[Pkg-gtkpod-devel] r292 - / trunk trunk/data trunk/data/icons trunk/data/icons/32x32 trunk/data/icons/48x48 trunk/data/icons/64x64 trunk/debian trunk/debian/patches trunk/po trunk/scripts trunk/src

nion at alioth.debian.org nion at alioth.debian.org
Sun Jan 13 16:16:37 UTC 2008


Author: nion
Date: 2008-01-13 16:16:35 +0000 (Sun, 13 Jan 2008)
New Revision: 292

Added:
   trunk/
   trunk/AUTHORS
   trunk/COPYING
   trunk/ChangeLog
   trunk/INSTALL
   trunk/Makefile.am
   trunk/Makefile.in
   trunk/NEWS
   trunk/README
   trunk/TODOandBUGS.txt
   trunk/TROUBLESHOOTING
   trunk/aclocal.m4
   trunk/autogen.sh
   trunk/config.guess
   trunk/config.h.in
   trunk/config.sub
   trunk/configure
   trunk/configure.in
   trunk/data/
   trunk/data/Makefile.am
   trunk/data/Makefile.in
   trunk/data/cdshine.png
   trunk/data/cdshine_main.png
   trunk/data/default-cover.png
   trunk/data/gphoto_album_menuitem-32.png
   trunk/data/gphoto_album_menuitem-48.png
   trunk/data/gphoto_images_menuitem-32.png
   trunk/data/gphoto_images_menuitem-48.png
   trunk/data/gphoto_playlist_icon-48.png
   trunk/data/gphoto_tools_menuitem-32.png
   trunk/data/gphoto_tools_menuitem-48.png
   trunk/data/gtkpod-add-dirs.png
   trunk/data/gtkpod-add-files.png
   trunk/data/gtkpod-add-playlists.png
   trunk/data/gtkpod-icon-32-2.png
   trunk/data/gtkpod-icon-32.png
   trunk/data/gtkpod-icon-48.png
   trunk/data/gtkpod-logo.png
   trunk/data/gtkpod-new-playlist.png
   trunk/data/gtkpod-read-16.png
   trunk/data/gtkpod-read.png
   trunk/data/gtkpod-sync.png
   trunk/data/gtkpod.desktop.in
   trunk/data/gtkpod.glade
   trunk/data/icons/
   trunk/data/icons/32x32/
   trunk/data/icons/32x32/Makefile.am
   trunk/data/icons/32x32/Makefile.in
   trunk/data/icons/32x32/gtkpod.png
   trunk/data/icons/48x48/
   trunk/data/icons/48x48/Makefile.am
   trunk/data/icons/48x48/Makefile.in
   trunk/data/icons/48x48/gtkpod.png
   trunk/data/icons/64x64/
   trunk/data/icons/64x64/Makefile.am
   trunk/data/icons/64x64/Makefile.in
   trunk/data/icons/64x64/gtkpod.png
   trunk/data/icons/Makefile.am
   trunk/data/icons/Makefile.in
   trunk/data/tunes_playlist_icon-48.png
   trunk/debian/
   trunk/debian/changelog
   trunk/debian/compat
   trunk/debian/control
   trunk/debian/copyright
   trunk/debian/dirs
   trunk/debian/docs
   trunk/debian/gtkpod-icon-32x32.xpm
   trunk/debian/gtkpod.desktop
   trunk/debian/gtkpod.pod
   trunk/debian/install
   trunk/debian/menu
   trunk/debian/patches/
   trunk/debian/patches/00list
   trunk/debian/patches/01_mountpoint.dpatch
   trunk/debian/patches/02_missing_fclose.dpatch
   trunk/debian/patches/03_itdb-set-local-to-imported.dpatch
   trunk/debian/rules
   trunk/debian/watch
   trunk/depcomp
   trunk/install-sh
   trunk/intltool-extract.in
   trunk/intltool-merge.in
   trunk/intltool-update.in
   trunk/missing
   trunk/mkinstalldirs
   trunk/po/
   trunk/po/ChangeLog
   trunk/po/Makefile.in.in
   trunk/po/POTFILES.in
   trunk/po/POTFILES.skip
   trunk/po/de.po
   trunk/po/es.po
   trunk/po/fr.po
   trunk/po/he.po
   trunk/po/it.po
   trunk/po/ja.po
   trunk/po/ro.po
   trunk/po/ru.po
   trunk/po/sv.po
   trunk/scripts/
   trunk/scripts/Makefile.am
   trunk/scripts/Makefile.in
   trunk/scripts/convert-2m4a.sh
   trunk/scripts/convert-2mp3.sh
   trunk/scripts/gtkpod-convert-common.sh
   trunk/scripts/ldif2vcf.sh
   trunk/scripts/mab2vcard
   trunk/scripts/sync-abook.sh
   trunk/scripts/sync-evocalendar.sh
   trunk/scripts/sync-evolution.sh
   trunk/scripts/sync-kaddressbook.sh
   trunk/scripts/sync-knotes.sh
   trunk/scripts/sync-korganizer.sh
   trunk/scripts/sync-ldif.sh
   trunk/scripts/sync-notes.sh
   trunk/scripts/sync-palm-jppy.py
   trunk/scripts/sync-thunderbird-nano.sh
   trunk/scripts/sync-thunderbird.sh
   trunk/scripts/sync-tomboy.sh
   trunk/scripts/sync-webcalendar.sh
   trunk/src/
   trunk/src/Makefile.am
   trunk/src/Makefile.in
   trunk/src/autodetection.c
   trunk/src/autodetection.h
   trunk/src/charset.c
   trunk/src/charset.h
   trunk/src/clientserver.c
   trunk/src/clientserver.h
   trunk/src/confirmation.c
   trunk/src/confirmation.h
   trunk/src/context_menus.c
   trunk/src/context_menus.h
   trunk/src/date_parser.c
   trunk/src/date_parser.h
   trunk/src/date_parser.l
   trunk/src/date_parser2.c
   trunk/src/date_parser2.l
   trunk/src/details.c
   trunk/src/details.h
   trunk/src/display.c
   trunk/src/display.h
   trunk/src/display_coverart.c
   trunk/src/display_coverart.h
   trunk/src/display_itdb.c
   trunk/src/display_itdb.h
   trunk/src/display_photo.c
   trunk/src/display_photo.h
   trunk/src/display_playlists.c
   trunk/src/display_private.h
   trunk/src/display_sorttabs.c
   trunk/src/display_spl.c
   trunk/src/display_tracks.c
   trunk/src/fetchcover.c
   trunk/src/fetchcover.h
   trunk/src/file.c
   trunk/src/file.h
   trunk/src/file_convert.c
   trunk/src/file_convert.h
   trunk/src/file_export.c
   trunk/src/file_itunesdb.c
   trunk/src/fileselection.c
   trunk/src/fileselection.h
   trunk/src/flacfile.c
   trunk/src/flacfile.h
   trunk/src/getopt.c
   trunk/src/getopt.h
   trunk/src/getopt1.c
   trunk/src/info.c
   trunk/src/info.h
   trunk/src/ipod_init.c
   trunk/src/ipod_init.h
   trunk/src/itdb.h
   trunk/src/main.c
   trunk/src/misc.c
   trunk/src/misc.h
   trunk/src/misc_confirm.c
   trunk/src/misc_conversion.c
   trunk/src/misc_input.c
   trunk/src/misc_playlist.c
   trunk/src/misc_track.c
   trunk/src/misc_track.h
   trunk/src/mp3file.c
   trunk/src/mp3file.h
   trunk/src/mp4file.c
   trunk/src/mp4file.h
   trunk/src/oggfile.c
   trunk/src/oggfile.h
   trunk/src/podcast.c
   trunk/src/podcast.h
   trunk/src/prefs.c
   trunk/src/prefs.h
   trunk/src/prefs_window.c
   trunk/src/prefs_window.h
   trunk/src/repository.c
   trunk/src/repository.h
   trunk/src/sha1.c
   trunk/src/sha1.h
   trunk/src/stock_icons.c
   trunk/src/stock_icons.h
   trunk/src/syncdir.c
   trunk/src/syncdir.h
   trunk/src/tools.c
   trunk/src/tools.h
   trunk/src/wavfile.c
   trunk/src/wavfile.h
   trunk/ylwrap
Log:
readding trunk with current upstream sources

Added: trunk/AUTHORS
===================================================================
--- trunk/AUTHORS	                        (rev 0)
+++ trunk/AUTHORS	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,3 @@
+Jorg Schuler <jcsjcs at users.sourceforge.net>
+Corey Donohoe <atmos at atmos.org>
+Adrian Ulrich <pab at blinkenlights.ch>

Added: trunk/COPYING
===================================================================
--- trunk/COPYING	                        (rev 0)
+++ trunk/COPYING	2008-01-13 16:16:35 UTC (rev 292)
@@ -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.

Added: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	                        (rev 0)
+++ trunk/ChangeLog	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,1000 @@
+gtkpod V0.99.12
+
+       NEW FEATURE: Import and management of photographs on ipods
+       that support them. Update of README to include photo management.
+       
+       UPDATE: Application requires libgpod version 0.6.0 or higher.
+      
+       UPDATE: Better icon theme specification compliance.
+
+       BUGFIX: Fixes to tomboy script. Thanks to Javier Kohen.
+
+       BUGFIX: Issues with display of track length. Inconsistent units used
+       in conjunction with libgpod (Jorg).
+
+       UPDATE: Cover art preview window either displays an album cover
+       to its full size or to a size consistent with the user's desktop.       
+
+       UPDATE: Download of Album Art from the net feature modified to the
+       ability of dragging-and-dropping a .jpg image from a web browser. This
+       has been changed due to licensing concerns over album art. Drag and 
+       Drop section of README updated accordingly (Paul).
+
+       BUGFIX: Issues on detecting changed local / podcast database. Thanks to
+       Mario Rossi.
+
+       BUGFIX: Issues addressed on Details Window.
+
+       BUGFIX: Crash avoided when auto-detecting an iTunes database that 
+       cannot be read.
+
+       UPDATE: Display of error output of scripts (Jorg).
+
+       IMPROVEMENT: Configuring and Compilation support (Todd).
+
+       UPDATE: New scripts for flac, ogg, mp3, m4a, wav conversion to mp3 and
+       m4a. Thanks to Peter van de Does.  
+
+       BUGFIX: Model number identified and written to ipod upon loading to ensure
+       libgpod can read the ipod's artwork.
+
+       UPDATE: Updates and bug fixes to gapless playback. Thanks to
+       Michael Tiffany.
+
+       BUGFIX: When Cover Art Display is widened, covers space out rather
+       than stretch.       
+
+       BUGFIX: Fixed memory leaks in CoverArt Display and Details window.
+       Thanks to Daniele Forsi.
+
+       UPDATE: French translation. Thanks to Éric Lassauge.
+     
+       UPDATE: Italian translation. Thanks to Daniele Forsi.
+
+       UPDATE: Hebrew translation. Thanks to Assaf Gillat.
+
+       UPDATE: Swedish translation. Thanks to Stefan Asserhäll.
+
+       NEW FEATURE: Added Romanian translation support. Thanks to 
+       Alex Eftimie.
+
+       NEW FEATURE: Added Russian translation support. Thanks to
+       Matvey Kozhev.
+
+gtkpod V0.99.10
+
+       NEW FEATURE: on-the-fly conversion of WAV, FLAC and OGG (as well
+       as MP3 and M4A). Thanks to Marc d[readlock], Simon Naunton and
+       Peter Edwards! Multi-threaded background conversion was added by
+       Jorg Schuler.
+
+       NEW FEATURE: editing of TV show metadata and track media
+       type. Thanks to Mario Rossi.
+
+       NEW FEATURE: Display of Album Art. Thanks to P.G. Richardson.
+
+       NEW FEATURE: Download of Album Art from the net. Thanks to
+       P.G. Richardson.
+
+       NEW FEATURE: copy playlists and tracks from within the context
+       menu without DND can simplify life with many playlists. Thanks
+       to Andrzej Palejko for his patch.
+
+       NEW FEATURE: preliminary support for calculating gapless
+       playback information (lame encoded mp3 files only).  Thanks to
+       Michael Tiffany.
+
+       UPDATE: Smart playlists now support the following new fields:
+       album artist, tv show, last skipped, season number, skipcount
+       and video kind.
+
+       IMPROVEMENT: Clicking on an item with the right mouse button
+       will select and open the context menu, which is the intended
+       behavior. As a consequence, the interface will remain blocked
+       while the selection is being updated and displayed.
+
+       BUGFIX: dragging tracks between two iPods would sometimes not
+       actually copy the file.
+
+       UPDATED: Italian translation (thanks to Daniele Forsi)
+
+       PACKAGING: Install a .desktop file and icons according to the
+       freedesktop.org specification.
+
+gtkpod V0.99.8
+
+       NEW FEATURE: Support of several iPods (currently you need to
+       edit the itdb_* entries in ~/.gtkpod/prefs to add
+       repositories). Each iPod can be loaded/ejected
+       individually. Scripts are called before loading (gtkpod.load)
+       and after saving (gtkpod.eject) with the mountpoint as the
+       first argument. If you need to mount the iPod manually, put the
+       mount command in gtkpod.load.
+
+       NEW FEATURE: Support for mobile phones supporting iTunes (see
+       Changelog_detailed for details)
+
+       NEW FEATURE: Lyrics are displayed on the iPod when available.
+
+       NEW FEATURE: Preliminary (no meta data) support of h.264 video
+       format via the libmp4v2 interface. Thanks to Peter Lieverdink.
+
+       NEW FEATURE: Script to sync notes from Tomboy to the
+       iPod. Thanks to Tejas Dinkar.
+
+       NEW FEATURE: Support of iTunes iTunNORM tag for volume
+       normalisation of mp4 tracks.
+
+       NEW FEATURE: Support of aacgain's replay gain tag for volume
+       normalisation of mp4 tracks (takes precedence over the iTunNORM
+       tag, see http://altosdesign.com/aacgain/)
+
+       NEW FEATURE: Support for start time, stop time, skip when
+       shuffling and remember playback position.
+
+       IMPROVEMENT: Support for coverart has been improved. You may
+       have to select your iPod model from a list of available models
+       if your iPod cannot be identified automatically, as is the case
+       for iTunes mobile phones or the new 6th generation iPod Nanos.
+       Coverart embedded in the music file (APIC tag) can now also
+       read. Support to read the coverart from specified files is
+       still available though. Please note that at present APIC
+       support only works when adding tracks directly to the iPod. It
+       does not work when you add tracks to a LOCAL repository first
+       and use Drag and Drop to move the track to your iPod.
+
+       IMPROVEMENT: Podcasts are marked as unplayed (on the iPod, with
+       a bullet in front of the title) when newly added to the podcast
+       list, and unmarked once they have been played once on the iPod.
+
+       IMPROVEMENT: Support to sync thunderbird's address book to an
+       iPod Nano with old firmware that would otherwise only display
+       the first address. This script may be useful to other users as
+       well as it writes out one vcf file per contact instead of just
+       one big file containing all contacts. Thanks to Paul Oremland.
+
+       IMPROVEMENT: Handle multiple calendar and task files in
+       sync-evocalendar script. Thanks to Michele C. Soccio
+
+       NEW: Spanish translation. Thanks to Alejandro Lamas.
+
+       BUGFIX: Pressing 'OK' when syncing directories several times
+       could crash gtkpod. Thanks to dforsi.
+
+       BUGFIX: Exporting tracks did not work if the template
+       extensions (.mp3...) did not match case-sensitively, possibly
+       leading to non-exported tracks. Thanks to Mattias Wadman.
+
+       BUGFIX: When updating tracks, the filename of the music file
+       and the filename of the thumbnail could be messed up. Fixed.
+
+       BUGFIX: The Edit Detail dialog did not handle the 'Year' field
+       correctly.
+
+       BUGFIX: When updating tracks, files were not copied to the iPod
+       even if the file was changed.
+
+       BUGFIX: Removing playlists could crash gtkpod.
+
+       WORKAROUND: Disable sorting of playlist view as this crashed
+       gtkpod.
+
+gtkpod V0.99.4
+
+       BUGFIX: Options for exporting playlist files could not be
+       changed.
+
+       BUGFIX: Fixed segfault when updating tracks or directories with
+       artowrk present.
+
+       BUGFIX: Browse button for "Sync Notes Script" opened a
+       directory browser instead of a file browser.
+
+       BUGFIX: Writing ID3v2.4 tags in UTF8 did not always
+       work. Thanks to 't0c' for the patch.
+
+       BUGFIX: Context Menus for removing playlists from the iPod were
+       not displayed. Thanks to 'rob/biffhero' for pointing this out.
+
+gtkpod V0.99.2
+       BUGFIX: Fix segfault when applying preferences.
+
+       BUGFIX: Don't require libcurl (not actively used).
+
+       UPDATE: Swedish translation catalog
+
+       IMPROVEMENT: Allow export of multiple thunderbird address
+       books (by naming the output filename).
+
+gtkpod V0.99.0
+       NEW: type-ahead search functionality. Thanks to Nick Piper,
+       http://www.nickpiper.co.uk/ -- please note that the list view
+       you want to search in needs to have keyboard focus. Selection
+       of the search column is done by clicking anywhere inside the
+       column.
+
+       NEW: Handle Compilations decently. The compilation mp3 tag is
+       read and written, and compilation artists can be grouped into
+       "Compilations" in the Artist filter tab. Thanks to Iain Benson!
+
+       NEW: Window for edit of track details, including functionality
+       to set thumbnails. The thumbnails are not stored as tags in the
+       file as iTunes does it. Instead, the original filename is
+       stored.
+
+       NEW: Display and setting/removing of thumbnail images. Choose
+       "Show Details" from the context menu (right mouse-button). New
+       thumbnails are displayed by the iPod but get wiped by iTunes,
+       however.
+
+       NEW: Automatic adding of thumbnail images when adding new
+       tracks or updating existing ones. See the option on the 'Track
+       Info' page of the preferences dialog for settings about which
+       filename will be used. Any filename is possible, even filenames
+       constructed from the album or artist name.
+
+       NEW: very basic iPod video support (you can add Videos but no
+       metadata is filled in). Thanks to Uwe Herman for the input.
+
+       NEW: script to sync contacts from a Palm (via jppy
+       http://wiki.zanu.org.uk/jppy). Thanks to Nick Piper,
+       http://www.nickpiper.co.uk/)
+
+       NEW: basic podcast support (use e.g. bashpodder or gpodder to
+       download podcasts, then add them directly into the podcast
+       playlist on the iPod).
+
+       NEW: transition to libgpod to read/write iTunesDB. See
+       www.gtkpod.org/libgpod.html for details.
+
+       IMPROVEMENT: added comment, category, description, podcast url,
+       podcast rss, subtitle fields and release date to displayable
+       fields.
+
+       IMPROVEMENT: Support playcounts on iPod Shuffle as well
+
+       IMPROVEMENT: Remember size of 'Edit Smart Playlist' dialog and
+       use scrolled window for the rules display.
+
+       IMPROVEMENT: Update smart playlists automatically (on
+       load/display/save) if 'live updating' is set.
+
+       IMPROVEMENT: Support for more mp3 file tags: Compilation
+       (TCMP), Podcast URL/Title (TID), Podcast Description (TDS),
+       Podcast Subtitle (TT3), Podcast RSS (WFD), Podcast Release Date
+       (TDR). Mostly reading only because of limited support on
+       id3tag's side.
+
+       UPDATED: Italian translation (thanks to Edward Matteucci)
+
+       BUGFIX: 'Check iPod's files' could crash under certain
+       circumstances (thanks to David Mansfield for the patch).
+
+       BUGFIX: Lame's Replay Gain was read incorrectly for certain
+       values. Thanks to Chris Brotherton for tracking this down.
+
+       BUGFIX: Prevent that all rules in a smart playlist get deleted,
+       which would mess up the iTunesDB.
+
+       BUGFIX: Choosing 'Delete' from the menu (not context menu) now
+       works again.
+
+gtkpod V0.95.CVS
+       NEW: script to sync addressbooks in ldif format provided by
+       Sebastien BERIDOT.
+
+       NEW: script to sync kNotes (KDE note program) provided by
+       Sebastian Scherer.
+
+       CHANGE: MP3 tags: use 'Band/Orchestra/Accompaniment' (TPE2) as
+       artist if it exists. Otherwise use 'Lead artist/Lead
+       performer/Soloist/Performing group' (TPE1) as before. Let me
+       know if this causes problems for you.
+
+       UPDATED Hebrew translation (thanks to Assaf Gillat)
+
+       SAFETY: call sync() and flush all buffers to the iPod after
+       writing the iTunesDB -- should minimise filesystem errors
+       caused by people disconnecting the iPod without unmounting.
+
+       BUGFIX: Copying playlists by drag and drop could confuse smart
+       playlists referencing these playlists. Fixed.
+
+       After copying playlists by drag and drop, smart playlists
+       refering to these playlists could become confused.
+
+gtkpod V0.94.0
+       NEW FEATURE: stable sorting of track view. This allows you, for
+       example, to first sort by title, then by artist. The list will
+       then be sorted by artist, but all titles of each artist remain
+       sorted as well (before the tiles were random).
+       Arbitrary depth and order of stable sorting is possible by
+       clicking the sort columns in the desired order.
+
+       NEW FEATURE: define your own ignore list of words that should
+       be ignored during sorting (sort options: ctrl-s).
+
+       IMPROVEMENT: improved handling of dangling files (files that
+       are referenced in the iTunesDB but are not present on the
+       iPod).
+
+       IMPROVEMENT: use 'eject' instead of 'umount'. Also fixes the
+       bug that 'could not unmount' was always displayed, even if the
+       umount was successful (thanks to Andreas Hauber).
+
+       BUGFIX: Some iTunesDB files written by iTunes could not be read
+       because of an error in the parse code (gtkpod would attempt to
+       read beyond the end of the file).
+
+       BUGFIX: Fixed compatibility issue with new firmware 3.1 and
+       iTunes 4.9 (only 256 tracks were shown on the iPod, iTunes
+       removed the majority of the tracks from the iPod). Podcasts are
+       still not supported, however, and will be lost when handled by
+       gtkpod.
+
+       BUGFIX: Fixed On-The-Go playlist handling (thanks to "Todd").
+
+       UPDATE: Hebrew translation catalog. Thanks to Assaf Gillat!
+
+gtkpod V0.93.1
+       BUGFIX: When changing the mountpoint, the change was not
+       written to the preferences file correctly.
+
+       BUGFIX: 'Copy from iPod' just failed in offline mode instead of
+       giving meaningful error messages -> fixed.
+
+       IMPROVEMENT: 'Copy from iPod' is now 'Export from Database' and
+       allows to export from the local database as well. This is
+       useful if you want to rename files in a consistant manner.
+
+gtkpod V0.93
+	Complete rewrite of reading/writing the iTunesDB. The code for
+	reading and writing the iTunesDB (and other iPod/Shuffle
+	files) is completely self-contained (itdb*.[ch]) and can
+	easily be used in other projects.
+
+	NEW FEATURE: Support of 'local database' containing tracks on
+	local harddisk. The contents of the local hard disk can be
+	browsed in the known gtkpod-fashion: by artist or genre or
+	album etc. Tracks and entire playlists can be dragged over to
+	the iPod or Shuffle database. By using smart playlists with
+	defined size in MBytes, the Shuffle can be filled effectively.
+
+	Drag and drop also works in the opposite direction: drag
+	tracks or entire playlists from the iPod/Shuffle database into
+	your local database. If necessary, the tracks are copied to
+	your harddisk automatically.
+
+	NEW FEATURE: sync-abook.sh and sync-webcalendar.sh scripts
+	provided by Daniel Kercher.
+
+	NEW FEATURE: sync-thunderbird.sh script	provided by Clinton
+	Gormley.
+
+	IMPROVEMENT: support MP3 disc numbers (thanks to Leigh Dyer)
+
+	IMPROVEMENT: Use of GTK filechoosers instead of fileselectors
+	(thanks to James Ligget)
+
+	IMPROVEMENT: sync-notes.sh now also works on directories (thanks
+	to Thomas Perl)
+
+	UPDATE: use 'iconv' instead of 'recode' in the provided export
+	scripts. Thanks to Alexey Dokuchaev.
+
+	UPDATE: All translation catlogs updated (French, German,
+	Italian, Japanese and Swedish)
+
+	BUGFIX: display and reading of compilation flag fixed (thanks
+	to Julien Oster for the patch)
+
+	BUGFIX: don't hang when parsing playlist files with empty
+	lines (thanks to Mattias Wadman)
+
+	BUGFIX: When exporting from the iPod: if the original filename
+        of a track was available, the track was not copied from the
+        iPod but from the original location on the user's
+        harddisk. Had the original file been removed or the export was
+        done on another computer (where the original file was not
+        present), the export failed.
+
+gtkpod V0.88.2
+	IMPROVEMENT: Added '%p' (current playlist) identifier when
+	exporting tracks.
+
+	BUGFIX: DND in playlist view did not work.
+
+	BUGFIX: scripts sync_evolution, sync_evocalendar and sync_notes
+	were not included in standard distribution.
+
+gtkpod V0.88.1
+	BUGFIX: Should now work with the shuffle -- forgot to change a
+	version number in the iTunesDB file :-(
+
+gtkpod V0.88
+	NEW FEATURE: Support for iPod Shuffle. Thanks to Steve Wahl.
+
+	BUGFIX: In smartlists star rating better supported. One star is
+	"1" and not "20".
+
+gtkpod V0.87
+	NEW FEATURE: Support for smart playlists.
+
+	NEW FEATURE: Added scripts sync_evolution, sync_evocalendar and
+	sync_notes to synchronise Contacts, Calendar and Tasks from
+	Evolution and to synchronise Notes with anything in the folder
+	~/ipod_notes.
+
+        BUGFIX: drag and drop was only implemented for mp3 files, not
+        for m4a, m4p, m4b, and wav files (thanks to Chris Micacchi for
+        pointing it out and supplying a first fix).
+
+	BUGFIX: Category playlists "for each year" did not work.
+
+	BUGFIX: Invalid charset conversion could hang gtkpod.
+
+	IMPROVEMENT: Support for iTunes' "checked", filedescriptor (kind),
+	and grouping fields.
+
+	IMPROVEMENT: When sorting ignore 'the' and similar at the
+	beginning of the title (thanks to Chris Micacchi)
+
+	IMPROVEMENT: Use statvfs() instead of a call to the external
+	command "df" to determine the free space on the iPod (thanks
+	to Steve Jay)
+
+	IMPROVEMENT: The fields "time_modified/played/created" can now
+	be edited from within the track view.
+
+	IMPROVEMENT: Creation of playlists for each rating
+	(Unrated, and Rated 1..5).
+
+	UPDATE: Swedish translation catalog
+
+	UPDATE: Italian translation catalog
+
+gtkpod V0.85.0
+	BUGFIX: when clicking onto the column header of the track
+	treeview three times and moving sidewards with the mouse at
+	the same time, gtkpod crashed. Crashing was due to a bad
+	workaround of a bug in the GTK+-library. Removed workaround
+	and instead submitted a bug report against GTK+. The bug has
+	been fixed in version 2.5.4 of the GTK+ library.
+
+	BUGFIX: When using "block display during updates" the display
+	was still updated during import. Fixed.
+
+	BUGFIX: The menu item "Check iPod's Files" was not reliably
+	activated. It's now always selectable when not in offline
+	mode.
+
+	BUGFIX: when writing tags to file the track tag was
+	deleted.
+
+	BUGFIX: special sorttab: sorting according to "time modified"
+	and "time created" did not work.
+
+	BUGFIX: handling of orphaned tracks that had been added to the
+	ipod again are now handled correctly.
+
+	BUGFIX: fixed case-sensitivity issue while handling orphaned
+	tracks.
+
+	BUGFIX: fixed bug that caused gtkpod to hang when activating
+	duplicate detection without having the list of duplicates
+	displayed (must have been around ever since duplicate
+	detection was introduced...)
+
+	BUGFIX: gain tags written by mp3gain were never read
+	correctly. Normalization using mp3gain was therefore
+	impossible. Didn't anyone ever use that feature?!
+
+	BUGFIX: when copying track to the iPod, the free space
+	indication became bigger and bigger during the process.
+
+	BUGFIX: Ascending and descending were interchanged in the sort
+	window.
+
+	NEW FEATURE: Implemented Michael Rolig's patch/idea to access
+	mserv data for the rating. Still needs testing as I don't use
+	mserv.
+
+	NEW FEATURE: added "randomize current playlist" (only the menu
+	entry without actual code was present so far).
+
+	NEW FEATURE: support for On-The-Go Playlists. They will show
+	up as "OTG Playlist 1" etc.
+
+	NEW FEATURE: export of PLS or M3U file including meta data.
+	
+	NEW FEATURE: registering playcounts when tracks are played on
+	the local machine is now possible (actually it was already
+	possible in V0.80, but now the README explains how to do it).
+
+	NEW FEATURE: Swedish translation provided by Stefan Asserhäll.
+
+	IMPROVEMENT: Speeded up writing of iTunesDB. For me it is now
+	between 1 and 15 seconds instead of between 20 and 40 seconds
+	before (for security I'm using the iPod as a non-buffered
+	device). A back-upped version of the iTunesDB is now always
+	written to ~/.gtkpod.
+
+	IMPROVEMENT: Speeded up display of sorted views. Thanks to
+	Stefan Asserhäll for the idea and valuable input.
+
+	IMPROVEMENT: Moved some options from the preferences dialog to
+	the file chooser dialog where you need them. gtkpod now
+	requires GTK2.4 to compile.
+
+	IMPROVEMENT: Added "Time Created" support to special sorttab,
+	track display and iTunesDB. (Before only "modified" and
+	"played" were supported.)
+
+	IMPROVEMENT: All information stored in the iTunesDB about
+	tracks is read and written, even if the information itself is
+	not used by gtkpod itself.
+
+	IMPROVEMENT: Added new track information fields: iPod_Path,
+	creation time, soundcheck, samplerate, "BPM"
+
+	IMPROVEMENT: Volume normalizing: when importing mp3 the replay
+	gain is read and the soundcheck field set accordingly. Use
+	the "soundcheck" feature of the iPod to have the volume
+	normalized during playback.
+	If no replay gain tag is set, use the "Normalize" as usual to
+	have mp3gain write a replay gain tag.
+
+	IMPROVEMENT: The extended information database now also
+	contains the iPod filename. This allows to find a certain
+	track even on systems not running gtkpod/gnupod/iTunes etc.
+
+	IMPROVEMENT: Some fixes for compilation under solaris. This
+	also led to the introduction of the environment variable
+	"GTKPOD_DF_COMMAND" that can be used to customize the df
+	command called to probe the free space of the iPod.
+
+gtkpod V0.80-2
+	BUGFIX: gtkpod would crash right after startup if the info
+	window was open when stopping gtkpod the previous time.
+
+	BUGFIX: Fixed free space display: the digits were right, the
+	unit was wrong (B instead of kB, kB instead of MB, MB instead
+	of GB...).
+
+	PATCH: gtkpod will compile with GTK V2.0 (V0.80 needed GTK
+	V2.4)
+
+	PATCH: gtkpod should compile under Fedora without patch
+
+	PATCH: reverted to old-style check of id3tag-lib as id3tag.pc
+	is not included with the id3tag distribution by default
+	
+gtkpod V0.80
+	NEW FEATURE: Added support for WAV audio files
+
+	NEW FEATURE: Added support for bookmarkable AAC files (.m4b
+	files). Thanks to D.L. Sharp. More information is available at
+	http://www.ipodlounge.com/articles_more.php?id=3233_0_8_0_C
+	http://docs.info.apple.com/article.html?artnum=61695
+
+	NEW FEATURE: Added support for syncing contacts and calendar from
+	existing applications to the iPod (on iTunesDB export and/or via
+	the Tools-menu). The sync is done by calling external scripts.
+	Only one script is included so far: kaddressbook_ipod. Please
+	submit more for inclusion into the next release.
+
+	NEW FEATURE: Added support for LAME's replay gain to normalize the
+	volume track (thanks to Jens Taprogge). Unfortunately the
+	conversion factor between LAME's replay gain and the iPod's volume
+	tag are not well known yet -- your input is appreciated!
+
+	IMPROVEMENT: Added file selectors for selecting files in the tools
+	section of the preferences dialog.
+
+	IMPROVEMENT: Added new auto-playlists: "One playlist for each
+	year" and "Playlist with all songs not listed in any playlist".
+
+	IMPROVEMENT: Can specify several templates to scan the filename
+	for tags using the ';' as a separator
+
+	IMPROVEMENT: Can specify several templates for the export
+	filename. gtkpod selects according to the extension given.
+
+	IMPROVEMENT: Streamlined layout of info window
+
+	IMPROVEMENT: Included Andrew Huntwork's patch to fix issues
+	concerning case-sensitivity of filenames under some conditions.
+
+	IMPROVEMENT: Included Ero Carrera's patch to validate the filename
+	when copying tracks from the iPod and to make a quick sync of the
+	iPod's contents.
+
+	IMPROVEMENT: When importing the iTunesDB automatically on startup,
+	no window was opened until the import was finished. Thanks to
+	Andrew Huntwork the window now opens before the import starts and
+	progress can be followed in the usual manner.
+
+	IMPROVEMENT: Send 'eject' to the iPod after unmounting. This only
+	works under LINUX and if the user has write access to the device
+	file (e.g. /dev/sda2)
+
+	IMPROVEMENT: When writing to the iPod automatically create iPod's
+	directories when they are not present.
+
+	IMPROVEMENT: Added progress dialog with abort button when copying
+	tracks from the iPod.
+
+	BUGFIX: When dragging tracks between two playlist (i.e. into a
+	newly created playlist), a new playlist was created but the tracks
+	were not added.
+
+	BUGFIX: Fixed hangup when syncing dirs
+
+	BUGFIX: Fixed compile error when compiling without mp4 support
+
+	BUGFIX: Fixed compile error when compiling with gcc 2.95
+
+	BUGFIX: Tags of tracks on the iPod were never changed (fixed
+	thanks to Andrew Huntwork)
+
+	BUGFIX: Fixed calculation of remaining seconds in progress
+	dialogs.
+
+	BUGFIX: automatic update of preferences data from older version
+	went awry when no preference file was present
+
+gtkpod V0.72
+        NEW FEATURE: tags can now be set from the filename using a
+	template like "%a - %A/%T %t.mp3".
+
+	IMPROVEMENT: read and write ID3v2.4 tags. This has been achieved
+	by migrating to the id3tag library. Using ID3v2.4 tags with
+	unicode encoding takes away the need to worry about which encoding
+	is used for the tags. Old "broken"-style locale charset encodings
+	in tags are still supported, of course.
+
+	BUGFIX: configure script was broken -- even though mp4 support was
+	configured in, gtkpod was built without :-(
+
+gtkpod V0.70
+	NEW FEATURE: import of AAC files (.m4a) supported, provided the
+	mp4v2 library from the mpeg4ip project
+	(mpeg4ip.sourceforge.net) is available during the compilation of
+	gtkpod. Writing tags to AAC files is also supported.  .m4p files
+	can also be imported, but they are not played by the iPod. .m4a
+	files work fine.
+
+	NEW FEATURE: info window showing total file size, play time
+	etc. can be opened.
+
+	IMPROVEMENT: Upon popular request, the menus now provide different
+	entries for "Delete from iPod" and "Delete from Playlist".
+
+	IMPROVEMENT: when deleting tracks completely from the iPod, the
+	confirmation dialog also displays the number of playlists the
+	tracks are members of.
+
+	IMPROVEMENT: Quick sync possible using "Add Tracks".  Details:
+
+	  Until now the default action when adding tracks that already
+	  exist (identical full filename) was to add it again (they were
+	  rejected by the duplicate detection, but that took a long time),
+	  or to update the track information (option).
+
+	  Now the default action is to skip existing tracks (identical
+	  filename) or to update the track information (option). Thus, by
+	  default, only new tracks are read, allowing quick
+	  synchronization of entire directories.
+
+	IMPROVEMENT: In the past, using programs other than gtkpod to
+	transfer files voided the extended information file. gtkpod will
+	now try to use the MD5 checksums stored in the extended
+	information file to match up the data when this occurs.
+
+	IMPROVEMENT: The 'year' tag is now supported as track view column
+	and as sort tab type.
+
+	IMPROVEMENT: The tags for track number and total number of tracks
+	are displayed as nn/nn in the track view, and can also be entered
+	as such.
+
+	IMPROVEMENT: The tags for CD number and total number of CDs can
+	now be displayed (analoguous to track number and total number of
+	tracks above)
+
+	IMPROVEMENT: When creating a new playlist a dialog is popped up
+	asking for a name.
+
+	BUGFIX: Drag and Drop of files with spaces did not work.
+
+	BUGFIX: "Unsort" (clicking sort column three times) of track view
+	failed if last sort tab was a "special" sort tab.
+
+	BUGFIX: updated ID3 tag reading code from easytag's new
+	version. Please also note that id3lib V3.7.3 seems to crash gtkpod
+	every once in a while. V3.8.3 appears to be more stable.
+
+gtkpod V0.60
+	NEW FEATURE: normalize song volume (using mp3gain). Uses iPod's
+	volume adjust feature rather than modifying the mp3 file.
+
+	NEW FEATURE: define format of filename when copying tracks from
+	iPod (mainly thanks to Sam Clegg).
+
+	NEW FEATURE: adjust volume of each track individually by using
+	iPod's per-track volume adjust feature (implemted through a new
+	column in the song view).
+
+	NEW FEATURE: automatically create a playlist for each
+	album/artist/genre/composer in your collection (thanks to Chris
+	Cutler), and other automatic playlist generations.
+
+	NEW FEATURE: menu items and context menu items to create new
+	playlist containing displayed songs or selected songs.
+
+	IMPROVEMENT: Try to press the shift key when dropping songs into a
+	playlist to move rather than copy tracks from one playlist to
+	another. Keep in mind that songs cannot be moved from or to the
+	master play list.
+
+	IMPROVEMENT: better alphabetize interface. Alphabetize settings
+	will be remembered, different settings for playlists, sort tabs,
+	and tracks possible. Also, clicking the column header three times
+	will revert the view to its unsorted state.
+
+	IMPROVEMENT: handle adding of playlist files containing files with
+	relative paths.
+
+	IMPROVEMENT: context menus more intuitive, context menus will no
+	longer trigger edit mode (most of the time).
+
+	IMPROVEMENT: the function copying songs to the iPod used a "large"
+	amount of stack memory (roughly 66000 Bytes) which crashed some
+	systems.
+
+	BUGFIX: md5 hash for duplicate detection will examine the same
+	number of bytes on all systems now (before it used 4xPATH_MAX).
+
+	BUGFIX: reading and writing of the Composer ID3 tags implemented
+	(so far the fields could only be set from inside gtkpod -- thanks
+	to Graeme Wilford)
+
+	BUGFIX: fixed memory holes in sync_songids(), sync_dir_ok(),
+	add_playlist_by_filename().
+
+	BUGFIX: drag and drop URIs with cr/nl at the end are handled
+	correctly (thanks to Walter Bell).
+
+gtkpod V0.52
+	NEW FEATURE: Supports Playcounts, Ratings, Time Last Played / Time
+	Last Modified. The playcounts and ratings are read from the 'Play
+	Count' file produced by iPod's firmware versions V1.3
+	(playcounts only) and V2.0 (playcounts and rating).
+
+	NEW FEATURE: If you mark several songs and change a tag in the
+	first one, the corresponding tag in the other songs will be
+	changed as well (must activate in the prefs menu). Patch provided
+	by Ramesh Dharan. Thanks!
+
+	IMPROVEMENT: added auto-dection of Japanese encoding (thanks to
+	Hiroshi Kawashima).
+
+	IMPROVEMENT: option to sort case-sensitively. Case-insensitive
+	utf8 sort should work fine, case-sensitive may not work entirely
+	as expected with some charsets.
+
+	BUGFIX: display free size correctly even if more than 4294967295
+	(or maybe just half that many?) Bytes are free on the iPod.
+
+	BUGFIX: drag-and-drop: gtkpod should now correctly handle files
+	with "special" characters (like spaces...) that are escaped in the
+	DND URI. (Thanks to Walter Bell).
+
+	BUGFIX: using 'file_export' from the context menu could crash
+	gtkpod
+
+	BUGFIX: file_export didn't remember directory last used.
+
+	BUGFIX: can now choose zero sort tabs in the prefs dialogue
+	(instead of the minimum one) -- why didn't anyone tell me?
+
+	BUGFIX: when deleting songs, sometimes adjacent songs got edited
+	(took title or artist... of the deleted song). Hopefully fixed --
+	please report.
+
+	BUGFIX: after reordering columns in the song view, the selection
+	of which columns are to be displayed went haywire -- fixed.
+
+	BUGFIX: fixed memory holes in pm_data_compare_func(),
+	st_data_compare_func(), sm_data_compare_func(),
+	get_ipod_used_space(), get_ipod_free_space(),
+	charset_to_description(), add_playlist_by_filename(),
+	sm_cell_edited().
+
+	NEW: Italian translation catalogue (almost complete)
+
+gtkpod V0.51
+	NEW FEATURE: Synchronize directories (removed songs can be deleted
+	automatically).
+
+	NEW FEATURE: gtkpod remembers charset used when initially
+	importing a song and uses this when "updating" the song
+	information from file or writing tags to file (needs extended
+	information enabled).
+
+	NEW FEATURE: display free space on iPod.
+
+	NEW FEATURE: menu item "Arrange Sort Tabs" to make all visible
+	sort tabs the same size
+
+        IMPROVEMENT: gtkpod should now compile "out of the box" under
+	FreeBSD and NetBSD (some adaptations were necessary before).
+
+        IMPROVEMENT: added all supported charsets provided by "iconv -l"
+	to the list of charsets to choose from. Code assumes that "iconv
+	-l" returns a list with the name of one charset in each line, each
+	valid line being terminated by "//".
+
+	IMPROVEMENT: new song column types: file size, play time,
+	avg. bitrate
+
+	BUGFIX: changed playlength code to that used by mp3info. It's much
+	slower but seems to be more reliable.
+
+	BUGFIX: fixed "dead" context menu "Alphabetize"
+
+gtkpod V0.50
+	NEW FEATURE: context sensitive popup menues (right mouse button
+	click in playlist view, sort tabs or song view.
+
+	NEW FEATURE: play song with xmms (two user definable commands).
+
+	NEW FEATURE: option to mount the iPod directory on startup and
+	unmount it on exit.
+
+	NEW FEATURE: mount/unmount ipod directory on startup/exit, and/or
+	execute ~/.gtkpod/gtkpod.in,out (or /etc/gtkpod/gtkpod.in,out if
+	the former doesn't exist) on startup/exit. First gtkpod.in is
+	executed, then the ipod is mounted (if this option is
+	activated). On exit, it's the other way round.
+
+	NEW FEATURE: read global prefs /etc/gtkpod/prefs if
+	~/.gtkpod/prefs does not exist. Useful, e.g. to set a machine-wide
+	default mountpoint for the ipod.
+
+	IMPROVEMENT: "Add Songs" and "Add Directory" has a new default
+	behaviour. They will now add songs/directories to the currently
+	selected playlist. If no playlist is selected, they add to the
+	master playlist.  "Add Playlist" will still create a new playlist
+	before adding the songs into it. Also, when playlist files are
+	added with "Add Songs" or "Add Directory" and no playlist is
+	selected, a new playlist will be selected for each playlist file.
+
+	NEW FEATURE: user settable: save song order after sort action
+	automatically?
+
+	NEW FEATURE: columns in song view can be dragged into any
+	order. Order will be saved.
+	
+        Change of copyright: itunesdb.c and itunesdb.h are now under the
+	GNU Lesser General Public License to make it easier to use the
+	code in other programs.
+
+	BUGFIX: when writing tags to file, all tags were updated even if
+	you selected only to update changed tags in the the preferences.
+
+	NEW FEATURE: drag and drop files/directories/playlists from
+	konqueror or nautilus directly into the song view. The songs will
+	be inserted at the specified position. You must already have some
+	songs displayed or a drop is not possible. In that case you should
+	drop into the playlist view since obviously you don't care about
+	the exact position of the files in the playlist (will be added at
+	the end).
+
+	NEW FEATURE: drag and drop files/directories/playlists from
+	konqueror or nautilus directly into the playlist view. If you drop
+	between playlists a (number of) new playlist(s) will be created
+	for the drop. If you drop onto a playlist, the songs will be added
+	into that playlist. Alpha-Version!
+
+	IMPROVEMENT: speed-up of display refreshs.  - Import of iTunesDB
+	with full non-blocked display: 4x as fast (51'' against 3'35'' on
+	my 2459 songs) - Refresh of first sort tab, non-blocked: 20x as
+	fast (0.65'' against 13'' on my 2459 songs) - Refresh of first
+	sort tab, blocked: 60x as fast (0.13'' against 7.8'' on my 2459
+	songs) - Refresh of song list, non-blocked: 2x as fast (9''
+	against 18'' on my 2459 songs)
+
+gtkpod V0.43-1 28-Feb-2003
+	BUGFIX: After DND operation songs were displayed twice in the
+	master playlist (this was just a display artifact).
+
+gtkpod V0.43 27-Feb-2003
+        Preventive BUGFIX: in the code to import the iTunesDB all absolute
+	references to positions in the iTunesDB were removed. Instead
+	itunesdb.c now uses the header information to find the headers it
+	needs. This should make it more reliable to read third party
+	iTunesDB. This was also part of the problem with the ephpod import
+	problem below (the other half of the problem was ephpod's not
+	really conformant way of writing the database).
+
+        BUGFIX: some iTunesDBs produced by ephpod could not be read (hang
+	after reading the songs and before adding the playlists).
+        
+	New Feature: update song information from file when adding songs
+	with identical filename (option)
+	
+        New Feature: update song information from file of selected songs
+	(ctrl-u and menu item)
+
+	BUGFIX: copy_song_to_ipod() there was a <5% chance that songs were
+	overwritten by new songs during the copy process, if you deleted
+	songs before adding new songs.
+
+        BUGFIX: Deleting songs from the iPod only worked if you exported
+	the iTunesDB twice.
+	
+	New Feature: Add Playlists (m3u and pls)
+
+gtkpod V0.42 20-Feb-2003
+        Bugfix: on first start gtkpod complained it could not create
+	~/.gtkpod even though it could... (and vice versa).
+
+	Improvement: display update can now be interrupted, selection
+	changed at any time.
+
+	Bugfix: gtkpod now sets bitrate (average bitrate for VBR)
+
+        Improvement: export can be interrupted and be continued at a later
+	time. gtkpod will (hopefully) correctly remember which songs have
+	already been copied/deleted from your iPod.
+	
+	Improvement: removal and copy of songs during export is done in a
+	separate thread, so the display doesn't freeze on long file system
+	operations
+
+        Bugfix: Kentaro Fukuchi pointed out that MusicMatch (at least the
+	Japanese version) uses song IDs starting with 2 (and not with
+	53). gtkpod then dropped some of your songs -- fixed.
+        
+	Improvement: Delete works on entries in sort tabs now (ctrl-d and
+	new menu item)
+	
+	Improvement?: don't close dirbrowser window until after the songs
+	have been read.
+
+	Improvement: display is updated while writing tags to disk "in the
+	background"
+
+	Bugfix: sometimes deleted songs were not removed from the
+	display. Changing tags then could crash the program
+
+	Bugfix: convert filenames ot UTF8 based on the charset chosen in
+	the options window
+
+	Bugfix: don't try to access iPod based files when in offline mode
+
+gtkpod V0.41 01-Feb-2003
+	- minor bugfixes (just possible segfaults and such)
+	- window won't freeze during import/export/add operations
+	- better handling of duplicate songs (e.g. duplicate songs are now
+	  displayed in a window instead of on the console, if duplicate
+	  detection is switched on later, duplicate songs are removed but
+	  the playlists are preserved...)
+	- confirmation window when quitting gtkpod without saving data
+	- Drag-and-drop for sort tab entries
+	- Japanese langauge catalogue
+	
+gtkpod V0.40 26-Jan-2003
+	many new features:
+
+	- Playlists (Drag-and-drop support)
+	- Sort Tabs
+	- Duplicate Detection
+	- German language support
+	- Charset for ID3 tags can be set
+	- Offline modification of iPod contents (and later synchronisation)
+	- Preferences
+	
+gtkpod V0.10
+	basic tool to import/export songs to your iPod.

Added: trunk/INSTALL
===================================================================
--- trunk/INSTALL	                        (rev 0)
+++ trunk/INSTALL	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,113 @@
+How to compile/install gtkpod:
+
+
+1. First, make sure you have compiled and installed the dependencies.
+   Most Linux distros will include them, except maybe for libid3tag
+   (http://sourceforge.net/project/showfiles.php?group_id=12349) and
+   libmp4v2 (http://mpeg4ip.sourceforge.net/).
+
+   Please do not confuse the libid3 library with the libid3tag
+   library -- they are not related. libid3tag is part of the MAD
+   project (http://sourceforge.net/projects/mad/).
+
+   Starting with version 0.96 gtkpod is using the gpod library.
+   libgpod should soon be available as a standard package for major
+   linux distributions. You can also install the library from source.
+   Download instructions for the tarball or development snapshot can
+   be found at http://www.gtkpod.org/libgpod.html
+
+   The libmp4v2 package is ONLY NEEDED if you need AAC support.  You
+   don't need libmp4v2 if you don't use AAC files.
+
+   libid3tag was successfully compiled and installed with
+
+   ./configure ; make ; make install
+
+   libmp4v2 was successfully compiled and install with
+
+   ./bootstrap --disable-server ; make ; make install
+
+
+   The following packages are required for building gtkpod:
+
+        autoconf (at least 2.55)
+        flex (or lex)
+        gettext
+        glib (at least 2.4.0)
+        gtk+ (at least 2.6.0)
+        libglade (at least 2.4.0)
+        libgnomecanvas (at least 2.14.0)
+        libgpod (at least 0.5.2)
+        libid3tag (at least 0.15)
+        perl XML::Parser module
+        pkgconfig
+
+   Optional packages:
+
+        libcurl (for coverart download support)
+        libflac (for FLAC support)
+        libgnome-vfs-2.0 >2.6 (for iPod autodetection under GNOME)
+        libhal >0.5 <0.6 (in combination with libgnome-vfs: better detection of iPods)
+        libvorbis (for ogg libvorbis support)
+        libmpv4 (for AAC/M4A support)
+
+
+2. If you install libraries to /usr/local/lib please don't forget to
+   add the path to LD_LIBRARY_PATH and PKG_CONFIG_PATH
+
+     LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
+     PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
+     export LD_LIBRARY_PATH
+     export PKG_CONFIG_PATH
+
+   You can add those lines to your ~/.bashrc or add it globally to
+   /etc/profile.
+
+   If you install packages from your linux distribution, keep in mind
+   that you will need to install the "-dev" packages as well to be
+   able to compile.
+
+
+3. Run the gtkpod 'configure' script to set up the compile
+
+   ./configure
+
+   The standard options to 'configure' apply.  For a list of options:
+
+   ./configure --help
+
+
+4. Compile the gtkpod software:
+
+   make
+
+
+5. Install the gtkpod software (may require root privileges):
+
+   make install
+
+
+   Note: You can test gtkpod without installing it. Some features
+   (translation catalogues, icons, scripts) may not be available,
+   however:
+
+   src/gtkpod
+
+
+
+----------------------------------------------------------------------
+** Note that you do not need to accept the default (usually
+   /usr/local) install path when you compile and install the software.
+   You may choose to install the software in a different location.
+   For example, with libid3tag and libmp4v2 in a non-standard
+   location, outside the $PATH and the usual build environment, you
+   need to configure the build of gtkpod appropriately.  You need to
+   set a CFLAGS variable during the 'configure' that sets the -I and
+   -L flags correctly.
+
+   As a practical example, let's say the libmp4v2 software was
+   installed in $HOME/Applications/mpeg4ip and the libid3tag software
+   was installed in $HOME/Applications/libid3tag, and you want to
+   install gtkpod into $HOME/Applications/gtkpod.  Do this instead:
+
+    CFLAGS="-I$HOME/Applications/mpeg4ip/include -L$HOME/Applications/mpeg4ip/lib -I$HOME/Applications/libid3tag/include -L$HOME/Applications/libid3tag/lib" ./configure --prefix=$HOME/Applications/gtkpod ; make ; make install 

Added: trunk/Makefile.am
===================================================================
--- trunk/Makefile.am	                        (rev 0)
+++ trunk/Makefile.am	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,21 @@
+## Process this file with automake to produce Makefile.in
+
+SUBDIRS = src po scripts data
+
+EXTRA_DIST =			\
+	autogen.sh		\
+	intltool-extract.in	\
+	intltool-merge.in	\
+	intltool-update.in	\
+	TROUBLESHOOTING		\
+	TODOandBUGS.txt
+
+DISTCLEANFILES =		\
+	intltool-extract	\
+	intltool-merge		\
+	intltool-update
+
+uninstall-hook:
+	-rmdir --ignore-fail-on-non-empty $(DESTDIR)$(pkgdatadir)/data
+	-rmdir --ignore-fail-on-non-empty $(DESTDIR)$(pkgdatadir)/scripts
+	-rmdir --ignore-fail-on-non-empty $(DESTDIR)$(pkgdatadir)

Added: trunk/Makefile.in
===================================================================
--- trunk/Makefile.in	                        (rev 0)
+++ trunk/Makefile.in	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,691 @@
+# Makefile.in generated by automake 1.10 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = .
+DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
+	$(srcdir)/Makefile.in $(srcdir)/config.h.in \
+	$(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \
+	config.guess config.sub depcomp install-sh missing \
+	mkinstalldirs ylwrap
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+	html-recursive info-recursive install-data-recursive \
+	install-dvi-recursive install-exec-recursive \
+	install-html-recursive install-info-recursive \
+	install-pdf-recursive install-ps-recursive install-recursive \
+	installcheck-recursive installdirs-recursive pdf-recursive \
+	ps-recursive uninstall-recursive
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+  { test ! -d $(distdir) \
+    || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
+         && rm -fr $(distdir); }; }
+DIST_ARCHIVES = $(distdir).tar.gz
+GZIP_ENV = --best
+distuninstallcheck_listfiles = find . -type f -print
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+ALL_LINGUAS = @ALL_LINGUAS@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CURL_CFLAGS = @CURL_CFLAGS@
+CURL_LIBS = @CURL_LIBS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GMODULE_CFLAGS = @GMODULE_CFLAGS@
+GMODULE_LIBS = @GMODULE_LIBS@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GNOME_VFS_CFLAGS = @GNOME_VFS_CFLAGS@
+GNOME_VFS_LIBS = @GNOME_VFS_LIBS@
+GREP = @GREP@
+GTHREAD_CFLAGS = @GTHREAD_CFLAGS@
+GTHREAD_LIBS = @GTHREAD_LIBS@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
+HAL_CFLAGS = @HAL_CFLAGS@
+HAL_LIBS = @HAL_LIBS@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
+INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
+INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
+INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
+INTLTOOL_PERL = @INTLTOOL_PERL@
+INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
+INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
+INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
+INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
+INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
+INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
+INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
+INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
+INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
+INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
+INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
+INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
+LDFLAGS = @LDFLAGS@
+LEX = @LEX@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
+LIBGLADE_CFLAGS = @LIBGLADE_CFLAGS@
+LIBGLADE_LIBS = @LIBGLADE_LIBS@
+LIBGNOMECANVAS_CFLAGS = @LIBGNOMECANVAS_CFLAGS@
+LIBGNOMECANVAS_LIBS = @LIBGNOMECANVAS_LIBS@
+LIBGPOD_CFLAGS = @LIBGPOD_CFLAGS@
+LIBGPOD_LIBS = @LIBGPOD_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MOUNT = @MOUNT@
+MSGFMT = @MSGFMT@
+MSGFMT_OPTS = @MSGFMT_OPTS@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+POFILES = @POFILES@
+POSUB = @POSUB@
+PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
+PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+UMOUNT = @UMOUNT@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+SUBDIRS = src po scripts data
+EXTRA_DIST = \
+	autogen.sh		\
+	intltool-extract.in	\
+	intltool-merge.in	\
+	intltool-update.in	\
+	TROUBLESHOOTING		\
+	TODOandBUGS.txt
+
+DISTCLEANFILES = \
+	intltool-extract	\
+	intltool-merge		\
+	intltool-update
+
+all: config.h
+	$(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+am--refresh:
+	@:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      echo ' cd $(srcdir) && $(AUTOMAKE) --gnu '; \
+	      cd $(srcdir) && $(AUTOMAKE) --gnu  \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    echo ' $(SHELL) ./config.status'; \
+	    $(SHELL) ./config.status;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	$(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+
+config.h: stamp-h1
+	@if test ! -f $@; then \
+	  rm -f stamp-h1; \
+	  $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \
+	else :; fi
+
+stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
+	@rm -f stamp-h1
+	cd $(top_builddir) && $(SHELL) ./config.status config.h
+$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) 
+	cd $(top_srcdir) && $(AUTOHEADER)
+	rm -f stamp-h1
+	touch $@
+
+distclean-hdr:
+	-rm -f config.h stamp-h1
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+$(RECURSIVE_CLEAN_TARGETS):
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	rev=''; for subdir in $$list; do \
+	  if test "$$subdir" = "."; then :; else \
+	    rev="$$subdir $$rev"; \
+	  fi; \
+	done; \
+	rev="$$rev ."; \
+	target=`echo $@ | sed s/-recursive//`; \
+	for subdir in $$rev; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done && test -z "$$fail"
+tags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	done
+ctags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	$(am__remove_distdir)
+	test -d $(distdir) || mkdir $(distdir)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test -d "$(distdir)/$$subdir" \
+	    || $(MKDIR_P) "$(distdir)/$$subdir" \
+	    || exit 1; \
+	    distdir=`$(am__cd) $(distdir) && pwd`; \
+	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+	    (cd $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$top_distdir" \
+	        distdir="$$distdir/$$subdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+	-find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
+	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
+	|| chmod -R a+r $(distdir)
+dist-gzip: distdir
+	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+	$(am__remove_distdir)
+
+dist-bzip2: distdir
+	tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+	$(am__remove_distdir)
+
+dist-tarZ: distdir
+	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+	$(am__remove_distdir)
+
+dist-shar: distdir
+	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+	$(am__remove_distdir)
+
+dist-zip: distdir
+	-rm -f $(distdir).zip
+	zip -rq $(distdir).zip $(distdir)
+	$(am__remove_distdir)
+
+dist dist-all: distdir
+	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+	$(am__remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration.  Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+	case '$(DIST_ARCHIVES)' in \
+	*.tar.gz*) \
+	  GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
+	*.tar.bz2*) \
+	  bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
+	*.tar.Z*) \
+	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+	*.shar.gz*) \
+	  GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
+	*.zip*) \
+	  unzip $(distdir).zip ;;\
+	esac
+	chmod -R a-w $(distdir); chmod a+w $(distdir)
+	mkdir $(distdir)/_build
+	mkdir $(distdir)/_inst
+	chmod a-w $(distdir)
+	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+	  && cd $(distdir)/_build \
+	  && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+	    $(DISTCHECK_CONFIGURE_FLAGS) \
+	  && $(MAKE) $(AM_MAKEFLAGS) \
+	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
+	  && $(MAKE) $(AM_MAKEFLAGS) check \
+	  && $(MAKE) $(AM_MAKEFLAGS) install \
+	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+	  && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+	  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+	        distuninstallcheck \
+	  && chmod -R a-w "$$dc_install_base" \
+	  && ({ \
+	       (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+	            distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+	      } || { rm -rf "$$dc_destdir"; exit 1; }) \
+	  && rm -rf "$$dc_destdir" \
+	  && $(MAKE) $(AM_MAKEFLAGS) dist \
+	  && rm -rf $(DIST_ARCHIVES) \
+	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck
+	$(am__remove_distdir)
+	@(echo "$(distdir) archives ready for distribution: "; \
+	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+	  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
+distuninstallcheck:
+	@cd $(distuninstallcheck_dir) \
+	&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
+	   || { echo "ERROR: files left after uninstall:" ; \
+	        if test -n "$(DESTDIR)"; then \
+	          echo "  (check DESTDIR support)"; \
+	        fi ; \
+	        $(distuninstallcheck_listfiles) ; \
+	        exit 1; } >&2
+distcleancheck: distclean
+	@if test '$(srcdir)' = . ; then \
+	  echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+	  exit 1 ; \
+	fi
+	@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+	  || { echo "ERROR: files left in build directory after distclean:" ; \
+	       $(distcleancheck_listfiles) ; \
+	       exit 1; } >&2
+check-am: all-am
+check: check-recursive
+all-am: Makefile config.h
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-hdr distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-info: install-info-recursive
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-ps: install-ps-recursive
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -rf $(top_srcdir)/autom4te.cache
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+	@$(NORMAL_INSTALL)
+	$(MAKE) $(AM_MAKEFLAGS) uninstall-hook
+
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
+	install-strip uninstall-am
+
+.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
+	all all-am am--refresh check check-am clean clean-generic \
+	ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \
+	dist-shar dist-tarZ dist-zip distcheck distclean \
+	distclean-generic distclean-hdr distclean-tags distcleancheck \
+	distdir distuninstallcheck dvi dvi-am html html-am info \
+	info-am install install-am install-data install-data-am \
+	install-dvi install-dvi-am install-exec install-exec-am \
+	install-html install-html-am install-info install-info-am \
+	install-man install-pdf install-pdf-am install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs installdirs-am maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \
+	uninstall-hook
+
+
+uninstall-hook:
+	-rmdir --ignore-fail-on-non-empty $(DESTDIR)$(pkgdatadir)/data
+	-rmdir --ignore-fail-on-non-empty $(DESTDIR)$(pkgdatadir)/scripts
+	-rmdir --ignore-fail-on-non-empty $(DESTDIR)$(pkgdatadir)
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:

Added: trunk/NEWS
===================================================================
--- trunk/NEWS	                        (rev 0)
+++ trunk/NEWS	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,607 @@
+gtkpod V0.90
+	Complete rewrite of reading/writing the iTunesDB
+
+	IMPROVEMENT: local database to browse local content
+
+	IMPROVEMENT: support MP3 disc numbers (thanks to Leigh Dyer)
+
+gtkpod V0.88.2
+	IMPROVEMENT: Added '%p' (current playlist) identifier when
+	exporting tracks.
+
+	BUGFIX: DND in playlist view did not work.
+
+	BUGFIX: scripts sync_evolution, sync_evocalendar and sync_notes
+	were not included in standard distribution.
+
+gtkpod V0.88.1
+	BUGFIX: Should now work with the shuffle -- forgot to change a
+	version number in the iTunesDB file :-(
+
+gtkpod V0.88
+	NEW FEATURE: Support for iPod Shuffle. Thanks to Steve Wahl.
+
+	BUGFIX: In smartlists star rating better supported. One star is
+	"1" and not "20".
+
+gtkpod V0.87
+	NEW FEATURE: Support for smart playlists.
+
+	NEW FEATURE: Added scripts sync_evolution, sync_evocalendar and
+	sync_notes to synchronise Contacts, Calendar and Tasks from
+	Evolution and to synchronise Notes with anything in the folder
+	~/ipod_notes.
+
+        BUGFIX: drag and drop was only implemented for mp3 files, not
+        for m4a, m4p, m4b, and wav files (thanks to Chris Micacchi for
+        pointing it out and supplying a first fix).
+
+	BUGFIX: Category playlists "for each year" did not work.
+
+	BUGFIX: Invalid charset conversion could hang gtkpod.
+
+	IMPROVEMENT: Support for iTunes' "checked", filedescriptor (kind),
+	and grouping fields.
+
+	IMPROVEMENT: When sorting ignore 'the' and similar at the
+	beginning of the title (thanks to Chris Micacchi)
+
+	IMPROVEMENT: Use statvfs() instead of a call to the external
+	command "df" to determine the free space on the iPod (thanks
+	to Steve Jay)
+
+	IMPROVEMENT: The fields "time_modified/played/created" can now
+	be edited from within the track view.
+
+	IMPROVEMENT: Creation of playlists for each rating
+	(Unrated, and Rated 1..5).
+
+	UPDATE: Swedish translation catalog
+
+	UPDATE: Italian translation catalog
+
+gtkpod V0.85.0
+	BUGFIX: when clicking onto the column header of the track
+	treeview three times and moving sidewards with the mouse at
+	the same time, gtkpod crashed. Crashing was due to a bad
+	workaround of a bug in the GTK+-library. Removed workaround
+	and instead submitted a bug report against GTK+. The bug has
+	been fixed in version 2.5.4 of the GTK+ library.
+
+	BUGFIX: When using "block display during updates" the display
+	was still updated during import. Fixed.
+
+	BUGFIX: The menu item "Check iPod's Files" was not reliably
+	activated. It's now always selectable when not in offline
+	mode.
+
+	BUGFIX: when writing tags to file the track tag was
+	deleted.
+
+	BUGFIX: special sorttab: sorting according to "time modified"
+	and "time created" did not work.
+
+	BUGFIX: handling of orphaned tracks that had been added to the
+	ipod again are now handled correctly.
+
+	BUGFIX: fixed case-sensitivity issue while handling orphaned
+	tracks.
+
+	BUGFIX: fixed bug that caused gtkpod to hang when activating
+	duplicate detection without having the list of duplicates
+	displayed (must have been around ever since duplicate
+	detection was introduced...)
+
+	BUGFIX: gain tags written by mp3gain were never read
+	correctly. Normalization using mp3gain was therefore
+	impossible. Didn't anyone ever use that feature?!
+
+	BUGFIX: when copying track to the iPod, the free space
+	indication became bigger and bigger during the process.
+
+	BUGFIX: Ascending and descending were interchanged in the sort
+	window.
+
+	NEW FEATURE: Implemented Michael Rolig's patch/idea to access
+	mserv data for the rating. Still needs testing as I don't use
+	mserv.
+
+	NEW FEATURE: added "randomize current playlist" (only the menu
+	entry without actual code was present so far).
+
+	NEW FEATURE: support for On-The-Go Playlists. They will show
+	up as "OTG Playlist 1" etc.
+
+	NEW FEATURE: export of PLS or M3U file including meta data.
+	
+	NEW FEATURE: registering playcounts when tracks are played on
+	the local machine is now possible (actually it was already
+	possible in V0.80, but now the README explains how to do it).
+
+	NEW FEATURE: Swedish translation provided by Stefan Asserhäll.
+
+	IMPROVEMENT: Speeded up writing of iTunesDB. For me it is now
+	between 1 and 15 seconds instead of between 20 and 40 seconds
+	before (for security I'm using the iPod as a non-buffered
+	device). A back-upped version of the iTunesDB is now always
+	written to ~/.gtkpod.
+
+	IMPROVEMENT: Speeded up display of sorted views. Thanks to
+	Stefan Asserhäll for the idea and valuable input.
+
+	IMPROVEMENT: Moved some options from the preferences dialog to
+	the file chooser dialog where you need them. gtkpod now
+	requires GTK2.4 to compile.
+
+	IMPROVEMENT: Added "Time Created" support to special sorttab,
+	track display and iTunesDB. (Before only "modified" and
+	"played" were supported.)
+
+	IMPROVEMENT: All information stored in the iTunesDB about
+	tracks is read and written, even if the information itself is
+	not used by gtkpod itself.
+
+	IMPROVEMENT: Added new track information fields: iPod_Path,
+	creation time, soundcheck, samplerate, "BPM"
+
+	IMPROVEMENT: Volume normalizing: when importing mp3 the replay
+	gain is read and the soundcheck field set accordingly. Use
+	the "soundcheck" feature of the iPod to have the volume
+	normalized during playback.
+	If no replay gain tag is set, use the "Normalize" as usual to
+	have mp3gain write a replay gain tag.
+
+	IMPROVEMENT: The extended information database now also
+	contains the iPod filename. This allows to find a certain
+	track even on systems not running gtkpod/gnupod/iTunes etc.
+
+	IMPROVEMENT: Some fixes for compilation under solaris. This
+	also led to the introduction of the environment variable
+	"GTKPOD_DF_COMMAND" that can be used to customize the df
+	command called to probe the free space of the iPod.
+
+gtkpod V0.80-2
+	BUGFIX: gtkpod would crash right after startup if the info
+	window was open when stopping gtkpod the previous time.
+
+	BUGFIX: Fixed free space display: the digits were right, the
+	unit was wrong (B instead of kB, kB instead of MB, MB instead
+	of GB...).
+
+	PATCH: gtkpod will compile with GTK V2.0 (V0.80 needed GTK
+	V2.4)
+
+	PATCH: gtkpod should compile under Fedora without patch
+
+	PATCH: reverted to old-style check of id3tag-lib as id3tag.pc
+	is not included with the id3tag distribution by default
+	
+gtkpod V0.80
+	NEW FEATURE: Added support for WAV audio files
+
+	NEW FEATURE: Added support for bookmarkable AAC files (.m4b
+	files). Thanks to D.L. Sharp. More information is available at
+	http://www.ipodlounge.com/articles_more.php?id=3233_0_8_0_C
+	http://docs.info.apple.com/article.html?artnum=61695
+
+	NEW FEATURE: Added support for syncing contacts and calendar from
+	existing applications to the iPod (on iTunesDB export and/or via
+	the Tools-menu). The sync is done by calling external scripts.
+	Only one script is included so far: kaddressbook_ipod. Please
+	submit more for inclusion into the next release.
+
+	NEW FEATURE: Added support for LAME's replay gain to normalize the
+	volume track (thanks to Jens Taprogge). Unfortunately the
+	conversion factor between LAME's replay gain and the iPod's volume
+	tag are not well known yet -- your input is appreciated!
+
+	IMPROVEMENT: Added file selectors for selecting files in the tools
+	section of the preferences dialog.
+
+	IMPROVEMENT: Added new auto-playlists: "One playlist for each
+	year" and "Playlist with all songs not listed in any playlist".
+
+	IMPROVEMENT: Can specify several templates to scan the filename
+	for tags using the ';' as a separator
+
+	IMPROVEMENT: Can specify several templates for the export
+	filename. gtkpod selects according to the extension given.
+
+	IMPROVEMENT: Streamlined layout of info window
+
+	IMPROVEMENT: Included Andrew Huntwork's patch to fix issues
+	concerning case-sensitivity of filenames under some conditions.
+
+	IMPROVEMENT: Included Ero Carrera's patch to validate the filename
+	when copying tracks from the iPod and to make a quick sync of the
+	iPod's contents.
+
+	IMPROVEMENT: When importing the iTunesDB automatically on startup,
+	no window was opened until the import was finished. Thanks to
+	Andrew Huntwork the window now opens before the import starts and
+	progress can be followed in the usual manner.
+
+	IMPROVEMENT: Send 'eject' to the iPod after unmounting. This only
+	works under LINUX and if the user has write access to the device
+	file (e.g. /dev/sda2)
+
+	IMPROVEMENT: When writing to the iPod automatically create iPod's
+	directories when they are not present.
+
+	IMPROVEMENT: Added progress dialog with abort button when copying
+	tracks from the iPod.
+
+	BUGFIX: When dragging tracks between two playlist (i.e. into a
+	newly created playlist), a new playlist was created but the tracks
+	were not added.
+
+	BUGFIX: Fixed hangup when syncing dirs
+
+	BUGFIX: Fixed compile error when compiling without mp4 support
+
+	BUGFIX: Fixed compile error when compiling with gcc 2.95
+
+	BUGFIX: Tags of tracks on the iPod were never changed (fixed
+	thanks to Andrew Huntwork)
+
+	BUGFIX: Fixed calculation of remaining seconds in progress
+	dialogs.
+
+	BUGFIX: automatic update of preferences data from older version
+	went awry when no preference file was present
+
+gtkpod V0.72
+        NEW FEATURE: tags can now be set from the filename using a
+	template like "%a - %A/%T %t.mp3".
+
+	IMPROVEMENT: read and write ID3v2.4 tags. This has been achieved
+	by migrating to the id3tag library. Using ID3v2.4 tags with
+	unicode encoding takes away the need to worry about which encoding
+	is used for the tags. Old "broken"-style locale charset encodings
+	in tags are still supported, of course.
+
+	BUGFIX: configure script was broken -- even though mp4 support was
+	configured in, gtkpod was built without :-(
+
+gtkpod V0.70
+	NEW FEATURE: import of AAC files (.m4a) supported, provided the
+	mp4v2 library from the mpeg4ip project
+	(mpeg4ip.sourceforge.net) is available during the compilation of
+	gtkpod. Writing tags to AAC files is also supported.  .m4p files
+	can also be imported, but they are not played by the iPod. .m4a
+	files work fine.
+
+	NEW FEATURE: info window showing total file size, play time
+	etc. can be opened.
+
+	IMPROVEMENT: Upon popular request, the menus now provide different
+	entries for "Delete from iPod" and "Delete from Playlist".
+
+	IMPROVEMENT: when deleting tracks completely from the iPod, the
+	confirmation dialog also displays the number of playlists the
+	tracks are members of.
+
+	IMPROVEMENT: Quick sync possible using "Add Tracks".  Details:
+
+	  Until now the default action when adding tracks that already
+	  exist (identical full filename) was to add it again (they were
+	  rejected by the duplicate detection, but that took a long time),
+	  or to update the track information (option).
+
+	  Now the default action is to skip existing tracks (identical
+	  filename) or to update the track information (option). Thus, by
+	  default, only new tracks are read, allowing quick
+	  synchronization of entire directories.
+
+	IMPROVEMENT: In the past, using programs other than gtkpod to
+	transfer files voided the extended information file. gtkpod will
+	now try to use the MD5 checksums stored in the extended
+	information file to match up the data when this occurs.
+
+	IMPROVEMENT: The 'year' tag is now supported as track view column
+	and as sort tab type.
+
+	IMPROVEMENT: The tags for track number and total number of tracks
+	are displayed as nn/nn in the track view, and can also be entered
+	as such.
+
+	IMPROVEMENT: The tags for CD number and total number of CDs can
+	now be displayed (analoguous to track number and total number of
+	tracks above)
+
+	IMPROVEMENT: When creating a new playlist a dialog is popped up
+	asking for a name.
+
+	BUGFIX: Drag and Drop of files with spaces did not work.
+
+	BUGFIX: "Unsort" (clicking sort column three times) of track view
+	failed if last sort tab was a "special" sort tab.
+
+	BUGFIX: updated ID3 tag reading code from easytag's new
+	version. Please also note that id3lib V3.7.3 seems to crash gtkpod
+	every once in a while. V3.8.3 appears to be more stable.
+
+gtkpod V0.60
+	NEW FEATURE: normalize song volume (using mp3gain). Uses iPod's
+	volume adjust feature rather than modifying the mp3 file.
+
+	NEW FEATURE: define format of filename when copying tracks from
+	iPod (mainly thanks to Sam Clegg).
+
+	NEW FEATURE: adjust volume of each track individually by using
+	iPod's per-track volume adjust feature (implemted through a new
+	column in the song view).
+
+	NEW FEATURE: automatically create a playlist for each
+	album/artist/genre/composer in your collection (thanks to Chris
+	Cutler), and other automatic playlist generations.
+
+	NEW FEATURE: menu items and context menu items to create new
+	playlist containing displayed songs or selected songs.
+
+	IMPROVEMENT: Try to press the shift key when dropping songs into a
+	playlist to move rather than copy tracks from one playlist to
+	another. Keep in mind that songs cannot be moved from or to the
+	master play list.
+
+	IMPROVEMENT: better alphabetize interface. Alphabetize settings
+	will be remembered, different settings for playlists, sort tabs,
+	and tracks possible. Also, clicking the column header three times
+	will revert the view to its unsorted state.
+
+	IMPROVEMENT: handle adding of playlist files containing files with
+	relative paths.
+
+	IMPROVEMENT: context menus more intuitive, context menus will no
+	longer trigger edit mode (most of the time).
+
+	IMPROVEMENT: the function copying songs to the iPod used a "large"
+	amount of stack memory (roughly 66000 Bytes) which crashed some
+	systems.
+
+	BUGFIX: md5 hash for duplicate detection will examine the same
+	number of bytes on all systems now (before it used 4xPATH_MAX).
+
+	BUGFIX: reading and writing of the Composer ID3 tags implemented
+	(so far the fields could only be set from inside gtkpod -- thanks
+	to Graeme Wilford)
+
+	BUGFIX: fixed memory holes in sync_songids(), sync_dir_ok(),
+	add_playlist_by_filename().
+
+	BUGFIX: drag and drop URIs with cr/nl at the end are handled
+	correctly (thanks to Walter Bell).
+
+gtkpod V0.52
+	NEW FEATURE: Supports Playcounts, Ratings, Time Last Played / Time
+	Last Modified. The playcounts and ratings are read from the 'Play
+	Count' file produced by iPod's firmware versions V1.3
+	(playcounts only) and V2.0 (playcounts and rating).
+
+	NEW FEATURE: If you mark several songs and change a tag in the
+	first one, the corresponding tag in the other songs will be
+	changed as well (must activate in the prefs menu). Patch provided
+	by Ramesh Dharan. Thanks!
+
+	IMPROVEMENT: added auto-dection of Japanese encoding (thanks to
+	Hiroshi Kawashima).
+
+	IMPROVEMENT: option to sort case-sensitively. Case-insensitive
+	utf8 sort should work fine, case-sensitive may not work entirely
+	as expected with some charsets.
+
+	BUGFIX: display free size correctly even if more than 4294967295
+	(or maybe just half that many?) Bytes are free on the iPod.
+
+	BUGFIX: drag-and-drop: gtkpod should now correctly handle files
+	with "special" characters (like spaces...) that are escaped in the
+	DND URI. (Thanks to Walter Bell).
+
+	BUGFIX: using 'file_export' from the context menu could crash
+	gtkpod
+
+	BUGFIX: file_export didn't remember directory last used.
+
+	BUGFIX: can now choose zero sort tabs in the prefs dialogue
+	(instead of the minimum one) -- why didn't anyone tell me?
+
+	BUGFIX: when deleting songs, sometimes adjacent songs got edited
+	(took title or artist... of the deleted song). Hopefully fixed --
+	please report.
+
+	BUGFIX: after reordering columns in the song view, the selection
+	of which columns are to be displayed went haywire -- fixed.
+
+	BUGFIX: fixed memory holes in pm_data_compare_func(),
+	st_data_compare_func(), sm_data_compare_func(),
+	get_ipod_used_space(), get_ipod_free_space(),
+	charset_to_description(), add_playlist_by_filename(),
+	sm_cell_edited().
+
+	NEW: Italian translation catalogue (almost complete)
+
+gtkpod V0.51
+	NEW FEATURE: Synchronize directories (removed songs can be deleted
+	automatically).
+
+	NEW FEATURE: gtkpod remembers charset used when initially
+	importing a song and uses this when "updating" the song
+	information from file or writing tags to file (needs extended
+	information enabled).
+
+	NEW FEATURE: display free space on iPod.
+
+	NEW FEATURE: menu item "Arrange Sort Tabs" to make all visible
+	sort tabs the same size
+
+        IMPROVEMENT: gtkpod should now compile "out of the box" under
+	FreeBSD and NetBSD (some adaptations were necessary before).
+
+        IMPROVEMENT: added all supported charsets provided by "iconv -l"
+	to the list of charsets to choose from. Code assumes that "iconv
+	-l" returns a list with the name of one charset in each line, each
+	valid line being terminated by "//".
+
+	IMPROVEMENT: new song column types: file size, play time,
+	avg. bitrate
+
+	BUGFIX: changed playlength code to that used by mp3info. It's much
+	slower but seems to be more reliable.
+
+	BUGFIX: fixed "dead" context menu "Alphabetize"
+
+gtkpod V0.50
+	NEW FEATURE: context sensitive popup menues (right mouse button
+	click in playlist view, sort tabs or song view.
+
+	NEW FEATURE: play song with xmms (two user definable commands).
+
+	NEW FEATURE: option to mount the iPod directory on startup and
+	unmount it on exit.
+
+	NEW FEATURE: mount/unmount ipod directory on startup/exit, and/or
+	execute ~/.gtkpod/gtkpod.in,out (or /etc/gtkpod/gtkpod.in,out if
+	the former doesn't exist) on startup/exit. First gtkpod.in is
+	executed, then the ipod is mounted (if this option is
+	activated). On exit, it's the other way round.
+
+	NEW FEATURE: read global prefs /etc/gtkpod/prefs if
+	~/.gtkpod/prefs does not exist. Useful, e.g. to set a machine-wide
+	default mountpoint for the ipod.
+
+	IMPROVEMENT: "Add Songs" and "Add Directory" has a new default
+	behaviour. They will now add songs/directories to the currently
+	selected playlist. If no playlist is selected, they add to the
+	master playlist.  "Add Playlist" will still create a new playlist
+	before adding the songs into it. Also, when playlist files are
+	added with "Add Songs" or "Add Directory" and no playlist is
+	selected, a new playlist will be selected for each playlist file.
+
+	NEW FEATURE: user settable: save song order after sort action
+	automatically?
+
+	NEW FEATURE: columns in song view can be dragged into any
+	order. Order will be saved.
+	
+        Change of copyright: itunesdb.c and itunesdb.h are now under the
+	GNU Lesser General Public License to make it easier to use the
+	code in other programs.
+
+	BUGFIX: when writing tags to file, all tags were updated even if
+	you selected only to update changed tags in the the preferences.
+
+	NEW FEATURE: drag and drop files/directories/playlists from
+	konqueror or nautilus directly into the song view. The songs will
+	be inserted at the specified position. You must already have some
+	songs displayed or a drop is not possible. In that case you should
+	drop into the playlist view since obviously you don't care about
+	the exact position of the files in the playlist (will be added at
+	the end).
+
+	NEW FEATURE: drag and drop files/directories/playlists from
+	konqueror or nautilus directly into the playlist view. If you drop
+	between playlists a (number of) new playlist(s) will be created
+	for the drop. If you drop onto a playlist, the songs will be added
+	into that playlist. Alpha-Version!
+
+	IMPROVEMENT: speed-up of display refreshs.  - Import of iTunesDB
+	with full non-blocked display: 4x as fast (51'' against 3'35'' on
+	my 2459 songs) - Refresh of first sort tab, non-blocked: 20x as
+	fast (0.65'' against 13'' on my 2459 songs) - Refresh of first
+	sort tab, blocked: 60x as fast (0.13'' against 7.8'' on my 2459
+	songs) - Refresh of song list, non-blocked: 2x as fast (9''
+	against 18'' on my 2459 songs)
+
+gtkpod V0.43-1 28-Feb-2003
+	BUGFIX: After DND operation songs were displayed twice in the
+	master playlist (this was just a display artifact).
+
+gtkpod V0.43 27-Feb-2003
+        Preventive BUGFIX: in the code to import the iTunesDB all absolute
+	references to positions in the iTunesDB were removed. Instead
+	itunesdb.c now uses the header information to find the headers it
+	needs. This should make it more reliable to read third party
+	iTunesDB. This was also part of the problem with the ephpod import
+	problem below (the other half of the problem was ephpod's not
+	really conformant way of writing the database).
+
+        BUGFIX: some iTunesDBs produced by ephpod could not be read (hang
+	after reading the songs and before adding the playlists).
+        
+	New Feature: update song information from file when adding songs
+	with identical filename (option)
+	
+        New Feature: update song information from file of selected songs
+	(ctrl-u and menu item)
+
+	BUGFIX: copy_song_to_ipod() there was a <5% chance that songs were
+	overwritten by new songs during the copy process, if you deleted
+	songs before adding new songs.
+
+        BUGFIX: Deleting songs from the iPod only worked if you exported
+	the iTunesDB twice.
+	
+	New Feature: Add Playlists (m3u and pls)
+
+gtkpod V0.42 20-Feb-2003
+        Bugfix: on first start gtkpod complained it could not create
+	~/.gtkpod even though it could... (and vice versa).
+
+	Improvement: display update can now be interrupted, selection
+	changed at any time.
+
+	Bugfix: gtkpod now sets bitrate (average bitrate for VBR)
+
+        Improvement: export can be interrupted and be continued at a later
+	time. gtkpod will (hopefully) correctly remember which songs have
+	already been copied/deleted from your iPod.
+	
+	Improvement: removal and copy of songs during export is done in a
+	separate thread, so the display doesn't freeze on long file system
+	operations
+
+        Bugfix: Kentaro Fukuchi pointed out that MusicMatch (at least the
+	Japanese version) uses song IDs starting with 2 (and not with
+	53). gtkpod then dropped some of your songs -- fixed.
+        
+	Improvement: Delete works on entries in sort tabs now (ctrl-d and
+	new menu item)
+	
+	Improvement?: don't close dirbrowser window until after the songs
+	have been read.
+
+	Improvement: display is updated while writing tags to disk "in the
+	background"
+
+	Bugfix: sometimes deleted songs were not removed from the
+	display. Changing tags then could crash the program
+
+	Bugfix: convert filenames ot UTF8 based on the charset chosen in
+	the options window
+
+	Bugfix: don't try to access iPod based files when in offline mode
+
+gtkpod V0.41 01-Feb-2003
+	- minor bugfixes (just possible segfaults and such)
+	- window won't freeze during import/export/add operations
+	- better handling of duplicate songs (e.g. duplicate songs are now
+	  displayed in a window instead of on the console, if duplicate
+	  detection is switched on later, duplicate songs are removed but
+	  the playlists are preserved...)
+	- confirmation window when quitting gtkpod without saving data
+	- Drag-and-drop for sort tab entries
+	- Japanese langauge catalogue
+	
+gtkpod V0.40 26-Jan-2003
+	many new features:
+
+	- Playlists (Drag-and-drop support)
+	- Sort Tabs
+	- Duplicate Detection
+	- German language support
+	- Charset for ID3 tags can be set
+	- Offline modification of iPod contents (and later synchronisation)
+	- Preferences
+	
+gtkpod V0.10
+	basic tool to import/export songs to your iPod.

Added: trunk/README
===================================================================
--- trunk/README	                        (rev 0)
+++ trunk/README	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,1154 @@
+iPod, iTunes, Mac, Macintosh, iBook are trademarks of Apple Computer,
+Inc., registered in the U.S. and other countries.
+
+
+
+Donations are welcome: please go to
+https://sourceforge.net/project/project_donations.php?group_id=67873
+for details.
+
+
+*----------------------------------*
+|                                  |
+|            Contents              |
+|                                  |
+*----------------------------------*
+
+
+  - Using gtkpod
+  - Features
+     - Tracks
+     - Filter Tabs
+     - Playlists
+     - Photos
+     - Drag and Drop
+     - Duplicate Detection
+     - Preferences File
+     - Startup and Shutdown scripts
+     - Load iPod and eject iPod scripts
+     - Extended Information File
+     - Refresh (Update) Track Info From File
+     - Synchronize Directories
+     - Volume Normalization
+     - Podcasts
+     - Export of Tracks (Copy from iPod)
+     - Encoding of ID3 tags (charsets)
+     - Extracting tag information from the filename
+     - Checking iPod's files
+     - Restoring your iPod after file system error
+     - Playcounts & Rating
+     - About filenames
+  - Icons for window managers
+  - Connecting iPod to a Linux box:
+  - Sick of loading the sbp2 modules by hand? (an example of how to
+    use startup/shutdown scripts)
+
+*----------------------------------*
+|                                  |
+|          Using gtkpod            |
+|                                  |
+*----------------------------------*
+
+
+1) If your iPod is not mounted automatically when connecting it to
+   your computer follow steps 1-7 in the "Connecting your iPod to a
+   Linux box" (basically you need to get the iPod partition mounted to
+   /mnt/ipod).  In most cases this should not be necessary any more
+   these days.
+
+2) If you are using GNOME, starting with V1.0 of gtkpod your iPod will
+   be automatically loaded and displayed within gtkpod once you
+   connect it to your box. Otherwise:
+
+   - Use "Load iPods" to import the contents of your old iTunesDB (you
+     may have to specify the correct mountpoint: right-button click on
+     the "iPod" repository, select "Edit iPod's Properties" and change
+     the mountpoint).
+
+3) Use "Add Files", "Add Directories" or DND to add files or
+   directories.
+
+4) Use "Eject iPod" in the context menu or click on the icon to the
+   left of the iPod name to write the added files to the iPod and
+   create a new iTunesDB and unload the iPod from gtkpod.
+
+5) Unmount your iPod. The easiest way is to use the windowmanager. If
+   this is not an option for you continue with step 8-11 of the
+   "Connecting your iPod to a Linux box" section (basically describing
+   how to unmount and disconnect your iPod).
+
+   You can automate the unmounting by adding creating a
+   ~/.gtkpod/gtkpod.eject file with the following line in it (without
+   the quotation marks): "eject $1"
+
+
+*----------------------------------*
+|                                  |
+|            Features              |
+|                                  |
+*----------------------------------*
+
+Tracks
+-----
+
+- You can add individual tracks, entire directories recursively, or
+  existing playlists using "Add Files". A file selection dialogue will
+  appear. By default existing tracks (same full filename) will be skipped.
+- You can add directories recursively using "Add Dirs". A directory
+  selection dialogue will appear.
+- You can add existing playlists using "Add Playlists"
+- You can delete tracks by marking them and pressing the "Ctrl-d" . If
+  you delete tracks from the master playlist (the topmost playlist,
+  called "gtkpod" by default).  You can also delete tracks by selecting them,
+  and using "Delete Track" in the Edit menu or from the context menu.
+- You can update ID3 tags of selected tracks in gtkpod from the mp3
+  file by pressing "Ctrl-u" or choose "Update track info from file" in
+  the Edit menu or from the context menu.
+- You can rename ID3 tags by editing the fields in gtkpod. You can
+  change an entire group of ID3 tags by editing an entry in the sort
+  tab (or mark several tracks and edit the first).
+- You can specify which tags to display in the preferences window
+- You can specify (in the prefs window) if the ID3 tags of the
+  corresponding mp3 file(s) should also be updated
+
+
+Filter Tabs
+-----------
+
+- The two notebooks above the track display are called "Filter Tabs"
+- They allow you to filter which tracks to display
+- If you edit an entry in the filter tab, the corresponding entry in all
+  associated tracks will be updated as well. When writing the tags to
+  disk as well, updating of a large number of tracks may take a while
+
+
+Playlists
+---------
+
+- You can create playlists with "New Playlist" or pressing "Ctrl-n" in
+  the playlist listview.
+- You can also create playlists by adding an existing playlist file
+  with "Add file" or "Add playlist".
+- You can add tracks to playlists by marking the tracks you want to add,
+  and then dragging them onto the playlist.
+- You can rename playlists.
+- You can delete playlists by selecting the desired playlist and pressing
+  "Ctrl-D", or by selecting "Delete Playlist" from the Edit menu.
+
+
+Photos
+------
+
+If your ipod supports photos then a special dynamic playlist is created in
+the playlist tree. YOU CANNOT DELETE IT! Indeed when clicking on it all the
+usual track related ipod functions are disabled or removed.
+
+Instead, the track window elements are replaced with the photo management pane.
+This displays the Photo Library and all the saved photos from the ipod and
+allows you to add new albums, add new images, remove albums, remove images and
+drag n drop image between albums.
+
+You cannot delete the Photo Library as this is the original photo database. All
+images are stored in it and thus clicking on it, all the images on the ipod are
+displayed in it. Subsequent albums display a subset of the Photo Library's images.
+
+Removing an image from an album will remove it from the album but it will still
+be stored on the ipod in the Photo Library.
+
+Removing an image from the Photo Library will delete it completely from the ipod.
+
+You can select a set of images from a selected album (inc. the Photo Library) and
+drag n drop them into another album.
+
+Any changes made in the photo management window will change the Photo playlist to
+italics indicating that a "Save Changes" should occur before exiting in order to
+preserve those changes.
+
+
+Drag and Drop
+-------------
+
+Drag and Drop can be used in several ways:
+
+1) gtkpod internal
+
+- Playlists, entries of a filter tab, and tracks can be dragged.
+
+- A drop _onto_ an existing playlist will add the tracks to that
+  playlist
+
+- A drop _between_ two existing playlists or behind the last playlist
+  will create a new playlist to which the tracks are added.
+
+- The default action for the drop is either move or copy as appears
+  appropriate (e.g. playlists are moved within a database ('local' or
+  'iPod/Shuffle'), but copied when dragged across different
+  databases).  The applicable action is displayed within the drag
+  icon and can be changed by pressing the control key during the drop. 
+
+2) between external file browser and gtkpod
+
+- Tracks, directories or playlist files can be dropped onto the
+  playlist view or track view. Drops between two existing playlists
+  create a new playlist.
+
+3) between external web browser and gtkpod
+
+- jpg files can be displayed in a web browser (eg. firefox, konqueror)
+  and dragged onto the coverart display or the image in the Edit Details
+  window. This will download the jpg to the album's directory then apply
+  it to the album's tracks. In the case of Edit Details, the jpg will
+  only be applied to the selected tracks (or only the one track if the
+  "Change all track simultaneously).
+  
+Preferences File
+----------------
+
+On startup gtkpod will read the preferences from ~/.gtkpod/prefs (or
+/etc/gtkpod/prefs if the former doesn't exist).
+
+
+Startup and Shutdown Scripts
+----------------------------
+
+After reading the preferences file gtkpod will try to execute
+~/.gtkpod/gtkpod.in (or /etc/gtkpod/gtkpod.in if the former doesn't
+exist) during startup.
+
+Just before exiting the program, gtkpod will try to execute
+~/.gtkpod/gtkpod.out (or /etc/gtkpod/gtkpod.out if the former doesn't
+exist).
+
+Please see the section "Sick of loading the sbp2 modules by hand?" for
+an example of how to use this functionality.
+
+
+
+Load iPod and eject iPod scripts
+--------------------------------
+
+Before loading the contents of an iPod, gtkpod will call
+~/.gtkpod/gtkpod.load with the iPod's mountpoint as the only
+command line argument. Put any commands here needed to access the
+iPod, for example if you need to mount the iPod manually.
+
+When ejecting an iPod, gtkpod will call ~/.gtkpod/gtkpod.eject
+with the the iPod's mountpoint as the only command line argument. Put
+any commands here you want to execute after gtkpod has written the
+changes to the iPod. One major candidate will probably be 
+
+sudo eject $1
+
+gtkpod will not attempt to do any magic of it's own to
+mount/unmount/eject the iPod.
+
+
+
+Duplicate Detection
+-------------------
+
+You can instruct gtkpod (in the prefs window) to use
+file-size-dependent SHA1 checksums to prevent the same file from
+being copied to your iPod twice.
+
+If a duplicate is detected, gtkpod will print out the the filenames
+of the duplicate files. If the filename of the already existing file
+is not available (it is not stored in the iTunes database, see
+"Extended Information File" below), other available information of
+the track is printed.
+
+
+Extended Information File
+-------------------------
+
+Some (I believe) essential information is not stored in Apple's iTunes
+database. You can therefore instruct gtkpod to write an additional
+file (iTunesDB.ext) with extended information. For each track it stores
+
+  - SHA1 hash
+  - filename in the locale's encoding
+  - filename in UTF8 encoding
+  - hostname where the file was added (not used for anything yet)
+  - filename of an associated converted file (for example an .mp3 for
+    a .flac file)
+  - if the file is present in the local database a reference to there
+    in order for playcounts to work on the local database as well
+  - last modification time
+  - the charset used for the file when adding it
+
+Since the extended information file is only valid with the
+corresponding standard iTunes database, a checksum of the iTunes
+database is also stored in the extended information file.
+
+Using an extended information file will considerably speed up the
+import of an existing iTunes database when using duplicate detection,
+since the SHA1 checksums do not have to be re-calculated.
+
+Using an extended information file will also allow modification of ID3
+tags in the track files after the initial import, because the full
+filenames are still available.
+
+
+Refresh (Update) Track Info From File
+------------------------------------
+
+If you have changed the ID3 tags of your original file, you can update
+the ID3 tags stored in gtkpod without removing and re-adding the
+track. Simply select the track to be updated and press "Ctrl-u" or
+choose "Update Track Info From File" from the Edit menu. Since gtkpod
+needs to know the filename of the track, the "Extended Information
+File" (see above) is needed.
+
+"Update" will also re-read the replay-gain tags from disk, if
+available, and set the soundcheck field. If no replay-gain tag is
+available, the soundcheck field will be erased.
+
+You can also select entries in the filter tab or entire playlists for
+refresh.
+
+
+Synchronize with Directories
+----------------------------
+
+If you have added files to directories or changed files in directories
+you have previously added tracks from, you can use the "Synchronize
+Dirs" utility to update your iTunesDB.
+
+"Synchronize with Dir(s)" will use the selected tracks to make a list
+of directories to update, so you should activate the "Write Extended
+Information" option in the export section of the preferences dialogue.
+
+It will then add all non-existing tracks in those directories and
+update (see "Refresh") all existing tracks. The tracks are also added to
+the currently selected playlist, if they aren't already a member.
+
+Tracks that have been removed from the directory will only be removed
+from the iTunesDB if this option is checked in the option dialogue.
+
+For best results you should also activate duplicate detection. This
+avoids unnecessary copying of unchanged tracks.
+
+
+
+Volume Normalization
+--------------------
+
+There are two fields in the iTunesDB that allow to adjust the volume
+of an individual track: the volume field (a signed integer) and the
+soundcheck field (in dB). The volume is always active, whereas the
+soundcheck field is only active when you select 'soundcheck' on the
+iPod. Further, the soundcheck field only affects the earphone output
+but not the line output of the iPod.
+
+gtkpod will set the soundcheck according to the replay-gain tag set in
+your mp3 file. Newer versions of 'lame' automatically include the
+replay-gain tag when encoding. In that case the soundcheck field will
+be filled in when you first import a track.
+
+If no replay-gain tag is set, you can use the function 'Normalize
+Volume' to call mp3gain (mp3gain.sourceforge.net) to calculate the
+gain and write a replay-gain tag. Since this procedure is very time
+consuming, it is not done automatically during import. You need to
+install mp3gain in the default path or set the full path in the
+'Tools' section of the preferences dialog. If the iPod is connected,
+the tag is written to the file stored on the iPod.
+
+At this time "album gain" functionality is not supported. "Album gain"
+means that the volume of all tracks of one album is adjusted by the
+same gain, such that the relative volume level remains the same. It is
+planned to realize this in one of the next versions.
+
+Also, please be aware that tracks are not normalized on a 'per
+playlist' fashion. If a track is normalized, it's normalized in all
+playlists it is a member of.
+
+Once the replay-gain tag has been read, it is stored in the extended
+information file 'iTunesDB.ext'. When you call 'Normalize volume'
+again, the stored value will be used to re-populate the soundcheck
+field. Use 'Update Track' to re-read the tag from the file.
+
+
+Podcasts
+--------
+
+You have to download podcasts using a third party tool like bashpodder
+(http://linc.homeunix.org:8080/scripts/bashpodder/) or gpodder
+(http://perli.net/projekte/gpodder/)
+
+Podcasts should be added directly into the 'Podcasts' playlist of the
+iPod repository, for example by selecting the Podcasts playlist before
+manually adding files/directories. Podcasts will then appear only in
+the Podcasts section on the iPod.
+
+If you add podcasts to the main playlist 'gtkpod/iPod' or any other
+iPod playlist first and then drag them over to the Podcasts playlist,
+the podcasts will appear in the Podcasts section on the iPod, as well
+as in the normal music section.
+
+The podcast 'repository' is a local repository (like 'Local') where
+you can keep all local podcasts. No mechanism exists to automatically
+synchronize the iPod repository with the Podcast repository at this
+time. You have to drag the podcasts over manually.
+
+
+Export of Tracks (Copy from iPod)
+---------------------------------
+
+- mark the tracks you want to export and select "Export Tracks from
+  Database" from the file menu (or use the context sensitive menu)
+- A file selection dialog window appears and you can choose the directory
+  you'd like the selected files to be written to.
+- You can specify the output filename in the prefs dialog by
+  specifying a template (e.g. "%A/%a - %t"). You can specify multiple
+  templates for different file formats by separating them by a
+  semicolon (e.g. "%A/%a - %t.mp3;%t.wav"). See the tooltip in the
+  prefs dialog for a list of identifiers.
+
+
+Encoding of ID3 tags (charsets)
+-------------------------------
+If you use correctly written unicode ID3V2 tags you don't have to
+worry about the charset setting.
+
+Otherwise you must specify the charset to be used for representing ID3
+tags in the preferences menu. The default is "System Charset", which
+is the charset associated with the locale gtkpod is running under. If
+your tags are stored in a different encoding, you should set it
+appropriately.
+
+Please note that if necessary you can change the charset each time you
+add files or directories: the iTunesDB itself is using UTF16, so once
+tags are imported correctly, changing the charset has no influence.
+
+If you chose "Japanese (automatic detection)", gtkpod will try to
+determine if the string is in ISO-2022-JP, Shift_JIS, or EUC-JP
+(Hankaku Katakana (1-byte Katakana) may not be recognized correctly --
+specify the correct encoding if you run into this problem). The actual
+encoding used for the ID tags will be stored and will be used when
+writing tags or doing updates/syncs. Check the "Use selected charset
+also when updating or syncing tracks" and "Use selected charset when
+writing tags" options if you want to specify a particular character
+set when writing or updating/syncing. The default charset is "EUC-JP"
+-- it will be used when the charset cannot be autodetected, as well as
+when writing tags if a specific charset could not be determined
+before.
+
+gtkpod will recognize ID3V2 tags encoded in unicode automatically and
+ignore your charset setting when necessary.
+
+
+Extracting tag information from the filename
+--------------------------------------------
+Tags can also be extracted from the filename if you activate the
+option 'Use this template to parse filename for tag information' and
+supply a template that explains how the filenames are constructed.
+
+For filenames like 
+    music/new/latin1/alan_jackson - drive/01 drive_for_daddy_gene.mp3
+you could use
+    %a - %A/%T %*.mp3
+
+to extract artist, album, track number and title.
+
+The following character sequences are supported:
+
+    %t: title
+    %a: artist
+    %A: album
+    %c: composer
+    %t: title
+    %g: genre
+    %T: track number
+    %C: CD number
+    %*: placeholder, ignore data
+    %%: the character '%'
+
+You cannot supply a template like "%a%t.mp3" because gtkpod would not
+know how to separate artist and title. "%a_%t.mp3" would be correct,
+if artist and title are separated by an underscore.
+
+You can also omit the trailing ".mp3" if you want the template to
+apply to all files instead of only to mp3 files.
+
+
+Checking iPod's Files
+---------------------
+For whatever reason -- it may happen that tracks are present in your
+iTunesDB that are no longer present on the iPod (dangling tracks), or
+that tracks are on the iPod but not in the iTunesDB (orphaned
+tracks).
+
+The function "Checking iPod's Files" under the "File" menu will
+identify both types and take the following actions:
+
+Orphaned tracks:
+A new playlist "[Orphaned]" will be created with all orphaned tracks
+in it. The only exception are orphaned tracks that would become
+duplicates (if duplicate detection is activated). Those are marked for
+deletion with the next sync.
+
+Dangling tracks:
+These tracks will be marked for deletion with the next sync unless the
+original PC file is still available. In that case you can have them
+restored with the next sync.
+
+
+Restoring your iPod after file system error
+-------------------------------------------
+If iPod's file system gets corrupted and you need to reformat your
+iPod, there is a way to restore the contents semi-automatically if you
+have been using the "write extended information file" (iTunesDB.ext)
+options:
+
+ - If the directory structure on the iPod doesn't exist yet,
+   load the iPod in gtkpod and have it created for you. Then unload
+   the iPod again.
+
+ - copy your backup files in .gtkpod/ (usually iTunesDB and
+   iTunesDB.ext) to your iPod (usually
+   <mountpoint>/iPod_Control/iTunes/
+   On the iPod the files must be named iTunesDB and iTunesDB.ext.
+
+ - load the iPod in gtkpod
+
+ - select the iPod repository and start "Check iPod's files" from the
+   File menu
+
+ - unload the iPod (or save changes)
+
+This should restore your iPod to what it was before, provided you
+didn't move or remove any of the original tracks on your harddrive, and
+the charset information was stored correctly.
+
+
+Playcounts & Rating
+-------------------
+
+Whenever you play a track completely on the iPod (firmware version 1.3
+or higher) a counter in the "Play Counts" file will be increased by
+one. The same file also contains the rating you can set with the 3rd
+generation iPods.
+
+This file appears to be deleted whenever the iPod resets itself --
+e.g. because you disconnect it from the computer. Therefore, be
+careful... Charging the iPod seems to do no harm.
+
+When gtkpod is started, it will also read this file and incorporate
+the information into the iTunesDB that can be written back to the
+iPod.
+
+There have been several requests to also register playcounts when
+playing a track on the local machine. This is possible by calling
+gtkpod as "gtkpod -p <filename>".
+
+If gtkpod is already running, the playcount of that track there will
+be increased by one. If gtkpod is not already running, the playcount
+will be registered in ~/.gtkpod/offline_playcount. This file will be
+read the next time you import the iTunesDB from your iPod, and the
+playcounts will be updated accordingly.
+
+Please note that if you start several instances of gtkpod, only the
+first instance will register playcounts through "gtkpod -p".
+
+Now all you have to do is tell your favorite player to call gtkpod
+with the filename of the played track.
+
+For xmms this is possible as of July 18th, 2004 (CVS
+version). Versions before that (including 1.2.10) only allow you to
+have an external program called at the beginning of a track. Our patch
+allows to have an external program called also at the end of a track.
+
+In each case you will need to activate the "General Plugin" called
+"song_change" and configure it to call 'gtkpod -p "%f"'.
+
+
+About filenames (excerpt from the GTK2 release notes):
+------------------------------------------------------
+* The assumption of GLib and GTK+ by default is that filenames on the
+  filesystem are encoded in UTF-8 rather than the encoding of the locale;
+  The GTK+ developers consider that having filenames whose interpretation
+  depends on the current locale is fundamentally a bad idea.
+
+  If you have filenames encoded in the encoding of your locale, then
+  you may want to set the G_BROKEN_FILENAMES environment variable:
+  
+   G_BROKEN_FILENAMES=1
+   export G_BROKEN_FILENAMES
+
+  Best integration of GTK+-2.0 with the environment is achieved by 
+  using a UTF-8 locale.
+
+------ end of excerpt
+
+It is my feeling that many people use filenames encoded in the
+encoding of the locale. The "Add directories" dialogue already takes
+care of this and assumes the filenames to be in the same encoding as
+you have specified for the ID3 tags (see above). You can therefore
+forget about the excerpt above.
+
+However, the "Add Files" and "Add Playlists" dialogue (at the moment)
+uses the standard GTK+-2.0 file selection dialogue. Therefore I have
+no access on the conversion functions used, and a warning is printed
+when filenames are encountered that are encoded in an encoding other
+than the one of the current locale. ID3 tags are still read correctly
+(according to the charset set in the preference dialogue).
+
+
+*--------------------------------------------------*
+|                                                  |
+|  Environment variables		           |
+|                                                  |
+*--------------------------------------------------*
+
+The following environment variables can be set if needed:
+
+IPOD_MOUNTPOINT: Defines the mountpoint of the iPod. This overwrites
+the value stored in the prefs, but is overwritten by the command line
+argument "-m" or "--mountpoint".
+
+GTKPOD_DF_COMMAND: Only used on systems without statvfs(). Defines the
+"df" command to be used for probing the free space on the iPod
+including command line arguments. Default is "df -k -P". On some
+systems it may be necessary to remove the "-P" option. The mount point
+is added to this command line automatically. You can switch off calls
+to df by setting this environment variable to an empty string.
+
+
+
+*--------------------------------------------------*
+|                                                  |
+|  Icons for window managers		           |
+|                                                  |
+*--------------------------------------------------*
+
+Should you require an icon for your window manager you can use those
+provided in $(datadir)/pixmaps (usually
+/usr/local/share/gtkpod/pixmaps or
+/usr/share/gtkpod/pixmaps).
+
+Currently the following files are available:
+
+  gtkpod-icon-32.png
+  gtkpod-icon-32x32.png
+  gtkpod-icon-32x32-2.png
+  gtkpod-icon-48.png
+  gtkpod-icon-48x48.png
+  gtkpod-icon-64x64.png
+
+
+*--------------------------------------------------*
+|                                                  |
+|  Connecting iPod to a Linux box	           |
+|  (kernel 2.6.6)                                  |
+|  (should also work with earlier 2.6 kernels)     |
+|                                                  |
+*--------------------------------------------------*
+
+This describes how to set up the iPod together with the automounter in
+kernel V2.6.6 (some minor changes in the kernel configuration may be
+necessary for older V2.6 versions).
+
+1) It appears to be possible to use HFS-formatted (Apple)
+   iPods. However, this short guide assumes you have a Windows
+   (VFAT) iPod. For conversion from HFS to VFAT please see 
+
+   http://www.blinkenlights.ch/gnupod/gnupod.html#SEC6
+
+2) I'm using the following kernel configuration options (I'm only
+   using FireWire -- so the USB options are just educated
+   guesses. Please let me know if it works).
+
+   I'm not using modules, simply because what's compiled in can't fail
+   loading.
+
+    * General Setup  -> Support for hot-pluggable devices - y
+    * Device Drivers -> SCSI device support - y
+    *                -> SCSI device support -> SCSI disk support - y
+    *                -> SCSI device support -> SCSI generic support - y
+For FireWire:
+    *                -> IEEE1394 (FireWire) support - y
+    *                -> IEEE1394 (FireWire) support -> OHCI-1394 support - y
+    *                -> IEEE1394 (FireWire) support -> SBP-2 support - y
+For USB:
+    *                -> USB support -> Support for Host-side USB - y
+    *                                       -> EHCI HCD support - y
+    *                                       -> OHCI HCD support - y
+    *                                       -> UHCI HCD support - y
+    *                                       -> USB Mass Storage support - y
+For USB and FireWire:
+    * Filesystems    -> DOS/FAT/NT Filesystems - y
+    *                -> DOS/FAT/NT Filesystems -> VFAT fs support - y
+    *                -> Kernel automounter version 4 support - y
+    *                -> Native Language Support
+    *                            -> Codepage 437 (CONFIG_NLS_CODEPAGE_437)
+    *                            -> NLS ISO 8859-1 (CONFIG_NLS_ISO8859_1) 
+
+
+
+(for iPods formatted with the HFS filesystem choose
+    * Filesystems -> Miscellaneous filesystems
+			   -> Apple Extended HFS filesystem support)
+
+At least for the new 4Gs and iPod minis you should _disable_
+(CONFIG_EFI_PARTITION, see Troubleshooting for more information):
+    * File Systems -> Partition Types -> Advanced Partition Selection
+		   -> EFI GUID Partition support
+
+3) You need to install the following external packages:
+
+   hotplug and udev (http://linux-hotplug.sourceforge.net/)
+   autofs (ftp.kernel.org:/pub/linux/daemons/autofs)
+
+   Most likely packages are available for your distribution.
+
+4) Write rules for udev (/etc/udev/udev.rules, add at the beginning)
+   to recognize your iPod automatically (mind the spaces within
+   "iPod...", and be aware that some distributions require a double
+   equal after the BUS keyword (BUS=="scsi"...)):
+
+BUS="scsi", SYSFS{model}="iPod            ", KERNEL="sd?2", NAME="%k", SYMLINK="ipod"
+
+   This will map /dev/sd?2 to /dev/ipod everytime you plug in your
+   iPod. That even works if you own more than one USB/Firewire device
+   that shows up as a harddisk, independent of the order in which you
+   connect the devices.
+
+   (You need to replace "sd?2" with "sd?1" (or maybe just "sd?") for
+   HFS formatted iPods.)
+
+   For more information on how to write udev rules please refer to
+   http://www.gamingclones.com/Howtos/udevrules.html. That document
+   gives an easy-to-understand introduction
+
+5) Set up autofs to automatically mount the iPod when you access it
+   and unmount it after 2 seconds of inactivity. In /etc/auto.master
+   add:
+
+/var/autofs/removable   /etc/auto.removable     --timeout=2,sync,nodev,nosuid,gid=autofs,umask=007
+
+   Adjust the gid,umask (and uid) values to whatever you need -- in this
+   example all users in the group "autofs" have read/write access, and
+   I have added all users that may access the iPod to the autofs group.
+
+   In /etc/auto.removable add
+
+ipod            -fstype=vfat            :/dev/ipod
+
+   (Obviously you need to change the filesystem type from 'vfat' to
+   'hfsplus' when you use an HFS formatted iPod.)
+
+   Then simply add a link from /mnt/ipod:
+
+   ln -s /var/autofs/removable/ipod /mnt/ipod
+
+
+Now your system is configured to mount the iPod every time you access
+/mnt/ipod and to unmount it again after two seconds of inactivity. You
+won't have to worry about doing mounting/unmouting yourself any more.
+
+
+
+*--------------------------------------------------*
+|                                                  |
+|  Connecting iPod to a Linux box (IEEE 1394)      |
+|  (kernel 2.4.21)                                 |
+|  (may also work with 2.4.20, but I didn't try)   |
+|  (instructions for 2.4.20 can be found below)    |
+|                                                  |
+*--------------------------------------------------*
+
+1) You need a Windows iPod. See e.g.
+
+http://www.blinkenlights.ch/gnupod/gnupod.html#SEC6
+
+for information about how to convert your mac iPod to a windows iPod.
+
+Alternatively, I have received a report that Alan Cox's patches
+(2.4.21-rc8-ac1, but 2.4.21-ac1 should work as well) include hfsplus
+support. That should allow you to use hfs formatted iPods. But beware:
+hfsplus support is still beta.
+
+2) Get kernel source and configure
+Needed configuration:
+
+    * Code maturity level options - y
+    * SCSI support - y
+    * SCSI disk support - y
+    * IEEE1394 (FireWire)/IEEE 1394 (FireWire) support (Experimental) - y
+    * OHCI-1394 support - y
+    * SBP-2 support - m (important to use module -- if someone finds
+      out how to use hotplug with sbp2 compiled in, let me know)
+      (With 2.6.1 compiling sbp2 in seems to work fine.)
+At least for the new 4Gs and iPod minis you should _disable_
+(CONFIG_EFI_PARTITION, see Troubleshooting for more information):
+    * File Systems -> Partition Types -> Advanced Partition Selection
+		   -> EFI GUID Partition support
+    *              -> Native Language Support
+    *                            -> Codepage 437 (CONFIG_NLS_CODEPAGE_437)
+    *                            -> NLS ISO 8859-1 (CONFIG_NLS_ISO8859_1) 
+
+
+3) Create /mnt/ipod:
+
+   mkdir /mnt/ipod
+
+4) Add a line to /etc/fstab. You should edit uid to match your user
+   id. Also, /dev/sda2 may not be appropriate, if you have other scsi
+   devices.
+
+/dev/sda2	/mnt/ipod	vfat rw,user,noauto,noatime,errors=remount 0 0
+
+   (For HFS this line should read
+
+/dev/sda  /mnt/ipod  hfsplus  rw,user,noauto,exec  0  0
+
+    please note that it's just '/dev/sda')
+
+
+NOTE: Some users have had problems with newer versions of mount(newer than
+mount-2.11h) The following fstab entry might work better for you.
+
+/dev/sda2	/mnt/ipod	vfat rw,user,noauto,noatime,shortname=winnt 0 0
+
+5) Install the hotplug utilities
+   (http://linux-hotplug.sourceforge.net/, debian package: 'hotplug')
+
+   (If you don't want to use the hotplug utilities, you must call the
+   rescan-scsi-bus.sh (see below) by hand after loading the sbp2
+   module. This is different from 2.4.20.)
+
+5a) Add the ieee1394 hotplug support (described at
+    http://www.linux1394.org/faq.html#hotplug):
+
+   - copy ieee1394.agent to /etc/hotplug/ from
+     http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/linux-hotplug/admin/etc/hotplug/
+   - mkdir /etc/hotplug/ieee1394
+   - create /etc/hotplug/ieee1394/sbp2:
+       #!/bin/bash
+       if [ "${ACTION}" = "add" ]; then
+	 . /etc/hotplug/ieee1394/rescan-scsi-bus.sh
+       else
+	 . /etc/hotplug/ieee1394/rescan-scsi-bus.sh -r
+       fi
+   - chmod +rx /etc/hotplug/ieee1394/sbp2
+   - copy rescan-scsi-bus.sh to /etc/hotplug/ieee1394 from
+     http://www.garloff.de/kurt/linux/rescan-scsi-bus.sh
+   - just to be sure: restart hotplug:
+	/etc/init.d/hotplug restart
+
+6) Connect your iPod to your computer and wait until you see something
+   like the following on your system log (you can use the 'dmesg'
+   command to check).
+
+Jun 15 17:13:53 hatarakibachi kernel: ieee1394: Node 00:1023 changed to 01:1023
+Jun 15 17:13:55 hatarakibachi kernel: ieee1394: Node 01:1023 changed to 00:1023
+Jun 15 17:13:57 hatarakibachi kernel: ieee1394: sbp2: Logged into SBP-2 device
+Jun 15 17:13:57 hatarakibachi kernel: ieee1394: Device added: Node[00:1023]  GUID[000a2700020680b5]  [Apple Computer, Inc.]
+Jun 15 17:13:57 hatarakibachi kernel: ieee1394: Node 00:1023 changed to 01:1023
+Jun 15 17:13:57 hatarakibachi kernel: scsi singledevice 0 0 0 0
+Jun 15 17:13:57 hatarakibachi kernel:   Vendor: Apple     Model: iPod              Rev: 1.30
+Jun 15 17:13:57 hatarakibachi kernel:   Type:   Direct-Access                      ANSI SCSI revision: 02
+Jun 15 17:13:57 hatarakibachi kernel: Attached scsi removable disk sda at scsi0, channel 0, id 0, lun 0
+Jun 15 17:13:57 hatarakibachi kernel: SCSI device sda: 39062520 512-byte hdwr sectors (20000 MB)
+Jun 15 17:13:57 hatarakibachi kernel: sda: test WP failed, assume Write Enabled
+Jun 15 17:13:58 hatarakibachi kernel:  sda: sda1 sda2
+Jun 15 17:13:58 hatarakibachi kernel: scsi singledevice 0 0 1 0
+...
+
+7) Mount the iPod hard drive
+
+   mount /mnt/ipod
+
+8) do whatever you need to do (e.g. start gtkpod, see below)
+
+9) Unmount the iPod:
+
+    umount /mnt/ipod
+
+10) Unload the module sbp2 (as most likely as root):
+
+    rmmod sbp2
+
+11) Disconnect the iPod from your computer (ignore the "Do not
+    disconnect" message -- as long as you wait for the 'unmount' to
+    command to finish properly, everything should be fine).
+
+
+
+*--------------------------------------------------*
+|                                                  |
+|  Connecting iPod to a Linux box using IEEE 1394  |
+|  (kernel 2.4.20)                                 |
+|  (connecting to 2.4.21 seems to work slightly    |
+|   differently -- see above)                      |
+|                                                  |
+*--------------------------------------------------*
+
+1) You need a Windows iPod. See e.g.
+
+http://www.blinkenlights.ch/gnupod/gnupod.html#SEC6
+
+for information about how to convert your mac iPod to a windows iPod.
+
+Alternatively, I have received a report that Alan Cox's patches
+(2.4.21-rc8-ac1, but 2.4.21-ac1 should work as well) include hfsplus
+support. That should allow you to use hfs formatted iPods. But beware:
+hfsplus support is still beta.
+
+2) Get kernel source and configure
+Needed configuration:
+
+    * Code maturity level options - y
+    * SCSI support - y
+    * SCSI disk support - m
+    * IEEE1394 (FireWire)/IEEE 1394 (FireWire) support (Experimental) - y
+    * OHCI-1394 support - y
+    * SBP-2 support - m
+At least for the new 4Gs and iPod minis you should _disable_
+(CONFIG_EFI_PARTITION, see Troubleshooting for more information):
+    * File Systems -> Partition Types -> Advanced Partition Selection
+    *	   	   -> EFI GUID Partition support
+    *              -> Native Language Support
+    *                          -> Codepage 437 (CONFIG_NLS_CODEPAGE_437)
+    *                          -> NLS ISO 8859-1 (CONFIG_NLS_ISO8859_1) 
+
+3) Create /mnt/ipod:
+
+   mkdir /mnt/ipod
+
+4) Add a line to /etc/fstab. You should edit uid to match your user
+   id. Also, /dev/sda2 may not be appropriate, if you have other scsi
+   devices.
+
+/dev/sda2	/mnt/ipod	vfat rw,user,noauto,noatime 0 0
+
+   (For HFS this line should read
+
+/dev/sda  /mnt/ipod  hfsplus  rw,user,noauto,exec  0  0
+
+    please note that it's just '/dev/sda')
+
+
+NOTE: Some users have had problems with newer versions of mount(newer than
+mount-2.11h) The following fstab entry might work better for you.
+
+/dev/sda2	/mnt/ipod	vfat rw,user,noauto,noatime,shortname=winnt 0 0
+
+NOTE: You can add ",umask=0" to the options to make the iPod
+readable/writable for all users.
+
+5) Connect your iPod to your computer and wait until you see something
+   like the following on your system log (you can use the 'dmesg'
+   command to check).
+
+Nov 28 21:58:06 hatarakibachi kernel: ieee1394: Node 00:1023 changed to 01:1023
+Nov 28 21:58:09 hatarakibachi kernel: ieee1394: Node 01:1023 changed to 00:1023
+Nov 28 21:58:12 hatarakibachi kernel: ieee1394: NodeMgr: hotplug policy returned -2
+Nov 28 21:58:12 hatarakibachi kernel: ieee1394: Device added: Node[00:1023]  GUID[000a2700020680b5]  [Apple Computer, Inc.]
+Nov 28 21:58:12 hatarakibachi kernel: ieee1394: Node 00:1023 changed to 01:1023
+
+6) Load the sbp2 module (most likely as root):
+
+   modprobe sbp2
+
+   You should see something like the following on your system log:
+
+Nov 28 21:58:38 hatarakibachi kernel: ieee1394: sbp2: Logged into SBP-2 device
+Nov 28 21:58:38 hatarakibachi kernel: scsi0 : IEEE-1394 SBP-2 protocol driver (host: ohci1394)
+Nov 28 21:58:38 hatarakibachi kernel: $Rev$ James Goodwin <jamesg at filanet.com>
+Nov 28 21:58:38 hatarakibachi kernel: SBP-2 module load options:
+Nov 28 21:58:38 hatarakibachi kernel: - Max speed supported: S400
+Nov 28 21:58:38 hatarakibachi kernel: - Max sectors per I/O supported: 255
+Nov 28 21:58:38 hatarakibachi kernel: - Max outstanding commands supported: 8
+Nov 28 21:58:38 hatarakibachi kernel: - Max outstanding commands per lun supported: 1
+Nov 28 21:58:38 hatarakibachi kernel: - Serialized I/O (debug): no
+Nov 28 21:58:38 hatarakibachi kernel: - Exclusive login: yes
+Nov 28 21:58:38 hatarakibachi kernel:   Vendor: Apple     Model: iPod              Rev: 1.21
+Nov 28 21:58:38 hatarakibachi kernel:   Type:   Direct-Access                      ANSI SCSI revision: 02
+Nov 28 21:58:38 hatarakibachi kernel: Attached scsi removable disk sda at scsi0, channel 0, id 0, lun 0
+Nov 28 21:58:38 hatarakibachi kernel: SCSI device sda: 39062520 512-byte hdwr sectors (20000 MB)
+Nov 28 21:58:38 hatarakibachi kernel: sda: test WP failed, assume Write Enabled
+Nov 28 21:58:39 hatarakibachi kernel:  sda: sda1 sda2
+
+7) Mount the iPod hard drive
+
+   mount /mnt/ipod
+
+8) do whatever you need to do (e.g. start gtkpod, see below)
+
+9) Unmount the iPod:
+
+    umount /mnt/ipod
+
+10) Unload the module sbp2 (as most likely as root):
+
+    rmmod sbp2
+
+11) Disconnect the iPod from your computer.
+
+
+*--------------------------------------------------*
+|                                                  |
+|  Connecting iPod to a Linux box (USB)            |
+|                                                  |
+*--------------------------------------------------*
+
+I don't have much information about this so far (I don't own a third
+generation iPod). Please help me to fill in the gaps.
+
+Stephen Drye sent me the following note:
+
+"I've figured out how to get a USB-connected iPod recognized...:
+
+The trick to it is that you have to 
+
+- plug the iPod in
+
+- it'll fail to be recognized by the SCSI subsystem
+
+- now, even though your ipod says not to, unplug the USB cord and
+  immediately plug it back in.
+
+- since the iPod's hdd was already spun up, the SCSI subsystem now
+  recognizes it and mounts it as /dev/sda
+
+- You can then mount /dev/sda2 to /mnt/ipod as normal."
+
+On the other hand: with my 4G iPod under 2.6.9 and 2.6.10 I never had
+any problem whatsoever getting the iPod to work. With IEEE it was
+awful (would work some times, would not some other time).
+
+
+*----------------------------------*
+|                                  |
+|     Sick of loading the sbp2     |
+|         modules by hand?         |
+|                                  |
+|         Corey Donohoe            |
+|     <atmos at atmos dot org>     |
+|         March 22nd 2003          |
+|                                  |
+*----------------------------------*
+
+Sick of loading the sbp2 modules by hand every time you want to use your
+ipod?  Are you sick of mounting it too?  Using sudo gtkpod can make manually
+interacting with the ipod filesystem a thing of the past.  Note that you
+should have your ipod working with gtkpod before attempting this automated
+method, see the README that came with gtkpod in order to get things up and
+running.
+
+Here's a brief example of how I'm using gtkpod now in 8 easy steps.
+
+(Remark: the hotplug facility of new kernels can also load and unload
+the sbp2 module for you.)
+
+/**********/
+ * Step 1 *
+/**********/
+Using sudo allow users to load/remove the sbp2 module
+Example /etc/sudoers
+------------------------------- Begin Here ---------------------------------
+
+# Cmnd alias specification
+Cmnd_Alias IPOD=/sbin/modprobe sbp2 sbp2_force_inquiry_hack=1, /sbin/rmmod sbp2
+# User privilege specification
+atmos   ALL=(ALL) ALL
+atmos   ALL= NOPASSWD : IPOD
+
+------------------------------- End Here -----------------------------------
+I use the force inquiry hack cause I have an older iPod, if you normally can
+get by with /sbin/modprobe sbp2 then ignore the inquiry hack stuff.  Note
+that explicitly specifying which module to probe/remove keeps the user from
+being able to add/remove arbitrary modules.  This allows us to keep gtkpod
+as a user process, and execute commands the user wouldn't usually have
+enough rights to.
+
+/**********/
+ * Step 2 *
+/**********/
+Add a line similar to the below to your /etc/fstab, this will enable users
+to mount the ipod with read/write capabilities.  Example line assumes your
+ipod mount point is /mnt/ipod and your ipod is detected as /dev/sda
+
+------------------------------- Begin Here ---------------------------------
+/dev/sda2       /mnt/ipod       vfat    rw,user,noauto          0       0
+------------------------------- End Here -----------------------------------
+
+
+/**********/
+ * Step 3 *
+/**********/
+Then setup your /etc/gtkpod/gtkpod.in file to load the module when gtkpod is
+started.
+Example /etc/gtkpod/gtkpod.in
+------------------------------- Begin Here ---------------------------------
+
+sudo /sbin/modprobe sbp2 sbp2_force_inquiry_hack=1
+
+------------------------------- End Here -----------------------------------
+
+/**********/
+ * Step 4 *
+/**********/
+
+Then setup your /etc/gtkpod/gtkpod.out file to unload the module when gtkpod
+is exited.
+Example /etc/gtkpod/gtkpod.out
+------------------------------- Begin Here ---------------------------------
+
+sudo /sbin/rmmod sbp2 
+
+------------------------------- End Here -----------------------------------
+
+/**********/
+ * Step 5 *
+/**********/
+Then enable ipod automounting in the gtkpod prefs(in the misc tab).
+
+/**********/
+ * Step 6 *
+/**********/
+You're now ready to use gtkpod in a much nicer fashion.  Start by
+plugging in your ipod.  You should get a check mark with "OK to disconnect"
+displayed on your ipod.
+
+/**********/
+ * Step 7 *
+/**********/
+Start gtkpod, your ipod should be accessible(i.e. autoimport should work)
+A "Do Not Disconnect" message is displayed on your ipod while gtkpod is
+running.
+
+/**********/
+ * Step 8 *
+/**********/
+After you exit gtkpod, the "OK to disconnect" message should be displayed
+again.  It's ok to unplug your ipod now.  
+
+Good Luck. 
+
+
+
+*----------------------------------*
+|                                  |
+|           Known bugs             |
+|                                  |
+*----------------------------------*
+
+
+- Display of large number of tracks is awfully slow (mainly because of
+  the use of the standard GTK2 tree views) -> deactivate "Automatically
+  select "All" in first filter tab" and/or deactivate "Automatically
+  select master playlist". You could also "block the display" to speed
+  up the display update. Further, decreasing the window size
+  considerably speeds up the display.
+
+  I also want to point out that updating the info window takes up a
+  considerable amount of time. Update may become more intelligent in
+  the future -- until then close the info window for more speed.
+
+- When changing selections in the filter tabs while importing the
+  iTunesDB, sometimes the interface freezes. I tried to track this
+  problem down but only found out that gtk+ does not return control
+  back to gtkpod. Selecting the "All" filter tabs seems to unfreeze the
+  interface again.

Added: trunk/TODOandBUGS.txt
===================================================================
--- trunk/TODOandBUGS.txt	                        (rev 0)
+++ trunk/TODOandBUGS.txt	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,446 @@
+BUGS, TODO:
+
+- when auto-loading iPods: set backup path if not set.
+
+- move part of free-space-update to file_convert.c
+
+- when creating new repository: make sure backup repository filename isn't
+  already used.
+
+- don't keep iTunesDB on iPod when syncing (takes up valuable space)
+
+- fileselection_select_script(): display @additional_text.
+
+- modify "warning" when matching checksums: Send a patch that changes
+  the behavior from printing into the info window to opening a dialog
+  with the "never show this dialog again" button. Then add an option
+  to the preferences to get the dialog back.
+
+- save extended database when rehash was done, even if main database
+  is not changed.
+
+- handle missing .ext file more decently
+
+- Add tooltips back to the track attributes section of the prefs or find a
+  way to not need them.  Perhaps using shorter versions of the previous
+  tooltips in the lists would work.  That way, users wouldn't even need to
+  wait for the tooltip popup to know what the attribute was for.
+
+- unload iPods when exiting gtkpod (ask/option).
+
+- cddb lookup (http://freedb.freedb.org). See also
+  http://musicbrainz.org/doc/libmusicbrainzDownload
+
+- wildcards for filename templates (automatic setting of tags from
+  filename/cover art).
+
+- Actually, there is an option to see all the dirs that
+are going to be synced but it's impossible to change
+them.It would be nice to have a tree whit all the dirs
+and sub-dirs, like in the amarok colection maker, so we
+can have a full control of the sync dirs.
+
+- set flag3/4 automatically for podcasts.
+
+- support for www.last.fm
+
+  http://www.last.fm is a web site that you report your listening
+  habits to.  The site can then give you recommendations on other
+  music that you may also like. The site also has music charts for
+  users and also for the entire site.  You can tag music and they also
+  have a Radio that you can download and it plays songs for you. -
+  Joshua
+
+- retag tracks with database information
+
+- photo support
+
+- lyrics support (http://www.jcbsoft.net/podlyrics/)
+
+- itdb/misc_confirm.c: number of F?? directories should be determined
+  before starting copying files to the iPod. At the moment only 20
+  dirs are used no matter how many are present.
+  Creation of directories should be moved to itdb_*
+
+- more features for mserv
+
+- icons should be themable
+
+- Update calendar in special sort tab when changing category.
+
+- Give status when adjusting offline_playcount after import of
+  database (can take quite a while even for only 90 tracks).
+
+- Dangling/orphaned tracks
+    - Open a progress window to display information instead of the
+      statusbar messages.
+
+
+- "adjust volume by ...%" functionality
+
+- Pattern matching for tag extraction from filename should also work
+  from the beginning of the name towards the end, not only from the
+  end to the beginning (clear?)
+
+
+- multiple playlist delete, ctrl-d, wipe iPod.
+
+   Unless I'm missing something, I think it would be handy to have a
+   mulitple playlist delete capability, since it's quite tedious to
+   have to delete playlists one at a time.
+
+   Also I noticed ctrl-d didn't delete the playlists, which could be
+   my setup, I'm using Debian Unstable.
+
+   Finally in addition to mulitple playlist delete, how about a total
+   wipe of the ipod (with lots of 'are you sure?'s) thus making it
+   ready for a new setup.
+
+   HTH.
+
+- be able to select multiple genres, albums, etc. at the same
+  time. (should be possible -- difficulty is selecting several
+  playlists)
+
+
+Anton de Wet
+Feature Suggestion:
+  Also usefull would be able to set the "default" rating for all newly
+  added tracks.
+
+
+Satadru
+> It would be nice to have the ability to have some sort of shadow aac 
+> directory, that would have converted versions of all the songs in your 
+> library, if the song is a higher bitrate than 128kbps aac, so that you 
+> can get the most music onto your ipod.
+(+ recode to 128 kB when exporting)
+
+
+Torsten Curdt
+> * I love the type-and-filter-right-away search of iTunes!
+> * I miss the easy click-on-burn-audio-cd button
+>   (any way passing this over to the nautilus cdwriter?)
+  - doesn't DND work?
+> * the rating should be stars not a numbers. ...at least
+>   a control that is easier than entering a number
+> 
+
+kulenfuster at ...
+> Not sure from the documentation but it looks like there's no way to
+> sync tunes in the iPod into the desktop database.
+ > 
+> For instance situation:
+> 
+> Bob has two desktop machines - one at work, one at home.  He has
+> tunes on both machines, ripped from his CD collection.  The tunes at
+> home are upbeat, the tunes at work are chilled.  He keeps these two
+> CD collections separate so that he can play them on regular CD
+> players in each location.  He loads his new iPod with the tunes on
+> his home computer and then take it to work and loads further tunes
+> from the work machine.  When he gets home he is able to update his
+> home tune database with the tunes from work to give him a backup in
+> a single place in case his iPod fails.  I know there are workarounds
+> but it'd be great if this was something you could do automatically
+> with gtkpod.  If it is already, please let me know (and Woo Ha!).
+
+
+I have the 20G model and I have more "f" directories
+than gtkpod recognises. So gtkpod only fills up through f19, when
+really I have through f29. Everything works fine on the iPod, it's
+just that gtkpod refuses to put music into any of the other
+directories.
+
+
+On Tue, Mar 08, 2005 at 05:37:29PM +0000, Andy wrote:   
+> Can gtkpod do any mangling of the files as it loads them on to an iPod?
+> In particular, I was wondering if there was a way to inject an album
+> cover into a file's id3 as it goes in so my drive files can remain
+> pristine.
+> 
+> That is, let's say I have cover.jpg in each folder, but not in the files
+> themselves.  Could gtkpod be made to pick that up and put it in the id3
+> field for cover (so the iPod Photo can show it).
+
+
+
+> 1) Ich erstelle beim Import von MP3 die ID3 Tags aus den Dateinamen. 
+> Dabei wuerde ich noch eine Vorschau ganz gut finden, in der man 
+> ggf. noch manuell eingreifen kann. (Stefan Onken)
+
+- Darren Zimerman
+> As for improvements to gtkpod, the only one I can think of off the top 
+> of my head would be to have a list of available playlists in the 
+> right-click menu.  So instead of just "Add selection to new playlist", 
+> there would actually be list of current playlists (perhaps in a sub-menu).
+
+
+- immediate copying of added tracks to the iPod (when reading tracks
+  over a slow network they will still be in the buffer memory and
+  won't have to read over the network twice if they are copied right
+  away) (request by Seth Arnold)
+
+- album support (normalize all tracks of an album with the same gain)
+   for volume normalization
+
+- gtkpod-like browse of file system contents
+
+- upload text notes to iPod
+
+- add more progress dialogues (in general!)
+
+- add an option to let the user decide if all the gtkpod's
+  playlist must be updated on export.
+
+- on-the-fly resampling to a particular bit rate. I have 32 GB of
+  songs be cause some of them at at 192, but I only need them at 128
+  or so on the Ipod. Mus icmatch does this exact
+  thing. (zumpicon at verizon.net) JCS: this could be done along with an
+  arbitrary "conversion" on export: user provides a command line in
+  the prefs dialogue that is executed instead of the simple copy
+  command (should also support faac).
+> I think this could be implemented like this: (Juho Routakorpi)
+> 1. User adds a track (or a directory containing a track) in format X
+> 2. gtkpod notices this and adds this to conversion queue, starts conversion 
+> immediatelly in the background
+> 3. If all format X files aren't converted when user commits sync, then format
+> X songs are put to end of transfer queue
+> 4. Temporary files are deleted on exit (if user has chose so)
+
+
+
+
+-- John Pedersen
+> I have an Ipod mini, which stores roughly 4GB.  My music collection
+> is roughly 18GB.
+>
+> ITunes has a nice feature: each song has a checkbox in front of the
+> song name.  And in the ipod preferences, there's a setting called
+> "Only Update Checked Songs".
+>
+> So the checkmarks are a nice simple way to create a subset of my
+> collection.
+>
+> Usage: by default, the songs are all checked, so my first task was
+> to uncheck all these thousands of songs.  Solution: get a listing
+> view of ALL songs, and hold down the CTRL key while I uncheck a
+> song.  ALL songs in the list now become unchecked (takes a little
+> while of course).
+> 
+> Next, I want to re-check the individual albums and/or songs that I 
+> want to put back in the mini ipod selection.  For the most part, I 
+> select an artist, show ALL their songs, and CTRL-click a single  
+> checkbox.  Alternatively, I can select a single album, or even a 
+> single song.
+
+> I have a question: (Will Richey)
+>  - Could Offline mode be modified such that it handles the unmounting /
+>    remounting of the iPod?  I'd like to be able to leave gtkpod running,
+>    detach the iPod and see the changes, then reattach and reconnect.
+This would also include that gtkpod.in and gtkpod.out are called only
+if not in offline mode. When switching from offline to online, mount
+and gtkpod.in should be called. When switching from online to offline
+gtkpod.out should be called. Further, the README file should be edited
+to reflect the change.
+
+(Michael)
+> Second issue - when I delete a playlist and add a playlist with many of  
+> the same identical songs, it looks like gtkpod does in fact delete the   
+> files from the iPod and recopy them to the iPod.
+Yes -- once they are removed, they are removed.
+> 
+> It would be nice if it did not do that.
+Could be done by checking against the "pending_deletion" list by md5 hash
+before adding a new track.
+
+On Sun, Apr 24, 2005 at 11:59:00AM +0100, David Smith wrote:
+> Is there any way to reverse sync with directories on gtkpod, i.e press  
+> sync and it updates my directories FROM my ipod? At the moment all i can
+> do is manually add the files i know I have updated on my iPod to my
+> computer.
+
+Len Trigg:
+> > Another thing that confused me was the "sort tabs". Since they are
+> > used for filtering rather than sorting, they should really be named
+> > "filter tabs" or "filter panes". 
+
+
+
+
+Please feel free to submit further features.
+
+
+BUGLIST:
+
+- segfault when sorting the playlists (0.99.2)
+
+drag playlist to track view: (JCS)
+(gtkpod:19911): Gtk-CRITICAL **: gtk_text_buffer_emit_insert: assertion `g_utf8_validate (text, len, NULL)' failed
+
+(gtkpod:19911): Gtk-CRITICAL **: gtk_text_buffer_emit_insert: assertion `g_utf8_validate (text, len, NULL)' failed
+
+(gtkpod:19911): Gtk-CRITICAL **: gtk_text_buffer_emit_insert: assertion `g_utf8_validate (text, len, NULL)' failed
+
+
+
+- Eelco van Veldhuizen 
+> First all apoligise for my bad english, i'm from the neatherlands. I
+> have the following problem with my iPod when I select a playlist for
+> my wake up alarm. The iPod switches it back to "beep". This only
+> happens with the playlists from gtkPod. When I sync with iTunes I
+> can select the playlist for my alarm. Maybe you already know this
+> problem.. I have searched on the internet and found a couple of
+> people that have the same problem. But no solutions found... Mabey
+> you know a solution for this problem :)
+
+
+- during a long operation (menues are blocked) the user can still edit
+  the track data. This could potentially crash gtkpod -> need a way to
+  block editing as well without blocking navigation.
+
+- when deleting an entry in the last sort tab (of 2) sometimes gtkpod
+  crashes
+
+
+stefano.brozzi
+> 1. on creating a smart playlist with a rule on title name,
+>   only exact case matching is considered
+> 
+> 2. adding options during creation of a smart playlist thru the button +
+>   there is no autoresize of the modal window to keep " Ok " and " cancel "
+>   buttons inside of the windows.
+> 3. another problem is that the field "date added" is overwritten by
+> gtkpod.  At this moment I've something like 30gb of mp3 with a "date
+> added" field at the same date and second.
+
+
+
+Please add/report bugs as you find them (jcsjcs at users dot
+sourceforge dot net).
+
+
+-----------------------------------------
+Coverart (JCS):
+Dragging tracks with coverart from Local to iPod may not work. It will
+definitely not work for coverart embedded in the MP3 file.
+
+
+Equalizer: (Julien Oster)
+As you certainly have noticed, the internal iPod equalizer is causing 
+ugly clipping (and thus horrible bass distortion) when using bass 
+booster settings with a lot of MP3s. Googling around quickly revealed a 
+forum posts (http://www5.head-fi.org/forums/showthread.php?t=84088) 
+which suggests using mp3gain to lower the level of MP3s. That way, 
+clipping no longer occurs. The forum thread also reports that doing so 
+unfortunately also lowers the volume the MP3 is played, but that isn't 
+necessarily the case.
+
+I just spent some hours doing a lot of tests on MP3s with mp3gain and 
+gtkpod and I finally came to a solution to avoid every clipping problems 
+AND keeping the original volume in every case.
+
+Before you say "but gtkpod already has support for mp3gain!", please 
+read on. The mp3gain feature as it is implemented in gtkpod right now 
+does not solve any equalizer bass distortion problems, it just 
+normalizes the volume of all tracks. However, what I am suggesting here 
+actually doesn't change the volume of the tracks at all, it just removes 
+possible clipping and thus possible bass distortion.
+
+While experimenting, dealing with all those different volumes, gains, 
+soundcheck values, mp3gain settings and whatever else got me quite 
+confused. I don't want you to get a headache, it's already enough that I 
+got one ;-) So I'll show you step by step what you have to do to remove 
+clipping from an MP3.
+
+First of all, we need an MP3 to test the whole thing. Just choose an MP3 
+which shows horrible and clearly hearable clipping distortion when using 
+the "Bass Booster" equalizer setting on your iPod.
+
+Let's assume that you have that track available as /tmp/foo.mp3 on your 
+workstation. Uploading it without any change to your iPod and listening 
+to it may be fine when the equalizer is disabled, but when choosing 
+"Bass Booster" or another bass intensive setting, the levels of some of 
+the lower frequencies are boosted beyond a limit so that that ugly 
+distortion occurs. Not good.
+
+We can easily solve this issue by using mp3gain on the track, giving the 
+following output:
+
+/tmp% mp3gain -r -o /tmp/foo.mp3
+File    MP3 gain        dB gain Max Amplitude   Max global_gain Min
+foo.mp3 -7      -10.690000      39675.560208    190     126
+
+Note that the "-r" switch has to be there! Otherwise it doesn't work. 
+I'm not entirely sure, but it looks like without the -r switch, only the 
+volume information in the ID3 tag is changed while with -r, the relative 
+volume of every single frame is changed (fortunately, also without 
+reducing quality). To avoid clipping you have to volume the frames down.
+
+As you know, the "-o" switch is just for a nicer output and doesn't 
+affect how the file is handled.
+
+Now, after doing this, you can already upload the file to your iPod 
+using gtkpod. Looking at the soundcheck value after importing it shows 
+that it isn't 0 anymore but something slightly off, like 0,3 or 0,75, 
+however it's always close to 0.
+
+Playing it reveals no clipping at all! You can try out every equalizer 
+setting you want, mp3gain lowered the volume of the individual frames 
+enough to not get any frequency boosted beyond any limit by the equalizer.
+
+Happy now? No, there's still a problem: the distortion is gone, but the 
+volume is way too low now. Of course, you can just increase the volume 
+on your iPod, but sometimes even the highest volume actually seems a bit 
+low (even on uncapped iPods). However, even that problem can be solved.
+
+Let's look at the mp3gain output again:
+
+File    MP3 gain        dB gain Max Amplitude   Max global_gain Min
+foo.mp3 -7      -10.690000      39675.560208    190     126
+
+So, it tells us the volume of every frame has been decreased by 10.69dB. 
+If you would use mp3gain without the -r switch, -10.69 would be exactly 
+the same value that would have got written in the "soundcheck" field.
+
+But since we want to *increase* the playing volume to get the track back 
+to its original volume, we do the opposite: we write "10.69dB" in the 
+soundcheck field. Not as a negative value, but as a positive value!
+
+Doing so, enabling "Sound Check" on the iPod and listening to the track 
+again shows that the track volume is obviously back to original. But 
+checking with the equalizer also proves... still no clipping!
+
+Yay! So we have got rid of the clipping while still keeping the original 
+volume and we're completely happy now.
+
+Now, what do you think about implementing this functionality in gtkpod, 
+similar to the already existing normalize functionality? That would 
+really be great.
+
+Of course, there's still one possible drawback, which depends on what 
+you would like to have: using that method, nothing is actually 
+normalized. The volume of the tracks is the same as before. But if my 
+aching head isn't mistaken, skipping the "set the soundcheck field to 
+the opposite value of the applied gain"-step will also result in 
+normalization (also I still think the volume may be too low then, but I 
+also think you could fix this by setting the Soundcheck field to a fixed 
+value for all tracks).
+-------------------------
+
+
+
+
+
+Doc sites:
+
+http://www.kgarner.com/blog/archives/2005/01/11/fc3-hal-ipod/
+http://mpeters.us/linux/linux_pod.php
+http://users.ameritech.net/djfake/linux3.htm
+
+Karlan Mitchell:
+The program searches for an ipod, and mounts it
+Check out a little C program I created to make iPod use with linux 
+easier, A GUI would be great, but I don't do that.  The tool can be 
+found at http://karlan.us.to/devel/ipod
+If you would like to merge the code, please feel free to, I'd do it if 
+you'd accept a patch.

Added: trunk/TROUBLESHOOTING
===================================================================
--- trunk/TROUBLESHOOTING	                        (rev 0)
+++ trunk/TROUBLESHOOTING	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,245 @@
+Troubleshooting-FAQ:
+
+
+Contents:
+
+- Installed libmp4v2 or libgpod from source to /usr/local/lib, but
+  gtkpod is unable to locate libmp4.so.0 or libgpod.so.0
+
+- Files copied to gtkpod but they don't appear in the database (0.80,
+  Tony Williams)
+
+- Filenames on the iPod appear in DOS 8.3 format and syncing to the iPod
+  is not working as expected.
+
+- ./autogen.sh does not work
+
+- The following error message is displayed when accessing the device
+  (Markus Gaugusch, Justin Thiessen):
+     ieee1394: sbp2: aborting sbp2 command
+     Test Unit Ready 00 00 00 00 00
+
+- The following error message is displayed when accessing the device
+  (Ingo Reimann)
+     usb-storage: Attempting to get CSW...
+     usb-storage: usb_stor_bulk_transfer_buf: xfer 13 bytes
+     usb-storage: Status code -75; transferred 0/13
+
+- When connecting an iPod via USB to a 2.6 kernel machine the iPod will
+  be recognized but not work correctly. In /var/log/messages you'll
+  see the a bunch of "Buffer I/O error on device sd?" when connecting
+  the iPod (Jonas Bergler, Kevin Venkiteswaran)
+
+- SHUFFLE won't play music after reformatting (Mark Davis)
+
+- Calendar entries mixed up
+
+- m4a files created by faac cannot be added by gtkpod (gentoo)
+
+- gtkpod crashes when reading the iTunesDB (Fedora)
+
+- Problems connecting the iPod to Solaris/SPARC
+
+----------------------------------------------------------------------
+
+Installed libmp4v2 or libgpod from source to /usr/local/lib, but
+gtkpod is unable to locate libmp4.so.0 or libgpod.so.0
+
+
+If you install to /usr/local/lib please don't forget to add the path
+to LD_LIBRARY_PATH:
+
+     LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
+     export LD_LIBRARY_PATH
+
+You can add those lines to your ~/.bashrc or add it globally to
+/etc/profile.
+
+----------------------------------------------------------------------
+Files copied to gtkpod but they don't appear in the database (0.80,
+Tony Williams)
+
+I'm having a problem that I wonder if you've seen.  I've setup
+gtkpod.  launch it and add files.  I can hear the ipod harddrive
+spin up.  If I go onto the ipod directly I can see the space being
+used and can even see the new files on the ipod.  However the ipod
+interface doesn't show the new files and gtkpod keeps telling me
+that there are orphaned files.
+
+Solution:
+
+I finally figured out the problem.  In my fstab I had the filesystem
+set to 'auto' and it was mounting as msdos instead of vfat.  I
+specified vfat in fstab and voila!  I'm a happy happy man.
+
+
+----------------------------------------------------------------------
+Filenames on the iPod appear in DOS 8.3 format and syncing to the iPod
+is not working as expected.
+
+Solution:
+
+You need to specify "vfat" as file system type. How to do that depends
+on which way you use to mount the iPod -- see the README file for more
+details.
+
+----------------------------------------------------------------------
+./autogen.sh does not work
+
+A ubunto user has reported that he had to set
+
+ACLOCAL_FLAGS=" -I /usr/share/aclocal/"
+
+in order to get ./autogen.sh to work.
+
+----------------------------------------------------------------------
+The following error message is displayed when accessing the device:
+
+     ieee1394: sbp2: aborting sbp2 command
+     Test Unit Ready 00 00 00 00 00
+
+Solution:
+
+(Markus Gaugusch):
+It is possible that hotplug and the "sg" support are not working well
+together. Try disabling "sg" support in the kernel configuration or
+unload the "sg" module if you are using modules.
+
+(Justin Thiessen):
+Forcing the sbp2 module to serialized I/O seems (so far) to have
+solved the problem.
+
+Ref.:
+------
+http://www.netzwerk-aktiv.com/pub/doc/newsletters/linux1394-user/html/1676.html
+http://www.ubuntuforums.org/printthread.php?t=6678
+http://66.102.7.104/search?q=cache:Xh_gu43y6w8J:themikecam.com/newmikecam/blog/index.php/geek/2005/+ipod+serialize_io&hl=en
+
+Looks like the driver is going to be set to default to serialized I/O
+in kernel 2.6.14, anyways.
+
+http://linuxtoday.com/developer/2005093001026NWKNDV
+
+
+----------------------------------------------------------------------
+The following error message is displayed when accessing the device
+
+     usb-storage: Attempting to get CSW...
+     usb-storage: usb_stor_bulk_transfer_buf: xfer 13 bytes
+     usb-storage: Status code -75; transferred 0/13
+
+Solution (by Ingo Reimann):
+
+I tried to use an iPod Mini with my nforce2-Board, kernel
+2.6.14/2.6.15 debian sid and got messages like [above] in
+dmesg. /dev/sda appeared, but fdisk -l did not show anything
+
+The solution, that i found in a discussion on
+http://kerneltrap.org/node/3844 was to unload ehci_hcd.
+
+
+----------------------------------------------------------------------
+When connecting an iPod via USB to a 2.6 kernel machine the iPod will
+be recognized but not work correctly. In /var/log/messages you'll see
+the a bunch of "Buffer I/O error on device sd?" when connecting the
+iPod (Jonas Bergler, Kevin Venkiteswaran)
+
+Solution (by "jeffmock"):
+
+Disable CONFIG_EFI_PARTITION (File Systems -> Partition Types ->
+Advanced Partition Selection -> EFI GUID Partition support) in your
+kernel configuration, recompile.
+
+Details can be found at 
+http://www.linuxquestions.org/questions/showthread.php?postid=1197015#post1197015
+
+Excerpt:
+
+"This problem could potentially happen with both 2.4 and 2.6 kernels.
+
+A longer story follows and perhaps someone can come up with a more
+sensible solution for the long run.
+
+The iPod looks like a removable disk drive to the host computer. When it
+is attached to the computer, the mini iPod reports a capacity of 7999488
+512-byte sectors (or about 4GB). This turns out to be wrong for whatever
+reason. The mini iPod only really has 7999376 sectors and it exaggerates
+by 112 sectors. The other quality of the iPod is that if the computer
+attempts to read a sector greater than the actual capacity but less than
+the reported capacity, the iPod will dutifully report an I/O error, but
+it won't respond to any future requests until you unplug/plug the iPod."
+
+I followed the kernel recompile instructions for distro, disabled only
+the CONFIG_EFI_PARTITION option, and things ran perfectly for me
+afterwards. As indicated above, hopefully a better long-term solution
+will emerge soon."
+
+(Jorg Schuler: it seems a patch was introduced in kernel version 2.6.10:
+"<phil at ipom.com> [PATCH] USB Storage: Add unusual_devs entry for iPod
+This patch adds an unusual_devs.h entry for the Apple iPod as it
+reports one too many sectors. The patch was submitted by
+Avi Kivity <avi at argo.co.il> and re-diffed by me.")
+
+
+----------------------------------------------------------------------
+SHUFFLE won't play music after reformatting
+
+Solution (by Mark Davis):
+
+The SHUFFLE seems to care about the volume name which has to be
+"IPOD". Try to format as (replace /dev/sda1 with the appropriate
+device file for your SHUFFLE!):
+
+mkdosfs -F32 -n IPOD /dev/sda1
+
+
+----------------------------------------------------------------------
+Calendar entries mixed up
+
+The iPod does not appear to like times specified in UTC (indicated by
+a trailing 'Z'). KOrganizer seems to do this. If you know how to work
+around it let me know.
+
+
+----------------------------------------------------------------------
+m4a files created by faac cannot be added by gtkpod (gentoo)
+
+There appear to be some versions of faac that do not create 'good' m4a
+files. The problem could be solved under gentoo by using version 1.24.
+In order to make error tracking easier, more detailled error messages
+are displayed when tracks could not be added for any reason starting
+with version 0.91-CVS of gtkpod.
+
+
+----------------------------------------------------------------------
+gtkpod crashes when reading the iTunesDB (Fedora)
+
+It appears that crashes were observed with kernel version
+2.6.11-1.35_FC3. An upgrade to 2.6.12-1.1376_FC3 got rid of the
+problem. This was with gtkpod-0.94.0 and Athlon64 3000+. 
+
+
+----------------------------------------------------------------------
+Problems connecting the iPod to Solaris/SPARC
+
+Current (as of 2006/03/30) versions of the Solaris pcfs SPARC driver
+have a bug where the correct filesystem/partition layout may not be
+recognized, and this is true for iPods.  This prevents the iPod
+partition from being mounted on Solaris SPARC.  In order to work
+around this, one must prevent pcfs from detecting the first FAT32
+filesystem, forcing it to move on to the second one.  This can be done
+by changing the filesystem identifier like so:
+
+# dd if=/dev/rdsk/c3t0d0s2 of=/tmp/ipod.orig count=1
+# cp /tmp/ipod.orig /tmp/ipod.modified
+<edit /tmp/ipod.modified and change the first occurance of "FAT32" (at
+offset 0x52 for me) to something else like "CAT32">
+# dd if=/tmp/ipod.modified of=/dev/rdsk/c3t0d0s2 count=1
+
+The above modification may or may not affect usage on other systems. 
+Some reports encounter no problems using the iPod or iTunes after
+making it.  In my own experience, my iPod hard locked moving from a
+SPARC system to an x86 system, and I had to undo the change.  Wrapper
+scripts to handle this may be desirable on SPARC.
+
+Eric Enright
\ No newline at end of file

Added: trunk/aclocal.m4
===================================================================
--- trunk/aclocal.m4	                        (rev 0)
+++ trunk/aclocal.m4	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,1737 @@
+# generated automatically by aclocal 1.10 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006  Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_if(m4_PACKAGE_VERSION, [2.61],,
+[m4_fatal([this file was generated for autoconf 2.61.
+You have another version of autoconf.  If you want to use that,
+you should regenerate the build system entirely.], [63])])
+
+# Copyright (C) 1995-2002 Free Software Foundation, Inc.
+# Copyright (C) 2001-2003,2004 Red Hat, Inc.
+#
+# This file is free software, distributed under the terms of the GNU
+# General Public License.  As a special exception to the GNU General
+# Public License, this file may be distributed as part of a program
+# that contains a configuration script generated by Autoconf, under
+# the same distribution terms as the rest of that program.
+#
+# This file can be copied and used freely without restrictions.  It can
+# be used in projects which are not available under the GNU Public License
+# but which still want to provide support for the GNU gettext functionality.
+#
+# Macro to add for using GNU gettext.
+# Ulrich Drepper <drepper at cygnus.com>, 1995, 1996
+#
+# Modified to never use included libintl. 
+# Owen Taylor <otaylor at redhat.com>, 12/15/1998
+#
+# Major rework to remove unused code
+# Owen Taylor <otaylor at redhat.com>, 12/11/2002
+#
+# Added better handling of ALL_LINGUAS from GNU gettext version 
+# written by Bruno Haible, Owen Taylor <otaylor.redhat.com> 5/30/3002
+#
+# Modified to require ngettext
+# Matthias Clasen <mclasen at redhat.com> 08/06/2004
+#
+# We need this here as well, since someone might use autoconf-2.5x
+# to configure GLib then an older version to configure a package
+# using AM_GLIB_GNU_GETTEXT
+AC_PREREQ(2.53)
+
+dnl
+dnl We go to great lengths to make sure that aclocal won't 
+dnl try to pull in the installed version of these macros
+dnl when running aclocal in the glib directory.
+dnl
+m4_copy([AC_DEFUN],[glib_DEFUN])
+m4_copy([AC_REQUIRE],[glib_REQUIRE])
+dnl
+dnl At the end, if we're not within glib, we'll define the public
+dnl definitions in terms of our private definitions.
+dnl
+
+# GLIB_LC_MESSAGES
+#--------------------
+glib_DEFUN([GLIB_LC_MESSAGES],
+  [AC_CHECK_HEADERS([locale.h])
+    if test $ac_cv_header_locale_h = yes; then
+    AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES,
+      [AC_TRY_LINK([#include <locale.h>], [return LC_MESSAGES],
+       am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)])
+    if test $am_cv_val_LC_MESSAGES = yes; then
+      AC_DEFINE(HAVE_LC_MESSAGES, 1,
+        [Define if your <locale.h> file defines LC_MESSAGES.])
+    fi
+  fi])
+
+# GLIB_PATH_PROG_WITH_TEST
+#----------------------------
+dnl GLIB_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR,
+dnl   TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]])
+glib_DEFUN([GLIB_PATH_PROG_WITH_TEST],
+[# Extract the first word of "$2", so it can be a program name with args.
+set dummy $2; ac_word=[$]2
+AC_MSG_CHECKING([for $ac_word])
+AC_CACHE_VAL(ac_cv_path_$1,
+[case "[$]$1" in
+  /*)
+  ac_cv_path_$1="[$]$1" # Let the user override the test with a path.
+  ;;
+  *)
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in ifelse([$5], , $PATH, [$5]); do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      if [$3]; then
+	ac_cv_path_$1="$ac_dir/$ac_word"
+	break
+      fi
+    fi
+  done
+  IFS="$ac_save_ifs"
+dnl If no 4th arg is given, leave the cache variable unset,
+dnl so AC_PATH_PROGS will keep looking.
+ifelse([$4], , , [  test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4"
+])dnl
+  ;;
+esac])dnl
+$1="$ac_cv_path_$1"
+if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then
+  AC_MSG_RESULT([$]$1)
+else
+  AC_MSG_RESULT(no)
+fi
+AC_SUBST($1)dnl
+])
+
+# GLIB_WITH_NLS
+#-----------------
+glib_DEFUN([GLIB_WITH_NLS],
+  dnl NLS is obligatory
+  [AC_REQUIRE([AC_CANONICAL_HOST])dnl
+    USE_NLS=yes
+    AC_SUBST(USE_NLS)
+
+    gt_cv_have_gettext=no
+
+    CATOBJEXT=NONE
+    XGETTEXT=:
+    INTLLIBS=
+
+    AC_CHECK_HEADER(libintl.h,
+     [gt_cv_func_dgettext_libintl="no"
+      libintl_extra_libs=""
+
+      #
+      # First check in libc
+      #
+      AC_CACHE_CHECK([for ngettext in libc], gt_cv_func_ngettext_libc,
+        [AC_TRY_LINK([
+#include <libintl.h>
+],
+         [return !ngettext ("","", 1)],
+	  gt_cv_func_ngettext_libc=yes,
+          gt_cv_func_ngettext_libc=no)
+        ])
+  
+      if test "$gt_cv_func_ngettext_libc" = "yes" ; then
+	      AC_CACHE_CHECK([for dgettext in libc], gt_cv_func_dgettext_libc,
+        	[AC_TRY_LINK([
+#include <libintl.h>
+],
+	          [return !dgettext ("","")],
+		  gt_cv_func_dgettext_libc=yes,
+	          gt_cv_func_dgettext_libc=no)
+        	])
+      fi
+  
+      if test "$gt_cv_func_ngettext_libc" = "yes" ; then
+        AC_CHECK_FUNCS(bind_textdomain_codeset)
+      fi
+
+      #
+      # If we don't have everything we want, check in libintl
+      #
+      if test "$gt_cv_func_dgettext_libc" != "yes" \
+	 || test "$gt_cv_func_ngettext_libc" != "yes" \
+         || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then
+        
+        AC_CHECK_LIB(intl, bindtextdomain,
+	    [AC_CHECK_LIB(intl, ngettext,
+		    [AC_CHECK_LIB(intl, dgettext,
+			          gt_cv_func_dgettext_libintl=yes)])])
+
+	if test "$gt_cv_func_dgettext_libintl" != "yes" ; then
+	  AC_MSG_CHECKING([if -liconv is needed to use gettext])
+	  AC_MSG_RESULT([])
+  	  AC_CHECK_LIB(intl, ngettext,
+          	[AC_CHECK_LIB(intl, dcgettext,
+		       [gt_cv_func_dgettext_libintl=yes
+			libintl_extra_libs=-liconv],
+			:,-liconv)],
+		:,-liconv)
+        fi
+
+        #
+        # If we found libintl, then check in it for bind_textdomain_codeset();
+        # we'll prefer libc if neither have bind_textdomain_codeset(),
+        # and both have dgettext and ngettext
+        #
+        if test "$gt_cv_func_dgettext_libintl" = "yes" ; then
+          glib_save_LIBS="$LIBS"
+          LIBS="$LIBS -lintl $libintl_extra_libs"
+          unset ac_cv_func_bind_textdomain_codeset
+          AC_CHECK_FUNCS(bind_textdomain_codeset)
+          LIBS="$glib_save_LIBS"
+
+          if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then
+            gt_cv_func_dgettext_libc=no
+          else
+            if test "$gt_cv_func_dgettext_libc" = "yes" \
+		&& test "$gt_cv_func_ngettext_libc" = "yes"; then
+              gt_cv_func_dgettext_libintl=no
+            fi
+          fi
+        fi
+      fi
+
+      if test "$gt_cv_func_dgettext_libc" = "yes" \
+	|| test "$gt_cv_func_dgettext_libintl" = "yes"; then
+        gt_cv_have_gettext=yes
+      fi
+  
+      if test "$gt_cv_func_dgettext_libintl" = "yes"; then
+        INTLLIBS="-lintl $libintl_extra_libs"
+      fi
+  
+      if test "$gt_cv_have_gettext" = "yes"; then
+	AC_DEFINE(HAVE_GETTEXT,1,
+	  [Define if the GNU gettext() function is already present or preinstalled.])
+	GLIB_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
+	  [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl
+	if test "$MSGFMT" != "no"; then
+          glib_save_LIBS="$LIBS"
+          LIBS="$LIBS $INTLLIBS"
+	  AC_CHECK_FUNCS(dcgettext)
+	  MSGFMT_OPTS=
+	  AC_MSG_CHECKING([if msgfmt accepts -c])
+	  GLIB_RUN_PROG([$MSGFMT -c -o /dev/null],[
+msgid ""
+msgstr ""
+"Content-Type: text/plain; charset=UTF-8\n"
+"Project-Id-Version: test 1.0\n"
+"PO-Revision-Date: 2007-02-15 12:01+0100\n"
+"Last-Translator: test <foo at bar.xx>\n"
+"Language-Team: C <LL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Transfer-Encoding: 8bit\n"
+], [MSGFMT_OPTS=-c; AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no])])
+	  AC_SUBST(MSGFMT_OPTS)
+	  AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
+	  GLIB_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
+	    [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :)
+	  AC_TRY_LINK(, [extern int _nl_msg_cat_cntr;
+			 return _nl_msg_cat_cntr],
+	    [CATOBJEXT=.gmo 
+             DATADIRNAME=share],
+	    [case $host in
+	    *-*-solaris*)
+	    dnl On Solaris, if bind_textdomain_codeset is in libc,
+	    dnl GNU format message catalog is always supported,
+            dnl since both are added to the libc all together.
+	    dnl Hence, we'd like to go with DATADIRNAME=share and
+	    dnl and CATOBJEXT=.gmo in this case.
+            AC_CHECK_FUNC(bind_textdomain_codeset,
+	      [CATOBJEXT=.gmo 
+               DATADIRNAME=share],
+	      [CATOBJEXT=.mo
+               DATADIRNAME=lib])
+	    ;;
+	    *)
+	    CATOBJEXT=.mo
+            DATADIRNAME=lib
+	    ;;
+	    esac])
+          LIBS="$glib_save_LIBS"
+	  INSTOBJEXT=.mo
+	else
+	  gt_cv_have_gettext=no
+	fi
+      fi
+    ])
+
+    if test "$gt_cv_have_gettext" = "yes" ; then
+      AC_DEFINE(ENABLE_NLS, 1,
+        [always defined to indicate that i18n is enabled])
+    fi
+
+    dnl Test whether we really found GNU xgettext.
+    if test "$XGETTEXT" != ":"; then
+      dnl If it is not GNU xgettext we define it as : so that the
+      dnl Makefiles still can work.
+      if $XGETTEXT --omit-header /dev/null 2> /dev/null; then
+        : ;
+      else
+        AC_MSG_RESULT(
+	  [found xgettext program is not GNU xgettext; ignore it])
+        XGETTEXT=":"
+      fi
+    fi
+
+    # We need to process the po/ directory.
+    POSUB=po
+
+    AC_OUTPUT_COMMANDS(
+      [case "$CONFIG_FILES" in *po/Makefile.in*)
+        sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile
+      esac])
+
+    dnl These rules are solely for the distribution goal.  While doing this
+    dnl we only have to keep exactly one list of the available catalogs
+    dnl in configure.in.
+    for lang in $ALL_LINGUAS; do
+      GMOFILES="$GMOFILES $lang.gmo"
+      POFILES="$POFILES $lang.po"
+    done
+
+    dnl Make all variables we use known to autoconf.
+    AC_SUBST(CATALOGS)
+    AC_SUBST(CATOBJEXT)
+    AC_SUBST(DATADIRNAME)
+    AC_SUBST(GMOFILES)
+    AC_SUBST(INSTOBJEXT)
+    AC_SUBST(INTLLIBS)
+    AC_SUBST(PO_IN_DATADIR_TRUE)
+    AC_SUBST(PO_IN_DATADIR_FALSE)
+    AC_SUBST(POFILES)
+    AC_SUBST(POSUB)
+  ])
+
+# AM_GLIB_GNU_GETTEXT
+# -------------------
+# Do checks necessary for use of gettext. If a suitable implementation 
+# of gettext is found in either in libintl or in the C library,
+# it will set INTLLIBS to the libraries needed for use of gettext
+# and AC_DEFINE() HAVE_GETTEXT and ENABLE_NLS. (The shell variable
+# gt_cv_have_gettext will be set to "yes".) It will also call AC_SUBST()
+# on various variables needed by the Makefile.in.in installed by 
+# glib-gettextize.
+dnl
+glib_DEFUN([GLIB_GNU_GETTEXT],
+  [AC_REQUIRE([AC_PROG_CC])dnl
+   AC_REQUIRE([AC_HEADER_STDC])dnl
+   
+   GLIB_LC_MESSAGES
+   GLIB_WITH_NLS
+
+   if test "$gt_cv_have_gettext" = "yes"; then
+     if test "x$ALL_LINGUAS" = "x"; then
+       LINGUAS=
+     else
+       AC_MSG_CHECKING(for catalogs to be installed)
+       NEW_LINGUAS=
+       for presentlang in $ALL_LINGUAS; do
+         useit=no
+         if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then
+           desiredlanguages="$LINGUAS"
+         else
+           desiredlanguages="$ALL_LINGUAS"
+         fi
+         for desiredlang in $desiredlanguages; do
+ 	   # Use the presentlang catalog if desiredlang is
+           #   a. equal to presentlang, or
+           #   b. a variant of presentlang (because in this case,
+           #      presentlang can be used as a fallback for messages
+           #      which are not translated in the desiredlang catalog).
+           case "$desiredlang" in
+             "$presentlang"*) useit=yes;;
+           esac
+         done
+         if test $useit = yes; then
+           NEW_LINGUAS="$NEW_LINGUAS $presentlang"
+         fi
+       done
+       LINGUAS=$NEW_LINGUAS
+       AC_MSG_RESULT($LINGUAS)
+     fi
+
+     dnl Construct list of names of catalog files to be constructed.
+     if test -n "$LINGUAS"; then
+       for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done
+     fi
+   fi
+
+   dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly
+   dnl find the mkinstalldirs script in another subdir but ($top_srcdir).
+   dnl Try to locate is.
+   MKINSTALLDIRS=
+   if test -n "$ac_aux_dir"; then
+     MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs"
+   fi
+   if test -z "$MKINSTALLDIRS"; then
+     MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs"
+   fi
+   AC_SUBST(MKINSTALLDIRS)
+
+   dnl Generate list of files to be processed by xgettext which will
+   dnl be included in po/Makefile.
+   test -d po || mkdir po
+   if test "x$srcdir" != "x."; then
+     if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then
+       posrcprefix="$srcdir/"
+     else
+       posrcprefix="../$srcdir/"
+     fi
+   else
+     posrcprefix="../"
+   fi
+   rm -f po/POTFILES
+   sed -e "/^#/d" -e "/^\$/d" -e "s,.*,	$posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \
+	< $srcdir/po/POTFILES.in > po/POTFILES
+  ])
+
+# AM_GLIB_DEFINE_LOCALEDIR(VARIABLE)
+# -------------------------------
+# Define VARIABLE to the location where catalog files will
+# be installed by po/Makefile.
+glib_DEFUN([GLIB_DEFINE_LOCALEDIR],
+[glib_REQUIRE([GLIB_GNU_GETTEXT])dnl
+glib_save_prefix="$prefix"
+glib_save_exec_prefix="$exec_prefix"
+glib_save_datarootdir="$datarootdir"
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+test "x$exec_prefix" = xNONE && exec_prefix=$prefix
+datarootdir=`eval echo "${datarootdir}"`
+if test "x$CATOBJEXT" = "x.mo" ; then
+  localedir=`eval echo "${libdir}/locale"`
+else
+  localedir=`eval echo "${datadir}/locale"`
+fi
+prefix="$glib_save_prefix"
+exec_prefix="$glib_save_exec_prefix"
+datarootdir="$glib_save_datarootdir"
+AC_DEFINE_UNQUOTED($1, "$localedir",
+  [Define the location where the catalogs will be installed])
+])
+
+dnl
+dnl Now the definitions that aclocal will find
+dnl
+ifdef(glib_configure_in,[],[
+AC_DEFUN([AM_GLIB_GNU_GETTEXT],[GLIB_GNU_GETTEXT($@)])
+AC_DEFUN([AM_GLIB_DEFINE_LOCALEDIR],[GLIB_DEFINE_LOCALEDIR($@)])
+])dnl
+
+# GLIB_RUN_PROG(PROGRAM, TEST-FILE, [ACTION-IF-PASS], [ACTION-IF-FAIL])
+# 
+# Create a temporary file with TEST-FILE as its contents and pass the
+# file name to PROGRAM.  Perform ACTION-IF-PASS if PROGRAM exits with
+# 0 and perform ACTION-IF-FAIL for any other exit status.
+AC_DEFUN([GLIB_RUN_PROG],
+[cat >conftest.foo <<_ACEOF
+$2
+_ACEOF
+if AC_RUN_LOG([$1 conftest.foo]); then
+  m4_ifval([$3], [$3], [:])
+m4_ifvaln([$4], [else $4])dnl
+echo "$as_me: failed input was:" >&AS_MESSAGE_LOG_FD
+sed 's/^/| /' conftest.foo >&AS_MESSAGE_LOG_FD
+fi])
+
+
+
+dnl IT_PROG_INTLTOOL([MINIMUM-VERSION], [no-xml])
+# serial 36 IT_PROG_INTLTOOL
+AC_DEFUN([IT_PROG_INTLTOOL],
+[AC_PREREQ([2.50])dnl
+
+case "$am__api_version" in
+    1.[01234])
+	AC_MSG_ERROR([Automake 1.5 or newer is required to use intltool])
+    ;;
+    *)
+    ;;
+esac
+
+if test -n "$1"; then
+    AC_MSG_CHECKING([for intltool >= $1])
+
+    INTLTOOL_REQUIRED_VERSION_AS_INT=`echo $1 | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'`
+    INTLTOOL_APPLIED_VERSION=`awk -F\" '/\\$VERSION / { print $ 2; }' ${ac_aux_dir}/intltool-update.in`
+    [INTLTOOL_APPLIED_VERSION_AS_INT=`awk -F\" '/\\$VERSION / { split($ 2, VERSION, "."); print VERSION[1] * 1000 + VERSION[2] * 100 + VERSION[3];}' ${ac_aux_dir}/intltool-update.in`
+    ]
+    AC_MSG_RESULT([$INTLTOOL_APPLIED_VERSION found])
+    test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge "$INTLTOOL_REQUIRED_VERSION_AS_INT" ||
+	AC_MSG_ERROR([Your intltool is too old.  You need intltool $1 or later.])
+fi
+
+  INTLTOOL_DESKTOP_RULE='%.desktop:   %.desktop.in   $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' 
+INTLTOOL_DIRECTORY_RULE='%.directory: %.directory.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' 
+     INTLTOOL_KEYS_RULE='%.keys:      %.keys.in      $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -k -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' 
+     INTLTOOL_PROP_RULE='%.prop:      %.prop.in      $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' 
+      INTLTOOL_OAF_RULE='%.oaf:       %.oaf.in       $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -o -p $(top_srcdir)/po $< [$]@'
+     INTLTOOL_PONG_RULE='%.pong:      %.pong.in      $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' 
+   INTLTOOL_SERVER_RULE='%.server:    %.server.in    $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -o -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' 
+    INTLTOOL_SHEET_RULE='%.sheet:     %.sheet.in     $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' 
+INTLTOOL_SOUNDLIST_RULE='%.soundlist: %.soundlist.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' 
+       INTLTOOL_UI_RULE='%.ui:        %.ui.in        $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' 
+      INTLTOOL_XML_RULE='%.xml:       %.xml.in       $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' 
+      INTLTOOL_XML_NOMERGE_RULE='%.xml:       %.xml.in       $(INTLTOOL_MERGE) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u /tmp $< [$]@' 
+      INTLTOOL_XAM_RULE='%.xam:       %.xml.in       $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' 
+      INTLTOOL_KBD_RULE='%.kbd:       %.kbd.in       $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -m -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' 
+    INTLTOOL_CAVES_RULE='%.caves:     %.caves.in     $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' 
+  INTLTOOL_SCHEMAS_RULE='%.schemas:   %.schemas.in   $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -s -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' 
+    INTLTOOL_THEME_RULE='%.theme:     %.theme.in     $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' 
+    INTLTOOL_SERVICE_RULE='%.service: %.service.in   $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@'
+   INTLTOOL_POLICY_RULE='%.policy:    %.policy.in    $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@'
+
+AC_SUBST(INTLTOOL_DESKTOP_RULE)
+AC_SUBST(INTLTOOL_DIRECTORY_RULE)
+AC_SUBST(INTLTOOL_KEYS_RULE)
+AC_SUBST(INTLTOOL_PROP_RULE)
+AC_SUBST(INTLTOOL_OAF_RULE)
+AC_SUBST(INTLTOOL_PONG_RULE)
+AC_SUBST(INTLTOOL_SERVER_RULE)
+AC_SUBST(INTLTOOL_SHEET_RULE)
+AC_SUBST(INTLTOOL_SOUNDLIST_RULE)
+AC_SUBST(INTLTOOL_UI_RULE)
+AC_SUBST(INTLTOOL_XAM_RULE)
+AC_SUBST(INTLTOOL_KBD_RULE)
+AC_SUBST(INTLTOOL_XML_RULE)
+AC_SUBST(INTLTOOL_XML_NOMERGE_RULE)
+AC_SUBST(INTLTOOL_CAVES_RULE)
+AC_SUBST(INTLTOOL_SCHEMAS_RULE)
+AC_SUBST(INTLTOOL_THEME_RULE)
+AC_SUBST(INTLTOOL_SERVICE_RULE)
+AC_SUBST(INTLTOOL_POLICY_RULE)
+
+# Use the tools built into the package, not the ones that are installed.
+AC_SUBST(INTLTOOL_EXTRACT, '$(top_builddir)/intltool-extract')
+AC_SUBST(INTLTOOL_MERGE, '$(top_builddir)/intltool-merge')
+AC_SUBST(INTLTOOL_UPDATE, '$(top_builddir)/intltool-update')
+
+AC_PATH_PROG(INTLTOOL_PERL, perl)
+if test -z "$INTLTOOL_PERL"; then
+   AC_MSG_ERROR([perl not found; required for intltool])
+fi
+if test -z "`$INTLTOOL_PERL -v | fgrep '5.' 2> /dev/null`"; then
+   AC_MSG_ERROR([perl 5.x required for intltool])
+fi
+if test "x$2" != "xno-xml"; then
+   AC_MSG_CHECKING([for XML::Parser])
+   if `$INTLTOOL_PERL -e "require XML::Parser" 2>/dev/null`; then
+       AC_MSG_RESULT([ok])
+   else
+       AC_MSG_ERROR([XML::Parser perl module is required for intltool])
+   fi
+fi
+
+# Substitute ALL_LINGUAS so we can use it in po/Makefile
+AC_SUBST(ALL_LINGUAS)
+
+# Set DATADIRNAME correctly if it is not set yet
+# (copied from glib-gettext.m4)
+if test -z "$DATADIRNAME"; then
+  AC_LINK_IFELSE(
+    [AC_LANG_PROGRAM([[]],
+                     [[extern int _nl_msg_cat_cntr;
+                       return _nl_msg_cat_cntr]])],
+    [DATADIRNAME=share],
+    [case $host in
+    *-*-solaris*)
+    dnl On Solaris, if bind_textdomain_codeset is in libc,
+    dnl GNU format message catalog is always supported,
+    dnl since both are added to the libc all together.
+    dnl Hence, we'd like to go with DATADIRNAME=share
+    dnl in this case.
+    AC_CHECK_FUNC(bind_textdomain_codeset,
+      [DATADIRNAME=share], [DATADIRNAME=lib])
+    ;;
+    *)
+    [DATADIRNAME=lib]
+    ;;
+    esac])
+fi
+AC_SUBST(DATADIRNAME)
+
+IT_PO_SUBDIR([po])
+
+dnl The following is very similar to
+dnl
+dnl	AC_CONFIG_FILES([intltool-extract intltool-merge intltool-update])
+dnl
+dnl with the following slight differences:
+dnl  - the *.in files are in ac_aux_dir,
+dnl  - if the file haven't changed upon reconfigure, it's not touched,
+dnl  - the evaluation of the third parameter enables a hack which computes
+dnl    the actual value of $libdir,
+dnl  - the user sees "executing intltool commands", instead of
+dnl    "creating intltool-extract" and such.
+dnl
+dnl Nothing crucial here, and we could use AC_CONFIG_FILES, if there were
+dnl a reason for it.
+
+AC_CONFIG_COMMANDS([intltool], [
+
+for file in intltool-extract intltool-merge intltool-update; do
+  sed -e "s|@INTLTOOL_EXTRACT@|`pwd`/intltool-extract|g" \
+      -e "s|@INTLTOOL_LIBDIR@|${INTLTOOL_LIBDIR}|g" \
+      -e "s|@INTLTOOL_PERL@|${INTLTOOL_PERL}|g" \
+	< ${ac_aux_dir}/${file}.in > ${file}.out
+  if cmp -s ${file} ${file}.out 2>/dev/null; then
+    rm -f ${file}.out
+  else
+    mv -f ${file}.out ${file}
+  fi
+  chmod ugo+x ${file}
+  chmod u+w ${file}
+done
+
+],
+[INTLTOOL_PERL='${INTLTOOL_PERL}' ac_aux_dir='${ac_aux_dir}'
+prefix="$prefix" exec_prefix="$exec_prefix" INTLTOOL_LIBDIR="$libdir" 
+INTLTOOL_EXTRACT='${INTLTOOL_EXTRACT}'])
+
+])
+
+
+# IT_PO_SUBDIR(DIRNAME)
+# ---------------------
+# All po subdirs have to be declared with this macro; the subdir "po" is
+# declared by IT_PROG_INTLTOOL.
+#
+AC_DEFUN([IT_PO_SUBDIR],
+[AC_PREREQ([2.53])dnl We use ac_top_srcdir inside AC_CONFIG_COMMANDS.
+dnl
+dnl The following CONFIG_COMMANDS should be exetuted at the very end
+dnl of config.status.
+AC_CONFIG_COMMANDS_PRE([
+  AC_CONFIG_COMMANDS([$1/stamp-it], [
+    rm -f "$1/stamp-it" "$1/stamp-it.tmp" "$1/POTFILES" "$1/Makefile.tmp"
+    >"$1/stamp-it.tmp"
+    [sed '/^#/d
+	 s/^[[].*] *//
+	 /^[ 	]*$/d
+	'"s|^|	$ac_top_srcdir/|" \
+      "$srcdir/$1/POTFILES.in" | sed '$!s/$/ \\/' >"$1/POTFILES"
+    ]
+    if test ! -f "$1/Makefile"; then
+      AC_MSG_ERROR([$1/Makefile is not ready.])
+    fi
+    mv "$1/Makefile" "$1/Makefile.tmp"
+    [sed '/^POTFILES =/,/[^\\]$/ {
+		/^POTFILES =/!d
+		r $1/POTFILES
+	  }
+	 ' "$1/Makefile.tmp" >"$1/Makefile"]
+    rm -f "$1/Makefile.tmp"
+    mv "$1/stamp-it.tmp" "$1/stamp-it"
+  ])
+])dnl
+])
+
+
+# deprecated macros
+AU_ALIAS([AC_PROG_INTLTOOL], [IT_PROG_INTLTOOL])
+# A hint is needed for aclocal from Automake <= 1.9.4:
+# AC_DEFUN([AC_PROG_INTLTOOL], ...)
+
+
+# pkg.m4 - Macros to locate and utilise pkg-config.            -*- Autoconf -*-
+# 
+# Copyright © 2004 Scott James Remnant <scott at netsplit.com>.
+#
+# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# PKG_PROG_PKG_CONFIG([MIN-VERSION])
+# ----------------------------------
+AC_DEFUN([PKG_PROG_PKG_CONFIG],
+[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
+m4_pattern_allow([^PKG_CONFIG(_PATH)?$])
+AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+	AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
+fi
+if test -n "$PKG_CONFIG"; then
+	_pkg_min_version=m4_default([$1], [0.9.0])
+	AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])
+	if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+		AC_MSG_RESULT([yes])
+	else
+		AC_MSG_RESULT([no])
+		PKG_CONFIG=""
+	fi
+		
+fi[]dnl
+])# PKG_PROG_PKG_CONFIG
+
+# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+#
+# Check to see whether a particular set of modules exists.  Similar
+# to PKG_CHECK_MODULES(), but does not set variables or print errors.
+#
+#
+# Similar to PKG_CHECK_MODULES, make sure that the first instance of
+# this or PKG_CHECK_MODULES is called, or make sure to call
+# PKG_CHECK_EXISTS manually
+# --------------------------------------------------------------
+AC_DEFUN([PKG_CHECK_EXISTS],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+if test -n "$PKG_CONFIG" && \
+    AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then
+  m4_ifval([$2], [$2], [:])
+m4_ifvaln([$3], [else
+  $3])dnl
+fi])
+
+
+# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
+# ---------------------------------------------
+m4_define([_PKG_CONFIG],
+[if test -n "$PKG_CONFIG"; then
+    if test -n "$$1"; then
+        pkg_cv_[]$1="$$1"
+    else
+        PKG_CHECK_EXISTS([$3],
+                         [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`],
+			 [pkg_failed=yes])
+    fi
+else
+	pkg_failed=untried
+fi[]dnl
+])# _PKG_CONFIG
+
+# _PKG_SHORT_ERRORS_SUPPORTED
+# -----------------------------
+AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi[]dnl
+])# _PKG_SHORT_ERRORS_SUPPORTED
+
+
+# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
+# [ACTION-IF-NOT-FOUND])
+#
+#
+# Note that if there is a possibility the first call to
+# PKG_CHECK_MODULES might not happen, you should be sure to include an
+# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
+#
+#
+# --------------------------------------------------------------
+AC_DEFUN([PKG_CHECK_MODULES],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
+AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
+
+pkg_failed=no
+AC_MSG_CHECKING([for $1])
+
+_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
+_PKG_CONFIG([$1][_LIBS], [libs], [$2])
+
+m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS
+and $1[]_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.])
+
+if test $pkg_failed = yes; then
+        _PKG_SHORT_ERRORS_SUPPORTED
+        if test $_pkg_short_errors_supported = yes; then
+	        $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"`
+        else 
+	        $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
+
+	ifelse([$4], , [AC_MSG_ERROR(dnl
+[Package requirements ($2) were not met:
+
+$$1_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+_PKG_TEXT
+])],
+		[AC_MSG_RESULT([no])
+                $4])
+elif test $pkg_failed = untried; then
+	ifelse([$4], , [AC_MSG_FAILURE(dnl
+[The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+_PKG_TEXT
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.])],
+		[$4])
+else
+	$1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
+	$1[]_LIBS=$pkg_cv_[]$1[]_LIBS
+        AC_MSG_RESULT([yes])
+	ifelse([$3], , :, [$3])
+fi[]dnl
+])# PKG_CHECK_MODULES
+
+# Copyright (C) 2002, 2003, 2005, 2006  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.10'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version.  Point them to the right macro.
+m4_if([$1], [1.10], [],
+      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too.  Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.10])dnl
+_AM_AUTOCONF_VERSION(m4_PACKAGE_VERSION)])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory.  The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run.  This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+#    fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+#    fails if $ac_aux_dir is absolute,
+#    fails when called from a subdirectory in a VPATH build with
+#          a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir.  In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
+#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+#   MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH.  The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2001, 2002, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# This was merged into AC_PROG_CC in Autoconf.
+
+AU_DEFUN([AM_PROG_CC_STDC],
+[AC_PROG_CC
+AC_DIAGNOSE([obsolete], [$0:
+	your code should no longer depend upon `am_cv_prog_cc_stdc', but upon
+	`ac_cv_prog_cc_stdc'.  Remove this warning and the assignment when
+	you adjust the code.  You can also remove the above call to
+	AC_PROG_CC if you already called it elsewhere.])
+am_cv_prog_cc_stdc=$ac_cv_prog_cc_stdc
+])
+AU_DEFUN([fp_PROG_CC_STDC])
+
+# AM_CONDITIONAL                                            -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 8
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+  AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 9
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery.  Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
+       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
+       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+       [$1], UPC,  [depcc="$UPC"  am_compiler_list=],
+       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                   [depcc="$$1"   am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+               [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_$1_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_$1_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+])
+
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+#serial 3
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[for mf in $CONFIG_FILES; do
+  # Strip MF so we end up with the name of the file.
+  mf=`echo "$mf" | sed -e 's/:.*$//'`
+  # Check whether this is an Automake generated Makefile or not.
+  # We used to match only the files named `Makefile.in', but
+  # some people rename them; so instead we look at the file content.
+  # Grep'ing the first line is not enough: some people post-process
+  # each Makefile.in and add a new line on top of each file to say so.
+  # Grep'ing the whole file is not good either: AIX grep has a line
+  # limit of 2048, but all sed's we know have understand at least 4000.
+  if sed 10q "$mf" | grep '^#.*generated by automake' > /dev/null 2>&1; then
+    dirpart=`AS_DIRNAME("$mf")`
+  else
+    continue
+  fi
+  # Extract the definition of DEPDIR, am__include, and am__quote
+  # from the Makefile without running `make'.
+  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+  test -z "$DEPDIR" && continue
+  am__include=`sed -n 's/^am__include = //p' < "$mf"`
+  test -z "am__include" && continue
+  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+  # When using ansi2knr, U may be empty or an underscore; expand it
+  U=`sed -n 's/^U = //p' < "$mf"`
+  # Find all dependency output files, they are included files with
+  # $(DEPDIR) in their names.  We invoke sed twice because it is the
+  # simplest approach to changing $(DEPDIR) to its actual value in the
+  # expansion.
+  for file in `sed -n "
+    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+    # Make sure the directory exists.
+    test -f "$dirpart/$file" && continue
+    fdir=`AS_DIRNAME(["$file"])`
+    AS_MKDIR_P([$dirpart/$fdir])
+    # echo "creating $dirpart/$file"
+    echo '# dummy' > "$dirpart/$file"
+  done
+done
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled.  FIXME.  This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 8
+
+# AM_CONFIG_HEADER is obsolete.  It has been replaced by AC_CONFIG_HEADERS.
+AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 12
+
+# This macro actually does too much.  Some checks are only needed if
+# your package does certain things.  But this isn't really a big deal.
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out.  PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition.  After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.60])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
+  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AM_PROG_INSTALL_SH
+AM_PROG_INSTALL_STRIP
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+              [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+	      		     [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+                  [_AM_DEPENDENCIES(CC)],
+                  [define([AC_PROG_CC],
+                          defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+                  [_AM_DEPENDENCIES(CXX)],
+                  [define([AC_PROG_CXX],
+                          defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+                  [_AM_DEPENDENCIES(OBJC)],
+                  [define([AC_PROG_OBJC],
+                          defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
+])
+])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $1 | $1:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"}
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot.  For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 5
+
+# AM_PROG_LEX
+# -----------
+# Autoconf leaves LEX=: if lex or flex can't be found.  Change that to a
+# "missing" invocation, for better error output.
+AC_DEFUN([AM_PROG_LEX],
+[AC_PREREQ(2.50)dnl
+AC_REQUIRE([AM_MISSING_HAS_RUN])dnl
+AC_REQUIRE([AC_PROG_LEX])dnl
+if test "$LEX" = :; then
+  LEX=${am_missing_run}flex
+fi])
+
+# Add --enable-maintainer-mode option to configure.         -*- Autoconf -*-
+# From Jim Meyering
+
+# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+AC_DEFUN([AM_MAINTAINER_MODE],
+[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
+  dnl maintainer-mode is disabled by default
+  AC_ARG_ENABLE(maintainer-mode,
+[  --enable-maintainer-mode  enable make rules and dependencies not useful
+			  (and sometimes confusing) to the casual installer],
+      USE_MAINTAINER_MODE=$enableval,
+      USE_MAINTAINER_MODE=no)
+  AC_MSG_RESULT([$USE_MAINTAINER_MODE])
+  AM_CONDITIONAL(MAINTAINER_MODE, [test $USE_MAINTAINER_MODE = yes])
+  MAINT=$MAINTAINER_MODE_TRUE
+  AC_SUBST(MAINT)dnl
+]
+)
+
+AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])
+
+# Check to see how 'make' treats includes.	            -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+   am__include=include
+   am__quote=
+   _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+      am__include=.include
+      am__quote="\""
+      _am_result=BSD
+   fi
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 5
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check for `mkdir -p'.
+AC_DEFUN([AM_PROG_MKDIR_P],
+[AC_PREREQ([2.60])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
+dnl while keeping a definition of mkdir_p for backward compatibility.
+dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
+dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
+dnl Makefile.ins that do not define MKDIR_P, so we do our own
+dnl adjustment using top_builddir (which is defined more often than
+dnl MKDIR_P).
+AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
+case $mkdir_p in
+  [[\\/$]]* | ?:[[\\/]]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# ------------------------------
+# Set option NAME.  Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ----------------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+   if test "$[*]" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$[*]" != "X $srcdir/configure conftest.file" \
+      && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+  AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputing VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+     [m4_case([$1], [ustar],, [pax],,
+              [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+  case $_am_tool in
+  gnutar)
+    for _am_tar in tar gnutar gtar;
+    do
+      AM_RUN_LOG([$_am_tar --version]) && break
+    done
+    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+    am__untar="$_am_tar -xf -"
+    ;;
+  plaintar)
+    # Must skip GNU tar: if it does not support --format= it doesn't create
+    # ustar tarball either.
+    (tar --version) >/dev/null 2>&1 && continue
+    am__tar='tar chf - "$$tardir"'
+    am__tar_='tar chf - "$tardir"'
+    am__untar='tar xf -'
+    ;;
+  pax)
+    am__tar='pax -L -x $1 -w "$$tardir"'
+    am__tar_='pax -L -x $1 -w "$tardir"'
+    am__untar='pax -r'
+    ;;
+  cpio)
+    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+    am__untar='cpio -i -H $1 -d'
+    ;;
+  none)
+    am__tar=false
+    am__tar_=false
+    am__untar=false
+    ;;
+  esac
+
+  # If the value was cached, stop now.  We just wanted to have am__tar
+  # and am__untar set.
+  test -n "${am_cv_prog_tar_$1}" && break
+
+  # tar/untar a dummy directory, and stop if the command works
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  echo GrepMe > conftest.dir/file
+  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+  rm -rf conftest.dir
+  if test -s conftest.tar; then
+    AM_RUN_LOG([$am__untar <conftest.tar])
+    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+  fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+

Added: trunk/autogen.sh
===================================================================
--- trunk/autogen.sh	                        (rev 0)
+++ trunk/autogen.sh	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,164 @@
+#!/bin/sh
+# Run this to generate all the initial makefiles, etc.
+srcdir=`dirname $0`
+test -z "$srcdir" && srcdir=.
+
+DIE=0
+
+if [ -n "$GNOME2_DIR" ]; then
+    ACLOCAL_FLAGS="-I $GNOME2_DIR/share/aclocal $ACLOCAL_FLAGS"
+    LD_LIBRARY_PATH="$GNOME2_DIR/lib:$LD_LIBRARY_PATH"
+    PATH="$GNOME2_DIR/bin:$PATH"
+    export PATH
+    export LD_LIBRARY_PATH
+fi
+
+(test -f $srcdir/configure.in) || {
+    echo -n "**Error**: Directory "\`$srcdir\'" does not look like the"
+    echo " top-level package directory"
+    exit 1
+}
+
+(${AUTOCONF:-autoconf} --version) < /dev/null > /dev/null 2>&1 || {
+  echo
+  echo "**Error**: You must have \`autoconf' installed."
+  echo "Download the appropriate package for your distribution,"
+  echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
+  DIE=1
+}
+
+(grep "^IT_PROG_INTLTOOL" $srcdir/configure.in >/dev/null) && {
+  (intltoolize --version) < /dev/null > /dev/null 2>&1 || {
+    echo 
+    echo "**Error**: You must have \`intltool' installed."
+    echo "You can get it from:"
+    echo "  ftp://ftp.gnome.org/pub/GNOME/"
+    DIE=1
+  }
+}
+
+(grep "^AM_PROG_XML_I18N_TOOLS" $srcdir/configure.in >/dev/null) && {
+  (xml-i18n-toolize --version) < /dev/null > /dev/null 2>&1 || {
+    echo
+    echo "**Error**: You must have \`xml-i18n-toolize' installed."
+    echo "You can get it from:"
+    echo "  ftp://ftp.gnome.org/pub/GNOME/"
+    DIE=1
+  }
+}
+
+(grep "^AM_PROG_LIBTOOL" $srcdir/configure.in >/dev/null) && {
+  (${LIBTOOL:-libtool} --version) < /dev/null > /dev/null 2>&1 || {
+    echo
+    echo "**Error**: You must have \`libtool' installed."
+    echo "You can get it from: ftp://ftp.gnu.org/pub/gnu/"
+    DIE=1
+  }
+}
+
+(grep "^AM_GLIB_GNU_GETTEXT" $srcdir/configure.in >/dev/null) && {
+  (grep "sed.*POTFILES" $srcdir/configure.in) > /dev/null || \
+  (glib-gettextize --version) < /dev/null > /dev/null 2>&1 || {
+    if [ -f /etc/debian_version ]
+    then
+        echo "**Error**: Please apt-get install libglib2.0-dev"
+    else
+        echo
+        echo "**Error**: You must have \`glib' installed."
+        echo "You can get it from: ftp://ftp.gtk.org/pub/gtk."
+        echo "When using packages, make sure you also install the -dev package."
+    fi
+    DIE=1
+  }
+}
+
+(${AUTOMAKE:-automake} --version) < /dev/null > /dev/null 2>&1 || {
+  echo
+  echo "**Error**: You must have \`automake' installed."
+  echo "You can get it from: ftp://ftp.gnu.org/pub/gnu/"
+  DIE=1
+  NO_AUTOMAKE=yes
+}
+
+
+# if no automake, don't bother testing for aclocal
+test -n "$NO_AUTOMAKE" || (${ACLOCAL:-aclocal} --version) < /dev/null > /dev/null 2>&1 || {
+  echo
+  echo "**Error**: Missing \`aclocal'.  The version of \`automake'"
+  echo "installed doesn't appear recent enough."
+  echo "You can get automake from ftp://ftp.gnu.org/pub/gnu/"
+  DIE=1
+}
+
+if test "$DIE" -eq 1; then
+  exit 1
+fi
+
+if test -z "$*"; then
+  echo "**Warning**: I am going to run \`configure' with no arguments."
+  echo "If you wish to pass any to it, please specify them on the"
+  echo \`$0\'" command line."
+  echo
+fi
+
+case $CC in
+xlc )
+  am_opt=--include-deps;;
+esac
+
+for coin in `find $srcdir -name configure.in -print`
+do 
+  dr=`dirname $coin`
+  if test -f $dr/NO-AUTO-GEN; then
+    echo skipping $dr -- flagged as no auto-gen
+  else
+    echo processing $dr
+    ( cd $dr
+
+      aclocalinclude="$ACLOCAL_FLAGS"
+
+      if grep "^AM_GLIB_GNU_GETTEXT" configure.in >/dev/null; then
+        echo "Creating $dr/aclocal.m4 ..."
+        test -r $dr/aclocal.m4 || touch $dr/aclocal.m4
+        echo "Running glib-gettextize...  Ignore non-fatal messages."
+        echo "no" | glib-gettextize --force --copy
+        echo "Making $dr/aclocal.m4 writable ..."
+        test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4
+      fi
+      if grep "^IT_PROG_INTLTOOL" configure.in >/dev/null; then
+        echo "Running intltoolize..."
+        intltoolize --copy --force --automake
+      fi
+      if grep "^AM_PROG_XML_I18N_TOOLS" configure.in >/dev/null; then
+        echo "Running xml-i18n-toolize..."
+        xml-i18n-toolize --copy --force --automake
+      fi
+      if grep "^AM_PROG_LIBTOOL" configure.in >/dev/null; then
+        if test -z "$NO_LIBTOOLIZE" ; then 
+          echo "Running libtoolize..."
+          ${LIBTOOLIZE:-libtoolize} --force --copy
+        fi
+      fi
+      echo "Running aclocal $aclocalinclude ..."
+      ${ACLOCAL:-aclocal} $aclocalinclude
+      if grep "^AM_CONFIG_HEADER" configure.in >/dev/null; then
+        echo "Running autoheader..."
+        ${AUTOHEADER:-autoheader}
+      fi
+      echo "Running automake --gnu $am_opt ..."
+      ${AUTOMAKE:-automake} --add-missing --gnu $am_opt
+      echo "Running autoconf ..."
+      ${AUTOCONF:-autoconf}
+    )
+  fi
+done
+
+conf_flags="--enable-maintainer-mode"
+
+if test x$NOCONFIGURE = x; then
+  echo Running $srcdir/configure $conf_flags "$@" ...
+  $srcdir/configure $conf_flags "$@" \
+  && echo Now type \`make\' to compile. || exit 1
+else
+  echo Skipping configure process.
+fi


Property changes on: trunk/autogen.sh
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/config.guess
===================================================================
--- trunk/config.guess	                        (rev 0)
+++ trunk/config.guess	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,1500 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
+#   Inc.
+
+timestamp='2006-07-02'
+
+# This file 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.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Originally written by Per Bothner <per at bothner.com>.
+# Please send patches to <config-patches at gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches at gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int x;" > $dummy.c ;
+	for c in cc gcc c89 c99 ; do
+	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+	     CC_FOR_BUILD="$c"; break ;
+	  fi ;
+	done ;
+	if test x"$CC_FOR_BUILD" = x ; then
+	  CC_FOR_BUILD=no_compiler_found ;
+	fi
+	;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi at noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+	PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+	# NetBSD (nbsd) targets should (where applicable) match one or
+	# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+	# switched to ELF, *-*-netbsd* would select the old
+	# object file format.  This provides both forward
+	# compatibility and a consistent mechanism for selecting the
+	# object file format.
+	#
+	# Note: NetBSD doesn't particularly care about the vendor
+	# portion of the name.  We always set it to "unknown".
+	sysctl="sysctl -n hw.machine_arch"
+	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+	case "${UNAME_MACHINE_ARCH}" in
+	    armeb) machine=armeb-unknown ;;
+	    arm*) machine=arm-unknown ;;
+	    sh3el) machine=shl-unknown ;;
+	    sh3eb) machine=sh-unknown ;;
+	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+	esac
+	# The Operating System including object format, if it has switched
+	# to ELF recently, or will in the future.
+	case "${UNAME_MACHINE_ARCH}" in
+	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+		eval $set_cc_for_build
+		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+			| grep __ELF__ >/dev/null
+		then
+		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+		    # Return netbsd for either.  FIX?
+		    os=netbsd
+		else
+		    os=netbsdelf
+		fi
+		;;
+	    *)
+	        os=netbsd
+		;;
+	esac
+	# The OS release
+	# Debian GNU/NetBSD machines have a different userland, and
+	# thus, need a distinct triplet. However, they do not need
+	# kernel version information, so it can be replaced with a
+	# suitable tag, in the style of linux-gnu.
+	case "${UNAME_VERSION}" in
+	    Debian*)
+		release='-gnu'
+		;;
+	    *)
+		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+		;;
+	esac
+	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+	# contains redundant information, the shorter form:
+	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+	echo "${machine}-${os}${release}"
+	exit ;;
+    *:OpenBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+	exit ;;
+    *:ekkoBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+	exit ;;
+    *:SolidBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+	exit ;;
+    macppc:MirBSD:*:*)
+	echo powerpc-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    *:MirBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    alpha:OSF1:*:*)
+	case $UNAME_RELEASE in
+	*4.0)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+		;;
+	*5.*)
+	        UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+		;;
+	esac
+	# According to Compaq, /usr/sbin/psrinfo has been available on
+	# OSF/1 and Tru64 systems produced since 1995.  I hope that
+	# covers most systems running today.  This code pipes the CPU
+	# types through head -n 1, so we only detect the type of CPU 0.
+	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+	case "$ALPHA_CPU_TYPE" in
+	    "EV4 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV4.5 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "LCA4 (21066/21068)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV5 (21164)")
+		UNAME_MACHINE="alphaev5" ;;
+	    "EV5.6 (21164A)")
+		UNAME_MACHINE="alphaev56" ;;
+	    "EV5.6 (21164PC)")
+		UNAME_MACHINE="alphapca56" ;;
+	    "EV5.7 (21164PC)")
+		UNAME_MACHINE="alphapca57" ;;
+	    "EV6 (21264)")
+		UNAME_MACHINE="alphaev6" ;;
+	    "EV6.7 (21264A)")
+		UNAME_MACHINE="alphaev67" ;;
+	    "EV6.8CB (21264C)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8AL (21264B)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8CX (21264D)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.9A (21264/EV69A)")
+		UNAME_MACHINE="alphaev69" ;;
+	    "EV7 (21364)")
+		UNAME_MACHINE="alphaev7" ;;
+	    "EV7.9 (21364A)")
+		UNAME_MACHINE="alphaev79" ;;
+	esac
+	# A Pn.n version is a patched version.
+	# A Vn.n version is a released version.
+	# A Tn.n version is a released field test version.
+	# A Xn.n version is an unreleased experimental baselevel.
+	# 1.2 uses "1.2" for uname -r.
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	exit ;;
+    Alpha\ *:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# Should we change UNAME_MACHINE based on the output of uname instead
+	# of the specific Alpha model?
+	echo alpha-pc-interix
+	exit ;;
+    21064:Windows_NT:50:3)
+	echo alpha-dec-winnt3.5
+	exit ;;
+    Amiga*:UNIX_System_V:4.0:*)
+	echo m68k-unknown-sysv4
+	exit ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-amigaos
+	exit ;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-morphos
+	exit ;;
+    *:OS/390:*:*)
+	echo i370-ibm-openedition
+	exit ;;
+    *:z/VM:*:*)
+	echo s390-ibm-zvmoe
+	exit ;;
+    *:OS400:*:*)
+        echo powerpc-ibm-os400
+	exit ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	echo arm-acorn-riscix${UNAME_RELEASE}
+	exit ;;
+    arm:riscos:*:*|arm:RISCOS:*:*)
+	echo arm-unknown-riscos
+	exit ;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+	echo hppa1.1-hitachi-hiuxmpp
+	exit ;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+	# akee at wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+	if test "`(/bin/universe) 2>/dev/null`" = att ; then
+		echo pyramid-pyramid-sysv3
+	else
+		echo pyramid-pyramid-bsd
+	fi
+	exit ;;
+    NILE*:*:*:dcosx)
+	echo pyramid-pyramid-svr4
+	exit ;;
+    DRS?6000:unix:4.0:6*)
+	echo sparc-icl-nx6
+	exit ;;
+    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+	case `/usr/bin/uname -p` in
+	    sparc) echo sparc-icl-nx7; exit ;;
+	esac ;;
+    sun4H:SunOS:5.*:*)
+	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    i86pc:SunOS:5.*:*)
+	echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:6*:*)
+	# According to config.sub, this is the proper way to canonicalize
+	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+	# it's likely to be more like Solaris than SunOS4.
+	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:*:*)
+	case "`/usr/bin/arch -k`" in
+	    Series*|S4*)
+		UNAME_RELEASE=`uname -v`
+		;;
+	esac
+	# Japanese Language versions have a version number like `4.1.3-JL'.
+	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+	exit ;;
+    sun3*:SunOS:*:*)
+	echo m68k-sun-sunos${UNAME_RELEASE}
+	exit ;;
+    sun*:*:4.2BSD:*)
+	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+	case "`/bin/arch`" in
+	    sun3)
+		echo m68k-sun-sunos${UNAME_RELEASE}
+		;;
+	    sun4)
+		echo sparc-sun-sunos${UNAME_RELEASE}
+		;;
+	esac
+	exit ;;
+    aushp:SunOS:*:*)
+	echo sparc-auspex-sunos${UNAME_RELEASE}
+	exit ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+        exit ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+        echo m68k-milan-mint${UNAME_RELEASE}
+        exit ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+        echo m68k-hades-mint${UNAME_RELEASE}
+        exit ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+        echo m68k-unknown-mint${UNAME_RELEASE}
+        exit ;;
+    m68k:machten:*:*)
+	echo m68k-apple-machten${UNAME_RELEASE}
+	exit ;;
+    powerpc:machten:*:*)
+	echo powerpc-apple-machten${UNAME_RELEASE}
+	exit ;;
+    RISC*:Mach:*:*)
+	echo mips-dec-mach_bsd4.3
+	exit ;;
+    RISC*:ULTRIX:*:*)
+	echo mips-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    VAX*:ULTRIX*:*:*)
+	echo vax-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+	echo clipper-intergraph-clix${UNAME_RELEASE}
+	exit ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+	#if defined (host_mips) && defined (MIPSEB)
+	#if defined (SYSTYPE_SYSV)
+	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_SVR4)
+	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+	#endif
+	#endif
+	  exit (-1);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c &&
+	  dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+	  SYSTEM_NAME=`$dummy $dummyarg` &&
+	    { echo "$SYSTEM_NAME"; exit; }
+	echo mips-mips-riscos${UNAME_RELEASE}
+	exit ;;
+    Motorola:PowerMAX_OS:*:*)
+	echo powerpc-motorola-powermax
+	exit ;;
+    Motorola:*:4.3:PL8-*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:Power_UNIX:*:*)
+	echo powerpc-harris-powerunix
+	exit ;;
+    m88k:CX/UX:7*:*)
+	echo m88k-harris-cxux7
+	exit ;;
+    m88k:*:4*:R4*)
+	echo m88k-motorola-sysv4
+	exit ;;
+    m88k:*:3*:R3*)
+	echo m88k-motorola-sysv3
+	exit ;;
+    AViiON:dgux:*:*)
+        # DG/UX returns AViiON for all architectures
+        UNAME_PROCESSOR=`/usr/bin/uname -p`
+	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+	then
+	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+	       [ ${TARGET_BINARY_INTERFACE}x = x ]
+	    then
+		echo m88k-dg-dgux${UNAME_RELEASE}
+	    else
+		echo m88k-dg-dguxbcs${UNAME_RELEASE}
+	    fi
+	else
+	    echo i586-dg-dgux${UNAME_RELEASE}
+	fi
+ 	exit ;;
+    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
+	echo m88k-dolphin-sysv3
+	exit ;;
+    M88*:*:R3*:*)
+	# Delta 88k system running SVR3
+	echo m88k-motorola-sysv3
+	exit ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+	echo m88k-tektronix-sysv3
+	exit ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+	echo m68k-tektronix-bsd
+	exit ;;
+    *:IRIX*:*:*)
+	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+	exit ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
+	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+	echo i386-ibm-aix
+	exit ;;
+    ia64:AIX:*:*)
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:2:3)
+	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+		eval $set_cc_for_build
+		sed 's/^		//' << EOF >$dummy.c
+		#include <sys/systemcfg.h>
+
+		main()
+			{
+			if (!__power_pc())
+				exit(1);
+			puts("powerpc-ibm-aix3.2.5");
+			exit(0);
+			}
+EOF
+		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+		then
+			echo "$SYSTEM_NAME"
+		else
+			echo rs6000-ibm-aix3.2.5
+		fi
+	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+		echo rs6000-ibm-aix3.2.4
+	else
+		echo rs6000-ibm-aix3.2
+	fi
+	exit ;;
+    *:AIX:*:[45])
+	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+		IBM_ARCH=rs6000
+	else
+		IBM_ARCH=powerpc
+	fi
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:*:*)
+	echo rs6000-ibm-aix
+	exit ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+	echo romp-ibm-bsd4.4
+	exit ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+	exit ;;                             # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+	echo rs6000-bull-bosx
+	exit ;;
+    DPX/2?00:B.O.S.:*:*)
+	echo m68k-bull-sysv3
+	exit ;;
+    9000/[34]??:4.3bsd:1.*:*)
+	echo m68k-hp-bsd
+	exit ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+	echo m68k-hp-bsd4.4
+	exit ;;
+    9000/[34678]??:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	case "${UNAME_MACHINE}" in
+	    9000/31? )            HP_ARCH=m68000 ;;
+	    9000/[34]?? )         HP_ARCH=m68k ;;
+	    9000/[678][0-9][0-9])
+		if [ -x /usr/bin/getconf ]; then
+		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+                    case "${sc_cpu_version}" in
+                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+                      532)                      # CPU_PA_RISC2_0
+                        case "${sc_kernel_bits}" in
+                          32) HP_ARCH="hppa2.0n" ;;
+                          64) HP_ARCH="hppa2.0w" ;;
+			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
+                        esac ;;
+                    esac
+		fi
+		if [ "${HP_ARCH}" = "" ]; then
+		    eval $set_cc_for_build
+		    sed 's/^              //' << EOF >$dummy.c
+
+              #define _HPUX_SOURCE
+              #include <stdlib.h>
+              #include <unistd.h>
+
+              int main ()
+              {
+              #if defined(_SC_KERNEL_BITS)
+                  long bits = sysconf(_SC_KERNEL_BITS);
+              #endif
+                  long cpu  = sysconf (_SC_CPU_VERSION);
+
+                  switch (cpu)
+              	{
+              	case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+              	case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+              	case CPU_PA_RISC2_0:
+              #if defined(_SC_KERNEL_BITS)
+              	    switch (bits)
+              		{
+              		case 64: puts ("hppa2.0w"); break;
+              		case 32: puts ("hppa2.0n"); break;
+              		default: puts ("hppa2.0"); break;
+              		} break;
+              #else  /* !defined(_SC_KERNEL_BITS) */
+              	    puts ("hppa2.0"); break;
+              #endif
+              	default: puts ("hppa1.0"); break;
+              	}
+                  exit (0);
+              }
+EOF
+		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+		    test -z "$HP_ARCH" && HP_ARCH=hppa
+		fi ;;
+	esac
+	if [ ${HP_ARCH} = "hppa2.0w" ]
+	then
+	    eval $set_cc_for_build
+
+	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
+	    # generating 64-bit code.  GNU and HP use different nomenclature:
+	    #
+	    # $ CC_FOR_BUILD=cc ./config.guess
+	    # => hppa2.0w-hp-hpux11.23
+	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+	    # => hppa64-hp-hpux11.23
+
+	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+		grep __LP64__ >/dev/null
+	    then
+		HP_ARCH="hppa2.0w"
+	    else
+		HP_ARCH="hppa64"
+	    fi
+	fi
+	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+	exit ;;
+    ia64:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	echo ia64-hp-hpux${HPUX_REV}
+	exit ;;
+    3050*:HI-UX:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#include <unistd.h>
+	int
+	main ()
+	{
+	  long cpu = sysconf (_SC_CPU_VERSION);
+	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+	     results, however.  */
+	  if (CPU_IS_PA_RISC (cpu))
+	    {
+	      switch (cpu)
+		{
+		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+		  default: puts ("hppa-hitachi-hiuxwe2"); break;
+		}
+	    }
+	  else if (CPU_IS_HP_MC68K (cpu))
+	    puts ("m68k-hitachi-hiuxwe2");
+	  else puts ("unknown-hitachi-hiuxwe2");
+	  exit (0);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+		{ echo "$SYSTEM_NAME"; exit; }
+	echo unknown-hitachi-hiuxwe2
+	exit ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+	echo hppa1.1-hp-bsd
+	exit ;;
+    9000/8??:4.3bsd:*:*)
+	echo hppa1.0-hp-bsd
+	exit ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+	echo hppa1.0-hp-mpeix
+	exit ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+	echo hppa1.1-hp-osf
+	exit ;;
+    hp8??:OSF1:*:*)
+	echo hppa1.0-hp-osf
+	exit ;;
+    i*86:OSF1:*:*)
+	if [ -x /usr/sbin/sysversion ] ; then
+	    echo ${UNAME_MACHINE}-unknown-osf1mk
+	else
+	    echo ${UNAME_MACHINE}-unknown-osf1
+	fi
+	exit ;;
+    parisc*:Lites*:*:*)
+	echo hppa1.1-hp-lites
+	exit ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+	echo c1-convex-bsd
+        exit ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+        exit ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+	echo c34-convex-bsd
+        exit ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+	echo c38-convex-bsd
+        exit ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+	echo c4-convex-bsd
+        exit ;;
+    CRAY*Y-MP:*:*:*)
+	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*[A-Z]90:*:*:*)
+	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+	      -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*TS:*:*:*)
+	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*T3E:*:*:*)
+	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*SV1:*:*:*)
+	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    *:UNICOS/mp:*:*)
+	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+        exit ;;
+    5000:UNIX_System_V:4.*:*)
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+        echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+	exit ;;
+    sparc*:BSD/OS:*:*)
+	echo sparc-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:BSD/OS:*:*)
+	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:FreeBSD:*:*)
+	case ${UNAME_MACHINE} in
+	    pc98)
+		echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	    amd64)
+		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	    *)
+		echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	esac
+	exit ;;
+    i*:CYGWIN*:*)
+	echo ${UNAME_MACHINE}-pc-cygwin
+	exit ;;
+    i*:MINGW*:*)
+	echo ${UNAME_MACHINE}-pc-mingw32
+	exit ;;
+    i*:windows32*:*)
+    	# uname -m includes "-pc" on this system.
+    	echo ${UNAME_MACHINE}-mingw32
+	exit ;;
+    i*:PW*:*)
+	echo ${UNAME_MACHINE}-pc-pw32
+	exit ;;
+    x86:Interix*:[3456]*)
+	echo i586-pc-interix${UNAME_RELEASE}
+	exit ;;
+    EM64T:Interix*:[3456]*)
+	echo x86_64-unknown-interix${UNAME_RELEASE}
+	exit ;;
+    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+	echo i${UNAME_MACHINE}-pc-mks
+	exit ;;
+    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+	# UNAME_MACHINE based on the output of uname instead of i386?
+	echo i586-pc-interix
+	exit ;;
+    i*:UWIN*:*)
+	echo ${UNAME_MACHINE}-pc-uwin
+	exit ;;
+    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+	echo x86_64-unknown-cygwin
+	exit ;;
+    p*:CYGWIN*:*)
+	echo powerpcle-unknown-cygwin
+	exit ;;
+    prep*:SunOS:5.*:*)
+	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    *:GNU:*:*)
+	# the GNU system
+	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	exit ;;
+    *:GNU/*:*:*)
+	# other systems with GNU libc and userland
+	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+	exit ;;
+    i*86:Minix:*:*)
+	echo ${UNAME_MACHINE}-pc-minix
+	exit ;;
+    arm*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    avr32*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    cris:Linux:*:*)
+	echo cris-axis-linux-gnu
+	exit ;;
+    crisv32:Linux:*:*)
+	echo crisv32-axis-linux-gnu
+	exit ;;
+    frv:Linux:*:*)
+    	echo frv-unknown-linux-gnu
+	exit ;;
+    ia64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    m32r*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    m68*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    mips:Linux:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#undef CPU
+	#undef mips
+	#undef mipsel
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	CPU=mipsel
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	CPU=mips
+	#else
+	CPU=
+	#endif
+	#endif
+EOF
+	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+	    /^CPU/{
+		s: ::g
+		p
+	    }'`"
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+	;;
+    mips64:Linux:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#undef CPU
+	#undef mips64
+	#undef mips64el
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	CPU=mips64el
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	CPU=mips64
+	#else
+	CPU=
+	#endif
+	#endif
+EOF
+	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+	    /^CPU/{
+		s: ::g
+		p
+	    }'`"
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+	;;
+    or32:Linux:*:*)
+	echo or32-unknown-linux-gnu
+	exit ;;
+    ppc:Linux:*:*)
+	echo powerpc-unknown-linux-gnu
+	exit ;;
+    ppc64:Linux:*:*)
+	echo powerpc64-unknown-linux-gnu
+	exit ;;
+    alpha:Linux:*:*)
+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+	  EV5)   UNAME_MACHINE=alphaev5 ;;
+	  EV56)  UNAME_MACHINE=alphaev56 ;;
+	  PCA56) UNAME_MACHINE=alphapca56 ;;
+	  PCA57) UNAME_MACHINE=alphapca56 ;;
+	  EV6)   UNAME_MACHINE=alphaev6 ;;
+	  EV67)  UNAME_MACHINE=alphaev67 ;;
+	  EV68*) UNAME_MACHINE=alphaev68 ;;
+        esac
+	objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+	exit ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+	# Look for CPU level
+	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
+	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
+	  *)    echo hppa-unknown-linux-gnu ;;
+	esac
+	exit ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+	echo hppa64-unknown-linux-gnu
+	exit ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+	echo ${UNAME_MACHINE}-ibm-linux
+	exit ;;
+    sh64*:Linux:*:*)
+    	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    sh*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    vax:Linux:*:*)
+	echo ${UNAME_MACHINE}-dec-linux-gnu
+	exit ;;
+    x86_64:Linux:*:*)
+	echo x86_64-unknown-linux-gnu
+	exit ;;
+    i*86:Linux:*:*)
+	# The BFD linker knows what the default object file format is, so
+	# first see if it will tell us. cd to the root directory to prevent
+	# problems with other programs or directories called `ld' in the path.
+	# Set LC_ALL=C to ensure ld outputs messages in English.
+	ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
+			 | sed -ne '/supported targets:/!d
+				    s/[ 	][ 	]*/ /g
+				    s/.*supported targets: *//
+				    s/ .*//
+				    p'`
+        case "$ld_supported_targets" in
+	  elf32-i386)
+		TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+		;;
+	  a.out-i386-linux)
+		echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+		exit ;;
+	  coff-i386)
+		echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+		exit ;;
+	  "")
+		# Either a pre-BFD a.out linker (linux-gnuoldld) or
+		# one that does not give us useful --help.
+		echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+		exit ;;
+	esac
+	# Determine whether the default compiler is a.out or elf
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#include <features.h>
+	#ifdef __ELF__
+	# ifdef __GLIBC__
+	#  if __GLIBC__ >= 2
+	LIBC=gnu
+	#  else
+	LIBC=gnulibc1
+	#  endif
+	# else
+	LIBC=gnulibc1
+	# endif
+	#else
+	#if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)
+	LIBC=gnu
+	#else
+	LIBC=gnuaout
+	#endif
+	#endif
+	#ifdef __dietlibc__
+	LIBC=dietlibc
+	#endif
+EOF
+	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+	    /^LIBC/{
+		s: ::g
+		p
+	    }'`"
+	test x"${LIBC}" != x && {
+		echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+		exit
+	}
+	test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; }
+	;;
+    i*86:DYNIX/ptx:4*:*)
+	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+	# earlier versions are messed up and put the nodename in both
+	# sysname and nodename.
+	echo i386-sequent-sysv4
+	exit ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+        # Unixware is an offshoot of SVR4, but it has its own version
+        # number series starting with 2...
+        # I am not positive that other SVR4 systems won't match this,
+	# I just have to hope.  -- rms.
+        # Use sysv4.2uw... so that sysv4* matches it.
+	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+	exit ;;
+    i*86:OS/2:*:*)
+	# If we were able to find `uname', then EMX Unix compatibility
+	# is probably installed.
+	echo ${UNAME_MACHINE}-pc-os2-emx
+	exit ;;
+    i*86:XTS-300:*:STOP)
+	echo ${UNAME_MACHINE}-unknown-stop
+	exit ;;
+    i*86:atheos:*:*)
+	echo ${UNAME_MACHINE}-unknown-atheos
+	exit ;;
+    i*86:syllable:*:*)
+	echo ${UNAME_MACHINE}-pc-syllable
+	exit ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
+	echo i386-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    i*86:*DOS:*:*)
+	echo ${UNAME_MACHINE}-pc-msdosdjgpp
+	exit ;;
+    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+	else
+		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+	fi
+	exit ;;
+    i*86:*:5:[678]*)
+    	# UnixWare 7.x, OpenUNIX and OpenServer 6.
+	case `/bin/uname -X | grep "^Machine"` in
+	    *486*)	     UNAME_MACHINE=i486 ;;
+	    *Pentium)	     UNAME_MACHINE=i586 ;;
+	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+	esac
+	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+	exit ;;
+    i*86:*:3.2:*)
+	if test -f /usr/options/cb.name; then
+		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+	elif /bin/uname -X 2>/dev/null >/dev/null ; then
+		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+			&& UNAME_MACHINE=i586
+		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+	else
+		echo ${UNAME_MACHINE}-pc-sysv32
+	fi
+	exit ;;
+    pc:*:*:*)
+	# Left here for compatibility:
+        # uname -m prints for DJGPP always 'pc', but it prints nothing about
+        # the processor, so we play safe by assuming i386.
+	echo i386-pc-msdosdjgpp
+        exit ;;
+    Intel:Mach:3*:*)
+	echo i386-pc-mach3
+	exit ;;
+    paragon:*:*:*)
+	echo i860-intel-osf1
+	exit ;;
+    i860:*:4.*:*) # i860-SVR4
+	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+	else # Add other i860-SVR4 vendors below as they are discovered.
+	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+	fi
+	exit ;;
+    mini*:CTIX:SYS*5:*)
+	# "miniframe"
+	echo m68010-convergent-sysv
+	exit ;;
+    mc68k:UNIX:SYSTEM5:3.51m)
+	echo m68k-convergent-sysv
+	exit ;;
+    M680?0:D-NIX:5.3:*)
+	echo m68k-diab-dnix
+	exit ;;
+    M68*:*:R3V[5678]*:*)
+	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+	OS_REL=''
+	test -r /etc/.relid \
+	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+          && { echo i486-ncr-sysv4; exit; } ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+	echo m68k-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    mc68030:UNIX_System_V:4.*:*)
+	echo m68k-atari-sysv4
+	exit ;;
+    TSUNAMI:LynxOS:2.*:*)
+	echo sparc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    rs6000:LynxOS:2.*:*)
+	echo rs6000-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+	echo powerpc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    SM[BE]S:UNIX_SV:*:*)
+	echo mips-dde-sysv${UNAME_RELEASE}
+	exit ;;
+    RM*:ReliantUNIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    RM*:SINIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    *:SINIX-*:*:*)
+	if uname -p 2>/dev/null >/dev/null ; then
+		UNAME_MACHINE=`(uname -p) 2>/dev/null`
+		echo ${UNAME_MACHINE}-sni-sysv4
+	else
+		echo ns32k-sni-sysv
+	fi
+	exit ;;
+    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                      # says <Richard.M.Bartel at ccMail.Census.GOV>
+        echo i586-unisys-sysv4
+        exit ;;
+    *:UNIX_System_V:4*:FTX*)
+	# From Gerald Hewes <hewes at openmarket.com>.
+	# How about differentiating between stratus architectures? -djm
+	echo hppa1.1-stratus-sysv4
+	exit ;;
+    *:*:*:FTX*)
+	# From seanf at swdc.stratus.com.
+	echo i860-stratus-sysv4
+	exit ;;
+    i*86:VOS:*:*)
+	# From Paul.Green at stratus.com.
+	echo ${UNAME_MACHINE}-stratus-vos
+	exit ;;
+    *:VOS:*:*)
+	# From Paul.Green at stratus.com.
+	echo hppa1.1-stratus-vos
+	exit ;;
+    mc68*:A/UX:*:*)
+	echo m68k-apple-aux${UNAME_RELEASE}
+	exit ;;
+    news*:NEWS-OS:6*:*)
+	echo mips-sony-newsos6
+	exit ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+	if [ -d /usr/nec ]; then
+	        echo mips-nec-sysv${UNAME_RELEASE}
+	else
+	        echo mips-unknown-sysv${UNAME_RELEASE}
+	fi
+        exit ;;
+    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
+	echo powerpc-be-beos
+	exit ;;
+    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
+	echo powerpc-apple-beos
+	exit ;;
+    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
+	echo i586-pc-beos
+	exit ;;
+    SX-4:SUPER-UX:*:*)
+	echo sx4-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-5:SUPER-UX:*:*)
+	echo sx5-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-6:SUPER-UX:*:*)
+	echo sx6-nec-superux${UNAME_RELEASE}
+	exit ;;
+    Power*:Rhapsody:*:*)
+	echo powerpc-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Rhapsody:*:*)
+	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Darwin:*:*)
+	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+	case $UNAME_PROCESSOR in
+	    unknown) UNAME_PROCESSOR=powerpc ;;
+	esac
+	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+	exit ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+	UNAME_PROCESSOR=`uname -p`
+	if test "$UNAME_PROCESSOR" = "x86"; then
+		UNAME_PROCESSOR=i386
+		UNAME_MACHINE=pc
+	fi
+	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+	exit ;;
+    *:QNX:*:4*)
+	echo i386-pc-qnx
+	exit ;;
+    NSE-?:NONSTOP_KERNEL:*:*)
+	echo nse-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    NSR-?:NONSTOP_KERNEL:*:*)
+	echo nsr-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    *:NonStop-UX:*:*)
+	echo mips-compaq-nonstopux
+	exit ;;
+    BS2000:POSIX*:*:*)
+	echo bs2000-siemens-sysv
+	exit ;;
+    DS/*:UNIX_System_V:*:*)
+	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+	exit ;;
+    *:Plan9:*:*)
+	# "uname -m" is not consistent, so use $cputype instead. 386
+	# is converted to i386 for consistency with other x86
+	# operating systems.
+	if test "$cputype" = "386"; then
+	    UNAME_MACHINE=i386
+	else
+	    UNAME_MACHINE="$cputype"
+	fi
+	echo ${UNAME_MACHINE}-unknown-plan9
+	exit ;;
+    *:TOPS-10:*:*)
+	echo pdp10-unknown-tops10
+	exit ;;
+    *:TENEX:*:*)
+	echo pdp10-unknown-tenex
+	exit ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+	echo pdp10-dec-tops20
+	exit ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+	echo pdp10-xkl-tops20
+	exit ;;
+    *:TOPS-20:*:*)
+	echo pdp10-unknown-tops20
+	exit ;;
+    *:ITS:*:*)
+	echo pdp10-unknown-its
+	exit ;;
+    SEI:*:*:SEIUX)
+        echo mips-sei-seiux${UNAME_RELEASE}
+	exit ;;
+    *:DragonFly:*:*)
+	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+	exit ;;
+    *:*VMS:*:*)
+    	UNAME_MACHINE=`(uname -p) 2>/dev/null`
+	case "${UNAME_MACHINE}" in
+	    A*) echo alpha-dec-vms ; exit ;;
+	    I*) echo ia64-dec-vms ; exit ;;
+	    V*) echo vax-dec-vms ; exit ;;
+	esac ;;
+    *:XENIX:*:SysV)
+	echo i386-pc-xenix
+	exit ;;
+    i*86:skyos:*:*)
+	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+	exit ;;
+    i*86:rdos:*:*)
+	echo ${UNAME_MACHINE}-pc-rdos
+	exit ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+          "4"
+#else
+	  ""
+#endif
+         ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix\n"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+	printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+	printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+#  include <sys/param.h>
+#  if defined (BSD)
+#   if BSD == 43
+      printf ("vax-dec-bsd4.3\n"); exit (0);
+#   else
+#    if BSD == 199006
+      printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#    else
+      printf ("vax-dec-bsd\n"); exit (0);
+#    endif
+#   endif
+#  else
+    printf ("vax-dec-bsd\n"); exit (0);
+#  endif
+# else
+    printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+	{ echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+	echo c1-convex-bsd
+	exit ;;
+    c2*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit ;;
+    c34*)
+	echo c34-convex-bsd
+	exit ;;
+    c38*)
+	echo c38-convex-bsd
+	exit ;;
+    c4*)
+	echo c4-convex-bsd
+	exit ;;
+    esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+  http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess
+and
+  http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches at gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:


Property changes on: trunk/config.guess
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/config.h.in
===================================================================
--- trunk/config.h.in	                        (rev 0)
+++ trunk/config.h.in	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,124 @@
+/* config.h.in.  Generated from configure.in by autoheader.  */
+
+/* libmp4v2 probably version 1.6 or higher: MP4GetMetadataCoverArt accepts an
+   extra argument */
+#undef COVERART_ACCEPTS_EXTRA_ARG
+
+/* always defined to indicate that i18n is enabled */
+#undef ENABLE_NLS
+
+/* libmp4v2 probably version 1.6 or higher: MP4GetMetadataFreeForm accepts
+   extra argument */
+#undef FREEFORM_ACCEPTS_EXTRA_ARG
+
+/* "Gettext package name" */
+#undef GETTEXT_PACKAGE
+
+/* Define to 1 if you have the `bind_textdomain_codeset' function. */
+#undef HAVE_BIND_TEXTDOMAIN_CODESET
+
+/* Define if you have curl support */
+#undef HAVE_CURL
+
+/* Define to 1 if you have the `dcgettext' function. */
+#undef HAVE_DCGETTEXT
+
+/* Define if you have the flac library */
+#undef HAVE_FLAC
+
+/* Define to 1 if you have the `flock' function. */
+#undef HAVE_FLOCK
+
+/* Define to 1 if you have the `getopt_long_only' function. */
+#undef HAVE_GETOPT_LONG_ONLY
+
+/* Define if the GNU gettext() function is already present or preinstalled. */
+#undef HAVE_GETTEXT
+
+/* Define if you have gnome-vfs support */
+#undef HAVE_GNOME_VFS
+
+/* Define if you have HAL support */
+#undef HAVE_HAL
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define if your <locale.h> file defines LC_MESSAGES. */
+#undef HAVE_LC_MESSAGES
+
+/* Define if you have the mp4v2 library */
+#undef HAVE_LIBMP4V2
+
+/* Define if you have the ogg/vorbis library */
+#undef HAVE_LIBVORBISFILE
+
+/* Define to 1 if you have the <linux/cdrom.h> header file. */
+#undef HAVE_LINUX_CDROM_H
+
+/* Define to 1 if you have the <locale.h> header file. */
+#undef HAVE_LOCALE_H
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the <scsi/scsi.h> header file. */
+#undef HAVE_SCSI_SCSI_H
+
+/* Define to 1 if you have the <scsi/scsi_ioctl.h> header file. */
+#undef HAVE_SCSI_SCSI_IOCTL_H
+
+/* Define to 1 if you have the <scsi/sg.h> header file. */
+#undef HAVE_SCSI_SG_H
+
+/* Define to 1 if you have the `statvfs' function. */
+#undef HAVE_STATVFS
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Version number of package */
+#undef VERSION
+
+/* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a
+   `char[]'. */
+#undef YYTEXT_POINTER

Added: trunk/config.sub
===================================================================
--- trunk/config.sub	                        (rev 0)
+++ trunk/config.sub	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,1616 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
+#   Inc.
+
+timestamp='2006-09-20'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This file 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.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Please send patches to <config-patches at gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+       $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches at gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit ;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
+  uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
+  storm-chaos* | os2-emx* | rtmk-nova*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+	-sun*os*)
+		# Prevent following clause from handling this invalid input.
+		;;
+	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+	-apple | -axis | -knuth | -cray)
+		os=
+		basic_machine=$1
+		;;
+	-sim | -cisco | -oki | -wec | -winbond)
+		os=
+		basic_machine=$1
+		;;
+	-scout)
+		;;
+	-wrs)
+		os=-vxworks
+		basic_machine=$1
+		;;
+	-chorusos*)
+		os=-chorusos
+		basic_machine=$1
+		;;
+ 	-chorusrdb)
+ 		os=-chorusrdb
+		basic_machine=$1
+ 		;;
+	-hiux*)
+		os=-hiuxwe2
+		;;
+	-sco6)
+		os=-sco5v6
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5)
+		os=-sco3.2v5
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco4)
+		os=-sco3.2v4
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2.[4-9]*)
+		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2v[4-9]*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5v6*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco*)
+		os=-sco3.2v2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-udk*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-isc)
+		os=-isc2.2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-clix*)
+		basic_machine=clipper-intergraph
+		;;
+	-isc*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-lynx*)
+		os=-lynxos
+		;;
+	-ptx*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+		;;
+	-windowsnt*)
+		os=`echo $os | sed -e 's/windowsnt/winnt/'`
+		;;
+	-psos*)
+		os=-psos
+		;;
+	-mint | -mint[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+	# Recognize the basic CPU types without company name.
+	# Some are omitted here because they have special meanings below.
+	1750a | 580 \
+	| a29k \
+	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+	| am33_2.0 \
+	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
+	| bfin \
+	| c4x | clipper \
+	| d10v | d30v | dlx | dsp16xx \
+	| fr30 | frv \
+	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+	| i370 | i860 | i960 | ia64 \
+	| ip2k | iq2000 \
+	| m32c | m32r | m32rle | m68000 | m68k | m88k \
+	| maxq | mb | microblaze | mcore \
+	| mips | mipsbe | mipseb | mipsel | mipsle \
+	| mips16 \
+	| mips64 | mips64el \
+	| mips64vr | mips64vrel \
+	| mips64orion | mips64orionel \
+	| mips64vr4100 | mips64vr4100el \
+	| mips64vr4300 | mips64vr4300el \
+	| mips64vr5000 | mips64vr5000el \
+	| mips64vr5900 | mips64vr5900el \
+	| mipsisa32 | mipsisa32el \
+	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa64 | mipsisa64el \
+	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64sb1 | mipsisa64sb1el \
+	| mipsisa64sr71k | mipsisa64sr71kel \
+	| mipstx39 | mipstx39el \
+	| mn10200 | mn10300 \
+	| mt \
+	| msp430 \
+	| nios | nios2 \
+	| ns16k | ns32k \
+	| or32 \
+	| pdp10 | pdp11 | pj | pjl \
+	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+	| pyramid \
+	| score \
+	| sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+	| sh64 | sh64le \
+	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+	| spu | strongarm \
+	| tahoe | thumb | tic4x | tic80 | tron \
+	| v850 | v850e \
+	| we32k \
+	| x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
+	| z8k)
+		basic_machine=$basic_machine-unknown
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12)
+		# Motorola 68HC11/12.
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+		;;
+	ms1)
+		basic_machine=mt-unknown
+		;;
+
+	# We use `pc' rather than `unknown'
+	# because (1) that's what they normally are, and
+	# (2) the word "unknown" tends to confuse beginning users.
+	i*86 | x86_64)
+	  basic_machine=$basic_machine-pc
+	  ;;
+	# Object if more than one company name word.
+	*-*-*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+	# Recognize the basic CPU types with company name.
+	580-* \
+	| a29k-* \
+	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+	| avr-* | avr32-* \
+	| bfin-* | bs2000-* \
+	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+	| clipper-* | craynv-* | cydra-* \
+	| d10v-* | d30v-* | dlx-* \
+	| elxsi-* \
+	| f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
+	| h8300-* | h8500-* \
+	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+	| i*86-* | i860-* | i960-* | ia64-* \
+	| ip2k-* | iq2000-* \
+	| m32c-* | m32r-* | m32rle-* \
+	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* \
+	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+	| mips16-* \
+	| mips64-* | mips64el-* \
+	| mips64vr-* | mips64vrel-* \
+	| mips64orion-* | mips64orionel-* \
+	| mips64vr4100-* | mips64vr4100el-* \
+	| mips64vr4300-* | mips64vr4300el-* \
+	| mips64vr5000-* | mips64vr5000el-* \
+	| mips64vr5900-* | mips64vr5900el-* \
+	| mipsisa32-* | mipsisa32el-* \
+	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa64-* | mipsisa64el-* \
+	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64sb1-* | mipsisa64sb1el-* \
+	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
+	| mipstx39-* | mipstx39el-* \
+	| mmix-* \
+	| mt-* \
+	| msp430-* \
+	| nios-* | nios2-* \
+	| none-* | np1-* | ns16k-* | ns32k-* \
+	| orion-* \
+	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+	| pyramid-* \
+	| romp-* | rs6000-* \
+	| sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+	| sparclite-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
+	| tahoe-* | thumb-* \
+	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+	| tron-* \
+	| v850-* | v850e-* | vax-* \
+	| we32k-* \
+	| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
+	| xstormy16-* | xtensa-* \
+	| ymp-* \
+	| z8k-*)
+		;;
+	# Recognize the various machine names and aliases which stand
+	# for a CPU type and a company and sometimes even an OS.
+	386bsd)
+		basic_machine=i386-unknown
+		os=-bsd
+		;;
+	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+		basic_machine=m68000-att
+		;;
+	3b*)
+		basic_machine=we32k-att
+		;;
+	a29khif)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+    	abacus)
+		basic_machine=abacus-unknown
+		;;
+	adobe68k)
+		basic_machine=m68010-adobe
+		os=-scout
+		;;
+	alliant | fx80)
+		basic_machine=fx80-alliant
+		;;
+	altos | altos3068)
+		basic_machine=m68k-altos
+		;;
+	am29k)
+		basic_machine=a29k-none
+		os=-bsd
+		;;
+	amd64)
+		basic_machine=x86_64-pc
+		;;
+	amd64-*)
+		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	amdahl)
+		basic_machine=580-amdahl
+		os=-sysv
+		;;
+	amiga | amiga-*)
+		basic_machine=m68k-unknown
+		;;
+	amigaos | amigados)
+		basic_machine=m68k-unknown
+		os=-amigaos
+		;;
+	amigaunix | amix)
+		basic_machine=m68k-unknown
+		os=-sysv4
+		;;
+	apollo68)
+		basic_machine=m68k-apollo
+		os=-sysv
+		;;
+	apollo68bsd)
+		basic_machine=m68k-apollo
+		os=-bsd
+		;;
+	aux)
+		basic_machine=m68k-apple
+		os=-aux
+		;;
+	balance)
+		basic_machine=ns32k-sequent
+		os=-dynix
+		;;
+	c90)
+		basic_machine=c90-cray
+		os=-unicos
+		;;
+	convex-c1)
+		basic_machine=c1-convex
+		os=-bsd
+		;;
+	convex-c2)
+		basic_machine=c2-convex
+		os=-bsd
+		;;
+	convex-c32)
+		basic_machine=c32-convex
+		os=-bsd
+		;;
+	convex-c34)
+		basic_machine=c34-convex
+		os=-bsd
+		;;
+	convex-c38)
+		basic_machine=c38-convex
+		os=-bsd
+		;;
+	cray | j90)
+		basic_machine=j90-cray
+		os=-unicos
+		;;
+	craynv)
+		basic_machine=craynv-cray
+		os=-unicosmp
+		;;
+	cr16c)
+		basic_machine=cr16c-unknown
+		os=-elf
+		;;
+	crds | unos)
+		basic_machine=m68k-crds
+		;;
+	crisv32 | crisv32-* | etraxfs*)
+		basic_machine=crisv32-axis
+		;;
+	cris | cris-* | etrax*)
+		basic_machine=cris-axis
+		;;
+	crx)
+		basic_machine=crx-unknown
+		os=-elf
+		;;
+	da30 | da30-*)
+		basic_machine=m68k-da30
+		;;
+	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+		basic_machine=mips-dec
+		;;
+	decsystem10* | dec10*)
+		basic_machine=pdp10-dec
+		os=-tops10
+		;;
+	decsystem20* | dec20*)
+		basic_machine=pdp10-dec
+		os=-tops20
+		;;
+	delta | 3300 | motorola-3300 | motorola-delta \
+	      | 3300-motorola | delta-motorola)
+		basic_machine=m68k-motorola
+		;;
+	delta88)
+		basic_machine=m88k-motorola
+		os=-sysv3
+		;;
+	djgpp)
+		basic_machine=i586-pc
+		os=-msdosdjgpp
+		;;
+	dpx20 | dpx20-*)
+		basic_machine=rs6000-bull
+		os=-bosx
+		;;
+	dpx2* | dpx2*-bull)
+		basic_machine=m68k-bull
+		os=-sysv3
+		;;
+	ebmon29k)
+		basic_machine=a29k-amd
+		os=-ebmon
+		;;
+	elxsi)
+		basic_machine=elxsi-elxsi
+		os=-bsd
+		;;
+	encore | umax | mmax)
+		basic_machine=ns32k-encore
+		;;
+	es1800 | OSE68k | ose68k | ose | OSE)
+		basic_machine=m68k-ericsson
+		os=-ose
+		;;
+	fx2800)
+		basic_machine=i860-alliant
+		;;
+	genix)
+		basic_machine=ns32k-ns
+		;;
+	gmicro)
+		basic_machine=tron-gmicro
+		os=-sysv
+		;;
+	go32)
+		basic_machine=i386-pc
+		os=-go32
+		;;
+	h3050r* | hiux*)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	h8300hms)
+		basic_machine=h8300-hitachi
+		os=-hms
+		;;
+	h8300xray)
+		basic_machine=h8300-hitachi
+		os=-xray
+		;;
+	h8500hms)
+		basic_machine=h8500-hitachi
+		os=-hms
+		;;
+	harris)
+		basic_machine=m88k-harris
+		os=-sysv3
+		;;
+	hp300-*)
+		basic_machine=m68k-hp
+		;;
+	hp300bsd)
+		basic_machine=m68k-hp
+		os=-bsd
+		;;
+	hp300hpux)
+		basic_machine=m68k-hp
+		os=-hpux
+		;;
+	hp3k9[0-9][0-9] | hp9[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k2[0-9][0-9] | hp9k31[0-9])
+		basic_machine=m68000-hp
+		;;
+	hp9k3[2-9][0-9])
+		basic_machine=m68k-hp
+		;;
+	hp9k6[0-9][0-9] | hp6[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k7[0-79][0-9] | hp7[0-79][0-9])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k78[0-9] | hp78[0-9])
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][13679] | hp8[0-9][13679])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][0-9] | hp8[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hppa-next)
+		os=-nextstep3
+		;;
+	hppaosf)
+		basic_machine=hppa1.1-hp
+		os=-osf
+		;;
+	hppro)
+		basic_machine=hppa1.1-hp
+		os=-proelf
+		;;
+	i370-ibm* | ibm*)
+		basic_machine=i370-ibm
+		;;
+# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+	i*86v32)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv32
+		;;
+	i*86v4*)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv4
+		;;
+	i*86v)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv
+		;;
+	i*86sol2)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-solaris2
+		;;
+	i386mach)
+		basic_machine=i386-mach
+		os=-mach
+		;;
+	i386-vsta | vsta)
+		basic_machine=i386-unknown
+		os=-vsta
+		;;
+	iris | iris4d)
+		basic_machine=mips-sgi
+		case $os in
+		    -irix*)
+			;;
+		    *)
+			os=-irix4
+			;;
+		esac
+		;;
+	isi68 | isi)
+		basic_machine=m68k-isi
+		os=-sysv
+		;;
+	m88k-omron*)
+		basic_machine=m88k-omron
+		;;
+	magnum | m3230)
+		basic_machine=mips-mips
+		os=-sysv
+		;;
+	merlin)
+		basic_machine=ns32k-utek
+		os=-sysv
+		;;
+	mingw32)
+		basic_machine=i386-pc
+		os=-mingw32
+		;;
+	miniframe)
+		basic_machine=m68000-convergent
+		;;
+	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+	mips3*-*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+		;;
+	mips3*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+		;;
+	monitor)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	morphos)
+		basic_machine=powerpc-unknown
+		os=-morphos
+		;;
+	msdos)
+		basic_machine=i386-pc
+		os=-msdos
+		;;
+	ms1-*)
+		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+		;;
+	mvs)
+		basic_machine=i370-ibm
+		os=-mvs
+		;;
+	ncr3000)
+		basic_machine=i486-ncr
+		os=-sysv4
+		;;
+	netbsd386)
+		basic_machine=i386-unknown
+		os=-netbsd
+		;;
+	netwinder)
+		basic_machine=armv4l-rebel
+		os=-linux
+		;;
+	news | news700 | news800 | news900)
+		basic_machine=m68k-sony
+		os=-newsos
+		;;
+	news1000)
+		basic_machine=m68030-sony
+		os=-newsos
+		;;
+	news-3600 | risc-news)
+		basic_machine=mips-sony
+		os=-newsos
+		;;
+	necv70)
+		basic_machine=v70-nec
+		os=-sysv
+		;;
+	next | m*-next )
+		basic_machine=m68k-next
+		case $os in
+		    -nextstep* )
+			;;
+		    -ns2*)
+		      os=-nextstep2
+			;;
+		    *)
+		      os=-nextstep3
+			;;
+		esac
+		;;
+	nh3000)
+		basic_machine=m68k-harris
+		os=-cxux
+		;;
+	nh[45]000)
+		basic_machine=m88k-harris
+		os=-cxux
+		;;
+	nindy960)
+		basic_machine=i960-intel
+		os=-nindy
+		;;
+	mon960)
+		basic_machine=i960-intel
+		os=-mon960
+		;;
+	nonstopux)
+		basic_machine=mips-compaq
+		os=-nonstopux
+		;;
+	np1)
+		basic_machine=np1-gould
+		;;
+	nsr-tandem)
+		basic_machine=nsr-tandem
+		;;
+	op50n-* | op60c-*)
+		basic_machine=hppa1.1-oki
+		os=-proelf
+		;;
+	openrisc | openrisc-*)
+		basic_machine=or32-unknown
+		;;
+	os400)
+		basic_machine=powerpc-ibm
+		os=-os400
+		;;
+	OSE68000 | ose68000)
+		basic_machine=m68000-ericsson
+		os=-ose
+		;;
+	os68k)
+		basic_machine=m68k-none
+		os=-os68k
+		;;
+	pa-hitachi)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	paragon)
+		basic_machine=i860-intel
+		os=-osf
+		;;
+	pbd)
+		basic_machine=sparc-tti
+		;;
+	pbb)
+		basic_machine=m68k-tti
+		;;
+	pc532 | pc532-*)
+		basic_machine=ns32k-pc532
+		;;
+	pc98)
+		basic_machine=i386-pc
+		;;
+	pc98-*)
+		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium | p5 | k5 | k6 | nexgen | viac3)
+		basic_machine=i586-pc
+		;;
+	pentiumpro | p6 | 6x86 | athlon | athlon_*)
+		basic_machine=i686-pc
+		;;
+	pentiumii | pentium2 | pentiumiii | pentium3)
+		basic_machine=i686-pc
+		;;
+	pentium4)
+		basic_machine=i786-pc
+		;;
+	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumpro-* | p6-* | 6x86-* | athlon-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium4-*)
+		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pn)
+		basic_machine=pn-gould
+		;;
+	power)	basic_machine=power-ibm
+		;;
+	ppc)	basic_machine=powerpc-unknown
+		;;
+	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppcle | powerpclittle | ppc-le | powerpc-little)
+		basic_machine=powerpcle-unknown
+		;;
+	ppcle-* | powerpclittle-*)
+		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64)	basic_machine=powerpc64-unknown
+		;;
+	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+		basic_machine=powerpc64le-unknown
+		;;
+	ppc64le-* | powerpc64little-*)
+		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ps2)
+		basic_machine=i386-ibm
+		;;
+	pw32)
+		basic_machine=i586-unknown
+		os=-pw32
+		;;
+	rdos)
+		basic_machine=i386-pc
+		os=-rdos
+		;;
+	rom68k)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	rm[46]00)
+		basic_machine=mips-siemens
+		;;
+	rtpc | rtpc-*)
+		basic_machine=romp-ibm
+		;;
+	s390 | s390-*)
+		basic_machine=s390-ibm
+		;;
+	s390x | s390x-*)
+		basic_machine=s390x-ibm
+		;;
+	sa29200)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	sb1)
+		basic_machine=mipsisa64sb1-unknown
+		;;
+	sb1el)
+		basic_machine=mipsisa64sb1el-unknown
+		;;
+	sde)
+		basic_machine=mipsisa32-sde
+		os=-elf
+		;;
+	sei)
+		basic_machine=mips-sei
+		os=-seiux
+		;;
+	sequent)
+		basic_machine=i386-sequent
+		;;
+	sh)
+		basic_machine=sh-hitachi
+		os=-hms
+		;;
+	sh64)
+		basic_machine=sh64-unknown
+		;;
+	sparclite-wrs | simso-wrs)
+		basic_machine=sparclite-wrs
+		os=-vxworks
+		;;
+	sps7)
+		basic_machine=m68k-bull
+		os=-sysv2
+		;;
+	spur)
+		basic_machine=spur-unknown
+		;;
+	st2000)
+		basic_machine=m68k-tandem
+		;;
+	stratus)
+		basic_machine=i860-stratus
+		os=-sysv4
+		;;
+	sun2)
+		basic_machine=m68000-sun
+		;;
+	sun2os3)
+		basic_machine=m68000-sun
+		os=-sunos3
+		;;
+	sun2os4)
+		basic_machine=m68000-sun
+		os=-sunos4
+		;;
+	sun3os3)
+		basic_machine=m68k-sun
+		os=-sunos3
+		;;
+	sun3os4)
+		basic_machine=m68k-sun
+		os=-sunos4
+		;;
+	sun4os3)
+		basic_machine=sparc-sun
+		os=-sunos3
+		;;
+	sun4os4)
+		basic_machine=sparc-sun
+		os=-sunos4
+		;;
+	sun4sol2)
+		basic_machine=sparc-sun
+		os=-solaris2
+		;;
+	sun3 | sun3-*)
+		basic_machine=m68k-sun
+		;;
+	sun4)
+		basic_machine=sparc-sun
+		;;
+	sun386 | sun386i | roadrunner)
+		basic_machine=i386-sun
+		;;
+	sv1)
+		basic_machine=sv1-cray
+		os=-unicos
+		;;
+	symmetry)
+		basic_machine=i386-sequent
+		os=-dynix
+		;;
+	t3e)
+		basic_machine=alphaev5-cray
+		os=-unicos
+		;;
+	t90)
+		basic_machine=t90-cray
+		os=-unicos
+		;;
+	tic54x | c54x*)
+		basic_machine=tic54x-unknown
+		os=-coff
+		;;
+	tic55x | c55x*)
+		basic_machine=tic55x-unknown
+		os=-coff
+		;;
+	tic6x | c6x*)
+		basic_machine=tic6x-unknown
+		os=-coff
+		;;
+	tx39)
+		basic_machine=mipstx39-unknown
+		;;
+	tx39el)
+		basic_machine=mipstx39el-unknown
+		;;
+	toad1)
+		basic_machine=pdp10-xkl
+		os=-tops20
+		;;
+	tower | tower-32)
+		basic_machine=m68k-ncr
+		;;
+	tpf)
+		basic_machine=s390x-ibm
+		os=-tpf
+		;;
+	udi29k)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	ultra3)
+		basic_machine=a29k-nyu
+		os=-sym1
+		;;
+	v810 | necv810)
+		basic_machine=v810-nec
+		os=-none
+		;;
+	vaxv)
+		basic_machine=vax-dec
+		os=-sysv
+		;;
+	vms)
+		basic_machine=vax-dec
+		os=-vms
+		;;
+	vpp*|vx|vx-*)
+		basic_machine=f301-fujitsu
+		;;
+	vxworks960)
+		basic_machine=i960-wrs
+		os=-vxworks
+		;;
+	vxworks68)
+		basic_machine=m68k-wrs
+		os=-vxworks
+		;;
+	vxworks29k)
+		basic_machine=a29k-wrs
+		os=-vxworks
+		;;
+	w65*)
+		basic_machine=w65-wdc
+		os=-none
+		;;
+	w89k-*)
+		basic_machine=hppa1.1-winbond
+		os=-proelf
+		;;
+	xbox)
+		basic_machine=i686-pc
+		os=-mingw32
+		;;
+	xps | xps100)
+		basic_machine=xps100-honeywell
+		;;
+	ymp)
+		basic_machine=ymp-cray
+		os=-unicos
+		;;
+	z8k-*-coff)
+		basic_machine=z8k-unknown
+		os=-sim
+		;;
+	none)
+		basic_machine=none-none
+		os=-none
+		;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+	w89k)
+		basic_machine=hppa1.1-winbond
+		;;
+	op50n)
+		basic_machine=hppa1.1-oki
+		;;
+	op60c)
+		basic_machine=hppa1.1-oki
+		;;
+	romp)
+		basic_machine=romp-ibm
+		;;
+	mmix)
+		basic_machine=mmix-knuth
+		;;
+	rs6000)
+		basic_machine=rs6000-ibm
+		;;
+	vax)
+		basic_machine=vax-dec
+		;;
+	pdp10)
+		# there are many clones, so DEC is not a safe bet
+		basic_machine=pdp10-unknown
+		;;
+	pdp11)
+		basic_machine=pdp11-dec
+		;;
+	we32k)
+		basic_machine=we32k-att
+		;;
+	sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
+		basic_machine=sh-unknown
+		;;
+	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
+		basic_machine=sparc-sun
+		;;
+	cydra)
+		basic_machine=cydra-cydrome
+		;;
+	orion)
+		basic_machine=orion-highlevel
+		;;
+	orion105)
+		basic_machine=clipper-highlevel
+		;;
+	mac | mpw | mac-mpw)
+		basic_machine=m68k-apple
+		;;
+	pmac | pmac-mpw)
+		basic_machine=powerpc-apple
+		;;
+	*-unknown)
+		# Make sure to match an already-canonicalized machine name.
+		;;
+	*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+	*-digital*)
+		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+		;;
+	*-commodore*)
+		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+		;;
+	*)
+		;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+        # First match some system type aliases
+        # that might get confused with valid system types.
+	# -solaris* is a basic system type, with this one exception.
+	-solaris1 | -solaris1.*)
+		os=`echo $os | sed -e 's|solaris1|sunos4|'`
+		;;
+	-solaris)
+		os=-solaris2
+		;;
+	-svr4*)
+		os=-sysv4
+		;;
+	-unixware*)
+		os=-sysv4.2uw
+		;;
+	-gnu/linux*)
+		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+		;;
+	# First accept the basic system types.
+	# The portable systems comes first.
+	# Each alternative MUST END IN A *, to match a version number.
+	# -sysv* is not here because it comes later, after sysvr4.
+	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+	      | -aos* \
+	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+	      | -openbsd* | -solidbsd* \
+	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+	      | -chorusos* | -chorusrdb* \
+	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
+	      | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+	      | -skyos* | -haiku* | -rdos* | -toppers*)
+	# Remember, each alternative MUST END IN *, to match a version number.
+		;;
+	-qnx*)
+		case $basic_machine in
+		    x86-* | i*86-*)
+			;;
+		    *)
+			os=-nto$os
+			;;
+		esac
+		;;
+	-nto-qnx*)
+		;;
+	-nto*)
+		os=`echo $os | sed -e 's|nto|nto-qnx|'`
+		;;
+	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+		;;
+	-mac*)
+		os=`echo $os | sed -e 's|mac|macos|'`
+		;;
+	-linux-dietlibc)
+		os=-linux-dietlibc
+		;;
+	-linux*)
+		os=`echo $os | sed -e 's|linux|linux-gnu|'`
+		;;
+	-sunos5*)
+		os=`echo $os | sed -e 's|sunos5|solaris2|'`
+		;;
+	-sunos6*)
+		os=`echo $os | sed -e 's|sunos6|solaris3|'`
+		;;
+	-opened*)
+		os=-openedition
+		;;
+        -os400*)
+		os=-os400
+		;;
+	-wince*)
+		os=-wince
+		;;
+	-osfrose*)
+		os=-osfrose
+		;;
+	-osf*)
+		os=-osf
+		;;
+	-utek*)
+		os=-bsd
+		;;
+	-dynix*)
+		os=-bsd
+		;;
+	-acis*)
+		os=-aos
+		;;
+	-atheos*)
+		os=-atheos
+		;;
+	-syllable*)
+		os=-syllable
+		;;
+	-386bsd)
+		os=-bsd
+		;;
+	-ctix* | -uts*)
+		os=-sysv
+		;;
+	-nova*)
+		os=-rtmk-nova
+		;;
+	-ns2 )
+		os=-nextstep2
+		;;
+	-nsk*)
+		os=-nsk
+		;;
+	# Preserve the version number of sinix5.
+	-sinix5.*)
+		os=`echo $os | sed -e 's|sinix|sysv|'`
+		;;
+	-sinix*)
+		os=-sysv4
+		;;
+        -tpf*)
+		os=-tpf
+		;;
+	-triton*)
+		os=-sysv3
+		;;
+	-oss*)
+		os=-sysv3
+		;;
+	-svr4)
+		os=-sysv4
+		;;
+	-svr3)
+		os=-sysv3
+		;;
+	-sysvr4)
+		os=-sysv4
+		;;
+	# This must come after -sysvr4.
+	-sysv*)
+		;;
+	-ose*)
+		os=-ose
+		;;
+	-es1800*)
+		os=-ose
+		;;
+	-xenix)
+		os=-xenix
+		;;
+	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+		os=-mint
+		;;
+	-aros*)
+		os=-aros
+		;;
+	-kaos*)
+		os=-kaos
+		;;
+	-zvmoe)
+		os=-zvmoe
+		;;
+	-none)
+		;;
+	*)
+		# Get rid of the `-' at the beginning of $os.
+		os=`echo $os | sed 's/[^-]*-//'`
+		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+		exit 1
+		;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+        score-*)
+		os=-elf
+		;;
+        spu-*)
+		os=-elf
+		;;
+	*-acorn)
+		os=-riscix1.2
+		;;
+	arm*-rebel)
+		os=-linux
+		;;
+	arm*-semi)
+		os=-aout
+		;;
+        c4x-* | tic4x-*)
+        	os=-coff
+		;;
+	# This must come before the *-dec entry.
+	pdp10-*)
+		os=-tops20
+		;;
+	pdp11-*)
+		os=-none
+		;;
+	*-dec | vax-*)
+		os=-ultrix4.2
+		;;
+	m68*-apollo)
+		os=-domain
+		;;
+	i386-sun)
+		os=-sunos4.0.2
+		;;
+	m68000-sun)
+		os=-sunos3
+		# This also exists in the configure program, but was not the
+		# default.
+		# os=-sunos4
+		;;
+	m68*-cisco)
+		os=-aout
+		;;
+	mips*-cisco)
+		os=-elf
+		;;
+	mips*-*)
+		os=-elf
+		;;
+	or32-*)
+		os=-coff
+		;;
+	*-tti)	# must be before sparc entry or we get the wrong os.
+		os=-sysv3
+		;;
+	sparc-* | *-sun)
+		os=-sunos4.1.1
+		;;
+	*-be)
+		os=-beos
+		;;
+	*-haiku)
+		os=-haiku
+		;;
+	*-ibm)
+		os=-aix
+		;;
+    	*-knuth)
+		os=-mmixware
+		;;
+	*-wec)
+		os=-proelf
+		;;
+	*-winbond)
+		os=-proelf
+		;;
+	*-oki)
+		os=-proelf
+		;;
+	*-hp)
+		os=-hpux
+		;;
+	*-hitachi)
+		os=-hiux
+		;;
+	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+		os=-sysv
+		;;
+	*-cbm)
+		os=-amigaos
+		;;
+	*-dg)
+		os=-dgux
+		;;
+	*-dolphin)
+		os=-sysv3
+		;;
+	m68k-ccur)
+		os=-rtu
+		;;
+	m88k-omron*)
+		os=-luna
+		;;
+	*-next )
+		os=-nextstep
+		;;
+	*-sequent)
+		os=-ptx
+		;;
+	*-crds)
+		os=-unos
+		;;
+	*-ns)
+		os=-genix
+		;;
+	i370-*)
+		os=-mvs
+		;;
+	*-next)
+		os=-nextstep3
+		;;
+	*-gould)
+		os=-sysv
+		;;
+	*-highlevel)
+		os=-bsd
+		;;
+	*-encore)
+		os=-bsd
+		;;
+	*-sgi)
+		os=-irix
+		;;
+	*-siemens)
+		os=-sysv4
+		;;
+	*-masscomp)
+		os=-rtu
+		;;
+	f30[01]-fujitsu | f700-fujitsu)
+		os=-uxpv
+		;;
+	*-rom68k)
+		os=-coff
+		;;
+	*-*bug)
+		os=-coff
+		;;
+	*-apple)
+		os=-macos
+		;;
+	*-atari*)
+		os=-mint
+		;;
+	*)
+		os=-none
+		;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+	*-unknown)
+		case $os in
+			-riscix*)
+				vendor=acorn
+				;;
+			-sunos*)
+				vendor=sun
+				;;
+			-aix*)
+				vendor=ibm
+				;;
+			-beos*)
+				vendor=be
+				;;
+			-hpux*)
+				vendor=hp
+				;;
+			-mpeix*)
+				vendor=hp
+				;;
+			-hiux*)
+				vendor=hitachi
+				;;
+			-unos*)
+				vendor=crds
+				;;
+			-dgux*)
+				vendor=dg
+				;;
+			-luna*)
+				vendor=omron
+				;;
+			-genix*)
+				vendor=ns
+				;;
+			-mvs* | -opened*)
+				vendor=ibm
+				;;
+			-os400*)
+				vendor=ibm
+				;;
+			-ptx*)
+				vendor=sequent
+				;;
+			-tpf*)
+				vendor=ibm
+				;;
+			-vxsim* | -vxworks* | -windiss*)
+				vendor=wrs
+				;;
+			-aux*)
+				vendor=apple
+				;;
+			-hms*)
+				vendor=hitachi
+				;;
+			-mpw* | -macos*)
+				vendor=apple
+				;;
+			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+				vendor=atari
+				;;
+			-vos*)
+				vendor=stratus
+				;;
+		esac
+		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+		;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:


Property changes on: trunk/config.sub
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/configure
===================================================================
--- trunk/configure	                        (rev 0)
+++ trunk/configure	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,12297 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.61.
+#
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+
+
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+if test "x$CONFIG_SHELL" = x; then
+  if (eval ":") 2>/dev/null; then
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+
+  if test $as_have_required = yes && 	 (eval ":
+(as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0) || { (exit 1); exit 1; }
+
+(
+  as_lineno_1=\$LINENO
+  as_lineno_2=\$LINENO
+  test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" &&
+  test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; }
+") 2> /dev/null; then
+  :
+else
+  as_candidate_shells=
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  case $as_dir in
+	 /*)
+	   for as_base in sh bash ksh sh5; do
+	     as_candidate_shells="$as_candidate_shells $as_dir/$as_base"
+	   done;;
+       esac
+done
+IFS=$as_save_IFS
+
+
+      for as_shell in $as_candidate_shells $SHELL; do
+	 # Try only shells that exist, to save several forks.
+	 if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+		{ ("$as_shell") 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+_ASEOF
+}; then
+  CONFIG_SHELL=$as_shell
+	       as_have_required=yes
+	       if { "$as_shell" 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+(as_func_return () {
+  (exit $1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = "$1" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test $exitcode = 0) || { (exit 1); exit 1; }
+
+(
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; }
+
+_ASEOF
+}; then
+  break
+fi
+
+fi
+
+      done
+
+      if test "x$CONFIG_SHELL" != x; then
+  for as_var in BASH_ENV ENV
+        do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+        done
+        export CONFIG_SHELL
+        exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+fi
+
+
+    if test $as_have_required = no; then
+  echo This script requires a shell more modern than all the
+      echo shells that I found on your system.  Please install a
+      echo modern shell, or manually run the script under such a
+      echo shell if you do have one.
+      { (exit 1); exit 1; }
+fi
+
+
+fi
+
+fi
+
+
+
+(eval "as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0") || {
+  echo No shell found that supports shell functions.
+  echo Please tell autoconf at gnu.org about your system,
+  echo including any error possibly output before this
+  echo message
+}
+
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir
+fi
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s='ln -s'
+  # ... but there are two gotchas:
+  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+  # In both cases, we have to default to `cp -p'.
+  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+    as_ln_s='cp -p'
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+        test -d "$1/.";
+      else
+	case $1 in
+        -*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+
+exec 7<&0 </dev/null 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Identity of this package.
+PACKAGE_NAME=
+PACKAGE_TARNAME=
+PACKAGE_VERSION=
+PACKAGE_STRING=
+PACKAGE_BUGREPORT=
+
+ac_unique_file="configure.in"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='SHELL
+PATH_SEPARATOR
+PACKAGE_NAME
+PACKAGE_TARNAME
+PACKAGE_VERSION
+PACKAGE_STRING
+PACKAGE_BUGREPORT
+exec_prefix
+prefix
+program_transform_name
+bindir
+sbindir
+libexecdir
+datarootdir
+datadir
+sysconfdir
+sharedstatedir
+localstatedir
+includedir
+oldincludedir
+docdir
+infodir
+htmldir
+dvidir
+pdfdir
+psdir
+libdir
+localedir
+mandir
+DEFS
+ECHO_C
+ECHO_N
+ECHO_T
+LIBS
+build_alias
+host_alias
+target_alias
+INSTALL_PROGRAM
+INSTALL_SCRIPT
+INSTALL_DATA
+am__isrc
+CYGPATH_W
+PACKAGE
+VERSION
+ACLOCAL
+AUTOCONF
+AUTOMAKE
+AUTOHEADER
+MAKEINFO
+install_sh
+STRIP
+INSTALL_STRIP_PROGRAM
+mkdir_p
+AWK
+SET_MAKE
+am__leading_dot
+AMTAR
+am__tar
+am__untar
+MAINTAINER_MODE_TRUE
+MAINTAINER_MODE_FALSE
+MAINT
+build
+build_cpu
+build_vendor
+build_os
+host
+host_cpu
+host_vendor
+host_os
+CC
+CFLAGS
+LDFLAGS
+CPPFLAGS
+ac_ct_CC
+EXEEXT
+OBJEXT
+DEPDIR
+am__include
+am__quote
+AMDEP_TRUE
+AMDEP_FALSE
+AMDEPBACKSLASH
+CCDEPMODE
+am__fastdepCC_TRUE
+am__fastdepCC_FALSE
+INTLTOOL_DESKTOP_RULE
+INTLTOOL_DIRECTORY_RULE
+INTLTOOL_KEYS_RULE
+INTLTOOL_PROP_RULE
+INTLTOOL_OAF_RULE
+INTLTOOL_PONG_RULE
+INTLTOOL_SERVER_RULE
+INTLTOOL_SHEET_RULE
+INTLTOOL_SOUNDLIST_RULE
+INTLTOOL_UI_RULE
+INTLTOOL_XAM_RULE
+INTLTOOL_KBD_RULE
+INTLTOOL_XML_RULE
+INTLTOOL_XML_NOMERGE_RULE
+INTLTOOL_CAVES_RULE
+INTLTOOL_SCHEMAS_RULE
+INTLTOOL_THEME_RULE
+INTLTOOL_SERVICE_RULE
+INTLTOOL_POLICY_RULE
+INTLTOOL_EXTRACT
+INTLTOOL_MERGE
+INTLTOOL_UPDATE
+INTLTOOL_PERL
+ALL_LINGUAS
+DATADIRNAME
+GETTEXT_PACKAGE
+PKG_CONFIG
+GTK_CFLAGS
+GTK_LIBS
+GLIB_CFLAGS
+GLIB_LIBS
+GMODULE_CFLAGS
+GMODULE_LIBS
+GTHREAD_CFLAGS
+GTHREAD_LIBS
+LIBGLADE_CFLAGS
+LIBGLADE_LIBS
+LIBGNOMECANVAS_CFLAGS
+LIBGNOMECANVAS_LIBS
+LIBGPOD_CFLAGS
+LIBGPOD_LIBS
+LEX
+LEX_OUTPUT_ROOT
+LEXLIB
+MOUNT
+UMOUNT
+CPP
+GREP
+EGREP
+USE_NLS
+MSGFMT
+MSGFMT_OPTS
+GMSGFMT
+XGETTEXT
+CATALOGS
+CATOBJEXT
+GMOFILES
+INSTOBJEXT
+INTLLIBS
+PO_IN_DATADIR_TRUE
+PO_IN_DATADIR_FALSE
+POFILES
+POSUB
+MKINSTALLDIRS
+LIBOBJS
+CURL_CFLAGS
+CURL_LIBS
+HAVE_CURL_TRUE
+HAVE_CURL_FALSE
+GNOME_VFS_CFLAGS
+GNOME_VFS_LIBS
+HAVE_GNOME_VFS_TRUE
+HAVE_GNOME_VFS_FALSE
+HAL_CFLAGS
+HAL_LIBS
+HAVE_HAL_TRUE
+HAVE_HAL_FALSE
+HAVE_LIBMP4V2_TRUE
+HAVE_LIBMP4V2_FALSE
+HAVE_LIBVORBISFILE_TRUE
+HAVE_LIBVORBISFILE_FALSE
+HAVE_FLAC_TRUE
+HAVE_FLAC_FALSE
+LTLIBOBJS'
+ac_subst_files=''
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+PKG_CONFIG
+GTK_CFLAGS
+GTK_LIBS
+GLIB_CFLAGS
+GLIB_LIBS
+GMODULE_CFLAGS
+GMODULE_LIBS
+GTHREAD_CFLAGS
+GTHREAD_LIBS
+LIBGLADE_CFLAGS
+LIBGLADE_LIBS
+LIBGNOMECANVAS_CFLAGS
+LIBGNOMECANVAS_LIBS
+LIBGPOD_CFLAGS
+LIBGPOD_LIBS
+CPP
+CURL_CFLAGS
+CURL_LIBS
+GNOME_VFS_CFLAGS
+GNOME_VFS_LIBS
+HAL_CFLAGS
+HAL_LIBS'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval $ac_prev=\$ac_option
+    ac_prev=
+    continue
+  fi
+
+  case $ac_option in
+  *=*)	ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *)	ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+    eval enable_$ac_feature=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+    eval enable_$ac_feature=\$ac_optarg ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+    eval with_$ac_package=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+    eval with_$ac_package=no ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; }
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+   { (exit 1); exit 1; }; }
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  { echo "$as_me: error: missing argument to $ac_option" >&2
+   { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute directory names.
+for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
+		datadir sysconfdir sharedstatedir localstatedir includedir \
+		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+		libdir localedir mandir
+do
+  eval ac_val=\$$ac_var
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; }
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used." >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  { echo "$as_me: error: Working directory cannot be determined" >&2
+   { (exit 1); exit 1; }; }
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  { echo "$as_me: error: pwd does not report name of working directory" >&2
+   { (exit 1); exit 1; }; }
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$0" ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$0" : 'X\(//\)[^/]' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$0" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+   { (exit 1); exit 1; }; }
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+	cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2
+   { (exit 1); exit 1; }; }
+	pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures this package to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+			  [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+			  [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR           user executables [EPREFIX/bin]
+  --sbindir=DIR          system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR       program executables [EPREFIX/libexec]
+  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
+  --libdir=DIR           object code libraries [EPREFIX/lib]
+  --includedir=DIR       C header files [PREFIX/include]
+  --oldincludedir=DIR    C header files for non-gcc [/usr/include]
+  --datarootdir=DIR      read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR          read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR          info documentation [DATAROOTDIR/info]
+  --localedir=DIR        locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR           man documentation [DATAROOTDIR/man]
+  --docdir=DIR           documentation root [DATAROOTDIR/doc/PACKAGE]
+  --htmldir=DIR          html documentation [DOCDIR]
+  --dvidir=DIR           dvi documentation [DOCDIR]
+  --pdfdir=DIR           pdf documentation [DOCDIR]
+  --psdir=DIR            ps documentation [DOCDIR]
+_ACEOF
+
+  cat <<\_ACEOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+
+System types:
+  --build=BUILD     configure for building on BUILD [guessed]
+  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --enable-maintainer-mode  enable make rules and dependencies not useful
+			  (and sometimes confusing) to the casual installer
+  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --without-curl          Disable coverart download support
+  --without-gnome-vfs     Disable autodetection support
+  --without-hal           Disable HAL support
+  --without-mp4v2         Disable MP4/AAC support
+  --without-ogg           Disable Ogg/Vorbis support
+  --without-flac          Disable FLAC support
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
+  PKG_CONFIG  path to pkg-config utility
+  GTK_CFLAGS  C compiler flags for GTK, overriding pkg-config
+  GTK_LIBS    linker flags for GTK, overriding pkg-config
+  GLIB_CFLAGS C compiler flags for GLIB, overriding pkg-config
+  GLIB_LIBS   linker flags for GLIB, overriding pkg-config
+  GMODULE_CFLAGS
+              C compiler flags for GMODULE, overriding pkg-config
+  GMODULE_LIBS
+              linker flags for GMODULE, overriding pkg-config
+  GTHREAD_CFLAGS
+              C compiler flags for GTHREAD, overriding pkg-config
+  GTHREAD_LIBS
+              linker flags for GTHREAD, overriding pkg-config
+  LIBGLADE_CFLAGS
+              C compiler flags for LIBGLADE, overriding pkg-config
+  LIBGLADE_LIBS
+              linker flags for LIBGLADE, overriding pkg-config
+  LIBGNOMECANVAS_CFLAGS
+              C compiler flags for LIBGNOMECANVAS, overriding pkg-config
+  LIBGNOMECANVAS_LIBS
+              linker flags for LIBGNOMECANVAS, overriding pkg-config
+  LIBGPOD_CFLAGS
+              C compiler flags for LIBGPOD, overriding pkg-config
+  LIBGPOD_LIBS
+              linker flags for LIBGPOD, overriding pkg-config
+  CPP         C preprocessor
+  CURL_CFLAGS C compiler flags for CURL, overriding pkg-config
+  CURL_LIBS   linker flags for CURL, overriding pkg-config
+  GNOME_VFS_CFLAGS
+              C compiler flags for GNOME_VFS, overriding pkg-config
+  GNOME_VFS_LIBS
+              linker flags for GNOME_VFS, overriding pkg-config
+  HAL_CFLAGS  C compiler flags for HAL, overriding pkg-config
+  HAL_LIBS    linker flags for HAL, overriding pkg-config
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" || continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
+    else
+      echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+configure
+generated by GNU Autoconf 2.61
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit
+fi
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by $as_me, which was
+generated by GNU Autoconf 2.61.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  echo "PATH: $as_dir"
+done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+    2)
+      ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+	ac_must_keep_next=false # Got value, back to normal.
+      else
+	case $ac_arg in
+	  *=* | --config-cache | -C | -disable-* | --disable-* \
+	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+	  | -with-* | --with-* | -without-* | --without-* | --x)
+	    case "$ac_configure_args0 " in
+	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+	    esac
+	    ;;
+	  -* ) ac_must_keep_next=true ;;
+	esac
+      fi
+      ac_configure_args="$ac_configure_args '$ac_arg'"
+      ;;
+    esac
+  done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+	"s/'\''/'\''\\\\'\'''\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      cat <<\_ASBOX
+## ------------------- ##
+## File substitutions. ##
+## ------------------- ##
+_ASBOX
+      echo
+      for ac_var in $ac_subst_files
+      do
+	eval ac_val=\$$ac_var
+	case $ac_val in
+	*\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+	esac
+	echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      echo "$as_me: caught signal $ac_signal"
+    echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -n "$CONFIG_SITE"; then
+  set x "$CONFIG_SITE"
+elif test "x$prefix" != xNONE; then
+  set x "$prefix/share/config.site" "$prefix/etc/config.site"
+else
+  set x "$ac_default_prefix/share/config.site" \
+	"$ac_default_prefix/etc/config.site"
+fi
+shift
+for ac_site_file
+do
+  if test -r "$ac_site_file"; then
+    { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special
+  # files actually), so we avoid doing that.
+  if test -f "$cache_file"; then
+    { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+	{ echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+	{ echo "$as_me:$LINENO:   former value:  $ac_old_val" >&5
+echo "$as_me:   former value:  $ac_old_val" >&2;}
+	{ echo "$as_me:$LINENO:   current value: $ac_new_val" >&5
+echo "$as_me:   current value: $ac_new_val" >&2;}
+	ac_cache_corrupted=:
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+am__api_version='1.10'
+
+ac_aux_dir=
+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+  if test -f "$ac_dir/install-sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f "$ac_dir/install.sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f "$ac_dir/shtool"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5
+echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; }
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+  ./ | .// | /cC/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
+	  if test $ac_prog = install &&
+	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  elif test $ac_prog = install &&
+	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # program-specific install script used by HP pwplus--don't use.
+	    :
+	  else
+	    ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	    break 3
+	  fi
+	fi
+      done
+    done
+    ;;
+esac
+done
+IFS=$as_save_IFS
+
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    INSTALL=$ac_install_sh
+  fi
+fi
+{ echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ echo "$as_me:$LINENO: checking whether build environment is sane" >&5
+echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6; }
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+   if test "$*" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$*" != "X $srcdir/configure conftest.file" \
+      && test "$*" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      { { echo "$as_me:$LINENO: error: ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" >&5
+echo "$as_me: error: ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" >&2;}
+   { (exit 1); exit 1; }; }
+   fi
+
+   test "$2" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   { { echo "$as_me:$LINENO: error: newly created file is older than distributed files!
+Check your system clock" >&5
+echo "$as_me: error: newly created file is older than distributed files!
+Check your system clock" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+{ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+test "$program_prefix" != NONE &&
+  program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.  echo might interpret backslashes.
+# By default was `s,x,x', remove it if useless.
+cat <<\_ACEOF >conftest.sed
+s/[\\$]/&&/g;s/;s,x,x,$//
+_ACEOF
+program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
+rm -f conftest.sed
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5
+echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+{ echo "$as_me:$LINENO: checking for a thread-safe mkdir -p" >&5
+echo $ECHO_N "checking for a thread-safe mkdir -p... $ECHO_C" >&6; }
+if test -z "$MKDIR_P"; then
+  if test "${ac_cv_path_mkdir+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_prog in mkdir gmkdir; do
+	 for ac_exec_ext in '' $ac_executable_extensions; do
+	   { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
+	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+	     'mkdir (GNU coreutils) '* | \
+	     'mkdir (coreutils) '* | \
+	     'mkdir (fileutils) '4.1*)
+	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+	       break 3;;
+	   esac
+	 done
+       done
+done
+IFS=$as_save_IFS
+
+fi
+
+  if test "${ac_cv_path_mkdir+set}" = set; then
+    MKDIR_P="$ac_cv_path_mkdir -p"
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for MKDIR_P within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    test -d ./--version && rmdir ./--version
+    MKDIR_P="$ac_install_sh -d"
+  fi
+fi
+{ echo "$as_me:$LINENO: result: $MKDIR_P" >&5
+echo "${ECHO_T}$MKDIR_P" >&6; }
+
+mkdir_p="$MKDIR_P"
+case $mkdir_p in
+  [\\/$]* | ?:[\\/]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+
+for ac_prog in gawk mawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_AWK+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_AWK="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  { echo "$as_me:$LINENO: result: $AWK" >&5
+echo "${ECHO_T}$AWK" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  test -n "$AWK" && break
+done
+
+{ echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; }
+set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+	@echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+  SET_MAKE=
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  am__isrc=' -I$(srcdir)'
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
+echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;}
+   { (exit 1); exit 1; }; }
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE=gtkpod
+ VERSION=0.99.12
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"}
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_STRIP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+
+
+
+
+
+ac_config_headers="$ac_config_headers config.h"
+
+{ echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5
+echo $ECHO_N "checking whether to enable maintainer-specific portions of Makefiles... $ECHO_C" >&6; }
+    # Check whether --enable-maintainer-mode was given.
+if test "${enable_maintainer_mode+set}" = set; then
+  enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval
+else
+  USE_MAINTAINER_MODE=no
+fi
+
+  { echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5
+echo "${ECHO_T}$USE_MAINTAINER_MODE" >&6; }
+   if test $USE_MAINTAINER_MODE = yes; then
+  MAINTAINER_MODE_TRUE=
+  MAINTAINER_MODE_FALSE='#'
+else
+  MAINTAINER_MODE_TRUE='#'
+  MAINTAINER_MODE_FALSE=
+fi
+
+  MAINT=$MAINTAINER_MODE_TRUE
+
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+  { { echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5
+echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;}
+   { (exit 1); exit 1; }; }
+
+{ echo "$as_me:$LINENO: checking build system type" >&5
+echo $ECHO_N "checking build system type... $ECHO_C" >&6; }
+if test "${ac_cv_build+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+  { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
+echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
+   { (exit 1); exit 1; }; }
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+  { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5
+echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;}
+   { (exit 1); exit 1; }; }
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_build" >&5
+echo "${ECHO_T}$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) { { echo "$as_me:$LINENO: error: invalid value of canonical build" >&5
+echo "$as_me: error: invalid value of canonical build" >&2;}
+   { (exit 1); exit 1; }; };;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ echo "$as_me:$LINENO: checking host system type" >&5
+echo $ECHO_N "checking host system type... $ECHO_C" >&6; }
+if test "${ac_cv_host+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
+else
+  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+    { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5
+echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_host" >&5
+echo "${ECHO_T}$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) { { echo "$as_me:$LINENO: error: invalid value of canonical host" >&5
+echo "$as_me: error: invalid value of canonical host" >&2;}
+   { (exit 1); exit 1; }; };;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+{ echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5
+echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6; }
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+   am__include=include
+   am__quote=
+   _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+      am__include=.include
+      am__quote="\""
+      _am_result=BSD
+   fi
+fi
+
+
+{ echo "$as_me:$LINENO: result: $_am_result" >&5
+echo "${ECHO_T}$_am_result" >&6; }
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then
+  enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+  AMDEP_TRUE=
+  AMDEP_FALSE='#'
+else
+  AMDEP_TRUE='#'
+  AMDEP_FALSE=
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO: checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler --version >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -v >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -V >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; }
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+#
+# List of possible output files, starting from the most likely.
+# The algorithm is not robust to junk in `.', hence go to wildcards (a.*)
+# only as a last resort.  b.out is created by i960 compilers.
+ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out'
+#
+# The IRIX 6 linker writes into existing files which may not be
+# executable, retaining their permissions.  Remove them first so a
+# subsequent execution test works.
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { (ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj )
+	;;
+    [ab].out )
+	# We found the default executable, but exeext='' is most
+	# certainly right.
+	break;;
+    *.* )
+        if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+	then :; else
+	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	fi
+	# We set ac_cv_exeext here because the later test for it is not
+	# safe: cross compilers may not add the suffix if given an `-o'
+	# argument, so we may need to know it at that point already.
+	# Even if this section looks crufty: it has the advantage of
+	# actually working.
+	break;;
+    * )
+	break;;
+  esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+  ac_file=''
+fi
+
+{ echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6; }
+if test -z "$ac_file"; then
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C compiler cannot create executables
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; }
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+  if { ac_try='./$ac_file'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { echo "$as_me:$LINENO: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+  fi
+fi
+{ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; }
+{ echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6; }
+
+{ echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; }
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	  break;;
+    * ) break;;
+  esac
+done
+else
+  { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+{ echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+{ echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; }
+if test "${ac_cv_objext+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; }
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_compiler_gnu=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; }
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	CFLAGS=""
+      cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
+echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_c89+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_c89=$ac_arg
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6; } ;;
+  xno)
+    { echo "$as_me:$LINENO: result: unsupported" >&5
+echo "${ECHO_T}unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CC"   am_compiler_list=
+
+{ echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6; }
+if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+
+{ echo "$as_me:$LINENO: checking for library containing strerror" >&5
+echo $ECHO_N "checking for library containing strerror... $ECHO_C" >&6; }
+if test "${ac_cv_search_strerror+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char strerror ();
+int
+main ()
+{
+return strerror ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' cposix; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_search_strerror=$ac_res
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext
+  if test "${ac_cv_search_strerror+set}" = set; then
+  break
+fi
+done
+if test "${ac_cv_search_strerror+set}" = set; then
+  :
+else
+  ac_cv_search_strerror=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_search_strerror" >&5
+echo "${ECHO_T}$ac_cv_search_strerror" >&6; }
+ac_res=$ac_cv_search_strerror
+if test "$ac_res" != no; then
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO: checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler --version >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -v >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -V >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; }
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_compiler_gnu=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; }
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	CFLAGS=""
+      cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
+echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_c89+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_c89=$ac_arg
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6; } ;;
+  xno)
+    { echo "$as_me:$LINENO: result: unsupported" >&5
+echo "${ECHO_T}unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CC"   am_compiler_list=
+
+{ echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6; }
+if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO: checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler --version >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -v >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -V >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; }
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_compiler_gnu=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; }
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	CFLAGS=""
+      cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
+echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_c89+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_c89=$ac_arg
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6; } ;;
+  xno)
+    { echo "$as_me:$LINENO: result: unsupported" >&5
+echo "${ECHO_T}unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CC"   am_compiler_list=
+
+{ echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6; }
+if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+
+am_cv_prog_cc_stdc=$ac_cv_prog_cc_stdc
+
+
+
+case "$am__api_version" in
+    1.01234)
+	{ { echo "$as_me:$LINENO: error: Automake 1.5 or newer is required to use intltool" >&5
+echo "$as_me: error: Automake 1.5 or newer is required to use intltool" >&2;}
+   { (exit 1); exit 1; }; }
+    ;;
+    *)
+    ;;
+esac
+
+if test -n "0.33"; then
+    { echo "$as_me:$LINENO: checking for intltool >= 0.33" >&5
+echo $ECHO_N "checking for intltool >= 0.33... $ECHO_C" >&6; }
+
+    INTLTOOL_REQUIRED_VERSION_AS_INT=`echo 0.33 | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'`
+    INTLTOOL_APPLIED_VERSION=`awk -F\" '/\\$VERSION / { print $ 2; }' ${ac_aux_dir}/intltool-update.in`
+    INTLTOOL_APPLIED_VERSION_AS_INT=`awk -F\" '/\\$VERSION / { split($ 2, VERSION, "."); print VERSION[1] * 1000 + VERSION[2] * 100 + VERSION[3];}' ${ac_aux_dir}/intltool-update.in`
+
+    { echo "$as_me:$LINENO: result: $INTLTOOL_APPLIED_VERSION found" >&5
+echo "${ECHO_T}$INTLTOOL_APPLIED_VERSION found" >&6; }
+    test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge "$INTLTOOL_REQUIRED_VERSION_AS_INT" ||
+	{ { echo "$as_me:$LINENO: error: Your intltool is too old.  You need intltool 0.33 or later." >&5
+echo "$as_me: error: Your intltool is too old.  You need intltool 0.33 or later." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+  INTLTOOL_DESKTOP_RULE='%.desktop:   %.desktop.in   $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'
+INTLTOOL_DIRECTORY_RULE='%.directory: %.directory.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'
+     INTLTOOL_KEYS_RULE='%.keys:      %.keys.in      $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -k -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'
+     INTLTOOL_PROP_RULE='%.prop:      %.prop.in      $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'
+      INTLTOOL_OAF_RULE='%.oaf:       %.oaf.in       $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -o -p $(top_srcdir)/po $< $@'
+     INTLTOOL_PONG_RULE='%.pong:      %.pong.in      $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'
+   INTLTOOL_SERVER_RULE='%.server:    %.server.in    $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -o -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'
+    INTLTOOL_SHEET_RULE='%.sheet:     %.sheet.in     $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'
+INTLTOOL_SOUNDLIST_RULE='%.soundlist: %.soundlist.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'
+       INTLTOOL_UI_RULE='%.ui:        %.ui.in        $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'
+      INTLTOOL_XML_RULE='%.xml:       %.xml.in       $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'
+      INTLTOOL_XML_NOMERGE_RULE='%.xml:       %.xml.in       $(INTLTOOL_MERGE) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u /tmp $< $@'
+      INTLTOOL_XAM_RULE='%.xam:       %.xml.in       $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'
+      INTLTOOL_KBD_RULE='%.kbd:       %.kbd.in       $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -m -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'
+    INTLTOOL_CAVES_RULE='%.caves:     %.caves.in     $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'
+  INTLTOOL_SCHEMAS_RULE='%.schemas:   %.schemas.in   $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -s -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'
+    INTLTOOL_THEME_RULE='%.theme:     %.theme.in     $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'
+    INTLTOOL_SERVICE_RULE='%.service: %.service.in   $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'
+   INTLTOOL_POLICY_RULE='%.policy:    %.policy.in    $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Use the tools built into the package, not the ones that are installed.
+INTLTOOL_EXTRACT='$(top_builddir)/intltool-extract'
+
+INTLTOOL_MERGE='$(top_builddir)/intltool-merge'
+
+INTLTOOL_UPDATE='$(top_builddir)/intltool-update'
+
+
+# Extract the first word of "perl", so it can be a program name with args.
+set dummy perl; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_INTLTOOL_PERL+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $INTLTOOL_PERL in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_INTLTOOL_PERL="$INTLTOOL_PERL" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_INTLTOOL_PERL="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+INTLTOOL_PERL=$ac_cv_path_INTLTOOL_PERL
+if test -n "$INTLTOOL_PERL"; then
+  { echo "$as_me:$LINENO: result: $INTLTOOL_PERL" >&5
+echo "${ECHO_T}$INTLTOOL_PERL" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+if test -z "$INTLTOOL_PERL"; then
+   { { echo "$as_me:$LINENO: error: perl not found; required for intltool" >&5
+echo "$as_me: error: perl not found; required for intltool" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "`$INTLTOOL_PERL -v | fgrep '5.' 2> /dev/null`"; then
+   { { echo "$as_me:$LINENO: error: perl 5.x required for intltool" >&5
+echo "$as_me: error: perl 5.x required for intltool" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test "x" != "xno-xml"; then
+   { echo "$as_me:$LINENO: checking for XML::Parser" >&5
+echo $ECHO_N "checking for XML::Parser... $ECHO_C" >&6; }
+   if `$INTLTOOL_PERL -e "require XML::Parser" 2>/dev/null`; then
+       { echo "$as_me:$LINENO: result: ok" >&5
+echo "${ECHO_T}ok" >&6; }
+   else
+       { { echo "$as_me:$LINENO: error: XML::Parser perl module is required for intltool" >&5
+echo "$as_me: error: XML::Parser perl module is required for intltool" >&2;}
+   { (exit 1); exit 1; }; }
+   fi
+fi
+
+# Substitute ALL_LINGUAS so we can use it in po/Makefile
+
+
+# Set DATADIRNAME correctly if it is not set yet
+# (copied from glib-gettext.m4)
+if test -z "$DATADIRNAME"; then
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+extern int _nl_msg_cat_cntr;
+                       return _nl_msg_cat_cntr
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  DATADIRNAME=share
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	case $host in
+    *-*-solaris*)
+                        { echo "$as_me:$LINENO: checking for bind_textdomain_codeset" >&5
+echo $ECHO_N "checking for bind_textdomain_codeset... $ECHO_C" >&6; }
+if test "${ac_cv_func_bind_textdomain_codeset+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define bind_textdomain_codeset to an innocuous variant, in case <limits.h> declares bind_textdomain_codeset.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define bind_textdomain_codeset innocuous_bind_textdomain_codeset
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char bind_textdomain_codeset (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef bind_textdomain_codeset
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char bind_textdomain_codeset ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_bind_textdomain_codeset || defined __stub___bind_textdomain_codeset
+choke me
+#endif
+
+int
+main ()
+{
+return bind_textdomain_codeset ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_func_bind_textdomain_codeset=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_cv_func_bind_textdomain_codeset=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_bind_textdomain_codeset" >&5
+echo "${ECHO_T}$ac_cv_func_bind_textdomain_codeset" >&6; }
+if test $ac_cv_func_bind_textdomain_codeset = yes; then
+  DATADIRNAME=share
+else
+  DATADIRNAME=lib
+fi
+
+    ;;
+    *)
+    DATADIRNAME=lib
+    ;;
+    esac
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+
+
+
+ac_config_commands="$ac_config_commands intltool"
+
+
+
+
+if test "x$GCC" = "xyes"; then
+    if test -z "`echo "$CFLAGS" | grep "\-Wall" 2> /dev/null`" ; then
+        CFLAGS="$CFLAGS -Wall"
+    fi
+    # gcc < 4.0 does not know '-Wno-pointer-sign'. Try to find out
+    # whether we can set this option or not.
+    CFLAGS_orig=$CFLAGS
+    CFLAGS="$CFLAGS -Wno-pointer-sign"
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdio.h>
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	CFLAGS=$CFLAGS_orig
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+GETTEXT_PACKAGE=gtkpod
+
+
+cat >>confdefs.h <<_ACEOF
+#define GETTEXT_PACKAGE "$GETTEXT_PACKAGE"
+_ACEOF
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_PKG_CONFIG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+if test -n "$PKG_CONFIG"; then
+  { echo "$as_me:$LINENO: result: $PKG_CONFIG" >&5
+echo "${ECHO_T}$PKG_CONFIG" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKG_CONFIG"; then
+  ac_pt_PKG_CONFIG=$PKG_CONFIG
+  # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $ac_pt_PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
+if test -n "$ac_pt_PKG_CONFIG"; then
+  { echo "$as_me:$LINENO: result: $ac_pt_PKG_CONFIG" >&5
+echo "${ECHO_T}$ac_pt_PKG_CONFIG" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+  if test "x$ac_pt_PKG_CONFIG" = x; then
+    PKG_CONFIG=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    PKG_CONFIG=$ac_pt_PKG_CONFIG
+  fi
+else
+  PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
+fi
+
+if test -z "$PKG_CONFIG"; then
+    { { echo "$as_me:$LINENO: error: *** pkg-config required (http://www.freedesktop.org/software/pkgconfig)
+See \`config.log' for more details." >&5
+echo "$as_me: error: *** pkg-config required (http://www.freedesktop.org/software/pkgconfig)
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+else
+    ac_cv_env_PKG_CONFIG_set=set
+fi
+
+
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+	if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_PKG_CONFIG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+if test -n "$PKG_CONFIG"; then
+  { echo "$as_me:$LINENO: result: $PKG_CONFIG" >&5
+echo "${ECHO_T}$PKG_CONFIG" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKG_CONFIG"; then
+  ac_pt_PKG_CONFIG=$PKG_CONFIG
+  # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $ac_pt_PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
+if test -n "$ac_pt_PKG_CONFIG"; then
+  { echo "$as_me:$LINENO: result: $ac_pt_PKG_CONFIG" >&5
+echo "${ECHO_T}$ac_pt_PKG_CONFIG" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+  if test "x$ac_pt_PKG_CONFIG" = x; then
+    PKG_CONFIG=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    PKG_CONFIG=$ac_pt_PKG_CONFIG
+  fi
+else
+  PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
+fi
+
+fi
+if test -n "$PKG_CONFIG"; then
+	_pkg_min_version=0.9.0
+	{ echo "$as_me:$LINENO: checking pkg-config is at least version $_pkg_min_version" >&5
+echo $ECHO_N "checking pkg-config is at least version $_pkg_min_version... $ECHO_C" >&6; }
+	if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+		{ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+	else
+		{ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+		PKG_CONFIG=""
+	fi
+
+fi
+
+pkg_failed=no
+{ echo "$as_me:$LINENO: checking for GTK" >&5
+echo $ECHO_N "checking for GTK... $ECHO_C" >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$GTK_CFLAGS"; then
+        pkg_cv_GTK_CFLAGS="$GTK_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0 >= 2.6.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "gtk+-2.0 >= 2.6.0") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_GTK_CFLAGS=`$PKG_CONFIG --cflags "gtk+-2.0 >= 2.6.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$GTK_LIBS"; then
+        pkg_cv_GTK_LIBS="$GTK_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0 >= 2.6.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "gtk+-2.0 >= 2.6.0") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_GTK_LIBS=`$PKG_CONFIG --libs "gtk+-2.0 >= 2.6.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        GTK_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gtk+-2.0 >= 2.6.0"`
+        else
+	        GTK_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gtk+-2.0 >= 2.6.0"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$GTK_PKG_ERRORS" >&5
+
+	{ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+                { { echo "$as_me:$LINENO: error: *** $GTK_PKG_ERRORS
+See \`config.log' for more details." >&5
+echo "$as_me: error: *** $GTK_PKG_ERRORS
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+elif test $pkg_failed = untried; then
+	{ { echo "$as_me:$LINENO: error: *** $GTK_PKG_ERRORS
+See \`config.log' for more details." >&5
+echo "$as_me: error: *** $GTK_PKG_ERRORS
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+else
+	GTK_CFLAGS=$pkg_cv_GTK_CFLAGS
+	GTK_LIBS=$pkg_cv_GTK_LIBS
+        { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+	:
+fi
+
+pkg_failed=no
+{ echo "$as_me:$LINENO: checking for GLIB" >&5
+echo $ECHO_N "checking for GLIB... $ECHO_C" >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$GLIB_CFLAGS"; then
+        pkg_cv_GLIB_CFLAGS="$GLIB_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.4.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.4.0") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_GLIB_CFLAGS=`$PKG_CONFIG --cflags "glib-2.0 >= 2.4.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$GLIB_LIBS"; then
+        pkg_cv_GLIB_LIBS="$GLIB_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.4.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.4.0") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_GLIB_LIBS=`$PKG_CONFIG --libs "glib-2.0 >= 2.4.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        GLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "glib-2.0 >= 2.4.0"`
+        else
+	        GLIB_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "glib-2.0 >= 2.4.0"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$GLIB_PKG_ERRORS" >&5
+
+	{ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+                { { echo "$as_me:$LINENO: error: *** $GLIB_PKG_ERRORS
+See \`config.log' for more details." >&5
+echo "$as_me: error: *** $GLIB_PKG_ERRORS
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+elif test $pkg_failed = untried; then
+	{ { echo "$as_me:$LINENO: error: *** $GLIB_PKG_ERRORS
+See \`config.log' for more details." >&5
+echo "$as_me: error: *** $GLIB_PKG_ERRORS
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+else
+	GLIB_CFLAGS=$pkg_cv_GLIB_CFLAGS
+	GLIB_LIBS=$pkg_cv_GLIB_LIBS
+        { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+	:
+fi
+
+pkg_failed=no
+{ echo "$as_me:$LINENO: checking for GMODULE" >&5
+echo $ECHO_N "checking for GMODULE... $ECHO_C" >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$GMODULE_CFLAGS"; then
+        pkg_cv_GMODULE_CFLAGS="$GMODULE_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"gmodule-2.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "gmodule-2.0") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_GMODULE_CFLAGS=`$PKG_CONFIG --cflags "gmodule-2.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$GMODULE_LIBS"; then
+        pkg_cv_GMODULE_LIBS="$GMODULE_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"gmodule-2.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "gmodule-2.0") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_GMODULE_LIBS=`$PKG_CONFIG --libs "gmodule-2.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        GMODULE_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gmodule-2.0"`
+        else
+	        GMODULE_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gmodule-2.0"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$GMODULE_PKG_ERRORS" >&5
+
+	{ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+                { { echo "$as_me:$LINENO: error: *** $GMODULE_PKG_ERRORS
+See \`config.log' for more details." >&5
+echo "$as_me: error: *** $GMODULE_PKG_ERRORS
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+elif test $pkg_failed = untried; then
+	{ { echo "$as_me:$LINENO: error: *** $GMODULE_PKG_ERRORS
+See \`config.log' for more details." >&5
+echo "$as_me: error: *** $GMODULE_PKG_ERRORS
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+else
+	GMODULE_CFLAGS=$pkg_cv_GMODULE_CFLAGS
+	GMODULE_LIBS=$pkg_cv_GMODULE_LIBS
+        { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+	:
+fi
+
+pkg_failed=no
+{ echo "$as_me:$LINENO: checking for GTHREAD" >&5
+echo $ECHO_N "checking for GTHREAD... $ECHO_C" >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$GTHREAD_CFLAGS"; then
+        pkg_cv_GTHREAD_CFLAGS="$GTHREAD_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"gthread-2.0 >= 0.14.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "gthread-2.0 >= 0.14.0") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_GTHREAD_CFLAGS=`$PKG_CONFIG --cflags "gthread-2.0 >= 0.14.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$GTHREAD_LIBS"; then
+        pkg_cv_GTHREAD_LIBS="$GTHREAD_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"gthread-2.0 >= 0.14.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "gthread-2.0 >= 0.14.0") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_GTHREAD_LIBS=`$PKG_CONFIG --libs "gthread-2.0 >= 0.14.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        GTHREAD_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gthread-2.0 >= 0.14.0"`
+        else
+	        GTHREAD_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gthread-2.0 >= 0.14.0"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$GTHREAD_PKG_ERRORS" >&5
+
+	{ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+                { { echo "$as_me:$LINENO: error: *** $GTHREAD_PKG_ERRORS
+See \`config.log' for more details." >&5
+echo "$as_me: error: *** $GTHREAD_PKG_ERRORS
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+elif test $pkg_failed = untried; then
+	{ { echo "$as_me:$LINENO: error: *** $GTHREAD_PKG_ERRORS
+See \`config.log' for more details." >&5
+echo "$as_me: error: *** $GTHREAD_PKG_ERRORS
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+else
+	GTHREAD_CFLAGS=$pkg_cv_GTHREAD_CFLAGS
+	GTHREAD_LIBS=$pkg_cv_GTHREAD_LIBS
+        { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+	:
+fi
+
+pkg_failed=no
+{ echo "$as_me:$LINENO: checking for LIBGLADE" >&5
+echo $ECHO_N "checking for LIBGLADE... $ECHO_C" >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$LIBGLADE_CFLAGS"; then
+        pkg_cv_LIBGLADE_CFLAGS="$LIBGLADE_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"libglade-2.0 >= 2.4.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "libglade-2.0 >= 2.4.0") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_LIBGLADE_CFLAGS=`$PKG_CONFIG --cflags "libglade-2.0 >= 2.4.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$LIBGLADE_LIBS"; then
+        pkg_cv_LIBGLADE_LIBS="$LIBGLADE_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"libglade-2.0 >= 2.4.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "libglade-2.0 >= 2.4.0") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_LIBGLADE_LIBS=`$PKG_CONFIG --libs "libglade-2.0 >= 2.4.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        LIBGLADE_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libglade-2.0 >= 2.4.0"`
+        else
+	        LIBGLADE_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libglade-2.0 >= 2.4.0"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$LIBGLADE_PKG_ERRORS" >&5
+
+	{ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+                { { echo "$as_me:$LINENO: error: *** $LIBGLADE_PKG_ERRORS
+See \`config.log' for more details." >&5
+echo "$as_me: error: *** $LIBGLADE_PKG_ERRORS
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+elif test $pkg_failed = untried; then
+	{ { echo "$as_me:$LINENO: error: *** $LIBGLADE_PKG_ERRORS
+See \`config.log' for more details." >&5
+echo "$as_me: error: *** $LIBGLADE_PKG_ERRORS
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+else
+	LIBGLADE_CFLAGS=$pkg_cv_LIBGLADE_CFLAGS
+	LIBGLADE_LIBS=$pkg_cv_LIBGLADE_LIBS
+        { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+	:
+fi
+
+pkg_failed=no
+{ echo "$as_me:$LINENO: checking for LIBGNOMECANVAS" >&5
+echo $ECHO_N "checking for LIBGNOMECANVAS... $ECHO_C" >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$LIBGNOMECANVAS_CFLAGS"; then
+        pkg_cv_LIBGNOMECANVAS_CFLAGS="$LIBGNOMECANVAS_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"libgnomecanvas-2.0 >= 2.14.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "libgnomecanvas-2.0 >= 2.14.0") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_LIBGNOMECANVAS_CFLAGS=`$PKG_CONFIG --cflags "libgnomecanvas-2.0 >= 2.14.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$LIBGNOMECANVAS_LIBS"; then
+        pkg_cv_LIBGNOMECANVAS_LIBS="$LIBGNOMECANVAS_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"libgnomecanvas-2.0 >= 2.14.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "libgnomecanvas-2.0 >= 2.14.0") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_LIBGNOMECANVAS_LIBS=`$PKG_CONFIG --libs "libgnomecanvas-2.0 >= 2.14.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        LIBGNOMECANVAS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libgnomecanvas-2.0 >= 2.14.0"`
+        else
+	        LIBGNOMECANVAS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libgnomecanvas-2.0 >= 2.14.0"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$LIBGNOMECANVAS_PKG_ERRORS" >&5
+
+	{ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+                { { echo "$as_me:$LINENO: error: *** $LIBGNOMECANVAS_PKG_ERRORS
+See \`config.log' for more details." >&5
+echo "$as_me: error: *** $LIBGNOMECANVAS_PKG_ERRORS
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+elif test $pkg_failed = untried; then
+	{ { echo "$as_me:$LINENO: error: *** $LIBGNOMECANVAS_PKG_ERRORS
+See \`config.log' for more details." >&5
+echo "$as_me: error: *** $LIBGNOMECANVAS_PKG_ERRORS
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+else
+	LIBGNOMECANVAS_CFLAGS=$pkg_cv_LIBGNOMECANVAS_CFLAGS
+	LIBGNOMECANVAS_LIBS=$pkg_cv_LIBGNOMECANVAS_LIBS
+        { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+	:
+fi
+
+pkg_failed=no
+{ echo "$as_me:$LINENO: checking for LIBGPOD" >&5
+echo $ECHO_N "checking for LIBGPOD... $ECHO_C" >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$LIBGPOD_CFLAGS"; then
+        pkg_cv_LIBGPOD_CFLAGS="$LIBGPOD_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"libgpod-1.0 >= 0.6.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "libgpod-1.0 >= 0.6.0") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_LIBGPOD_CFLAGS=`$PKG_CONFIG --cflags "libgpod-1.0 >= 0.6.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$LIBGPOD_LIBS"; then
+        pkg_cv_LIBGPOD_LIBS="$LIBGPOD_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"libgpod-1.0 >= 0.6.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "libgpod-1.0 >= 0.6.0") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_LIBGPOD_LIBS=`$PKG_CONFIG --libs "libgpod-1.0 >= 0.6.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        LIBGPOD_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libgpod-1.0 >= 0.6.0"`
+        else
+	        LIBGPOD_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libgpod-1.0 >= 0.6.0"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$LIBGPOD_PKG_ERRORS" >&5
+
+	{ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+                { { echo "$as_me:$LINENO: error: *** $LIBGPOD_PKG_ERRORS
+See \`config.log' for more details." >&5
+echo "$as_me: error: *** $LIBGPOD_PKG_ERRORS
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+elif test $pkg_failed = untried; then
+	{ { echo "$as_me:$LINENO: error: *** $LIBGPOD_PKG_ERRORS
+See \`config.log' for more details." >&5
+echo "$as_me: error: *** $LIBGPOD_PKG_ERRORS
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+else
+	LIBGPOD_CFLAGS=$pkg_cv_LIBGPOD_CFLAGS
+	LIBGPOD_LIBS=$pkg_cv_LIBGPOD_LIBS
+        { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+	:
+fi
+
+CFLAGS="$CFLAGS $GTK_CFLAGS $GLIB_CFLAGS $GMODULE_CFLAGS $GTHREAD_CFLAGS $LIBGLADE_CFLAGS $LIBGNOMECANVAS_CFLAGS $LIBGPOD_CFLAGS"
+LIBS="$LIBS $GTK_LIBS $GLIB_LIBS $GMODULE_LIBS $GTHREAD_LIBS $LIBGLADE_LIBS $LIBGNOMECANVAS_LIBS $LIBGPOD_LIBS"
+
+for ac_prog in flex lex
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_LEX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$LEX"; then
+  ac_cv_prog_LEX="$LEX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_LEX="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+LEX=$ac_cv_prog_LEX
+if test -n "$LEX"; then
+  { echo "$as_me:$LINENO: result: $LEX" >&5
+echo "${ECHO_T}$LEX" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  test -n "$LEX" && break
+done
+test -n "$LEX" || LEX=":"
+
+if test "x$LEX" != "x:"; then
+  cat >conftest.l <<_ACEOF
+%%
+a { ECHO; }
+b { REJECT; }
+c { yymore (); }
+d { yyless (1); }
+e { yyless (input () != 0); }
+f { unput (yytext[0]); }
+. { BEGIN INITIAL; }
+%%
+#ifdef YYTEXT_POINTER
+extern char *yytext;
+#endif
+int
+main (void)
+{
+  return ! yylex () + ! yywrap ();
+}
+_ACEOF
+{ (ac_try="$LEX conftest.l"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$LEX conftest.l") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ echo "$as_me:$LINENO: checking lex output file root" >&5
+echo $ECHO_N "checking lex output file root... $ECHO_C" >&6; }
+if test "${ac_cv_prog_lex_root+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+if test -f lex.yy.c; then
+  ac_cv_prog_lex_root=lex.yy
+elif test -f lexyy.c; then
+  ac_cv_prog_lex_root=lexyy
+else
+  { { echo "$as_me:$LINENO: error: cannot find output from $LEX; giving up" >&5
+echo "$as_me: error: cannot find output from $LEX; giving up" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_prog_lex_root" >&5
+echo "${ECHO_T}$ac_cv_prog_lex_root" >&6; }
+LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root
+
+if test -z "${LEXLIB+set}"; then
+  { echo "$as_me:$LINENO: checking lex library" >&5
+echo $ECHO_N "checking lex library... $ECHO_C" >&6; }
+if test "${ac_cv_lib_lex+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+    ac_save_LIBS=$LIBS
+    ac_cv_lib_lex='none needed'
+    for ac_lib in '' -lfl -ll; do
+      LIBS="$ac_lib $ac_save_LIBS"
+      cat >conftest.$ac_ext <<_ACEOF
+`cat $LEX_OUTPUT_ROOT.c`
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_lib_lex=$ac_lib
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+      test "$ac_cv_lib_lex" != 'none needed' && break
+    done
+    LIBS=$ac_save_LIBS
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_lex" >&5
+echo "${ECHO_T}$ac_cv_lib_lex" >&6; }
+  test "$ac_cv_lib_lex" != 'none needed' && LEXLIB=$ac_cv_lib_lex
+fi
+
+
+{ echo "$as_me:$LINENO: checking whether yytext is a pointer" >&5
+echo $ECHO_N "checking whether yytext is a pointer... $ECHO_C" >&6; }
+if test "${ac_cv_prog_lex_yytext_pointer+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  # POSIX says lex can declare yytext either as a pointer or an array; the
+# default is implementation-dependent.  Figure out which it is, since
+# not all implementations provide the %pointer and %array declarations.
+ac_cv_prog_lex_yytext_pointer=no
+ac_save_LIBS=$LIBS
+LIBS="$LEXLIB $ac_save_LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+#define YYTEXT_POINTER 1
+`cat $LEX_OUTPUT_ROOT.c`
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_prog_lex_yytext_pointer=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_save_LIBS
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_prog_lex_yytext_pointer" >&5
+echo "${ECHO_T}$ac_cv_prog_lex_yytext_pointer" >&6; }
+if test $ac_cv_prog_lex_yytext_pointer = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define YYTEXT_POINTER 1
+_ACEOF
+
+fi
+rm -f conftest.l $LEX_OUTPUT_ROOT.c
+
+fi
+if test "$LEX" = :; then
+  LEX=${am_missing_run}flex
+fi
+if ! test "y$LEX" = "yflex"; then
+    if ! test "y$LEX" = "ylex"; then
+        { { echo "$as_me:$LINENO: error: *** flex or lex required
+See \`config.log' for more details." >&5
+echo "$as_me: error: *** flex or lex required
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+fi
+
+# Extract the first word of "mount", so it can be a program name with args.
+set dummy mount; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_MOUNT+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $MOUNT in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_MOUNT="$MOUNT" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_MOUNT="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+MOUNT=$ac_cv_path_MOUNT
+if test -n "$MOUNT"; then
+  { echo "$as_me:$LINENO: result: $MOUNT" >&5
+echo "${ECHO_T}$MOUNT" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+
+# Extract the first word of "umount", so it can be a program name with args.
+set dummy umount; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_UMOUNT+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $UMOUNT in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_UMOUNT="$UMOUNT" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_UMOUNT="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+UMOUNT=$ac_cv_path_UMOUNT
+if test -n "$UMOUNT"; then
+  { echo "$as_me:$LINENO: result: $UMOUNT" >&5
+echo "${ECHO_T}$UMOUNT" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+
+
+ALL_LINGUAS="de es fr he it ja ru ro sv"
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if test "${ac_cv_prog_CPP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+{ echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  :
+else
+  { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5
+echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; }
+if test "${ac_cv_path_GREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  # Extract the first word of "grep ggrep" to use in msg output
+if test -z "$GREP"; then
+set dummy grep ggrep; ac_prog_name=$2
+if test "${ac_cv_path_GREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_path_GREP_found=false
+# Loop through the user's path and test for each of PROGNAME-LIST
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_prog in grep ggrep; do
+  for ac_exec_ext in '' $ac_executable_extensions; do
+    ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+    { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
+    # Check for GNU ac_path_GREP and select it if it is found.
+  # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+  ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    echo 'GREP' >> "conftest.nl"
+    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    ac_count=`expr $ac_count + 1`
+    if test $ac_count -gt ${ac_path_GREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_GREP="$ac_path_GREP"
+      ac_path_GREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+
+    $ac_path_GREP_found && break 3
+  done
+done
+
+done
+IFS=$as_save_IFS
+
+
+fi
+
+GREP="$ac_cv_path_GREP"
+if test -z "$GREP"; then
+  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+else
+  ac_cv_path_GREP=$GREP
+fi
+
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5
+echo "${ECHO_T}$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ echo "$as_me:$LINENO: checking for egrep" >&5
+echo $ECHO_N "checking for egrep... $ECHO_C" >&6; }
+if test "${ac_cv_path_EGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     # Extract the first word of "egrep" to use in msg output
+if test -z "$EGREP"; then
+set dummy egrep; ac_prog_name=$2
+if test "${ac_cv_path_EGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_path_EGREP_found=false
+# Loop through the user's path and test for each of PROGNAME-LIST
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_prog in egrep; do
+  for ac_exec_ext in '' $ac_executable_extensions; do
+    ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+    { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
+    # Check for GNU ac_path_EGREP and select it if it is found.
+  # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+  ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    echo 'EGREP' >> "conftest.nl"
+    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    ac_count=`expr $ac_count + 1`
+    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_EGREP="$ac_path_EGREP"
+      ac_path_EGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+
+    $ac_path_EGREP_found && break 3
+  done
+done
+
+done
+IFS=$as_save_IFS
+
+
+fi
+
+EGREP="$ac_cv_path_EGREP"
+if test -z "$EGREP"; then
+  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+else
+  ac_cv_path_EGREP=$EGREP
+fi
+
+
+   fi
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5
+echo "${ECHO_T}$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; }
+if test "${ac_cv_header_stdc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_header_stdc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_cv_header_stdc=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then
+  :
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+		   (('a' <= (c) && (c) <= 'i') \
+		     || ('j' <= (c) && (c) <= 'r') \
+		     || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+	|| toupper (i) != TOUPPER (i))
+      return 2;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+fi
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define STDC_HEADERS 1
+_ACEOF
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+
+
+
+
+
+
+
+
+
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+		  inttypes.h stdint.h unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	eval "$as_ac_Header=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+
+for ac_header in locale.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+
+    ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+    if test $ac_cv_header_locale_h = yes; then
+    { echo "$as_me:$LINENO: checking for LC_MESSAGES" >&5
+echo $ECHO_N "checking for LC_MESSAGES... $ECHO_C" >&6; }
+if test "${am_cv_val_LC_MESSAGES+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <locale.h>
+int
+main ()
+{
+return LC_MESSAGES
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  am_cv_val_LC_MESSAGES=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	am_cv_val_LC_MESSAGES=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $am_cv_val_LC_MESSAGES" >&5
+echo "${ECHO_T}$am_cv_val_LC_MESSAGES" >&6; }
+    if test $am_cv_val_LC_MESSAGES = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_LC_MESSAGES 1
+_ACEOF
+
+    fi
+  fi
+         USE_NLS=yes
+
+
+    gt_cv_have_gettext=no
+
+    CATOBJEXT=NONE
+    XGETTEXT=:
+    INTLLIBS=
+
+    if test "${ac_cv_header_libintl_h+set}" = set; then
+  { echo "$as_me:$LINENO: checking for libintl.h" >&5
+echo $ECHO_N "checking for libintl.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_libintl_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_libintl_h" >&5
+echo "${ECHO_T}$ac_cv_header_libintl_h" >&6; }
+else
+  # Is the header compilable?
+{ echo "$as_me:$LINENO: checking libintl.h usability" >&5
+echo $ECHO_N "checking libintl.h usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <libintl.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking libintl.h presence" >&5
+echo $ECHO_N "checking libintl.h presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <libintl.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: libintl.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: libintl.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: libintl.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: libintl.h: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: libintl.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: libintl.h: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: libintl.h:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: libintl.h:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: libintl.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: libintl.h: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: libintl.h:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: libintl.h:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: libintl.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: libintl.h: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: libintl.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: libintl.h: in the future, the compiler will take precedence" >&2;}
+
+    ;;
+esac
+{ echo "$as_me:$LINENO: checking for libintl.h" >&5
+echo $ECHO_N "checking for libintl.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_libintl_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_header_libintl_h=$ac_header_preproc
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_libintl_h" >&5
+echo "${ECHO_T}$ac_cv_header_libintl_h" >&6; }
+
+fi
+if test $ac_cv_header_libintl_h = yes; then
+  gt_cv_func_dgettext_libintl="no"
+      libintl_extra_libs=""
+
+      #
+      # First check in libc
+      #
+      { echo "$as_me:$LINENO: checking for ngettext in libc" >&5
+echo $ECHO_N "checking for ngettext in libc... $ECHO_C" >&6; }
+if test "${gt_cv_func_ngettext_libc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#include <libintl.h>
+
+int
+main ()
+{
+return !ngettext ("","", 1)
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  gt_cv_func_ngettext_libc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	gt_cv_func_ngettext_libc=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ echo "$as_me:$LINENO: result: $gt_cv_func_ngettext_libc" >&5
+echo "${ECHO_T}$gt_cv_func_ngettext_libc" >&6; }
+
+      if test "$gt_cv_func_ngettext_libc" = "yes" ; then
+	      { echo "$as_me:$LINENO: checking for dgettext in libc" >&5
+echo $ECHO_N "checking for dgettext in libc... $ECHO_C" >&6; }
+if test "${gt_cv_func_dgettext_libc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#include <libintl.h>
+
+int
+main ()
+{
+return !dgettext ("","")
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  gt_cv_func_dgettext_libc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	gt_cv_func_dgettext_libc=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ echo "$as_me:$LINENO: result: $gt_cv_func_dgettext_libc" >&5
+echo "${ECHO_T}$gt_cv_func_dgettext_libc" >&6; }
+      fi
+
+      if test "$gt_cv_func_ngettext_libc" = "yes" ; then
+
+for ac_func in bind_textdomain_codeset
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+      fi
+
+      #
+      # If we don't have everything we want, check in libintl
+      #
+      if test "$gt_cv_func_dgettext_libc" != "yes" \
+	 || test "$gt_cv_func_ngettext_libc" != "yes" \
+         || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then
+
+        { echo "$as_me:$LINENO: checking for bindtextdomain in -lintl" >&5
+echo $ECHO_N "checking for bindtextdomain in -lintl... $ECHO_C" >&6; }
+if test "${ac_cv_lib_intl_bindtextdomain+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lintl  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char bindtextdomain ();
+int
+main ()
+{
+return bindtextdomain ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_lib_intl_bindtextdomain=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_cv_lib_intl_bindtextdomain=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_intl_bindtextdomain" >&5
+echo "${ECHO_T}$ac_cv_lib_intl_bindtextdomain" >&6; }
+if test $ac_cv_lib_intl_bindtextdomain = yes; then
+  { echo "$as_me:$LINENO: checking for ngettext in -lintl" >&5
+echo $ECHO_N "checking for ngettext in -lintl... $ECHO_C" >&6; }
+if test "${ac_cv_lib_intl_ngettext+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lintl  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ngettext ();
+int
+main ()
+{
+return ngettext ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_lib_intl_ngettext=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_cv_lib_intl_ngettext=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_intl_ngettext" >&5
+echo "${ECHO_T}$ac_cv_lib_intl_ngettext" >&6; }
+if test $ac_cv_lib_intl_ngettext = yes; then
+  { echo "$as_me:$LINENO: checking for dgettext in -lintl" >&5
+echo $ECHO_N "checking for dgettext in -lintl... $ECHO_C" >&6; }
+if test "${ac_cv_lib_intl_dgettext+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lintl  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dgettext ();
+int
+main ()
+{
+return dgettext ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_lib_intl_dgettext=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_cv_lib_intl_dgettext=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_intl_dgettext" >&5
+echo "${ECHO_T}$ac_cv_lib_intl_dgettext" >&6; }
+if test $ac_cv_lib_intl_dgettext = yes; then
+  gt_cv_func_dgettext_libintl=yes
+fi
+
+fi
+
+fi
+
+
+	if test "$gt_cv_func_dgettext_libintl" != "yes" ; then
+	  { echo "$as_me:$LINENO: checking if -liconv is needed to use gettext" >&5
+echo $ECHO_N "checking if -liconv is needed to use gettext... $ECHO_C" >&6; }
+	  { echo "$as_me:$LINENO: result: " >&5
+echo "${ECHO_T}" >&6; }
+  	  { echo "$as_me:$LINENO: checking for ngettext in -lintl" >&5
+echo $ECHO_N "checking for ngettext in -lintl... $ECHO_C" >&6; }
+if test "${ac_cv_lib_intl_ngettext+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lintl -liconv $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ngettext ();
+int
+main ()
+{
+return ngettext ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_lib_intl_ngettext=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_cv_lib_intl_ngettext=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_intl_ngettext" >&5
+echo "${ECHO_T}$ac_cv_lib_intl_ngettext" >&6; }
+if test $ac_cv_lib_intl_ngettext = yes; then
+  { echo "$as_me:$LINENO: checking for dcgettext in -lintl" >&5
+echo $ECHO_N "checking for dcgettext in -lintl... $ECHO_C" >&6; }
+if test "${ac_cv_lib_intl_dcgettext+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lintl -liconv $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dcgettext ();
+int
+main ()
+{
+return dcgettext ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_lib_intl_dcgettext=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_cv_lib_intl_dcgettext=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_intl_dcgettext" >&5
+echo "${ECHO_T}$ac_cv_lib_intl_dcgettext" >&6; }
+if test $ac_cv_lib_intl_dcgettext = yes; then
+  gt_cv_func_dgettext_libintl=yes
+			libintl_extra_libs=-liconv
+else
+  :
+fi
+
+else
+  :
+fi
+
+        fi
+
+        #
+        # If we found libintl, then check in it for bind_textdomain_codeset();
+        # we'll prefer libc if neither have bind_textdomain_codeset(),
+        # and both have dgettext and ngettext
+        #
+        if test "$gt_cv_func_dgettext_libintl" = "yes" ; then
+          glib_save_LIBS="$LIBS"
+          LIBS="$LIBS -lintl $libintl_extra_libs"
+          unset ac_cv_func_bind_textdomain_codeset
+
+for ac_func in bind_textdomain_codeset
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+          LIBS="$glib_save_LIBS"
+
+          if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then
+            gt_cv_func_dgettext_libc=no
+          else
+            if test "$gt_cv_func_dgettext_libc" = "yes" \
+		&& test "$gt_cv_func_ngettext_libc" = "yes"; then
+              gt_cv_func_dgettext_libintl=no
+            fi
+          fi
+        fi
+      fi
+
+      if test "$gt_cv_func_dgettext_libc" = "yes" \
+	|| test "$gt_cv_func_dgettext_libintl" = "yes"; then
+        gt_cv_have_gettext=yes
+      fi
+
+      if test "$gt_cv_func_dgettext_libintl" = "yes"; then
+        INTLLIBS="-lintl $libintl_extra_libs"
+      fi
+
+      if test "$gt_cv_have_gettext" = "yes"; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_GETTEXT 1
+_ACEOF
+
+	# Extract the first word of "msgfmt", so it can be a program name with args.
+set dummy msgfmt; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_MSGFMT+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case "$MSGFMT" in
+  /*)
+  ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path.
+  ;;
+  *)
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then
+	ac_cv_path_MSGFMT="$ac_dir/$ac_word"
+	break
+      fi
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="no"
+  ;;
+esac
+fi
+MSGFMT="$ac_cv_path_MSGFMT"
+if test "$MSGFMT" != "no"; then
+  { echo "$as_me:$LINENO: result: $MSGFMT" >&5
+echo "${ECHO_T}$MSGFMT" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+	if test "$MSGFMT" != "no"; then
+          glib_save_LIBS="$LIBS"
+          LIBS="$LIBS $INTLLIBS"
+
+for ac_func in dcgettext
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+	  MSGFMT_OPTS=
+	  { echo "$as_me:$LINENO: checking if msgfmt accepts -c" >&5
+echo $ECHO_N "checking if msgfmt accepts -c... $ECHO_C" >&6; }
+	  cat >conftest.foo <<_ACEOF
+
+msgid ""
+msgstr ""
+"Content-Type: text/plain; charset=UTF-8\n"
+"Project-Id-Version: test 1.0\n"
+"PO-Revision-Date: 2007-02-15 12:01+0100\n"
+"Last-Translator: test <foo at bar.xx>\n"
+"Language-Team: C <LL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+_ACEOF
+if { (echo "$as_me:$LINENO: \$MSGFMT -c -o /dev/null conftest.foo") >&5
+  ($MSGFMT -c -o /dev/null conftest.foo) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  MSGFMT_OPTS=-c; { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+else { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+echo "$as_me: failed input was:" >&5
+sed 's/^/| /' conftest.foo >&5
+fi
+
+	  # Extract the first word of "gmsgfmt", so it can be a program name with args.
+set dummy gmsgfmt; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_GMSGFMT+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $GMSGFMT in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT"
+  ;;
+esac
+fi
+GMSGFMT=$ac_cv_path_GMSGFMT
+if test -n "$GMSGFMT"; then
+  { echo "$as_me:$LINENO: result: $GMSGFMT" >&5
+echo "${ECHO_T}$GMSGFMT" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+	  # Extract the first word of "xgettext", so it can be a program name with args.
+set dummy xgettext; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_XGETTEXT+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case "$XGETTEXT" in
+  /*)
+  ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
+  ;;
+  *)
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then
+	ac_cv_path_XGETTEXT="$ac_dir/$ac_word"
+	break
+      fi
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":"
+  ;;
+esac
+fi
+XGETTEXT="$ac_cv_path_XGETTEXT"
+if test "$XGETTEXT" != ":"; then
+  { echo "$as_me:$LINENO: result: $XGETTEXT" >&5
+echo "${ECHO_T}$XGETTEXT" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+	  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+extern int _nl_msg_cat_cntr;
+			 return _nl_msg_cat_cntr
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  CATOBJEXT=.gmo
+             DATADIRNAME=share
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	case $host in
+	    *-*-solaris*)
+	    	                	    	                { echo "$as_me:$LINENO: checking for bind_textdomain_codeset" >&5
+echo $ECHO_N "checking for bind_textdomain_codeset... $ECHO_C" >&6; }
+if test "${ac_cv_func_bind_textdomain_codeset+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define bind_textdomain_codeset to an innocuous variant, in case <limits.h> declares bind_textdomain_codeset.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define bind_textdomain_codeset innocuous_bind_textdomain_codeset
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char bind_textdomain_codeset (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef bind_textdomain_codeset
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char bind_textdomain_codeset ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_bind_textdomain_codeset || defined __stub___bind_textdomain_codeset
+choke me
+#endif
+
+int
+main ()
+{
+return bind_textdomain_codeset ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_func_bind_textdomain_codeset=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_cv_func_bind_textdomain_codeset=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_bind_textdomain_codeset" >&5
+echo "${ECHO_T}$ac_cv_func_bind_textdomain_codeset" >&6; }
+if test $ac_cv_func_bind_textdomain_codeset = yes; then
+  CATOBJEXT=.gmo
+               DATADIRNAME=share
+else
+  CATOBJEXT=.mo
+               DATADIRNAME=lib
+fi
+
+	    ;;
+	    *)
+	    CATOBJEXT=.mo
+            DATADIRNAME=lib
+	    ;;
+	    esac
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+          LIBS="$glib_save_LIBS"
+	  INSTOBJEXT=.mo
+	else
+	  gt_cv_have_gettext=no
+	fi
+      fi
+
+fi
+
+
+
+    if test "$gt_cv_have_gettext" = "yes" ; then
+
+cat >>confdefs.h <<\_ACEOF
+#define ENABLE_NLS 1
+_ACEOF
+
+    fi
+
+        if test "$XGETTEXT" != ":"; then
+                  if $XGETTEXT --omit-header /dev/null 2> /dev/null; then
+        : ;
+      else
+        { echo "$as_me:$LINENO: result: found xgettext program is not GNU xgettext; ignore it" >&5
+echo "${ECHO_T}found xgettext program is not GNU xgettext; ignore it" >&6; }
+        XGETTEXT=":"
+      fi
+    fi
+
+    # We need to process the po/ directory.
+    POSUB=po
+
+    ac_config_commands="$ac_config_commands default-1"
+
+
+                for lang in $ALL_LINGUAS; do
+      GMOFILES="$GMOFILES $lang.gmo"
+      POFILES="$POFILES $lang.po"
+    done
+
+
+
+
+
+
+
+
+
+
+
+
+
+   if test "$gt_cv_have_gettext" = "yes"; then
+     if test "x$ALL_LINGUAS" = "x"; then
+       LINGUAS=
+     else
+       { echo "$as_me:$LINENO: checking for catalogs to be installed" >&5
+echo $ECHO_N "checking for catalogs to be installed... $ECHO_C" >&6; }
+       NEW_LINGUAS=
+       for presentlang in $ALL_LINGUAS; do
+         useit=no
+         if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then
+           desiredlanguages="$LINGUAS"
+         else
+           desiredlanguages="$ALL_LINGUAS"
+         fi
+         for desiredlang in $desiredlanguages; do
+ 	   # Use the presentlang catalog if desiredlang is
+           #   a. equal to presentlang, or
+           #   b. a variant of presentlang (because in this case,
+           #      presentlang can be used as a fallback for messages
+           #      which are not translated in the desiredlang catalog).
+           case "$desiredlang" in
+             "$presentlang"*) useit=yes;;
+           esac
+         done
+         if test $useit = yes; then
+           NEW_LINGUAS="$NEW_LINGUAS $presentlang"
+         fi
+       done
+       LINGUAS=$NEW_LINGUAS
+       { echo "$as_me:$LINENO: result: $LINGUAS" >&5
+echo "${ECHO_T}$LINGUAS" >&6; }
+     fi
+
+          if test -n "$LINGUAS"; then
+       for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done
+     fi
+   fi
+
+            MKINSTALLDIRS=
+   if test -n "$ac_aux_dir"; then
+     MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs"
+   fi
+   if test -z "$MKINSTALLDIRS"; then
+     MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs"
+   fi
+
+
+         test -d po || mkdir po
+   if test "x$srcdir" != "x."; then
+     if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then
+       posrcprefix="$srcdir/"
+     else
+       posrcprefix="../$srcdir/"
+     fi
+   else
+     posrcprefix="../"
+   fi
+   rm -f po/POTFILES
+   sed -e "/^#/d" -e "/^\$/d" -e "s,.*,	$posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \
+	< $srcdir/po/POTFILES.in > po/POTFILES
+
+
+
+for ac_func in getopt_long_only
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else
+  case " $LIBOBJS " in
+  *" getopt.$ac_objext "* ) ;;
+  *) LIBOBJS="$LIBOBJS getopt.$ac_objext"
+ ;;
+esac
+
+fi
+done
+
+
+for ac_func in getopt_long_only
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else
+  case " $LIBOBJS " in
+  *" getopt1.$ac_objext "* ) ;;
+  *) LIBOBJS="$LIBOBJS getopt1.$ac_objext"
+ ;;
+esac
+
+fi
+done
+
+
+
+for ac_func in flock
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+
+for ac_func in statvfs
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+{ echo "$as_me:$LINENO: checking for library containing id3_frame_field" >&5
+echo $ECHO_N "checking for library containing id3_frame_field... $ECHO_C" >&6; }
+if test "${ac_cv_search_id3_frame_field+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char id3_frame_field ();
+int
+main ()
+{
+return id3_frame_field ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' "id3tag" "id3tag -lz"; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_search_id3_frame_field=$ac_res
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext
+  if test "${ac_cv_search_id3_frame_field+set}" = set; then
+  break
+fi
+done
+if test "${ac_cv_search_id3_frame_field+set}" = set; then
+  :
+else
+  ac_cv_search_id3_frame_field=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_search_id3_frame_field" >&5
+echo "${ECHO_T}$ac_cv_search_id3_frame_field" >&6; }
+ac_res=$ac_cv_search_id3_frame_field
+if test "$ac_res" != no; then
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+else
+  { { echo "$as_me:$LINENO: error: *** id3tag >= 0.15 lib not found (0.14 will not work!)" >&5
+echo "$as_me: error: *** id3tag >= 0.15 lib not found (0.14 will not work!)" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+
+
+# Check whether --with-curl was given.
+if test "${with_curl+set}" = set; then
+  withval=$with_curl;
+fi
+
+if test "x$with_curl" != "xno"; then
+
+pkg_failed=no
+{ echo "$as_me:$LINENO: checking for CURL" >&5
+echo $ECHO_N "checking for CURL... $ECHO_C" >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$CURL_CFLAGS"; then
+        pkg_cv_CURL_CFLAGS="$CURL_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"libcurl >= 7.10.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "libcurl >= 7.10.0") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_CURL_CFLAGS=`$PKG_CONFIG --cflags "libcurl >= 7.10.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$CURL_LIBS"; then
+        pkg_cv_CURL_LIBS="$CURL_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"libcurl >= 7.10.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "libcurl >= 7.10.0") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_CURL_LIBS=`$PKG_CONFIG --libs "libcurl >= 7.10.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        CURL_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libcurl >= 7.10.0"`
+        else
+	        CURL_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libcurl >= 7.10.0"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$CURL_PKG_ERRORS" >&5
+
+	{ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+                have_curl=no
+elif test $pkg_failed = untried; then
+	have_curl=no
+else
+	CURL_CFLAGS=$pkg_cv_CURL_CFLAGS
+	CURL_LIBS=$pkg_cv_CURL_LIBS
+        { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+	have_curl=yes
+fi
+    if test "x$with_curl" = "xyes" -a "x$have_curl" = "xno"; then
+        { { echo "$as_me:$LINENO: error: curl support explicitly requested but curl couldn't be found" >&5
+echo "$as_me: error: curl support explicitly requested but curl couldn't be found" >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+fi
+ if test "x$have_curl" = "xyes"; then
+  HAVE_CURL_TRUE=
+  HAVE_CURL_FALSE='#'
+else
+  HAVE_CURL_TRUE='#'
+  HAVE_CURL_FALSE=
+fi
+
+if test "x$have_curl" = "xyes"; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_CURL 1
+_ACEOF
+
+    have_curl="yes -- will build with coverart download support"
+    CPPFLAGS="$CPPFLAGS $CURL_CFLAGS"
+    CFLAGS="$CFLAGS $CURL_CFLAGS"
+    LIBS="$LIBS $CURL_LIBS"
+else
+    have_curl="*no -- will build without coverart download support"
+fi
+
+
+# Check whether --with-gnome-vfs was given.
+if test "${with_gnome_vfs+set}" = set; then
+  withval=$with_gnome_vfs;
+fi
+
+if test "x$with_gnome_vfs" != "xno"; then
+
+pkg_failed=no
+{ echo "$as_me:$LINENO: checking for GNOME_VFS" >&5
+echo $ECHO_N "checking for GNOME_VFS... $ECHO_C" >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$GNOME_VFS_CFLAGS"; then
+        pkg_cv_GNOME_VFS_CFLAGS="$GNOME_VFS_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"gnome-vfs-2.0 >= 2.6.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "gnome-vfs-2.0 >= 2.6.0") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_GNOME_VFS_CFLAGS=`$PKG_CONFIG --cflags "gnome-vfs-2.0 >= 2.6.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$GNOME_VFS_LIBS"; then
+        pkg_cv_GNOME_VFS_LIBS="$GNOME_VFS_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"gnome-vfs-2.0 >= 2.6.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "gnome-vfs-2.0 >= 2.6.0") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_GNOME_VFS_LIBS=`$PKG_CONFIG --libs "gnome-vfs-2.0 >= 2.6.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        GNOME_VFS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gnome-vfs-2.0 >= 2.6.0"`
+        else
+	        GNOME_VFS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gnome-vfs-2.0 >= 2.6.0"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$GNOME_VFS_PKG_ERRORS" >&5
+
+	{ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+                have_gnome_vfs=no
+elif test $pkg_failed = untried; then
+	have_gnome_vfs=no
+else
+	GNOME_VFS_CFLAGS=$pkg_cv_GNOME_VFS_CFLAGS
+	GNOME_VFS_LIBS=$pkg_cv_GNOME_VFS_LIBS
+        { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+	have_gnome_vfs=yes
+fi
+    if test "x$with_gnome_vfs" = "xyes" -a "x$have_gnome_vfs" = "xno"; then
+        { { echo "$as_me:$LINENO: error: gnome-vfs support explicitly requested but gnome-vfs couldn't be found" >&5
+echo "$as_me: error: gnome-vfs support explicitly requested but gnome-vfs couldn't be found" >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+fi
+ if test "x$have_gnome_vfs" = "xyes"; then
+  HAVE_GNOME_VFS_TRUE=
+  HAVE_GNOME_VFS_FALSE='#'
+else
+  HAVE_GNOME_VFS_TRUE='#'
+  HAVE_GNOME_VFS_FALSE=
+fi
+
+if test "x$have_gnome_vfs" = "xyes"; then
+    have_gnome_vfs="yes -- will build with automount support"
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_GNOME_VFS 1
+_ACEOF
+
+    CPPFLAGS="$CPPFLAGS $GNOME_VFS_CFLAGS"
+    CFLAGS="$CFLAGS $GNOME_VFS_CFLAGS"
+    LIBS="$LIBS $GNOME_VFS_LIBS"
+else
+    have_gnome_vfs="*no -- will build without iPod autodetection support"
+fi
+
+#dnl Check for HAL
+
+# Check whether --with-hal was given.
+if test "${with_hal+set}" = set; then
+  withval=$with_hal;
+fi
+
+if test "x$with_hal" != "xno"; then
+
+pkg_failed=no
+{ echo "$as_me:$LINENO: checking for HAL" >&5
+echo $ECHO_N "checking for HAL... $ECHO_C" >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$HAL_CFLAGS"; then
+        pkg_cv_HAL_CFLAGS="$HAL_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"hal >= 0.5 hal < 0.6\"") >&5
+  ($PKG_CONFIG --exists --print-errors "hal >= 0.5 hal < 0.6") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_HAL_CFLAGS=`$PKG_CONFIG --cflags "hal >= 0.5 hal < 0.6" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$HAL_LIBS"; then
+        pkg_cv_HAL_LIBS="$HAL_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"hal >= 0.5 hal < 0.6\"") >&5
+  ($PKG_CONFIG --exists --print-errors "hal >= 0.5 hal < 0.6") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_HAL_LIBS=`$PKG_CONFIG --libs "hal >= 0.5 hal < 0.6" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        HAL_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "hal >= 0.5 hal < 0.6"`
+        else
+	        HAL_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "hal >= 0.5 hal < 0.6"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$HAL_PKG_ERRORS" >&5
+
+	{ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+                have_hal=no
+elif test $pkg_failed = untried; then
+	have_hal=no
+else
+	HAL_CFLAGS=$pkg_cv_HAL_CFLAGS
+	HAL_LIBS=$pkg_cv_HAL_LIBS
+        { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+	have_hal=yes
+fi
+    if test "x$with_hal" = "xyes" -a "x$have_hal" = "xno"; then
+        { { echo "$as_me:$LINENO: error: HAL support explicitly requested but HAL couldn't be found" >&5
+echo "$as_me: error: HAL support explicitly requested but HAL couldn't be found" >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+fi
+ if test "x$have_hal" = "xyes"; then
+  HAVE_HAL_TRUE=
+  HAVE_HAL_FALSE='#'
+else
+  HAVE_HAL_TRUE='#'
+  HAVE_HAL_FALSE=
+fi
+
+if test "x$have_hal" = "xyes"; then
+    have_hal="yes -- will build with HAL support"
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_HAL 1
+_ACEOF
+
+    CPPFLAGS="$CPPFLAGS $HAL_CFLAGS"
+    CFLAGS="$CFLAGS $HAL_CFLAGS"
+    LIBS="$LIBS $HAL_LIBS"
+else
+    have_hal="*no -- will build without HAL support"
+fi
+
+
+# Check whether --with-mp4v2 was given.
+if test "${with_mp4v2+set}" = set; then
+  withval=$with_mp4v2;
+fi
+
+if test "x$with_mp4v2" != "xno"; then
+    { echo "$as_me:$LINENO: checking for library containing MP4GetMetadataGrouping" >&5
+echo $ECHO_N "checking for library containing MP4GetMetadataGrouping... $ECHO_C" >&6; }
+if test "${ac_cv_search_MP4GetMetadataGrouping+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char MP4GetMetadataGrouping ();
+int
+main ()
+{
+return MP4GetMetadataGrouping ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' "mp4v2" "mp4v2 -lstdc++" "mp4v2 -lz" "mp4v2 -lz -lstdc++"; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_search_MP4GetMetadataGrouping=$ac_res
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext
+  if test "${ac_cv_search_MP4GetMetadataGrouping+set}" = set; then
+  break
+fi
+done
+if test "${ac_cv_search_MP4GetMetadataGrouping+set}" = set; then
+  :
+else
+  ac_cv_search_MP4GetMetadataGrouping=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_search_MP4GetMetadataGrouping" >&5
+echo "${ECHO_T}$ac_cv_search_MP4GetMetadataGrouping" >&6; }
+ac_res=$ac_cv_search_MP4GetMetadataGrouping
+if test "$ac_res" != no; then
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+  if test "${ac_cv_header_mp4_h+set}" = set; then
+  { echo "$as_me:$LINENO: checking for mp4.h" >&5
+echo $ECHO_N "checking for mp4.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_mp4_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_mp4_h" >&5
+echo "${ECHO_T}$ac_cv_header_mp4_h" >&6; }
+else
+  # Is the header compilable?
+{ echo "$as_me:$LINENO: checking mp4.h usability" >&5
+echo $ECHO_N "checking mp4.h usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <mp4.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking mp4.h presence" >&5
+echo $ECHO_N "checking mp4.h presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <mp4.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: mp4.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: mp4.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: mp4.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: mp4.h: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: mp4.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: mp4.h: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: mp4.h:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: mp4.h:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: mp4.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: mp4.h: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: mp4.h:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: mp4.h:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: mp4.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: mp4.h: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: mp4.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: mp4.h: in the future, the compiler will take precedence" >&2;}
+
+    ;;
+esac
+{ echo "$as_me:$LINENO: checking for mp4.h" >&5
+echo $ECHO_N "checking for mp4.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_mp4_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_header_mp4_h=$ac_header_preproc
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_mp4_h" >&5
+echo "${ECHO_T}$ac_cv_header_mp4_h" >&6; }
+
+fi
+if test $ac_cv_header_mp4_h = yes; then
+  have_mp4v2=yes
+else
+  have_mp4v2_header=no
+fi
+
+
+else
+  have_mp4v2=no
+fi
+
+    if test "x$have_mp4v2_header" = "xno"; then
+        have_mp4v2="no"
+        { echo "$as_me:$LINENO: WARNING: mp4.h cannot be found or is unusable. Check your mp4v2 installation." >&5
+echo "$as_me: WARNING: mp4.h cannot be found or is unusable. Check your mp4v2 installation." >&2;}
+    else
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <mp4.h>
+int
+main ()
+{
+bool TestMP4GetMetadataFreeForm(MP4FileHandle hFile, const char *name,
+            u_int8_t** pValue, u_int32_t* valueSize, const char *owner)
+            {
+                MP4GetMetadataFreeForm(hFile, name,pValue, valueSize, owner);
+            }
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  freeform_accepts_extra_arg=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <mp4.h>
+int
+main ()
+{
+bool TestMP4GetMetadataCoverArt(MP4FileHandle hFile,
+            u_int8_t **coverArt, u_int32_t* size, uint32_t index)
+            {
+                MP4GetMetadataCoverArt(hFile, coverArt, size, index);
+            }
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  coverart_accepts_extra_arg=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+    if test "x$freeform_accepts_extra_arg" = "xyes"; then
+
+cat >>confdefs.h <<\_ACEOF
+#define FREEFORM_ACCEPTS_EXTRA_ARG 1
+_ACEOF
+
+    fi
+    if test "x$coverart_accepts_extra_arg" = "xyes"; then
+
+cat >>confdefs.h <<\_ACEOF
+#define COVERART_ACCEPTS_EXTRA_ARG 1
+_ACEOF
+
+    fi
+    fi
+    if test "x$with_mp4v2" = "xyes" -a "x$have_mp4v2" = "xno"; then
+        { { echo "$as_me:$LINENO: error: MP4/AAC support explicitly requested but libmp4v2 couldn't be found" >&5
+echo "$as_me: error: MP4/AAC support explicitly requested but libmp4v2 couldn't be found" >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+fi
+ if test "x$have_mp4v2" = "xyes"; then
+  HAVE_LIBMP4V2_TRUE=
+  HAVE_LIBMP4V2_FALSE='#'
+else
+  HAVE_LIBMP4V2_TRUE='#'
+  HAVE_LIBMP4V2_FALSE=
+fi
+
+if test "x$have_mp4v2" = "xyes"; then
+    have_mp4v2="yes -- will build with aac support"
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_LIBMP4V2 1
+_ACEOF
+
+else
+    have_mp4v2="*no -- will build without aac support"
+fi
+
+
+# Check whether --with-ogg was given.
+if test "${with_ogg+set}" = set; then
+  withval=$with_ogg;
+fi
+
+if test "x$with_ogg" != "xno"; then
+    { echo "$as_me:$LINENO: checking for library containing ov_open" >&5
+echo $ECHO_N "checking for library containing ov_open... $ECHO_C" >&6; }
+if test "${ac_cv_search_ov_open+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ov_open ();
+int
+main ()
+{
+return ov_open ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' "vorbisfile"; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_search_ov_open=$ac_res
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext
+  if test "${ac_cv_search_ov_open+set}" = set; then
+  break
+fi
+done
+if test "${ac_cv_search_ov_open+set}" = set; then
+  :
+else
+  ac_cv_search_ov_open=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_search_ov_open" >&5
+echo "${ECHO_T}$ac_cv_search_ov_open" >&6; }
+ac_res=$ac_cv_search_ov_open
+if test "$ac_res" != no; then
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+  if test "${ac_cv_header_vorbis_vorbisfile_h+set}" = set; then
+  { echo "$as_me:$LINENO: checking for vorbis/vorbisfile.h" >&5
+echo $ECHO_N "checking for vorbis/vorbisfile.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_vorbis_vorbisfile_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_vorbis_vorbisfile_h" >&5
+echo "${ECHO_T}$ac_cv_header_vorbis_vorbisfile_h" >&6; }
+else
+  # Is the header compilable?
+{ echo "$as_me:$LINENO: checking vorbis/vorbisfile.h usability" >&5
+echo $ECHO_N "checking vorbis/vorbisfile.h usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <vorbis/vorbisfile.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking vorbis/vorbisfile.h presence" >&5
+echo $ECHO_N "checking vorbis/vorbisfile.h presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <vorbis/vorbisfile.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: vorbis/vorbisfile.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: vorbis/vorbisfile.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: vorbis/vorbisfile.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: vorbis/vorbisfile.h: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: vorbis/vorbisfile.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: vorbis/vorbisfile.h: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: vorbis/vorbisfile.h:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: vorbis/vorbisfile.h:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: vorbis/vorbisfile.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: vorbis/vorbisfile.h: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: vorbis/vorbisfile.h:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: vorbis/vorbisfile.h:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: vorbis/vorbisfile.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: vorbis/vorbisfile.h: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: vorbis/vorbisfile.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: vorbis/vorbisfile.h: in the future, the compiler will take precedence" >&2;}
+
+    ;;
+esac
+{ echo "$as_me:$LINENO: checking for vorbis/vorbisfile.h" >&5
+echo $ECHO_N "checking for vorbis/vorbisfile.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_vorbis_vorbisfile_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_header_vorbis_vorbisfile_h=$ac_header_preproc
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_vorbis_vorbisfile_h" >&5
+echo "${ECHO_T}$ac_cv_header_vorbis_vorbisfile_h" >&6; }
+
+fi
+if test $ac_cv_header_vorbis_vorbisfile_h = yes; then
+  have_ogg=yes
+else
+  have_ogg_header=no
+fi
+
+
+else
+  have_ogg=no
+fi
+
+    if test "x$have_ogg_header" = "xno"; then
+        have_ogg="no"
+        { echo "$as_me:$LINENO: WARNING: vorbis/vorbisfile.h cannot be found or is unusable. Check your ogg/vorbis installation." >&5
+echo "$as_me: WARNING: vorbis/vorbisfile.h cannot be found or is unusable. Check your ogg/vorbis installation." >&2;}
+    fi
+    if test "x$with_ogg" = "xyes" -a "x$have_ogg" = "xno"; then
+        { { echo "$as_me:$LINENO: error: Ogg/Vorbis support explicitly requested but ogg/vorbis libs couldn't be found" >&5
+echo "$as_me: error: Ogg/Vorbis support explicitly requested but ogg/vorbis libs couldn't be found" >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+fi
+ if test "x$have_ogg" = "xyes"; then
+  HAVE_LIBVORBISFILE_TRUE=
+  HAVE_LIBVORBISFILE_FALSE='#'
+else
+  HAVE_LIBVORBISFILE_TRUE='#'
+  HAVE_LIBVORBISFILE_FALSE=
+fi
+
+if test "x$have_ogg" = "xyes"; then
+    have_ogg="yes -- will build with ogg support"
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_LIBVORBISFILE 1
+_ACEOF
+
+else
+    have_ogg="*no -- will build without ogg support"
+fi
+
+
+# Check whether --with-flac was given.
+if test "${with_flac+set}" = set; then
+  withval=$with_flac;
+fi
+
+if test "x$with_flac" != "xno"; then
+    { echo "$as_me:$LINENO: checking for library containing FLAC__metadata_get_streaminfo" >&5
+echo $ECHO_N "checking for library containing FLAC__metadata_get_streaminfo... $ECHO_C" >&6; }
+if test "${ac_cv_search_FLAC__metadata_get_streaminfo+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char FLAC__metadata_get_streaminfo ();
+int
+main ()
+{
+return FLAC__metadata_get_streaminfo ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' "FLAC"; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_search_FLAC__metadata_get_streaminfo=$ac_res
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext
+  if test "${ac_cv_search_FLAC__metadata_get_streaminfo+set}" = set; then
+  break
+fi
+done
+if test "${ac_cv_search_FLAC__metadata_get_streaminfo+set}" = set; then
+  :
+else
+  ac_cv_search_FLAC__metadata_get_streaminfo=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_search_FLAC__metadata_get_streaminfo" >&5
+echo "${ECHO_T}$ac_cv_search_FLAC__metadata_get_streaminfo" >&6; }
+ac_res=$ac_cv_search_FLAC__metadata_get_streaminfo
+if test "$ac_res" != no; then
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+  if test "${ac_cv_header_FLAC_metadata_h+set}" = set; then
+  { echo "$as_me:$LINENO: checking for FLAC/metadata.h" >&5
+echo $ECHO_N "checking for FLAC/metadata.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_FLAC_metadata_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_FLAC_metadata_h" >&5
+echo "${ECHO_T}$ac_cv_header_FLAC_metadata_h" >&6; }
+else
+  # Is the header compilable?
+{ echo "$as_me:$LINENO: checking FLAC/metadata.h usability" >&5
+echo $ECHO_N "checking FLAC/metadata.h usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <FLAC/metadata.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking FLAC/metadata.h presence" >&5
+echo $ECHO_N "checking FLAC/metadata.h presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <FLAC/metadata.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: FLAC/metadata.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: FLAC/metadata.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: FLAC/metadata.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: FLAC/metadata.h: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: FLAC/metadata.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: FLAC/metadata.h: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: FLAC/metadata.h:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: FLAC/metadata.h:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: FLAC/metadata.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: FLAC/metadata.h: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: FLAC/metadata.h:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: FLAC/metadata.h:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: FLAC/metadata.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: FLAC/metadata.h: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: FLAC/metadata.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: FLAC/metadata.h: in the future, the compiler will take precedence" >&2;}
+
+    ;;
+esac
+{ echo "$as_me:$LINENO: checking for FLAC/metadata.h" >&5
+echo $ECHO_N "checking for FLAC/metadata.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_FLAC_metadata_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_header_FLAC_metadata_h=$ac_header_preproc
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_FLAC_metadata_h" >&5
+echo "${ECHO_T}$ac_cv_header_FLAC_metadata_h" >&6; }
+
+fi
+if test $ac_cv_header_FLAC_metadata_h = yes; then
+  have_flac=yes
+else
+  have_flac_header=no
+fi
+
+
+else
+  have_flac=no
+fi
+
+    if test "x$have_flac_header" = "xno"; then
+        have_flac="no"
+        { echo "$as_me:$LINENO: WARNING: FLAC/metadata.h cannot be found or is unusable. Check your FLACinstallation." >&5
+echo "$as_me: WARNING: FLAC/metadata.h cannot be found or is unusable. Check your FLACinstallation." >&2;}
+    fi
+    if test "xwith_flac" = "xyes" -a "x$have_flac" = "xno"; then
+        { { echo "$as_me:$LINENO: error: FLAC support explicitly requested but flac libs couldn't be found" >&5
+echo "$as_me: error: FLAC support explicitly requested but flac libs couldn't be found" >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+fi
+ if test "x$have_flac" = "xyes"; then
+  HAVE_FLAC_TRUE=
+  HAVE_FLAC_FALSE='#'
+else
+  HAVE_FLAC_TRUE='#'
+  HAVE_FLAC_FALSE=
+fi
+
+if test "x$have_flac" = "xyes"; then
+    have_flac="yes -- will build with FLAC support"
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_FLAC 1
+_ACEOF
+
+else
+    have_flac="*no -- will build without FLAC support"
+fi
+
+{ echo "$as_me:$LINENO: checking for library containing bind" >&5
+echo $ECHO_N "checking for library containing bind... $ECHO_C" >&6; }
+if test "${ac_cv_search_bind+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char bind ();
+int
+main ()
+{
+return bind ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' "socket" "nsl" "socket -lnsl"; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_search_bind=$ac_res
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext
+  if test "${ac_cv_search_bind+set}" = set; then
+  break
+fi
+done
+if test "${ac_cv_search_bind+set}" = set; then
+  :
+else
+  ac_cv_search_bind=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_search_bind" >&5
+echo "${ECHO_T}$ac_cv_search_bind" >&6; }
+ac_res=$ac_cv_search_bind
+if test "$ac_res" != no; then
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+
+
+
+
+
+for ac_header in linux/cdrom.h scsi/sg.h scsi/scsi.h scsi/scsi_ioctl.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+
+    ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+ac_config_files="$ac_config_files Makefile src/Makefile po/Makefile.in scripts/Makefile data/Makefile data/icons/Makefile data/icons/32x32/Makefile data/icons/48x48/Makefile data/icons/64x64/Makefile"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes (double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \).
+      sed -n \
+	"s/'/'\\\\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    test "x$cache_file" != "x/dev/null" &&
+      { echo "$as_me:$LINENO: updating cache $cache_file" >&5
+echo "$as_me: updating cache $cache_file" >&6;}
+    cat confcache >$cache_file
+  else
+    { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5
+echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+  ac_config_commands="$ac_config_commands po/stamp-it"
+
+
+if test -z "${HAVE_CURL_TRUE}" && test -z "${HAVE_CURL_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"HAVE_CURL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"HAVE_CURL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${HAVE_GNOME_VFS_TRUE}" && test -z "${HAVE_GNOME_VFS_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"HAVE_GNOME_VFS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"HAVE_GNOME_VFS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${HAVE_HAL_TRUE}" && test -z "${HAVE_HAL_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"HAVE_HAL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"HAVE_HAL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${HAVE_LIBMP4V2_TRUE}" && test -z "${HAVE_LIBMP4V2_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"HAVE_LIBMP4V2\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"HAVE_LIBMP4V2\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${HAVE_LIBVORBISFILE_TRUE}" && test -z "${HAVE_LIBVORBISFILE_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"HAVE_LIBVORBISFILE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"HAVE_LIBVORBISFILE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${HAVE_FLAC_TRUE}" && test -z "${HAVE_FLAC_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"HAVE_FLAC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"HAVE_FLAC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+
+
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir
+fi
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s='ln -s'
+  # ... but there are two gotchas:
+  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+  # In both cases, we have to default to `cp -p'.
+  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+    as_ln_s='cp -p'
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+        test -d "$1/.";
+      else
+	case $1 in
+        -*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+
+# Save the log message, to keep $[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by $as_me, which was
+generated by GNU Autoconf 2.61.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+  -q, --quiet      do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+  --file=FILE[:TEMPLATE]
+		   instantiate the configuration file FILE
+  --header=FILE[:TEMPLATE]
+		   instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <bug-autoconf at gnu.org>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+config.status
+configured by $0, generated by GNU Autoconf 2.61,
+  with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2006 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value.  By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    echo "$ac_cs_version"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+    ac_need_defaults=false;;
+  --he | --h)
+    # Conflict between --help and --header
+    { echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; };;
+  --help | --hel | -h )
+    echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) { echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; } ;;
+
+  *) ac_config_targets="$ac_config_targets $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+  echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+  CONFIG_SHELL=$SHELL
+  export CONFIG_SHELL
+  exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+INTLTOOL_PERL='${INTLTOOL_PERL}' ac_aux_dir='${ac_aux_dir}'
+prefix="$prefix" exec_prefix="$exec_prefix" INTLTOOL_LIBDIR="$libdir"
+INTLTOOL_EXTRACT='${INTLTOOL_EXTRACT}'
+
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+    "intltool") CONFIG_COMMANDS="$CONFIG_COMMANDS intltool" ;;
+    "default-1") CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+    "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
+    "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;;
+    "scripts/Makefile") CONFIG_FILES="$CONFIG_FILES scripts/Makefile" ;;
+    "data/Makefile") CONFIG_FILES="$CONFIG_FILES data/Makefile" ;;
+    "data/icons/Makefile") CONFIG_FILES="$CONFIG_FILES data/icons/Makefile" ;;
+    "data/icons/32x32/Makefile") CONFIG_FILES="$CONFIG_FILES data/icons/32x32/Makefile" ;;
+    "data/icons/48x48/Makefile") CONFIG_FILES="$CONFIG_FILES data/icons/48x48/Makefile" ;;
+    "data/icons/64x64/Makefile") CONFIG_FILES="$CONFIG_FILES data/icons/64x64/Makefile" ;;
+    "po/stamp-it") CONFIG_COMMANDS="$CONFIG_COMMANDS po/stamp-it" ;;
+
+  *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp=
+  trap 'exit_status=$?
+  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
+' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} ||
+{
+   echo "$me: cannot create a temporary directory in ." >&2
+   { (exit 1); exit 1; }
+}
+
+#
+# Set up the sed scripts for CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "$CONFIG_FILES"; then
+
+_ACEOF
+
+
+
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  cat >conf$$subs.sed <<_ACEOF
+SHELL!$SHELL$ac_delim
+PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim
+PACKAGE_NAME!$PACKAGE_NAME$ac_delim
+PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim
+PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim
+PACKAGE_STRING!$PACKAGE_STRING$ac_delim
+PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim
+exec_prefix!$exec_prefix$ac_delim
+prefix!$prefix$ac_delim
+program_transform_name!$program_transform_name$ac_delim
+bindir!$bindir$ac_delim
+sbindir!$sbindir$ac_delim
+libexecdir!$libexecdir$ac_delim
+datarootdir!$datarootdir$ac_delim
+datadir!$datadir$ac_delim
+sysconfdir!$sysconfdir$ac_delim
+sharedstatedir!$sharedstatedir$ac_delim
+localstatedir!$localstatedir$ac_delim
+includedir!$includedir$ac_delim
+oldincludedir!$oldincludedir$ac_delim
+docdir!$docdir$ac_delim
+infodir!$infodir$ac_delim
+htmldir!$htmldir$ac_delim
+dvidir!$dvidir$ac_delim
+pdfdir!$pdfdir$ac_delim
+psdir!$psdir$ac_delim
+libdir!$libdir$ac_delim
+localedir!$localedir$ac_delim
+mandir!$mandir$ac_delim
+DEFS!$DEFS$ac_delim
+ECHO_C!$ECHO_C$ac_delim
+ECHO_N!$ECHO_N$ac_delim
+ECHO_T!$ECHO_T$ac_delim
+LIBS!$LIBS$ac_delim
+build_alias!$build_alias$ac_delim
+host_alias!$host_alias$ac_delim
+target_alias!$target_alias$ac_delim
+INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim
+INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim
+INSTALL_DATA!$INSTALL_DATA$ac_delim
+am__isrc!$am__isrc$ac_delim
+CYGPATH_W!$CYGPATH_W$ac_delim
+PACKAGE!$PACKAGE$ac_delim
+VERSION!$VERSION$ac_delim
+ACLOCAL!$ACLOCAL$ac_delim
+AUTOCONF!$AUTOCONF$ac_delim
+AUTOMAKE!$AUTOMAKE$ac_delim
+AUTOHEADER!$AUTOHEADER$ac_delim
+MAKEINFO!$MAKEINFO$ac_delim
+install_sh!$install_sh$ac_delim
+STRIP!$STRIP$ac_delim
+INSTALL_STRIP_PROGRAM!$INSTALL_STRIP_PROGRAM$ac_delim
+mkdir_p!$mkdir_p$ac_delim
+AWK!$AWK$ac_delim
+SET_MAKE!$SET_MAKE$ac_delim
+am__leading_dot!$am__leading_dot$ac_delim
+AMTAR!$AMTAR$ac_delim
+am__tar!$am__tar$ac_delim
+am__untar!$am__untar$ac_delim
+MAINTAINER_MODE_TRUE!$MAINTAINER_MODE_TRUE$ac_delim
+MAINTAINER_MODE_FALSE!$MAINTAINER_MODE_FALSE$ac_delim
+MAINT!$MAINT$ac_delim
+build!$build$ac_delim
+build_cpu!$build_cpu$ac_delim
+build_vendor!$build_vendor$ac_delim
+build_os!$build_os$ac_delim
+host!$host$ac_delim
+host_cpu!$host_cpu$ac_delim
+host_vendor!$host_vendor$ac_delim
+host_os!$host_os$ac_delim
+CC!$CC$ac_delim
+CFLAGS!$CFLAGS$ac_delim
+LDFLAGS!$LDFLAGS$ac_delim
+CPPFLAGS!$CPPFLAGS$ac_delim
+ac_ct_CC!$ac_ct_CC$ac_delim
+EXEEXT!$EXEEXT$ac_delim
+OBJEXT!$OBJEXT$ac_delim
+DEPDIR!$DEPDIR$ac_delim
+am__include!$am__include$ac_delim
+am__quote!$am__quote$ac_delim
+AMDEP_TRUE!$AMDEP_TRUE$ac_delim
+AMDEP_FALSE!$AMDEP_FALSE$ac_delim
+AMDEPBACKSLASH!$AMDEPBACKSLASH$ac_delim
+CCDEPMODE!$CCDEPMODE$ac_delim
+am__fastdepCC_TRUE!$am__fastdepCC_TRUE$ac_delim
+am__fastdepCC_FALSE!$am__fastdepCC_FALSE$ac_delim
+INTLTOOL_DESKTOP_RULE!$INTLTOOL_DESKTOP_RULE$ac_delim
+INTLTOOL_DIRECTORY_RULE!$INTLTOOL_DIRECTORY_RULE$ac_delim
+INTLTOOL_KEYS_RULE!$INTLTOOL_KEYS_RULE$ac_delim
+INTLTOOL_PROP_RULE!$INTLTOOL_PROP_RULE$ac_delim
+INTLTOOL_OAF_RULE!$INTLTOOL_OAF_RULE$ac_delim
+INTLTOOL_PONG_RULE!$INTLTOOL_PONG_RULE$ac_delim
+INTLTOOL_SERVER_RULE!$INTLTOOL_SERVER_RULE$ac_delim
+INTLTOOL_SHEET_RULE!$INTLTOOL_SHEET_RULE$ac_delim
+INTLTOOL_SOUNDLIST_RULE!$INTLTOOL_SOUNDLIST_RULE$ac_delim
+INTLTOOL_UI_RULE!$INTLTOOL_UI_RULE$ac_delim
+INTLTOOL_XAM_RULE!$INTLTOOL_XAM_RULE$ac_delim
+_ACEOF
+
+  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then
+    break
+  elif $ac_last_try; then
+    { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`
+if test -n "$ac_eof"; then
+  ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`
+  ac_eof=`expr $ac_eof + 1`
+fi
+
+cat >>$CONFIG_STATUS <<_ACEOF
+cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+_ACEOF
+sed '
+s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g
+s/^/s,@/; s/!/@,|#_!!_#|/
+:n
+t n
+s/'"$ac_delim"'$/,g/; t
+s/$/\\/; p
+N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n
+' >>$CONFIG_STATUS <conf$$subs.sed
+rm -f conf$$subs.sed
+cat >>$CONFIG_STATUS <<_ACEOF
+CEOF$ac_eof
+_ACEOF
+
+
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  cat >conf$$subs.sed <<_ACEOF
+INTLTOOL_KBD_RULE!$INTLTOOL_KBD_RULE$ac_delim
+INTLTOOL_XML_RULE!$INTLTOOL_XML_RULE$ac_delim
+INTLTOOL_XML_NOMERGE_RULE!$INTLTOOL_XML_NOMERGE_RULE$ac_delim
+INTLTOOL_CAVES_RULE!$INTLTOOL_CAVES_RULE$ac_delim
+INTLTOOL_SCHEMAS_RULE!$INTLTOOL_SCHEMAS_RULE$ac_delim
+INTLTOOL_THEME_RULE!$INTLTOOL_THEME_RULE$ac_delim
+INTLTOOL_SERVICE_RULE!$INTLTOOL_SERVICE_RULE$ac_delim
+INTLTOOL_POLICY_RULE!$INTLTOOL_POLICY_RULE$ac_delim
+INTLTOOL_EXTRACT!$INTLTOOL_EXTRACT$ac_delim
+INTLTOOL_MERGE!$INTLTOOL_MERGE$ac_delim
+INTLTOOL_UPDATE!$INTLTOOL_UPDATE$ac_delim
+INTLTOOL_PERL!$INTLTOOL_PERL$ac_delim
+ALL_LINGUAS!$ALL_LINGUAS$ac_delim
+DATADIRNAME!$DATADIRNAME$ac_delim
+GETTEXT_PACKAGE!$GETTEXT_PACKAGE$ac_delim
+PKG_CONFIG!$PKG_CONFIG$ac_delim
+GTK_CFLAGS!$GTK_CFLAGS$ac_delim
+GTK_LIBS!$GTK_LIBS$ac_delim
+GLIB_CFLAGS!$GLIB_CFLAGS$ac_delim
+GLIB_LIBS!$GLIB_LIBS$ac_delim
+GMODULE_CFLAGS!$GMODULE_CFLAGS$ac_delim
+GMODULE_LIBS!$GMODULE_LIBS$ac_delim
+GTHREAD_CFLAGS!$GTHREAD_CFLAGS$ac_delim
+GTHREAD_LIBS!$GTHREAD_LIBS$ac_delim
+LIBGLADE_CFLAGS!$LIBGLADE_CFLAGS$ac_delim
+LIBGLADE_LIBS!$LIBGLADE_LIBS$ac_delim
+LIBGNOMECANVAS_CFLAGS!$LIBGNOMECANVAS_CFLAGS$ac_delim
+LIBGNOMECANVAS_LIBS!$LIBGNOMECANVAS_LIBS$ac_delim
+LIBGPOD_CFLAGS!$LIBGPOD_CFLAGS$ac_delim
+LIBGPOD_LIBS!$LIBGPOD_LIBS$ac_delim
+LEX!$LEX$ac_delim
+LEX_OUTPUT_ROOT!$LEX_OUTPUT_ROOT$ac_delim
+LEXLIB!$LEXLIB$ac_delim
+MOUNT!$MOUNT$ac_delim
+UMOUNT!$UMOUNT$ac_delim
+CPP!$CPP$ac_delim
+GREP!$GREP$ac_delim
+EGREP!$EGREP$ac_delim
+USE_NLS!$USE_NLS$ac_delim
+MSGFMT!$MSGFMT$ac_delim
+MSGFMT_OPTS!$MSGFMT_OPTS$ac_delim
+GMSGFMT!$GMSGFMT$ac_delim
+XGETTEXT!$XGETTEXT$ac_delim
+CATALOGS!$CATALOGS$ac_delim
+CATOBJEXT!$CATOBJEXT$ac_delim
+GMOFILES!$GMOFILES$ac_delim
+INSTOBJEXT!$INSTOBJEXT$ac_delim
+INTLLIBS!$INTLLIBS$ac_delim
+PO_IN_DATADIR_TRUE!$PO_IN_DATADIR_TRUE$ac_delim
+PO_IN_DATADIR_FALSE!$PO_IN_DATADIR_FALSE$ac_delim
+POFILES!$POFILES$ac_delim
+POSUB!$POSUB$ac_delim
+MKINSTALLDIRS!$MKINSTALLDIRS$ac_delim
+LIBOBJS!$LIBOBJS$ac_delim
+CURL_CFLAGS!$CURL_CFLAGS$ac_delim
+CURL_LIBS!$CURL_LIBS$ac_delim
+HAVE_CURL_TRUE!$HAVE_CURL_TRUE$ac_delim
+HAVE_CURL_FALSE!$HAVE_CURL_FALSE$ac_delim
+GNOME_VFS_CFLAGS!$GNOME_VFS_CFLAGS$ac_delim
+GNOME_VFS_LIBS!$GNOME_VFS_LIBS$ac_delim
+HAVE_GNOME_VFS_TRUE!$HAVE_GNOME_VFS_TRUE$ac_delim
+HAVE_GNOME_VFS_FALSE!$HAVE_GNOME_VFS_FALSE$ac_delim
+HAL_CFLAGS!$HAL_CFLAGS$ac_delim
+HAL_LIBS!$HAL_LIBS$ac_delim
+HAVE_HAL_TRUE!$HAVE_HAL_TRUE$ac_delim
+HAVE_HAL_FALSE!$HAVE_HAL_FALSE$ac_delim
+HAVE_LIBMP4V2_TRUE!$HAVE_LIBMP4V2_TRUE$ac_delim
+HAVE_LIBMP4V2_FALSE!$HAVE_LIBMP4V2_FALSE$ac_delim
+HAVE_LIBVORBISFILE_TRUE!$HAVE_LIBVORBISFILE_TRUE$ac_delim
+HAVE_LIBVORBISFILE_FALSE!$HAVE_LIBVORBISFILE_FALSE$ac_delim
+HAVE_FLAC_TRUE!$HAVE_FLAC_TRUE$ac_delim
+HAVE_FLAC_FALSE!$HAVE_FLAC_FALSE$ac_delim
+LTLIBOBJS!$LTLIBOBJS$ac_delim
+_ACEOF
+
+  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 73; then
+    break
+  elif $ac_last_try; then
+    { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`
+if test -n "$ac_eof"; then
+  ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`
+  ac_eof=`expr $ac_eof + 1`
+fi
+
+cat >>$CONFIG_STATUS <<_ACEOF
+cat >"\$tmp/subs-2.sed" <<\CEOF$ac_eof
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end
+_ACEOF
+sed '
+s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g
+s/^/s,@/; s/!/@,|#_!!_#|/
+:n
+t n
+s/'"$ac_delim"'$/,g/; t
+s/$/\\/; p
+N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n
+' >>$CONFIG_STATUS <conf$$subs.sed
+rm -f conf$$subs.sed
+cat >>$CONFIG_STATUS <<_ACEOF
+:end
+s/|#_!!_#|//g
+CEOF$ac_eof
+_ACEOF
+
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
+s/:*\$(srcdir):*/:/
+s/:*\${srcdir}:*/:/
+s/:*@srcdir@:*/:/
+s/^\([^=]*=[	 ]*\):*/\1/
+s/:*$//
+s/^[^=]*=[	 ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+fi # test -n "$CONFIG_FILES"
+
+
+for ac_tag in  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5
+echo "$as_me: error: Invalid tag $ac_tag." >&2;}
+   { (exit 1); exit 1; }; };;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
+	 # because $ac_f cannot contain `:'.
+	 test -f "$ac_f" ||
+	   case $ac_f in
+	   [\\/$]*) false;;
+	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+	   esac ||
+	   { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5
+echo "$as_me: error: cannot find input file: $ac_f" >&2;}
+   { (exit 1); exit 1; }; };;
+      esac
+      ac_file_inputs="$ac_file_inputs $ac_f"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input="Generated from "`IFS=:
+	  echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure."
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    fi
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$tmp/stdin";;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  { as_dir="$ac_dir"
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+echo "$as_me: error: cannot create directory $as_dir" >&2;}
+   { (exit 1); exit 1; }; }; }
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+  esac
+  ac_MKDIR_P=$MKDIR_P
+  case $MKDIR_P in
+  [\\/$]* | ?:[\\/]* ) ;;
+  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+  esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+
+case `sed -n '/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p
+' $ac_file_inputs` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+    s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF
+  sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s&@configure_input@&$configure_input&;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+" $ac_file_inputs | sed -f "$tmp/subs-1.sed" | sed -f "$tmp/subs-2.sed" >$tmp/out
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
+  { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&5
+echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&2;}
+
+  rm -f "$tmp/stdin"
+  case $ac_file in
+  -) cat "$tmp/out"; rm -f "$tmp/out";;
+  *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;;
+  esac
+ ;;
+  :H)
+  #
+  # CONFIG_HEADER
+  #
+_ACEOF
+
+# Transform confdefs.h into a sed script `conftest.defines', that
+# substitutes the proper values into config.h.in to produce config.h.
+rm -f conftest.defines conftest.tail
+# First, append a space to every undef/define line, to ease matching.
+echo 's/$/ /' >conftest.defines
+# Then, protect against being on the right side of a sed subst, or in
+# an unquoted here document, in config.status.  If some macros were
+# called several times there might be several #defines for the same
+# symbol, which is useless.  But do not sort them, since the last
+# AC_DEFINE must be honored.
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+# These sed commands are passed to sed as "A NAME B PARAMS C VALUE D", where
+# NAME is the cpp macro being defined, VALUE is the value it is being given.
+# PARAMS is the parameter list in the macro definition--in most cases, it's
+# just an empty string.
+ac_dA='s,^\\([	 #]*\\)[^	 ]*\\([	 ]*'
+ac_dB='\\)[	 (].*,\\1define\\2'
+ac_dC=' '
+ac_dD=' ,'
+
+uniq confdefs.h |
+  sed -n '
+	t rset
+	:rset
+	s/^[	 ]*#[	 ]*define[	 ][	 ]*//
+	t ok
+	d
+	:ok
+	s/[\\&,]/\\&/g
+	s/^\('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/ '"$ac_dA"'\1'"$ac_dB"'\2'"${ac_dC}"'\3'"$ac_dD"'/p
+	s/^\('"$ac_word_re"'\)[	 ]*\(.*\)/'"$ac_dA"'\1'"$ac_dB$ac_dC"'\2'"$ac_dD"'/p
+  ' >>conftest.defines
+
+# Remove the space that was appended to ease matching.
+# Then replace #undef with comments.  This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+# (The regexp can be short, since the line contains either #define or #undef.)
+echo 's/ $//
+s,^[	 #]*u.*,/* & */,' >>conftest.defines
+
+# Break up conftest.defines:
+ac_max_sed_lines=50
+
+# First sed command is:	 sed -f defines.sed $ac_file_inputs >"$tmp/out1"
+# Second one is:	 sed -f defines.sed "$tmp/out1" >"$tmp/out2"
+# Third one will be:	 sed -f defines.sed "$tmp/out2" >"$tmp/out1"
+# et cetera.
+ac_in='$ac_file_inputs'
+ac_out='"$tmp/out1"'
+ac_nxt='"$tmp/out2"'
+
+while :
+do
+  # Write a here document:
+    cat >>$CONFIG_STATUS <<_ACEOF
+    # First, check the format of the line:
+    cat >"\$tmp/defines.sed" <<\\CEOF
+/^[	 ]*#[	 ]*undef[	 ][	 ]*$ac_word_re[	 ]*\$/b def
+/^[	 ]*#[	 ]*define[	 ][	 ]*$ac_word_re[(	 ]/b def
+b
+:def
+_ACEOF
+  sed ${ac_max_sed_lines}q conftest.defines >>$CONFIG_STATUS
+  echo 'CEOF
+    sed -f "$tmp/defines.sed"' "$ac_in >$ac_out" >>$CONFIG_STATUS
+  ac_in=$ac_out; ac_out=$ac_nxt; ac_nxt=$ac_in
+  sed 1,${ac_max_sed_lines}d conftest.defines >conftest.tail
+  grep . conftest.tail >/dev/null || break
+  rm -f conftest.defines
+  mv conftest.tail conftest.defines
+done
+rm -f conftest.defines conftest.tail
+
+echo "ac_result=$ac_in" >>$CONFIG_STATUS
+cat >>$CONFIG_STATUS <<\_ACEOF
+  if test x"$ac_file" != x-; then
+    echo "/* $configure_input  */" >"$tmp/config.h"
+    cat "$ac_result" >>"$tmp/config.h"
+    if diff $ac_file "$tmp/config.h" >/dev/null 2>&1; then
+      { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      rm -f $ac_file
+      mv "$tmp/config.h" $ac_file
+    fi
+  else
+    echo "/* $configure_input  */"
+    cat "$ac_result"
+  fi
+  rm -f "$tmp/out12"
+# Compute $ac_file's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $ac_file | $ac_file:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $ac_file" >`$as_dirname -- $ac_file ||
+$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X$ac_file : 'X\(//\)[^/]' \| \
+	 X$ac_file : 'X\(//\)$' \| \
+	 X$ac_file : 'X\(/\)' \| . 2>/dev/null ||
+echo X$ac_file |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`/stamp-h$_am_stamp_count
+ ;;
+
+  :C)  { echo "$as_me:$LINENO: executing $ac_file commands" >&5
+echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+  esac
+
+
+  case $ac_file$ac_mode in
+    "depfiles":C) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do
+  # Strip MF so we end up with the name of the file.
+  mf=`echo "$mf" | sed -e 's/:.*$//'`
+  # Check whether this is an Automake generated Makefile or not.
+  # We used to match only the files named `Makefile.in', but
+  # some people rename them; so instead we look at the file content.
+  # Grep'ing the first line is not enough: some people post-process
+  # each Makefile.in and add a new line on top of each file to say so.
+  # Grep'ing the whole file is not good either: AIX grep has a line
+  # limit of 2048, but all sed's we know have understand at least 4000.
+  if sed 10q "$mf" | grep '^#.*generated by automake' > /dev/null 2>&1; then
+    dirpart=`$as_dirname -- "$mf" ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$mf" : 'X\(//\)[^/]' \| \
+	 X"$mf" : 'X\(//\)$' \| \
+	 X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$mf" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  else
+    continue
+  fi
+  # Extract the definition of DEPDIR, am__include, and am__quote
+  # from the Makefile without running `make'.
+  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+  test -z "$DEPDIR" && continue
+  am__include=`sed -n 's/^am__include = //p' < "$mf"`
+  test -z "am__include" && continue
+  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+  # When using ansi2knr, U may be empty or an underscore; expand it
+  U=`sed -n 's/^U = //p' < "$mf"`
+  # Find all dependency output files, they are included files with
+  # $(DEPDIR) in their names.  We invoke sed twice because it is the
+  # simplest approach to changing $(DEPDIR) to its actual value in the
+  # expansion.
+  for file in `sed -n "
+    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+    # Make sure the directory exists.
+    test -f "$dirpart/$file" && continue
+    fdir=`$as_dirname -- "$file" ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$file" : 'X\(//\)[^/]' \| \
+	 X"$file" : 'X\(//\)$' \| \
+	 X"$file" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+    { as_dir=$dirpart/$fdir
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+echo "$as_me: error: cannot create directory $as_dir" >&2;}
+   { (exit 1); exit 1; }; }; }
+    # echo "creating $dirpart/$file"
+    echo '# dummy' > "$dirpart/$file"
+  done
+done
+ ;;
+    "intltool":C)
+
+for file in intltool-extract intltool-merge intltool-update; do
+  sed -e "s|@INTLTOOL_EXTRACT@|`pwd`/intltool-extract|g" \
+      -e "s|@INTLTOOL_LIBDIR@|${INTLTOOL_LIBDIR}|g" \
+      -e "s|@INTLTOOL_PERL@|${INTLTOOL_PERL}|g" \
+	< ${ac_aux_dir}/${file}.in > ${file}.out
+  if cmp -s ${file} ${file}.out 2>/dev/null; then
+    rm -f ${file}.out
+  else
+    mv -f ${file}.out ${file}
+  fi
+  chmod ugo+x ${file}
+  chmod u+w ${file}
+done
+
+ ;;
+    "default-1":C) case "$CONFIG_FILES" in *po/Makefile.in*)
+        sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile
+      esac ;;
+    "po/stamp-it":C)
+    rm -f "po/stamp-it" "po/stamp-it.tmp" "po/POTFILES" "po/Makefile.tmp"
+    >"po/stamp-it.tmp"
+    sed '/^#/d
+	 s/^[[].*] *//
+	 /^[ 	]*$/d
+	'"s|^|	$ac_top_srcdir/|" \
+      "$srcdir/po/POTFILES.in" | sed '$!s/$/ \\/' >"po/POTFILES"
+
+    if test ! -f "po/Makefile"; then
+      { { echo "$as_me:$LINENO: error: po/Makefile is not ready." >&5
+echo "$as_me: error: po/Makefile is not ready." >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+    mv "po/Makefile" "po/Makefile.tmp"
+    sed '/^POTFILES =/,/[^\\]$/ {
+		/^POTFILES =/!d
+		r po/POTFILES
+	  }
+	 ' "po/Makefile.tmp" >"po/Makefile"
+    rm -f "po/Makefile.tmp"
+    mv "po/stamp-it.tmp" "po/stamp-it"
+   ;;
+
+  esac
+done # for ac_tag
+
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || { (exit 1); exit 1; }
+fi
+
+
+echo "
+Configuration for $PACKAGE $VERSION :
+--------------------------------
+
+ Host System Type .....: $host
+ Install path .........: $prefix
+ GTK2 version .........: `pkg-config gtk+-2.0 --modversion`
+ GLib2/GThread version : `pkg-config gthread-2.0 --modversion`
+ gnome-vfs.............: $have_gnome_vfs
+ hal...................: $have_hal
+ libcurl ..............: $have_curl
+ mp4v2 ................: $have_mp4v2
+ vorbisfile ...........: $have_ogg
+ FLAC .................: $have_flac
+ Preprocessor .........: $CC $CPPFLAGS
+ Compiler .............: $CC $CFLAGS
+ Linker ...............: $CC $LDFLAGS $LIBS
+
+ Now type 'make' to build $PACKAGE $VERSION,
+ and then 'make install' for installation.
+"


Property changes on: trunk/configure
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/configure.in
===================================================================
--- trunk/configure.in	                        (rev 0)
+++ trunk/configure.in	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,271 @@
+dnl Process this file with autoconf to produce a configure script.
+
+# Require autoconf 2.55 or higher
+AC_PREREQ(2.55)
+
+AC_INIT(configure.in)
+AM_INIT_AUTOMAKE(gtkpod, 0.99.12)
+AM_CONFIG_HEADER(config.h)
+AM_MAINTAINER_MODE
+AC_CANONICAL_HOST
+AC_ISC_POSIX
+AC_PROG_CC
+AM_PROG_CC_STDC
+
+IT_PROG_INTLTOOL([0.33])
+
+dnl Only use -Wall if we have gcc
+if test "x$GCC" = "xyes"; then
+    if test -z "`echo "$CFLAGS" | grep "\-Wall" 2> /dev/null`" ; then
+        CFLAGS="$CFLAGS -Wall"
+    fi
+    # gcc < 4.0 does not know '-Wno-pointer-sign'. Try to find out
+    # whether we can set this option or not.
+    CFLAGS_orig=$CFLAGS
+    CFLAGS="$CFLAGS -Wno-pointer-sign"
+    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stdio.h>]])],
+                      [], [CFLAGS=$CFLAGS_orig])
+fi
+
+GETTEXT_PACKAGE=gtkpod
+AC_SUBST(GETTEXT_PACKAGE)
+AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE",["Gettext package name"])
+
+dnl check if pkg-config exists -- if not print a meaningful error message
+AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
+if test -z "$PKG_CONFIG"; then
+    AC_MSG_FAILURE([*** pkg-config required (http://www.freedesktop.org/software/pkgconfig)])
+else
+    ac_cv_env_PKG_CONFIG_set=set
+fi
+
+dnl check for required libs that are managed with pkg-config
+PKG_CHECK_MODULES(GTK, gtk+-2.0 >= 2.6.0,, [AC_MSG_FAILURE([*** $GTK_PKG_ERRORS])])
+PKG_CHECK_MODULES(GLIB, glib-2.0 >= 2.4.0,, [AC_MSG_FAILURE([*** $GLIB_PKG_ERRORS])])
+PKG_CHECK_MODULES(GMODULE, gmodule-2.0,, [AC_MSG_FAILURE([*** $GMODULE_PKG_ERRORS])])
+PKG_CHECK_MODULES(GTHREAD, gthread-2.0 >= 0.14.0,, [AC_MSG_FAILURE([*** $GTHREAD_PKG_ERRORS])])
+PKG_CHECK_MODULES(LIBGLADE, libglade-2.0 >= 2.4.0,, [AC_MSG_FAILURE([*** $LIBGLADE_PKG_ERRORS])])
+PKG_CHECK_MODULES(LIBGNOMECANVAS, libgnomecanvas-2.0 >= 2.14.0,, [AC_MSG_FAILURE([*** $LIBGNOMECANVAS_PKG_ERRORS])])
+PKG_CHECK_MODULES(LIBGPOD, libgpod-1.0 >= 0.6.0,, [AC_MSG_FAILURE([*** $LIBGPOD_PKG_ERRORS])])
+
+CFLAGS="$CFLAGS $GTK_CFLAGS $GLIB_CFLAGS $GMODULE_CFLAGS $GTHREAD_CFLAGS $LIBGLADE_CFLAGS $LIBGNOMECANVAS_CFLAGS $LIBGPOD_CFLAGS"
+LIBS="$LIBS $GTK_LIBS $GLIB_LIBS $GMODULE_LIBS $GTHREAD_LIBS $LIBGLADE_LIBS $LIBGNOMECANVAS_LIBS $LIBGPOD_LIBS"
+
+dnl we need 'flex'
+AM_PROG_LEX
+if ! test "y$LEX" = "yflex"; then
+    if ! test "y$LEX" = "ylex"; then
+        AC_MSG_FAILURE([*** flex or lex required])
+    fi
+fi
+
+dnl Retrieve the path of mount and umount binaries
+AC_PATH_PROG(MOUNT, mount)
+AC_SUBST(MOUNT)
+AC_PATH_PROG(UMOUNT, umount)
+AC_SUBST(UMOUNT)
+
+dnl Add the languages which your application supports here.
+ALL_LINGUAS="de es fr he it ja ru ro sv"
+AM_GLIB_GNU_GETTEXT
+
+dnl Check if we have to supply getopt_long
+dnl If getopt_long_only is not available, getopt.c and getopt1.c
+dnl (providing getopt_long*) will be included into the binary.
+AC_CHECK_FUNCS(getopt_long_only, , [AC_LIBOBJ(getopt)]) 
+AC_CHECK_FUNCS(getopt_long_only, , [AC_LIBOBJ(getopt1)]) 
+
+dnl Check if flock() is available (seems to be missing on some solaris versions)
+AC_CHECK_FUNCS(flock)
+
+dnl Check if statvfs() is available (otherwise we fall back on 'df' to determine
+dnl free space on the iPod
+AC_CHECK_FUNCS(statvfs)
+
+dnl Check for libid3tag
+AC_SEARCH_LIBS([id3_frame_field], ["id3tag" "id3tag -lz"],,
+    AC_MSG_ERROR([*** id3tag >= 0.15 lib not found (0.14 will not work!)]))
+
+dnl Check for libcurl
+AC_ARG_WITH(curl, AC_HELP_STRING([--without-curl], [Disable coverart download support]))
+if test "x$with_curl" != "xno"; then
+    PKG_CHECK_MODULES(CURL, [libcurl >= 7.10.0], have_curl=yes, have_curl=no)
+    if test "x$with_curl" = "xyes" -a "x$have_curl" = "xno"; then
+        AC_MSG_ERROR([curl support explicitly requested but curl couldn't be found])
+    fi
+fi
+AM_CONDITIONAL(HAVE_CURL, test "x$have_curl" = "xyes")
+if test "x$have_curl" = "xyes"; then
+    AC_DEFINE(HAVE_CURL, 1, [Define if you have curl support])
+    have_curl="yes -- will build with coverart download support"
+    CPPFLAGS="$CPPFLAGS $CURL_CFLAGS"
+    CFLAGS="$CFLAGS $CURL_CFLAGS"
+    LIBS="$LIBS $CURL_LIBS"
+else
+    have_curl="*no -- will build without coverart download support"
+fi
+
+dnl Check for gnome-vfs
+AC_ARG_WITH(gnome-vfs, AC_HELP_STRING([--without-gnome-vfs],[Disable autodetection support]))
+if test "x$with_gnome_vfs" != "xno"; then
+    PKG_CHECK_MODULES(GNOME_VFS, [gnome-vfs-2.0 >= 2.6.0], have_gnome_vfs=yes, have_gnome_vfs=no)
+    if test "x$with_gnome_vfs" = "xyes" -a "x$have_gnome_vfs" = "xno"; then
+        AC_MSG_ERROR([gnome-vfs support explicitly requested but gnome-vfs couldn't be found])
+    fi
+fi
+AM_CONDITIONAL(HAVE_GNOME_VFS, test "x$have_gnome_vfs" = "xyes")
+if test "x$have_gnome_vfs" = "xyes"; then
+    have_gnome_vfs="yes -- will build with automount support"
+    AC_DEFINE(HAVE_GNOME_VFS, 1, [Define if you have gnome-vfs support])
+    CPPFLAGS="$CPPFLAGS $GNOME_VFS_CFLAGS"
+    CFLAGS="$CFLAGS $GNOME_VFS_CFLAGS"
+    LIBS="$LIBS $GNOME_VFS_LIBS"
+else
+    have_gnome_vfs="*no -- will build without iPod autodetection support"
+fi
+
+#dnl Check for HAL
+AC_ARG_WITH(hal, AC_HELP_STRING([--without-hal],[Disable HAL support]))
+if test "x$with_hal" != "xno"; then
+    PKG_CHECK_MODULES(HAL, hal >= 0.5 hal < 0.6, have_hal=yes, have_hal=no)
+    if test "x$with_hal" = "xyes" -a "x$have_hal" = "xno"; then
+        AC_MSG_ERROR([HAL support explicitly requested but HAL couldn't be found])
+    fi
+fi
+AM_CONDITIONAL(HAVE_HAL, test "x$have_hal" = "xyes")
+if test "x$have_hal" = "xyes"; then
+    have_hal="yes -- will build with HAL support"
+    AC_DEFINE(HAVE_HAL, 1, [Define if you have HAL support])
+    CPPFLAGS="$CPPFLAGS $HAL_CFLAGS"
+    CFLAGS="$CFLAGS $HAL_CFLAGS"
+    LIBS="$LIBS $HAL_LIBS"
+else
+    have_hal="*no -- will build without HAL support"
+fi
+
+dnl Check for libmp4v2 (and mp4.h)
+AC_ARG_WITH(mp4v2, AC_HELP_STRING([--without-mp4v2], [Disable MP4/AAC support]))
+if test "x$with_mp4v2" != "xno"; then
+    AC_SEARCH_LIBS(MP4GetMetadataGrouping,
+        ["mp4v2" "mp4v2 -lstdc++" "mp4v2 -lz" "mp4v2 -lz -lstdc++"],
+        [AC_CHECK_HEADER(mp4.h, have_mp4v2=yes, have_mp4v2_header=no)], have_mp4v2=no)
+    if test "x$have_mp4v2_header" = "xno"; then
+        have_mp4v2="no"
+        AC_MSG_WARN([mp4.h cannot be found or is unusable. Check your mp4v2 installation.])
+    else 
+    AC_TRY_COMPILE( [#include <mp4.h> ],
+        [bool TestMP4GetMetadataFreeForm(MP4FileHandle hFile, const char *name,
+            u_int8_t** pValue, u_int32_t* valueSize, const char *owner)
+            {
+                MP4GetMetadataFreeForm(hFile, name,pValue, valueSize, owner);
+            } ], freeform_accepts_extra_arg=yes)
+    AC_TRY_COMPILE( [#include <mp4.h>],
+        [bool TestMP4GetMetadataCoverArt(MP4FileHandle hFile,
+            u_int8_t **coverArt, u_int32_t* size, uint32_t index)
+            {
+                MP4GetMetadataCoverArt(hFile, coverArt, size, index);
+            }], coverart_accepts_extra_arg=yes)
+
+    if test "x$freeform_accepts_extra_arg" = "xyes"; then
+        AC_DEFINE(FREEFORM_ACCEPTS_EXTRA_ARG, 1,[libmp4v2 probably version 1.6 or higher: 
+                  MP4GetMetadataFreeForm accepts extra argument])
+    fi
+    if test "x$coverart_accepts_extra_arg" = "xyes"; then
+        AC_DEFINE(COVERART_ACCEPTS_EXTRA_ARG, 1,[libmp4v2 probably version 1.6 or higher: 
+                  MP4GetMetadataCoverArt accepts an extra argument] )
+    fi
+    fi
+    if test "x$with_mp4v2" = "xyes" -a "x$have_mp4v2" = "xno"; then
+        AC_MSG_ERROR([MP4/AAC support explicitly requested but libmp4v2 couldn't be found])
+    fi
+fi
+AM_CONDITIONAL(HAVE_LIBMP4V2, test "x$have_mp4v2" = "xyes")
+if test "x$have_mp4v2" = "xyes"; then
+    have_mp4v2="yes -- will build with aac support"
+    AC_DEFINE(HAVE_LIBMP4V2, 1, [Define if you have the mp4v2 library])
+else
+    have_mp4v2="*no -- will build without aac support"
+fi
+
+dnl Check for libvorbisfile
+AC_ARG_WITH(ogg, AC_HELP_STRING([--without-ogg], [Disable Ogg/Vorbis support]))
+if test "x$with_ogg" != "xno"; then
+    AC_SEARCH_LIBS(ov_open, ["vorbisfile"],
+        [AC_CHECK_HEADER(vorbis/vorbisfile.h, have_ogg=yes, have_ogg_header=no)], have_ogg=no)
+    if test "x$have_ogg_header" = "xno"; then
+        have_ogg="no"
+        AC_MSG_WARN([vorbis/vorbisfile.h cannot be found or is unusable. Check your ogg/vorbis installation.])
+    fi
+    if test "x$with_ogg" = "xyes" -a "x$have_ogg" = "xno"; then
+        AC_MSG_ERROR([Ogg/Vorbis support explicitly requested but ogg/vorbis libs couldn't be found])
+    fi
+fi
+AM_CONDITIONAL(HAVE_LIBVORBISFILE, test "x$have_ogg" = "xyes")
+if test "x$have_ogg" = "xyes"; then
+    have_ogg="yes -- will build with ogg support"
+    AC_DEFINE(HAVE_LIBVORBISFILE, 1, [Define if you have the ogg/vorbis library])
+else
+    have_ogg="*no -- will build without ogg support"
+fi
+
+dnl Check for FLAC
+AC_ARG_WITH(flac, AC_HELP_STRING([--without-flac], [Disable FLAC support]))
+if test "x$with_flac" != "xno"; then
+    AC_SEARCH_LIBS(FLAC__metadata_get_streaminfo, ["FLAC"],
+        [AC_CHECK_HEADER(FLAC/metadata.h, have_flac=yes, have_flac_header=no)], have_flac=no)
+    if test "x$have_flac_header" = "xno"; then
+        have_flac="no"
+        AC_MSG_WARN([FLAC/metadata.h cannot be found or is unusable. Check your FLACinstallation.])
+    fi
+    if test "xwith_flac" = "xyes" -a "x$have_flac" = "xno"; then
+        AC_MSG_ERROR([FLAC support explicitly requested but flac libs couldn't be found])
+    fi
+fi
+AM_CONDITIONAL(HAVE_FLAC, test "x$have_flac" = "xyes")
+if test "x$have_flac" = "xyes"; then
+    have_flac="yes -- will build with FLAC support"
+    AC_DEFINE(HAVE_FLAC, 1, [Define if you have the flac library])
+else
+    have_flac="*no -- will build without FLAC support"
+fi
+
+dnl Additional libs maybe needed when compiling under solaris
+AC_SEARCH_LIBS(bind, ["socket" "nsl" "socket -lnsl"])
+
+dnl Check for Linux-specific headers (so we can compile Linux-specific
+dnl stuff only when compiling under Linux)
+AC_CHECK_HEADERS(linux/cdrom.h scsi/sg.h scsi/scsi.h scsi/scsi_ioctl.h)
+
+AC_OUTPUT([
+Makefile
+src/Makefile
+po/Makefile.in
+scripts/Makefile
+data/Makefile
+data/icons/Makefile
+data/icons/32x32/Makefile
+data/icons/48x48/Makefile
+data/icons/64x64/Makefile
+])
+
+echo "
+Configuration for $PACKAGE $VERSION :
+--------------------------------
+
+ Host System Type .....: $host
+ Install path .........: $prefix
+ GTK2 version .........: `pkg-config gtk+-2.0 --modversion`
+ GLib2/GThread version : `pkg-config gthread-2.0 --modversion`
+ gnome-vfs.............: $have_gnome_vfs
+ hal...................: $have_hal
+ libcurl ..............: $have_curl
+ mp4v2 ................: $have_mp4v2
+ vorbisfile ...........: $have_ogg
+ FLAC .................: $have_flac
+ Preprocessor .........: $CC $CPPFLAGS
+ Compiler .............: $CC $CFLAGS
+ Linker ...............: $CC $LDFLAGS $LIBS
+
+ Now type 'make' to build $PACKAGE $VERSION,
+ and then 'make install' for installation.
+"

Added: trunk/data/Makefile.am
===================================================================
--- trunk/data/Makefile.am	                        (rev 0)
+++ trunk/data/Makefile.am	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,40 @@
+SUBDIRS = icons
+
+desktopdir = $(datadir)/applications
+desktop_in_files = gtkpod.desktop.in
+desktop_DATA = $(desktop_in_files:.desktop.in=.desktop)
+ at INTLTOOL_DESKTOP_RULE@
+
+appdatadir = $(pkgdatadir)/data
+appdata_DATA =				\
+	gtkpod.glade			\
+	cdshine.png			\
+	cdshine_main.png		\
+	default-cover.png		\
+	gtkpod-add-dirs.png		\
+	gtkpod-add-files.png		\
+	gtkpod-add-playlists.png	\
+	gtkpod-icon-32-2.png		\
+	gtkpod-icon-32.png		\
+	gtkpod-icon-48.png		\
+	gtkpod-logo.png			\
+	gtkpod-new-playlist.png		\
+	gtkpod-read.png			\
+	gtkpod-read-16.png		\
+	gtkpod-sync.png     		\
+	gphoto_album_menuitem-32.png   \
+	gphoto_album_menuitem-48.png   \
+	gphoto_images_menuitem-32.png  \
+	gphoto_images_menuitem-48.png  \
+	gphoto_tools_menuitem-32.png   \
+	gphoto_tools_menuitem-48.png   \
+	gphoto_playlist_icon-48.png    \
+	tunes_playlist_icon-48.png
+
+EXTRA_DIST = 				\
+	$(desktop_in_files)		\
+	$(appdata_DATA)
+
+CLEANFILES =				\
+	$(desktop_DATA)			\
+	gtkpod.gladep

Added: trunk/data/Makefile.in
===================================================================
--- trunk/data/Makefile.in	                        (rev 0)
+++ trunk/data/Makefile.in	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,615 @@
+# Makefile.in generated by automake 1.10 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = data
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+	html-recursive info-recursive install-data-recursive \
+	install-dvi-recursive install-exec-recursive \
+	install-html-recursive install-info-recursive \
+	install-pdf-recursive install-ps-recursive install-recursive \
+	installcheck-recursive installdirs-recursive pdf-recursive \
+	ps-recursive uninstall-recursive
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(appdatadir)" "$(DESTDIR)$(desktopdir)"
+appdataDATA_INSTALL = $(INSTALL_DATA)
+desktopDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(appdata_DATA) $(desktop_DATA)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALL_LINGUAS = @ALL_LINGUAS@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CURL_CFLAGS = @CURL_CFLAGS@
+CURL_LIBS = @CURL_LIBS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GMODULE_CFLAGS = @GMODULE_CFLAGS@
+GMODULE_LIBS = @GMODULE_LIBS@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GNOME_VFS_CFLAGS = @GNOME_VFS_CFLAGS@
+GNOME_VFS_LIBS = @GNOME_VFS_LIBS@
+GREP = @GREP@
+GTHREAD_CFLAGS = @GTHREAD_CFLAGS@
+GTHREAD_LIBS = @GTHREAD_LIBS@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
+HAL_CFLAGS = @HAL_CFLAGS@
+HAL_LIBS = @HAL_LIBS@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
+INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
+INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
+INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
+INTLTOOL_PERL = @INTLTOOL_PERL@
+INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
+INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
+INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
+INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
+INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
+INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
+INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
+INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
+INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
+INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
+INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
+INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
+LDFLAGS = @LDFLAGS@
+LEX = @LEX@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
+LIBGLADE_CFLAGS = @LIBGLADE_CFLAGS@
+LIBGLADE_LIBS = @LIBGLADE_LIBS@
+LIBGNOMECANVAS_CFLAGS = @LIBGNOMECANVAS_CFLAGS@
+LIBGNOMECANVAS_LIBS = @LIBGNOMECANVAS_LIBS@
+LIBGPOD_CFLAGS = @LIBGPOD_CFLAGS@
+LIBGPOD_LIBS = @LIBGPOD_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MOUNT = @MOUNT@
+MSGFMT = @MSGFMT@
+MSGFMT_OPTS = @MSGFMT_OPTS@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+POFILES = @POFILES@
+POSUB = @POSUB@
+PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
+PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+UMOUNT = @UMOUNT@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+SUBDIRS = icons
+desktopdir = $(datadir)/applications
+desktop_in_files = gtkpod.desktop.in
+desktop_DATA = $(desktop_in_files:.desktop.in=.desktop)
+appdatadir = $(pkgdatadir)/data
+appdata_DATA = \
+	gtkpod.glade			\
+	cdshine.png			\
+	cdshine_main.png		\
+	default-cover.png		\
+	gtkpod-add-dirs.png		\
+	gtkpod-add-files.png		\
+	gtkpod-add-playlists.png	\
+	gtkpod-icon-32-2.png		\
+	gtkpod-icon-32.png		\
+	gtkpod-icon-48.png		\
+	gtkpod-logo.png			\
+	gtkpod-new-playlist.png		\
+	gtkpod-read.png			\
+	gtkpod-read-16.png		\
+	gtkpod-sync.png     		\
+	gphoto_album_menuitem-32.png   \
+	gphoto_album_menuitem-48.png   \
+	gphoto_images_menuitem-32.png  \
+	gphoto_images_menuitem-48.png  \
+	gphoto_tools_menuitem-32.png   \
+	gphoto_tools_menuitem-48.png   \
+	gphoto_playlist_icon-48.png    \
+	tunes_playlist_icon-48.png
+
+EXTRA_DIST = \
+	$(desktop_in_files)		\
+	$(appdata_DATA)
+
+CLEANFILES = \
+	$(desktop_DATA)			\
+	gtkpod.gladep
+
+all: all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  data/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  data/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-appdataDATA: $(appdata_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(appdatadir)" || $(MKDIR_P) "$(DESTDIR)$(appdatadir)"
+	@list='$(appdata_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(appdataDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(appdatadir)/$$f'"; \
+	  $(appdataDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(appdatadir)/$$f"; \
+	done
+
+uninstall-appdataDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(appdata_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(appdatadir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(appdatadir)/$$f"; \
+	done
+install-desktopDATA: $(desktop_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(desktopdir)" || $(MKDIR_P) "$(DESTDIR)$(desktopdir)"
+	@list='$(desktop_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(desktopDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(desktopdir)/$$f'"; \
+	  $(desktopDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(desktopdir)/$$f"; \
+	done
+
+uninstall-desktopDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(desktop_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(desktopdir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(desktopdir)/$$f"; \
+	done
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+$(RECURSIVE_CLEAN_TARGETS):
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	rev=''; for subdir in $$list; do \
+	  if test "$$subdir" = "."; then :; else \
+	    rev="$$subdir $$rev"; \
+	  fi; \
+	done; \
+	rev="$$rev ."; \
+	target=`echo $@ | sed s/-recursive//`; \
+	for subdir in $$rev; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done && test -z "$$fail"
+tags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	done
+ctags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test -d "$(distdir)/$$subdir" \
+	    || $(MKDIR_P) "$(distdir)/$$subdir" \
+	    || exit 1; \
+	    distdir=`$(am__cd) $(distdir) && pwd`; \
+	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+	    (cd $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$top_distdir" \
+	        distdir="$$distdir/$$subdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-recursive
+all-am: Makefile $(DATA)
+installdirs: installdirs-recursive
+installdirs-am:
+	for dir in "$(DESTDIR)$(appdatadir)" "$(DESTDIR)$(desktopdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-appdataDATA install-desktopDATA
+
+install-dvi: install-dvi-recursive
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-info: install-info-recursive
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-ps: install-ps-recursive
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-appdataDATA uninstall-desktopDATA
+
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
+	install-strip
+
+.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
+	all all-am check check-am clean clean-generic ctags \
+	ctags-recursive distclean distclean-generic distclean-tags \
+	distdir dvi dvi-am html html-am info info-am install \
+	install-am install-appdataDATA install-data install-data-am \
+	install-desktopDATA install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs installdirs-am maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \
+	uninstall-appdataDATA uninstall-desktopDATA
+
+ at INTLTOOL_DESKTOP_RULE@
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:

Added: trunk/data/cdshine.png
===================================================================
(Binary files differ)


Property changes on: trunk/data/cdshine.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/data/cdshine_main.png
===================================================================
(Binary files differ)


Property changes on: trunk/data/cdshine_main.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/data/default-cover.png
===================================================================
(Binary files differ)


Property changes on: trunk/data/default-cover.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/data/gphoto_album_menuitem-32.png
===================================================================
(Binary files differ)


Property changes on: trunk/data/gphoto_album_menuitem-32.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/data/gphoto_album_menuitem-48.png
===================================================================
(Binary files differ)


Property changes on: trunk/data/gphoto_album_menuitem-48.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/data/gphoto_images_menuitem-32.png
===================================================================
(Binary files differ)


Property changes on: trunk/data/gphoto_images_menuitem-32.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/data/gphoto_images_menuitem-48.png
===================================================================
(Binary files differ)


Property changes on: trunk/data/gphoto_images_menuitem-48.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/data/gphoto_playlist_icon-48.png
===================================================================
(Binary files differ)


Property changes on: trunk/data/gphoto_playlist_icon-48.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/data/gphoto_tools_menuitem-32.png
===================================================================
(Binary files differ)


Property changes on: trunk/data/gphoto_tools_menuitem-32.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/data/gphoto_tools_menuitem-48.png
===================================================================
(Binary files differ)


Property changes on: trunk/data/gphoto_tools_menuitem-48.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/data/gtkpod-add-dirs.png
===================================================================
(Binary files differ)


Property changes on: trunk/data/gtkpod-add-dirs.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/data/gtkpod-add-files.png
===================================================================
(Binary files differ)


Property changes on: trunk/data/gtkpod-add-files.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/data/gtkpod-add-playlists.png
===================================================================
(Binary files differ)


Property changes on: trunk/data/gtkpod-add-playlists.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/data/gtkpod-icon-32-2.png
===================================================================
(Binary files differ)


Property changes on: trunk/data/gtkpod-icon-32-2.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/data/gtkpod-icon-32.png
===================================================================
(Binary files differ)


Property changes on: trunk/data/gtkpod-icon-32.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/data/gtkpod-icon-48.png
===================================================================
(Binary files differ)


Property changes on: trunk/data/gtkpod-icon-48.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/data/gtkpod-logo.png
===================================================================
(Binary files differ)


Property changes on: trunk/data/gtkpod-logo.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/data/gtkpod-new-playlist.png
===================================================================
(Binary files differ)


Property changes on: trunk/data/gtkpod-new-playlist.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/data/gtkpod-read-16.png
===================================================================
(Binary files differ)


Property changes on: trunk/data/gtkpod-read-16.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/data/gtkpod-read.png
===================================================================
(Binary files differ)


Property changes on: trunk/data/gtkpod-read.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/data/gtkpod-sync.png
===================================================================
(Binary files differ)


Property changes on: trunk/data/gtkpod-sync.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/data/gtkpod.desktop.in
===================================================================
--- trunk/data/gtkpod.desktop.in	                        (rev 0)
+++ trunk/data/gtkpod.desktop.in	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,8 @@
+[Desktop Entry]
+_Name=GtkPod
+_GenericName=iPod Manager
+_Comment=Manage music and video on an Apple iPod
+Exec=gtkpod
+Icon=gtkpod
+Type=Application
+Categories=GTK;AudioVideo;

Added: trunk/data/gtkpod.glade
===================================================================
--- trunk/data/gtkpod.glade	                        (rev 0)
+++ trunk/data/gtkpod.glade	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,20907 @@
+<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
+<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
+
+<glade-interface>
+
+<widget class="GtkWindow" id="gtkpod">
+  <property name="title" translatable="yes">gtkpod</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_NONE</property>
+  <property name="modal">False</property>
+  <property name="default_width">600</property>
+  <property name="default_height">500</property>
+  <property name="resizable">True</property>
+  <property name="destroy_with_parent">False</property>
+  <property name="icon">gtkpod-icon-48.png</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
+  <property name="urgency_hint">False</property>
+  <signal name="delete_event" handler="on_gtkpod_delete_event" last_modification_time="Sun, 24 Nov 2002 13:00:13 GMT"/>
+
+  <child>
+    <widget class="GtkVBox" id="vbox1">
+      <property name="visible">True</property>
+      <property name="homogeneous">False</property>
+      <property name="spacing">0</property>
+
+      <child>
+	<widget class="GtkMenuBar" id="menubar">
+	  <property name="visible">True</property>
+	  <property name="pack_direction">GTK_PACK_DIRECTION_LTR</property>
+	  <property name="child_pack_direction">GTK_PACK_DIRECTION_LTR</property>
+
+	  <child>
+	    <widget class="GtkMenuItem" id="menuitem10">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">_File</property>
+	      <property name="use_underline">True</property>
+
+	      <child>
+		<widget class="GtkMenu" id="menuitem10_menu">
+
+		  <child>
+		    <widget class="GtkImageMenuItem" id="load_ipods_mi">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">_Load iPod(s)</property>
+		      <property name="use_underline">True</property>
+		      <signal name="activate" handler="on_load_ipods_mi" last_modification_time="Sat, 20 May 2006 14:21:46 GMT"/>
+
+		      <child internal-child="image">
+			<widget class="GtkImage" id="image3992">
+			  <property name="visible">True</property>
+			  <property name="pixbuf">gtkpod-read-16.png</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			</widget>
+		      </child>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkImageMenuItem" id="save_changes_mi">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">_Save Changes</property>
+		      <property name="use_underline">True</property>
+		      <signal name="activate" handler="on_save_changes_mi" last_modification_time="Sat, 20 May 2006 14:22:12 GMT"/>
+		      <accelerator key="s" modifiers="GDK_CONTROL_MASK" signal="activate"/>
+
+		      <child internal-child="image">
+			<widget class="GtkImage" id="image3993">
+			  <property name="visible">True</property>
+			  <property name="stock">gtk-save</property>
+			  <property name="icon_size">1</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			</widget>
+		      </child>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkImageMenuItem" id="add_files1">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">Add _Files</property>
+		      <property name="use_underline">True</property>
+		      <signal name="activate" handler="create_add_files_callback" last_modification_time="Sun, 24 Jun 2007 14:43:18 GMT"/>
+
+		      <child internal-child="image">
+			<widget class="GtkImage" id="image3994">
+			  <property name="visible">True</property>
+			  <property name="stock">gtk-add</property>
+			  <property name="icon_size">1</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			</widget>
+		      </child>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkImageMenuItem" id="add_directory1">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">Add Fol_der</property>
+		      <property name="use_underline">True</property>
+		      <signal name="activate" handler="dirbrowser_create_callback" last_modification_time="Sun, 24 Jun 2007 15:25:37 GMT"/>
+
+		      <child internal-child="image">
+			<widget class="GtkImage" id="image3995">
+			  <property name="visible">True</property>
+			  <property name="stock">gtk-add</property>
+			  <property name="icon_size">1</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			</widget>
+		      </child>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkImageMenuItem" id="add_playlist1">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">Add _Playlist</property>
+		      <property name="use_underline">True</property>
+		      <signal name="activate" handler="create_add_playlists_callback" last_modification_time="Sun, 24 Jun 2007 15:42:46 GMT"/>
+
+		      <child internal-child="image">
+			<widget class="GtkImage" id="image3996">
+			  <property name="visible">True</property>
+			  <property name="stock">gtk-add</property>
+			  <property name="icon_size">1</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			</widget>
+		      </child>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkSeparatorMenuItem" id="separator3">
+		      <property name="visible">True</property>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkImageMenuItem" id="update_menu">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">_Update Tracks from File</property>
+		      <property name="use_underline">True</property>
+
+		      <child internal-child="image">
+			<widget class="GtkImage" id="image3997">
+			  <property name="visible">True</property>
+			  <property name="stock">gtk-refresh</property>
+			  <property name="icon_size">1</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			</widget>
+		      </child>
+
+		      <child>
+			<widget class="GtkMenu" id="update_menu_menu">
+
+			  <child>
+			    <widget class="GtkMenuItem" id="update_playlist_menu">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Selected _Playlist</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_update_playlist_activate" last_modification_time="Sun, 23 Mar 2003 09:00:04 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="update_tab_entry_menu">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Selected Tab _Entry</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_update_tab_entry_activate" last_modification_time="Sat, 15 Mar 2003 03:49:29 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="update_tracks_menu">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Selected _Tracks</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_update_tracks_activate" last_modification_time="Sun, 23 Mar 2003 09:00:04 GMT"/>
+			    </widget>
+			  </child>
+			</widget>
+		      </child>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkImageMenuItem" id="mserv_from_file_menu">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">Update _mserv Data from File</property>
+		      <property name="use_underline">True</property>
+
+		      <child internal-child="image">
+			<widget class="GtkImage" id="image3998">
+			  <property name="visible">True</property>
+			  <property name="stock">gtk-refresh</property>
+			  <property name="icon_size">1</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			</widget>
+		      </child>
+
+		      <child>
+			<widget class="GtkMenu" id="mserv_from_file_menu_menu">
+
+			  <child>
+			    <widget class="GtkMenuItem" id="mserv_from_file_playlist_menu">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Selected _Playlist</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_mserv_from_file_playlist_menu_activate" last_modification_time="Sat, 02 Oct 2004 05:09:52 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="mserv_from_file_entry_menu">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Selected Tab _Entry</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_mserv_from_file_entry_menu_activate" last_modification_time="Sat, 02 Oct 2004 05:09:52 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="mserv_from_file_tracks_menu">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Selected _Tracks</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_mserv_from_file_tracks_menu_activate" last_modification_time="Sat, 02 Oct 2004 05:09:52 GMT"/>
+			    </widget>
+			  </child>
+			</widget>
+		      </child>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkImageMenuItem" id="sync_menu">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">_Synchronize Playlist with Dir(s)</property>
+		      <property name="use_underline">True</property>
+		      <signal name="activate" handler="on_sync_playlist_activate" last_modification_time="Mon, 15 May 2006 15:39:05 GMT"/>
+
+		      <child internal-child="image">
+			<widget class="GtkImage" id="image3999">
+			  <property name="visible">True</property>
+			  <property name="stock">gtk-refresh</property>
+			  <property name="icon_size">1</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			</widget>
+		      </child>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkSeparatorMenuItem" id="separator6">
+		      <property name="visible">True</property>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkImageMenuItem" id="export_menu">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">_Export Tracks from Database</property>
+		      <property name="use_underline">True</property>
+
+		      <child internal-child="image">
+			<widget class="GtkImage" id="image4000">
+			  <property name="visible">True</property>
+			  <property name="stock">gtk-save-as</property>
+			  <property name="icon_size">1</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			</widget>
+		      </child>
+
+		      <child>
+			<widget class="GtkMenu" id="export_menu_menu">
+
+			  <child>
+			    <widget class="GtkMenuItem" id="export_playlist">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Selected _Playlist</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_export_playlist_activate" last_modification_time="Sun, 23 Mar 2003 09:00:04 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="export_tab_entry_menu">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Selected Tab _Entry</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_export_tab_entry_activate" last_modification_time="Sun, 23 Mar 2003 09:00:04 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="export_tracks">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Selected _Tracks</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_export_tracks_activate" last_modification_time="Sun, 23 Mar 2003 09:00:04 GMT"/>
+			    </widget>
+			  </child>
+			</widget>
+		      </child>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkImageMenuItem" id="create_playlist_file_menu">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">Create _Playlist File</property>
+		      <property name="use_underline">True</property>
+
+		      <child internal-child="image">
+			<widget class="GtkImage" id="image4001">
+			  <property name="visible">True</property>
+			  <property name="stock">gtk-save-as</property>
+			  <property name="icon_size">1</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			</widget>
+		      </child>
+
+		      <child>
+			<widget class="GtkMenu" id="create_playlist_file_menu_menu">
+
+			  <child>
+			    <widget class="GtkMenuItem" id="playlist_file_playlist">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Selected _Playlist</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_playlist_file_playlist_activate" last_modification_time="Sat, 21 Aug 2004 08:43:11 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="playlist_file_tab_entry">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Selected Tab _Entry</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_playlist_file_tab_entry_activate" last_modification_time="Sat, 21 Aug 2004 08:43:11 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="playlist_file_tracks">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Selected _Tracks</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_playlist_file_tracks_activate" last_modification_time="Sat, 21 Aug 2004 08:43:11 GMT"/>
+			    </widget>
+			  </child>
+			</widget>
+		      </child>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkSeparatorMenuItem" id="trennlinie6">
+		      <property name="visible">True</property>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkImageMenuItem" id="ipod_directories">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">_Create iPod's Directories</property>
+		      <property name="use_underline">True</property>
+		      <signal name="activate" handler="on_ipod_directories_menu" last_modification_time="Sat, 18 Jan 2003 02:10:39 GMT"/>
+
+		      <child internal-child="image">
+			<widget class="GtkImage" id="image4002">
+			  <property name="visible">True</property>
+			  <property name="stock">gtk-execute</property>
+			  <property name="icon_size">1</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			</widget>
+		      </child>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkMenuItem" id="check_ipod_files_mi">
+		      <property name="visible">True</property>
+		      <property name="tooltip" translatable="yes">Find orphan files (files with no track info in DB) and dangling tracks (tracks with no corresponding files on iPod)</property>
+		      <property name="label" translatable="yes">_Check iPod's Files</property>
+		      <property name="use_underline">True</property>
+		      <signal name="activate" handler="on_check_ipod_files_activate" last_modification_time="Sat, 24 Jan 2004 09:02:49 GMT"/>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkSeparatorMenuItem" id="trennlinie3">
+		      <property name="visible">True</property>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkImageMenuItem" id="quit1">
+		      <property name="visible">True</property>
+		      <property name="label">gtk-quit</property>
+		      <property name="use_stock">True</property>
+		      <signal name="activate" handler="on_quit1_activate" last_modification_time="Sat, 23 Nov 2002 03:06:04 GMT"/>
+		    </widget>
+		  </child>
+		</widget>
+	      </child>
+	    </widget>
+	  </child>
+
+	  <child>
+	    <widget class="GtkMenuItem" id="edit_menu">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">_Edit</property>
+	      <property name="use_underline">True</property>
+
+	      <child>
+		<widget class="GtkMenu" id="edit_menu_menu">
+
+		  <child>
+		    <widget class="GtkImageMenuItem" id="edit_details_menu">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">Edit Track Details</property>
+		      <property name="use_underline">True</property>
+
+		      <child internal-child="image">
+			<widget class="GtkImage" id="image4003">
+			  <property name="visible">True</property>
+			  <property name="stock">gtk-edit</property>
+			  <property name="icon_size">1</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			</widget>
+		      </child>
+
+		      <child>
+			<widget class="GtkMenu" id="edit_details_menu_menu">
+
+			  <child>
+			    <widget class="GtkMenuItem" id="edit_details_selected_playlist">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Tracks in Selected _Playlist</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_edit_details_selected_playlist" last_modification_time="Fri, 09 Dec 2005 15:42:30 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="edit_details_selected_tab_entry">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Tracks in Selected Tab _Entry</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_edit_details_selected_tab_entry" last_modification_time="Fri, 09 Dec 2005 15:42:30 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="edit_details_selected_tracks">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Selected _Tracks</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_edit_details_selected_tracks" last_modification_time="Fri, 09 Dec 2005 15:42:30 GMT"/>
+			    </widget>
+			  </child>
+			</widget>
+		      </child>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkMenuItem" id="edit_smart_playlist">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">Edit Smart Playlist</property>
+		      <property name="use_underline">True</property>
+		      <signal name="activate" handler="on_edit_smart_playlist" last_modification_time="Sat, 10 Dec 2005 07:48:01 GMT"/>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkImageMenuItem" id="delete_menu">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">_Delete</property>
+		      <property name="use_underline">True</property>
+
+		      <child internal-child="image">
+			<widget class="GtkImage" id="image4004">
+			  <property name="visible">True</property>
+			  <property name="stock">gtk-delete</property>
+			  <property name="icon_size">1</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			</widget>
+		      </child>
+
+		      <child>
+			<widget class="GtkMenu" id="delete_menu_menu">
+
+			  <child>
+			    <widget class="GtkMenuItem" id="delete_selected_playlist">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Selected playlist</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_delete_selected_playlist" last_modification_time="Sat, 10 Dec 2005 07:34:07 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="delete_selected_playlist_including_tracks_from_ipod">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Selected Playlist Including Tracks from iPod</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_delete_selected_playlist_including_tracks_from_ipod" last_modification_time="Sat, 10 Dec 2005 07:34:07 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="delete_selected_playlist_including_tracks_from_database">
+			      <property name="visible">True</property>
+                  <property name="label" translatable="yes">Selected Playlist Including Tracks from Database</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_delete_selected_playlist_including_tracks_from_database" last_modification_time="Sat, 10 Dec 2005 07:34:07 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="delete_selected_playlist_including_tracks_from_harddisk">
+			      <property name="visible">True</property>
+                  <property name="label" translatable="yes">Selected Playlist Including Tracks from Hard Disk</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_delete_selected_playlist_including_tracks_from_harddisk" last_modification_time="Sat, 10 Dec 2005 07:34:07 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkSeparatorMenuItem" id="delete_separator1">
+			      <property name="visible">True</property>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="delete_selected_entry_from_playlist">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Selected Filter Tab Entry from Playlist</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_delete_selected_entry_from_playlist" last_modification_time="Sat, 10 Dec 2005 07:34:07 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="delete_selected_entry_from_ipod">
+			      <property name="visible">True</property>
+                  <property name="label" translatable="yes">Selected Filter Tab Entry from iPod</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_delete_selected_entry_from_ipod" last_modification_time="Sat, 10 Dec 2005 07:34:07 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="delete_selected_entry_from_database">
+			      <property name="visible">True</property>
+                  <property name="label" translatable="yes">Selected Filter Tab Entry from Database</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_delete_selected_entry_from_database" last_modification_time="Sat, 10 Dec 2005 07:34:07 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="delete_selected_entry_from_harddisk">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Selected Filter Tab Entry from Hard Disk</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_delete_selected_entry_from_harddisk" last_modification_time="Sat, 10 Dec 2005 07:34:07 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkSeparatorMenuItem" id="delete_separator2">
+			      <property name="visible">True</property>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="delete_selected_tracks_from_playlist">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Selected Tracks from Playlist</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_delete_selected_tracks_from_playlist" last_modification_time="Sat, 10 Dec 2005 07:34:07 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="delete_selected_tracks_from_ipod">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Selected Tracks from iPod</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_delete_selected_tracks_from_ipod" last_modification_time="Sat, 10 Dec 2005 07:34:07 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="delete_selected_tracks_from_database">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Selected Tracks from Database</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_delete_selected_tracks_from_database" last_modification_time="Sat, 10 Dec 2005 07:34:07 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="delete_selected_tracks_from_harddisk">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Selected Tracks from Hard Disk</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_delete_selected_tracks_from_harddisk" last_modification_time="Sat, 10 Dec 2005 07:34:07 GMT"/>
+			    </widget>
+			  </child>
+			</widget>
+		      </child>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkSeparatorMenuItem" id="separator7">
+		      <property name="visible">True</property>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkImageMenuItem" id="create_playlists_menu">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">_Create Playlists</property>
+		      <property name="use_underline">True</property>
+
+		      <child internal-child="image">
+			<widget class="GtkImage" id="image4005">
+			  <property name="visible">True</property>
+			  <property name="stock">gtk-new</property>
+			  <property name="icon_size">1</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			</widget>
+		      </child>
+
+		      <child>
+			<widget class="GtkMenu" id="create_playlists_menu_menu">
+
+			  <child>
+			    <widget class="GtkMenuItem" id="new_playlist1">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Empty Playlist</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_new_playlist1_activate" last_modification_time="Sun, 03 Aug 2003 03:58:25 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="smart_playlist">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Smart Playlist</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_smart_playlist_activate" last_modification_time="Mon, 06 Dec 2004 14:36:42 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkSeparatorMenuItem" id="separator8">
+			      <property name="visible">True</property>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="random_playlist">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Random Playlist from Displayed Tracks</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_random_playlist_activate" last_modification_time="Fri, 19 Mar 2004 17:27:51 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="pl_containing_displayed_tracks">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Containing Displayed Tracks</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_pl_containing_displayed_tracks_activate" last_modification_time="Sun, 03 Aug 2003 04:03:36 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="pl_containing_selected_tracks">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Containing Selected Tracks</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_pl_containing_selected_tracks_activate" last_modification_time="Sun, 03 Aug 2003 04:03:36 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="pl_for_each_artist">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">One for each Artist</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_pl_for_each_artist_activate" last_modification_time="Sun, 03 Aug 2003 03:48:28 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="pl_for_each_album">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">One for each Album</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_pl_for_each_album_activate" last_modification_time="Sun, 03 Aug 2003 03:48:28 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="pl_for_each_genre">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">One for each Genre</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_pl_for_each_genre_activate" last_modification_time="Sun, 03 Aug 2003 03:48:28 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="pl_for_each_composer">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">One for each Composer</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_pl_for_each_composer_activate" last_modification_time="Sun, 03 Aug 2003 03:48:28 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="pl_for_each_year">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">One for each Year</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_pl_for_each_year_activate" last_modification_time="Thu, 11 Mar 2004 14:10:34 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="pl_for_each_rating">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">One for each Rating</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_pl_for_each_rating_activate" last_modification_time="Sun, 05 Dec 2004 12:52:43 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="most_rated_tracks">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Best Rated Tracks</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_most_rated_tracks_playlist_s1_activate" last_modification_time="Sun, 10 Aug 2003 14:21:51 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="most_listened_tracks">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Tracks Most Often Listened To</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_most_listened_tracks1_activate" last_modification_time="Sun, 10 Aug 2003 14:24:20 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="most_recent_played_tracks">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Most Recently Played Tracks</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_most_recent_played_tracks_activate" last_modification_time="Sun, 10 Aug 2003 14:24:57 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="played_since_last_time1">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">All Tracks Played Since Last Time</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_played_since_last_time1_activate" last_modification_time="Fri, 22 Aug 2003 12:24:50 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="all_tracks_never_listened_to1">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">All Tracks Never Listened To</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_all_tracks_never_listened_to1_activate" last_modification_time="Fri, 07 Nov 2003 15:51:06 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="all_tracks_not_listed_in_any_playlist1">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">All Tracks not Listed in any Playlist</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_all_tracks_not_listed_in_any_playlist1_activate" last_modification_time="Thu, 11 Mar 2004 14:09:28 GMT"/>
+			    </widget>
+			  </child>
+			</widget>
+		      </child>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkSeparatorMenuItem" id="separator1">
+		      <property name="visible">True</property>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkImageMenuItem" id="sorting1">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">_Sorting</property>
+		      <property name="use_underline">True</property>
+		      <signal name="activate" handler="on_sorting_activate" last_modification_time="Mon, 22 Sep 2003 08:00:42 GMT"/>
+
+		      <child internal-child="image">
+			<widget class="GtkImage" id="image4006">
+			  <property name="visible">True</property>
+			  <property name="stock">gtk-sort-ascending</property>
+			  <property name="icon_size">1</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			</widget>
+		      </child>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkMenuItem" id="randomize_current_playlist_menu">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">Randomize Current Playlist</property>
+		      <property name="use_underline">True</property>
+		      <signal name="activate" handler="on_randomize_current_playlist_activate" last_modification_time="Fri, 19 Mar 2004 17:27:51 GMT"/>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkImageMenuItem" id="save_track_order_menu">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">_Save Displayed Track Order</property>
+		      <property name="use_underline">True</property>
+		      <signal name="activate" handler="on_save_track_order1_activate" last_modification_time="Sat, 08 Mar 2003 13:45:01 GMT"/>
+		      <accelerator key="s" modifiers="GDK_CONTROL_MASK | GDK_SHIFT_MASK" signal="activate"/>
+
+		      <child internal-child="image">
+			<widget class="GtkImage" id="image4007">
+			  <property name="visible">True</property>
+			  <property name="stock">gtk-justify-fill</property>
+			  <property name="icon_size">1</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			</widget>
+		      </child>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkSeparatorMenuItem" id="separator2">
+		      <property name="visible">True</property>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkImageMenuItem" id="edit_repository_options">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">Edit Repository/iPod Options</property>
+		      <property name="use_underline">True</property>
+		      <signal name="activate" handler="on_edit_repository_options_activate" last_modification_time="Sun, 21 May 2006 03:40:14 GMT"/>
+
+		      <child internal-child="image">
+			<widget class="GtkImage" id="image4008">
+			  <property name="visible">True</property>
+			  <property name="stock">gtk-preferences</property>
+			  <property name="icon_size">1</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			</widget>
+		      </child>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkImageMenuItem" id="edit_preferences">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">Edit _Preferences</property>
+		      <property name="use_underline">True</property>
+		      <signal name="activate" handler="on_edit_preferences_activate" last_modification_time="Sun, 21 May 2006 03:41:05 GMT"/>
+		      <accelerator key="p" modifiers="GDK_CONTROL_MASK" signal="activate"/>
+
+		      <child internal-child="image">
+			<widget class="GtkImage" id="image4009">
+			  <property name="visible">True</property>
+			  <property name="stock">gtk-preferences</property>
+			  <property name="icon_size">1</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			</widget>
+		      </child>
+		    </widget>
+		  </child>
+		</widget>
+	      </child>
+	    </widget>
+	  </child>
+
+	  <child>
+	    <widget class="GtkMenuItem" id="item1">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">_View</property>
+	      <property name="use_underline">True</property>
+
+	      <child>
+		<widget class="GtkMenu" id="item1_menu">
+
+		  <child>
+		    <widget class="GtkCheckMenuItem" id="toolbar_menu">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">_Toolbar</property>
+		      <property name="use_underline">True</property>
+		      <property name="active">False</property>
+		      <signal name="activate" handler="on_toolbar_menu_activate" last_modification_time="Fri, 14 Mar 2003 10:58:38 GMT"/>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkCheckMenuItem" id="tooltips_menu">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">_Tooltips</property>
+		      <property name="use_underline">True</property>
+		      <property name="active">False</property>
+		      <signal name="activate" handler="on_tooltips_menu_activate" last_modification_time="Sat, 14 Jun 2003 16:48:32 GMT"/>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkCheckMenuItem" id="info_window_menu">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">_Info Window</property>
+		      <property name="use_underline">True</property>
+		      <property name="active">False</property>
+		      <signal name="activate" handler="on_info_window1_activate" last_modification_time="Sun, 23 Nov 2003 15:25:04 GMT"/>
+		      <accelerator key="i" modifiers="GDK_CONTROL_MASK" signal="activate"/>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkCheckMenuItem" id="conversion_log">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">_Conversion Log</property>
+		      <property name="use_underline">True</property>
+		      <property name="active">False</property>
+		      <signal name="activate" handler="on_conversion_log1_activate" last_modification_time="Sun, 22 Apr 2007 15:25:48 GMT"/>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkImageMenuItem" id="more_sort_tabs">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">_More Sort Tabs</property>
+		      <property name="use_underline">True</property>
+		      <signal name="activate" handler="on_more_sort_tabs_activate" last_modification_time="Fri, 14 Mar 2003 11:57:43 GMT"/>
+
+		      <child internal-child="image">
+			<widget class="GtkImage" id="image4010">
+			  <property name="visible">True</property>
+			  <property name="stock">gtk-add</property>
+			  <property name="icon_size">1</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			</widget>
+		      </child>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkImageMenuItem" id="less_sort_tabs">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">_Less Sort Tabs</property>
+		      <property name="use_underline">True</property>
+		      <signal name="activate" handler="on_less_sort_tabs_activate" last_modification_time="Fri, 14 Mar 2003 11:57:43 GMT"/>
+
+		      <child internal-child="image">
+			<widget class="GtkImage" id="image4011">
+			  <property name="visible">True</property>
+			  <property name="stock">gtk-remove</property>
+			  <property name="icon_size">1</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			</widget>
+		      </child>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkMenuItem" id="arrange_sort_tabs">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">_Arrange Sort Tabs</property>
+		      <property name="use_underline">True</property>
+		      <signal name="activate" handler="on_arrange_sort_tabs_activate" last_modification_time="Tue, 25 Mar 2003 13:59:28 GMT"/>
+		    </widget>
+		  </child>
+		</widget>
+	      </child>
+	    </widget>
+	  </child>
+
+	  <child>
+	    <widget class="GtkMenuItem" id="tools1">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">_Tools</property>
+	      <property name="use_underline">True</property>
+
+	      <child>
+		<widget class="GtkMenu" id="tools1_menu">
+
+		  <child>
+		    <widget class="GtkImageMenuItem" id="play_menu">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">_Play Now</property>
+		      <property name="use_underline">True</property>
+
+		      <child internal-child="image">
+			<widget class="GtkImage" id="image4012">
+			  <property name="visible">True</property>
+			  <property name="stock">gtk-cdrom</property>
+			  <property name="icon_size">1</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			</widget>
+		      </child>
+
+		      <child>
+			<widget class="GtkMenu" id="play_menu_menu">
+
+			  <child>
+			    <widget class="GtkMenuItem" id="play_playlist_menu">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Selected _Playlist</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_play_playlist_activate" last_modification_time="Sun, 23 Mar 2003 09:00:04 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="play_tab_entry_menu">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Selected Tab _Entry</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_play_tab_entry_activate" last_modification_time="Sun, 23 Mar 2003 09:00:04 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="play_tracks_menu">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Selected _Tracks</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_play_tracks_activate" last_modification_time="Sun, 23 Mar 2003 09:00:04 GMT"/>
+			    </widget>
+			  </child>
+			</widget>
+		      </child>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkImageMenuItem" id="enqueue_menu">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">_Enqueue</property>
+		      <property name="use_underline">True</property>
+
+		      <child internal-child="image">
+			<widget class="GtkImage" id="image4013">
+			  <property name="visible">True</property>
+			  <property name="stock">gtk-cdrom</property>
+			  <property name="icon_size">1</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			</widget>
+		      </child>
+
+		      <child>
+			<widget class="GtkMenu" id="enqueue_menu_menu">
+
+			  <child>
+			    <widget class="GtkMenuItem" id="enqueue_playlist_menu">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Selected _Playlist</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_enqueue_playlist_activate" last_modification_time="Sun, 23 Mar 2003 09:00:04 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="enqueue_tab_entry_menu">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Selected Tab _Entry</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_enqueue_tab_entry_activate" last_modification_time="Sun, 23 Mar 2003 09:00:04 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="enqueue_tracks_menu">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Selected _Tracks</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_enqueue_tracks_activate" last_modification_time="Sun, 23 Mar 2003 09:00:04 GMT"/>
+			    </widget>
+			  </child>
+			</widget>
+		      </child>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkSeparatorMenuItem" id="trennlinie4">
+		      <property name="visible">True</property>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkMenuItem" id="normalize_tracks1">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">_Normalize Volume</property>
+		      <property name="use_underline">True</property>
+
+		      <child>
+			<widget class="GtkMenu" id="normalize_tracks1_menu">
+
+			  <child>
+			    <widget class="GtkMenuItem" id="normalize_selected_playlist">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Selected _Playlist</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_normalize_selected_playlist_activate" last_modification_time="Fri, 26 Sep 2003 16:01:19 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="normalize_selected_tab_entry">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Selected Tab _Entry</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_normalize_selected_tab_entry_activate" last_modification_time="Fri, 26 Sep 2003 16:01:19 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="normalize_selected_tracks">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Selected _Tracks</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_normalize_selected_tracks_activate" last_modification_time="Fri, 26 Sep 2003 16:01:19 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="normalize_displayed_tracks">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">_Displayed Tracks</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_normalize_displayed_tracks_activate" last_modification_time="Fri, 26 Sep 2003 16:01:19 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="normalize_all_tracks">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">_All Tracks</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_normalize_all_tracks" last_modification_time="Fri, 26 Sep 2003 16:01:19 GMT"/>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="normalize_newly_added_tracks">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">_Newly Added Tracks</property>
+			      <property name="use_underline">True</property>
+			      <signal name="activate" handler="on_normalize_newly_added_tracks" last_modification_time="Fri, 26 Sep 2003 16:01:19 GMT"/>
+			    </widget>
+			  </child>
+			</widget>
+		      </child>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkSeparatorMenuItem" id="trennlinie5">
+		      <property name="visible">True</property>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkMenuItem" id="sync_all">
+		      <property name="visible">True</property>
+		      <property name="tooltip" translatable="yes">Synchronise Contacts, Calendar and Notes</property>
+		      <property name="label" translatable="yes">Synchronize All</property>
+		      <property name="use_underline">True</property>
+		      <signal name="activate" handler="on_sync_all_activate" last_modification_time="Thu, 16 Dec 2004 00:15:04 GMT"/>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkMenuItem" id="sync_contacts">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">Synchronize Contacts</property>
+		      <property name="use_underline">True</property>
+		      <signal name="activate" handler="on_sync_contacts_activate" last_modification_time="Sun, 01 Feb 2004 10:51:37 GMT"/>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkMenuItem" id="sync_calendar">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">Synchronize Calendar</property>
+		      <property name="use_underline">True</property>
+		      <signal name="activate" handler="on_sync_calendar_activate" last_modification_time="Sun, 01 Feb 2004 10:51:37 GMT"/>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkMenuItem" id="sync_notes">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">Synchronize Notes</property>
+		      <property name="use_underline">True</property>
+		      <signal name="activate" handler="on_sync_notes_activate" last_modification_time="Thu, 16 Dec 2004 00:15:04 GMT"/>
+		    </widget>
+		  </child>
+		</widget>
+	      </child>
+	    </widget>
+	  </child>
+
+	  <child>
+	    <widget class="GtkMenuItem" id="menuitem13">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">_Help</property>
+	      <property name="use_underline">True</property>
+
+	      <child>
+		<widget class="GtkMenu" id="menuitem13_menu">
+
+		  <child>
+		    <widget class="GtkImageMenuItem" id="about1">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">_About gtkpod</property>
+		      <property name="use_underline">True</property>
+		      <signal name="activate" handler="open_about_window" last_modification_time="Sun, 05 Jun 2005 13:09:31 GMT"/>
+
+		      <child internal-child="image">
+			<widget class="GtkImage" id="image4014">
+			  <property name="visible">True</property>
+			  <property name="stock">gtk-about</property>
+			  <property name="icon_size">1</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			</widget>
+		      </child>
+		    </widget>
+		  </child>
+		</widget>
+	      </child>
+	    </widget>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">False</property>
+	</packing>
+      </child>
+
+      <child>
+          <widget class="GtkToolbar" id="toolbar">
+              <property name="visible">True</property>
+              <property name="orientation">GTK_ORIENTATION_HORIZONTAL</property>
+              <property name="toolbar_style">GTK_TOOLBAR_BOTH</property>
+              <property name="tooltips">True</property>
+              <property name="show_arrow">True</property>
+              
+              <child>
+                  <widget class="GtkToolButton" id="load_ipods_button">
+                      <property name="visible">True</property>
+                      <property name="tooltip" translatable="yes">Try to load contents of all connected iPods. For each iPod a separate repository must be set up.</property>
+                      <property name="label" translatable="yes">Load iPod(s)</property>
+                      <property name="use_underline">True</property>
+                      <property name="icon">gtkpod-read.png</property>
+                      <property name="visible_horizontal">True</property>
+                      <property name="visible_vertical">True</property>
+                      <property name="is_important">False</property>
+                      <signal name="clicked" handler="on_load_ipods_clicked" last_modification_time="Sat, 20 May 2006 14:20:43 GMT"/>
+                  </widget>
+                  <packing>
+                      <property name="expand">False</property>
+                      <property name="homogeneous">True</property>
+                  </packing>
+              </child>
+              
+              <child>
+                  <widget class="GtkToolButton" id="save_changes_button">
+                      <property name="visible">True</property>
+                      <property name="tooltip" translatable="yes">Write all changes made to the disk and the iPod(s).</property>
+                      <property name="label" translatable="yes">Save Changes</property>
+                      <property name="use_underline">True</property>
+                      <property name="stock_id">gtk-save</property>
+                      <property name="visible_horizontal">True</property>
+                      <property name="visible_vertical">True</property>
+                      <property name="is_important">False</property>
+                      <signal name="clicked" handler="on_save_changes_clicked" last_modification_time="Sat, 20 May 2006 14:20:33 GMT"/>
+                  </widget>
+                  <packing>
+                      <property name="expand">False</property>
+                      <property name="homogeneous">True</property>
+                  </packing>
+              </child>
+              
+              <child>
+                  <widget class="GtkSeparatorToolItem" id="separatortoolitem1">
+                      <property name="visible">True</property>
+                      <property name="draw">True</property>
+                      <property name="visible_horizontal">True</property>
+                      <property name="visible_vertical">True</property>
+                  </widget>
+                  <packing>
+                      <property name="expand">False</property>
+                      <property name="homogeneous">False</property>
+                  </packing>
+              </child>
+              
+              <child>
+                  <widget class="GtkToolButton" id="add_files_button">
+                      <property name="visible">True</property>
+                      <property name="tooltip" translatable="yes">Add Files or Directories</property>
+                      <property name="label" translatable="yes">Add Files</property>
+                      <property name="use_underline">True</property>
+                      <property name="icon">gtkpod-add-files.png</property>
+                      <property name="visible_horizontal">True</property>
+                      <property name="visible_vertical">True</property>
+                      <property name="is_important">False</property>
+                      <signal name="clicked" handler="create_add_files_callback" last_modification_time="Sun, 24 Jun 2007 14:43:28 GMT"/>
+                  </widget>
+                  <packing>
+                      <property name="expand">False</property>
+                      <property name="homogeneous">True</property>
+                  </packing>
+              </child>
+              
+              <child>
+                  <widget class="GtkToolButton" id="add_dirs_button">
+                      <property name="visible">True</property>
+                      <property name="tooltip" translatable="yes">Add Directories Recursively</property>
+                      <property name="label" translatable="yes">Add Folder</property>
+                      <property name="use_underline">True</property>
+                      <property name="icon">gtkpod-add-dirs.png</property>
+                      <property name="visible_horizontal">True</property>
+                      <property name="visible_vertical">True</property>
+                      <property name="is_important">False</property>
+                      <signal name="clicked" handler="dirbrowser_create_callback" last_modification_time="Sun, 24 Jun 2007 15:25:22 GMT"/>
+                  </widget>
+                  <packing>
+                      <property name="expand">False</property>
+                      <property name="homogeneous">True</property>
+                  </packing>
+              </child>
+              
+              <child>
+                  <widget class="GtkToolButton" id="add_PL_button">
+                      <property name="visible">True</property>
+                      <property name="tooltip" translatable="yes">Add playlist from file</property>
+                      <property name="label" translatable="yes">Add Playlist</property>
+                      <property name="use_underline">True</property>
+                      <property name="icon">gtkpod-add-playlists.png</property>
+                      <property name="visible_horizontal">True</property>
+                      <property name="visible_vertical">True</property>
+                      <property name="is_important">False</property>
+                      <signal name="clicked" handler="create_add_playlists_callback" last_modification_time="Sun, 24 Jun 2007 15:42:57 GMT"/>
+                  </widget>
+                  <packing>
+                      <property name="expand">False</property>
+                      <property name="homogeneous">True</property>
+                  </packing>
+              </child>
+              
+              <child>
+                  <widget class="GtkSeparatorToolItem" id="separatortoolitem2">
+                      <property name="visible">True</property>
+                      <property name="draw">True</property>
+                      <property name="visible_horizontal">True</property>
+                      <property name="visible_vertical">True</property>
+                  </widget>
+                  <packing>
+                      <property name="expand">False</property>
+                      <property name="homogeneous">False</property>
+                  </packing>
+              </child>
+              
+              <child>
+                  <widget class="GtkToolButton" id="new_PL_button">
+                      <property name="visible">True</property>
+                      <property name="tooltip" translatable="yes">Create New Playlist</property>
+                      <property name="label" translatable="yes">New Playlist</property>
+                      <property name="use_underline">True</property>
+                      <property name="stock_id">gtk-new</property>
+                      <property name="visible_horizontal">True</property>
+                      <property name="visible_vertical">True</property>
+                      <property name="is_important">False</property>
+                      <signal name="clicked" handler="on_new_playlist_button" last_modification_time="Thu, 05 Dec 2002 12:17:43 GMT"/>
+                  </widget>
+                  <packing>
+                      <property name="expand">False</property>
+                      <property name="homogeneous">True</property>
+                  </packing>
+              </child>
+              
+              <child>
+                  <placeholder/>
+              </child>
+          </widget>
+          <packing>
+              <property name="padding">0</property>
+              <property name="expand">False</property>
+              <property name="fill">False</property>
+          </packing>
+      </child>
+
+      <child>
+	<widget class="GtkHPaned" id="paned0">
+	  <property name="visible">True</property>
+	  <property name="can_focus">True</property>
+	  <property name="position">150</property>
+	  <signal name="button_release_event" handler="on_paned0_button_release_event" last_modification_time="Sat, 17 Feb 2007 20:51:03 GMT"/>
+
+	  <child>
+	    <widget class="GtkVBox" id="vbox2">
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">0</property>
+
+	      <child>
+		<widget class="GtkScrolledWindow" id="playlist_window">
+		  <property name="visible">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+		  <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+		  <property name="shadow_type">GTK_SHADOW_NONE</property>
+		  <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+		  <child>
+		    <placeholder/>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">True</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkHBox" id="cover_visible_control_box">
+		  <property name="height_request">23</property>
+		  <property name="visible">True</property>
+		  <property name="homogeneous">False</property>
+		  <property name="spacing">0</property>
+
+		  <child>
+		    <widget class="GtkButton" id="cover_down_button">
+		      <property name="width_request">25</property>
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="relief">GTK_RELIEF_NONE</property>
+		      <property name="focus_on_click">True</property>
+		      <signal name="clicked" handler="on_cover_down_button_clicked" last_modification_time="Sat, 17 Feb 2007 19:15:25 GMT"/>
+
+		      <child>
+			<widget class="GtkArrow" id="arrow1">
+			  <property name="width_request">22</property>
+			  <property name="visible">True</property>
+			  <property name="arrow_type">GTK_ARROW_DOWN</property>
+			  <property name="shadow_type">GTK_SHADOW_NONE</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			</widget>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		      <property name="pack_type">GTK_PACK_END</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkButton" id="cover_up_button">
+		      <property name="width_request">25</property>
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="relief">GTK_RELIEF_NONE</property>
+		      <property name="focus_on_click">True</property>
+		      <signal name="clicked" handler="on_cover_up_button_clicked" last_modification_time="Sat, 17 Feb 2007 19:37:56 GMT"/>
+
+		      <child>
+			<widget class="GtkArrow" id="arrow2">
+			  <property name="visible">True</property>
+			  <property name="arrow_type">GTK_ARROW_UP</property>
+			  <property name="shadow_type">GTK_SHADOW_NONE</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			</widget>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		      <property name="pack_type">GTK_PACK_END</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkLabel" id="lbl_albumart">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">Album Art</property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">False</property>
+		      <property name="justify">GTK_JUSTIFY_CENTER</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">2</property>
+		      <property name="expand">True</property>
+		      <property name="fill">True</property>
+		    </packing>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkVBox" id="cover_display_window">
+		  <property name="visible">True</property>
+		  <property name="homogeneous">False</property>
+		  <property name="spacing">0</property>
+
+		  <child>
+		    <widget class="GtkHBox" id="cover_display_canvasbox">
+		      <property name="visible">True</property>
+		      <property name="homogeneous">False</property>
+		      <property name="spacing">0</property>
+
+		      <child>
+			<placeholder/>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkHBox" id="cover_display_controlbox">
+		      <property name="visible">True</property>
+		      <property name="homogeneous">False</property>
+		      <property name="spacing">2</property>
+
+		      <child>
+			<widget class="GtkButton" id="cover_display_leftbutton">
+			  <property name="visible">True</property>
+			  <property name="can_focus">True</property>
+			  <property name="label" translatable="yes">&lt;</property>
+			  <property name="use_underline">True</property>
+			  <property name="relief">GTK_RELIEF_NORMAL</property>
+			  <property name="focus_on_click">True</property>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">False</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkHScale" id="cover_display_scaler">
+			  <property name="visible">True</property>
+			  <property name="can_focus">True</property>
+			  <property name="draw_value">False</property>
+			  <property name="value_pos">GTK_POS_TOP</property>
+			  <property name="digits">0</property>
+			  <property name="update_policy">GTK_UPDATE_CONTINUOUS</property>
+			  <property name="inverted">False</property>
+			  <property name="adjustment">0 0 0 1 9 0</property>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">True</property>
+			  <property name="fill">True</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkButton" id="cover_display_rightbutton">
+			  <property name="visible">True</property>
+			  <property name="can_focus">True</property>
+			  <property name="label" translatable="yes">&gt;</property>
+			  <property name="use_underline">True</property>
+			  <property name="relief">GTK_RELIEF_NORMAL</property>
+			  <property name="focus_on_click">True</property>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">False</property>
+			</packing>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="shrink">False</property>
+	      <property name="resize">False</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkVBox" id="main_vbox">
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">0</property>
+
+	      <child>
+		<widget class="GtkVPaned" id="paned1">
+		  <property name="visible">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="position">180</property>
+
+		  <child>
+		    <widget class="GtkScrolledWindow" id="paned1_dummy">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+		      <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+		      <property name="shadow_type">GTK_SHADOW_NONE</property>
+		      <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+		      <child>
+			<placeholder/>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="shrink">True</property>
+		      <property name="resize">False</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkScrolledWindow" id="track_window">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+		      <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+		      <property name="shadow_type">GTK_SHADOW_NONE</property>
+		      <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+		      <child>
+			<placeholder/>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="shrink">True</property>
+		      <property name="resize">True</property>
+		    </packing>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">True</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<placeholder/>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="shrink">True</property>
+	      <property name="resize">True</property>
+	    </packing>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">True</property>
+	  <property name="fill">True</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkHPaned" id="paned2">
+	  <property name="visible">True</property>
+	  <property name="can_focus">True</property>
+	  <property name="position">0</property>
+
+	  <child>
+	    <widget class="GtkStatusbar" id="gtkpod_status">
+	      <property name="border_width">1</property>
+	      <property name="width_request">300</property>
+	      <property name="visible">True</property>
+	      <property name="has_resize_grip">False</property>
+	    </widget>
+	    <packing>
+	      <property name="shrink">False</property>
+	      <property name="resize">True</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkHPaned" id="paned3">
+	      <property name="visible">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="position">130</property>
+
+	      <child>
+		<widget class="GtkStatusbar" id="space_statusbar">
+		  <property name="border_width">1</property>
+		  <property name="width_request">80</property>
+		  <property name="visible">True</property>
+		  <property name="has_resize_grip">False</property>
+		</widget>
+		<packing>
+		  <property name="shrink">True</property>
+		  <property name="resize">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkStatusbar" id="tracks_statusbar">
+		  <property name="border_width">1</property>
+		  <property name="width_request">175</property>
+		  <property name="visible">True</property>
+		  <property name="has_resize_grip">True</property>
+		</widget>
+		<packing>
+		  <property name="shrink">True</property>
+		  <property name="resize">True</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="shrink">True</property>
+	      <property name="resize">True</property>
+	    </packing>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">True</property>
+	</packing>
+      </child>
+    </widget>
+  </child>
+</widget>
+
+<widget class="GtkWindow" id="gtkpod_about_window">
+  <property name="width_request">350</property>
+  <property name="height_request">0</property>
+  <property name="title" translatable="yes">About gtkpod</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_NONE</property>
+  <property name="modal">False</property>
+  <property name="default_width">450</property>
+  <property name="default_height">450</property>
+  <property name="resizable">True</property>
+  <property name="destroy_with_parent">False</property>
+  <property name="icon">gtkpod-icon-48.png</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
+  <property name="urgency_hint">False</property>
+  <signal name="delete_event" handler="on_about_window_close" last_modification_time="Sat, 30 Nov 2002 16:10:01 GMT"/>
+
+  <child>
+    <widget class="GtkVBox" id="vbox2">
+      <property name="visible">True</property>
+      <property name="homogeneous">False</property>
+      <property name="spacing">0</property>
+
+      <child>
+	<widget class="GtkVBox" id="about_top_box">
+	  <property name="visible">True</property>
+	  <property name="homogeneous">False</property>
+	  <property name="spacing">0</property>
+
+	  <child>
+	    <widget class="GtkImage" id="logo_image">
+	      <property name="visible">True</property>
+	      <property name="pixbuf">gtkpod-logo.png</property>
+	      <property name="xalign">0.5</property>
+	      <property name="yalign">0.5</property>
+	      <property name="xpad">0</property>
+	      <property name="ypad">0</property>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">True</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkLabel" id="about_label">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes"></property>
+	      <property name="use_underline">False</property>
+	      <property name="use_markup">False</property>
+	      <property name="justify">GTK_JUSTIFY_CENTER</property>
+	      <property name="wrap">True</property>
+	      <property name="selectable">False</property>
+	      <property name="xalign">0.5</property>
+	      <property name="yalign">0.5</property>
+	      <property name="xpad">0</property>
+	      <property name="ypad">0</property>
+	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	      <property name="width_chars">-1</property>
+	      <property name="single_line_mode">False</property>
+	      <property name="angle">0</property>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
+	    </packing>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">False</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkNotebook" id="notebook1">
+	  <property name="border_width">2</property>
+	  <property name="visible">True</property>
+	  <property name="can_focus">True</property>
+	  <property name="show_tabs">True</property>
+	  <property name="show_border">True</property>
+	  <property name="tab_pos">GTK_POS_TOP</property>
+	  <property name="scrollable">False</property>
+	  <property name="enable_popup">False</property>
+
+	  <child>
+	    <widget class="GtkScrolledWindow" id="scrolledwindow2">
+	      <property name="visible">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+	      <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+	      <property name="shadow_type">GTK_SHADOW_NONE</property>
+	      <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+	      <child>
+		<widget class="GtkTextView" id="credits_textview">
+		  <property name="visible">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="editable">False</property>
+		  <property name="overwrite">False</property>
+		  <property name="accepts_tab">True</property>
+		  <property name="justification">GTK_JUSTIFY_LEFT</property>
+		  <property name="wrap_mode">GTK_WRAP_WORD</property>
+		  <property name="cursor_visible">True</property>
+		  <property name="pixels_above_lines">0</property>
+		  <property name="pixels_below_lines">0</property>
+		  <property name="pixels_inside_wrap">0</property>
+		  <property name="left_margin">0</property>
+		  <property name="right_margin">0</property>
+		  <property name="indent">0</property>
+		  <property name="text" translatable="yes"></property>
+		</widget>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="tab_expand">False</property>
+	      <property name="tab_fill">True</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkLabel" id="label3">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">Credits</property>
+	      <property name="use_underline">False</property>
+	      <property name="use_markup">False</property>
+	      <property name="justify">GTK_JUSTIFY_LEFT</property>
+	      <property name="wrap">False</property>
+	      <property name="selectable">False</property>
+	      <property name="xalign">0.5</property>
+	      <property name="yalign">0.5</property>
+	      <property name="xpad">0</property>
+	      <property name="ypad">0</property>
+	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	      <property name="width_chars">-1</property>
+	      <property name="single_line_mode">False</property>
+	      <property name="angle">0</property>
+	    </widget>
+	    <packing>
+	      <property name="type">tab</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkScrolledWindow" id="scrolledwindow3">
+	      <property name="visible">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+	      <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+	      <property name="shadow_type">GTK_SHADOW_NONE</property>
+	      <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+	      <child>
+		<widget class="GtkTextView" id="translators_textview">
+		  <property name="visible">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="editable">False</property>
+		  <property name="overwrite">False</property>
+		  <property name="accepts_tab">True</property>
+		  <property name="justification">GTK_JUSTIFY_LEFT</property>
+		  <property name="wrap_mode">GTK_WRAP_WORD</property>
+		  <property name="cursor_visible">True</property>
+		  <property name="pixels_above_lines">0</property>
+		  <property name="pixels_below_lines">0</property>
+		  <property name="pixels_inside_wrap">0</property>
+		  <property name="left_margin">0</property>
+		  <property name="right_margin">0</property>
+		  <property name="indent">0</property>
+		  <property name="text" translatable="yes"></property>
+		</widget>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="tab_expand">False</property>
+	      <property name="tab_fill">True</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkLabel" id="label4">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">Translators</property>
+	      <property name="use_underline">False</property>
+	      <property name="use_markup">False</property>
+	      <property name="justify">GTK_JUSTIFY_LEFT</property>
+	      <property name="wrap">False</property>
+	      <property name="selectable">False</property>
+	      <property name="xalign">0.5</property>
+	      <property name="yalign">0.5</property>
+	      <property name="xpad">0</property>
+	      <property name="ypad">0</property>
+	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	      <property name="width_chars">-1</property>
+	      <property name="single_line_mode">False</property>
+	      <property name="angle">0</property>
+	    </widget>
+	    <packing>
+	      <property name="type">tab</property>
+	    </packing>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">True</property>
+	  <property name="fill">True</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkHButtonBox" id="hbuttonbox2">
+	  <property name="border_width">5</property>
+	  <property name="visible">True</property>
+	  <property name="layout_style">GTK_BUTTONBOX_DEFAULT_STYLE</property>
+	  <property name="spacing">0</property>
+
+	  <child>
+	    <widget class="GtkButton" id="about_close">
+	      <property name="visible">True</property>
+	      <property name="can_default">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label">gtk-close</property>
+	      <property name="use_stock">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	      <signal name="clicked" handler="on_about_window_close_button" object="gtkpod_about_window" last_modification_time="Sat, 30 Nov 2002 17:00:55 GMT"/>
+	    </widget>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">False</property>
+	</packing>
+      </child>
+    </widget>
+  </child>
+</widget>
+
+<widget class="GtkWindow" id="special_sorttab">
+  <property name="title" translatable="yes">special_sorttab -- Don't translate!</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_NONE</property>
+  <property name="modal">False</property>
+  <property name="resizable">True</property>
+  <property name="destroy_with_parent">False</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
+  <property name="urgency_hint">False</property>
+
+  <child>
+    <widget class="GtkViewport" id="special_viewport">
+      <property name="visible">True</property>
+      <property name="shadow_type">GTK_SHADOW_IN</property>
+
+      <child>
+	<widget class="GtkVBox" id="vbox37">
+	  <property name="visible">True</property>
+	  <property name="homogeneous">False</property>
+	  <property name="spacing">0</property>
+
+	  <child>
+	    <widget class="GtkHBox" id="hbox20">
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">0</property>
+
+	      <child>
+		<widget class="GtkLabel" id="label52">
+		  <property name="visible">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="label" translatable="yes"> Logic: </property>
+		  <property name="use_underline">False</property>
+		  <property name="use_markup">False</property>
+		  <property name="justify">GTK_JUSTIFY_LEFT</property>
+		  <property name="wrap">False</property>
+		  <property name="selectable">True</property>
+		  <property name="xalign">0.5</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xpad">0</property>
+		  <property name="ypad">0</property>
+		  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		  <property name="width_chars">-1</property>
+		  <property name="single_line_mode">False</property>
+		  <property name="angle">0</property>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkRadioButton" id="sp_or_button">
+		  <property name="visible">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="label" translatable="yes">Any (OR)</property>
+		  <property name="use_underline">True</property>
+		  <property name="relief">GTK_RELIEF_NORMAL</property>
+		  <property name="focus_on_click">True</property>
+		  <property name="active">False</property>
+		  <property name="inconsistent">False</property>
+		  <property name="draw_indicator">True</property>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkRadioButton" id="sp_and_button">
+		  <property name="visible">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="label" translatable="yes">All (AND)</property>
+		  <property name="use_underline">True</property>
+		  <property name="relief">GTK_RELIEF_NORMAL</property>
+		  <property name="focus_on_click">True</property>
+		  <property name="active">False</property>
+		  <property name="inconsistent">False</property>
+		  <property name="draw_indicator">True</property>
+		  <property name="group">sp_or_button</property>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkHSeparator" id="hseparator1">
+	      <property name="visible">True</property>
+	    </widget>
+	    <packing>
+	      <property name="padding">2</property>
+	      <property name="expand">False</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkTable" id="table6">
+	      <property name="visible">True</property>
+	      <property name="n_rows">5</property>
+	      <property name="n_columns">2</property>
+	      <property name="homogeneous">False</property>
+	      <property name="row_spacing">0</property>
+	      <property name="column_spacing">0</property>
+
+	      <child>
+		<widget class="GtkHBox" id="hbox14">
+		  <property name="visible">True</property>
+		  <property name="homogeneous">False</property>
+		  <property name="spacing">0</property>
+
+		  <child>
+		    <widget class="GtkCheckButton" id="sp_rating0">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="label" translatable="yes">0</property>
+		      <property name="use_underline">True</property>
+		      <property name="relief">GTK_RELIEF_NORMAL</property>
+		      <property name="focus_on_click">True</property>
+		      <property name="active">False</property>
+		      <property name="inconsistent">False</property>
+		      <property name="draw_indicator">True</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkCheckButton" id="sp_rating1">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="label" translatable="yes">1</property>
+		      <property name="use_underline">True</property>
+		      <property name="relief">GTK_RELIEF_NORMAL</property>
+		      <property name="focus_on_click">True</property>
+		      <property name="active">False</property>
+		      <property name="inconsistent">False</property>
+		      <property name="draw_indicator">True</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkCheckButton" id="sp_rating2">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="label" translatable="yes">2</property>
+		      <property name="use_underline">True</property>
+		      <property name="relief">GTK_RELIEF_NORMAL</property>
+		      <property name="focus_on_click">True</property>
+		      <property name="active">False</property>
+		      <property name="inconsistent">False</property>
+		      <property name="draw_indicator">True</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkCheckButton" id="sp_rating3">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="label" translatable="yes">3</property>
+		      <property name="use_underline">True</property>
+		      <property name="relief">GTK_RELIEF_NORMAL</property>
+		      <property name="focus_on_click">True</property>
+		      <property name="active">False</property>
+		      <property name="inconsistent">False</property>
+		      <property name="draw_indicator">True</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkCheckButton" id="sp_rating4">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="label" translatable="yes">4</property>
+		      <property name="use_underline">True</property>
+		      <property name="relief">GTK_RELIEF_NORMAL</property>
+		      <property name="focus_on_click">True</property>
+		      <property name="active">False</property>
+		      <property name="inconsistent">False</property>
+		      <property name="draw_indicator">True</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkCheckButton" id="sp_rating5">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="label" translatable="yes">5</property>
+		      <property name="use_underline">True</property>
+		      <property name="relief">GTK_RELIEF_NORMAL</property>
+		      <property name="focus_on_click">True</property>
+		      <property name="active">False</property>
+		      <property name="inconsistent">False</property>
+		      <property name="draw_indicator">True</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="left_attach">1</property>
+		  <property name="right_attach">2</property>
+		  <property name="top_attach">0</property>
+		  <property name="bottom_attach">1</property>
+		  <property name="y_options">fill</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkHBox" id="hbox15">
+		  <property name="visible">True</property>
+		  <property name="homogeneous">False</property>
+		  <property name="spacing">0</property>
+
+		  <child>
+		    <widget class="GtkHBox" id="hbox23">
+		      <property name="visible">True</property>
+		      <property name="homogeneous">False</property>
+		      <property name="spacing">0</property>
+
+		      <child>
+			<widget class="GtkSpinButton" id="sp_playcount_low">
+			  <property name="visible">True</property>
+			  <property name="tooltip" translatable="yes">Select '0' for no lower limit.</property>
+			  <property name="can_focus">True</property>
+			  <property name="climb_rate">1</property>
+			  <property name="digits">0</property>
+			  <property name="numeric">False</property>
+			  <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+			  <property name="snap_to_ticks">False</property>
+			  <property name="wrap">False</property>
+			  <property name="adjustment">1 0 2147480000 1 10 10</property>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">True</property>
+			  <property name="fill">True</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkLabel" id="label54">
+			  <property name="visible">True</property>
+			  <property name="can_focus">True</property>
+			  <property name="label" translatable="yes"> &lt;= cts &lt;= </property>
+			  <property name="use_underline">False</property>
+			  <property name="use_markup">False</property>
+			  <property name="justify">GTK_JUSTIFY_LEFT</property>
+			  <property name="wrap">False</property>
+			  <property name="selectable">True</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			  <property name="width_chars">-1</property>
+			  <property name="single_line_mode">False</property>
+			  <property name="angle">0</property>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">False</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkSpinButton" id="sp_playcount_high">
+			  <property name="visible">True</property>
+			  <property name="tooltip" translatable="yes">Select '-1' for no upper limit.</property>
+			  <property name="can_focus">True</property>
+			  <property name="climb_rate">1</property>
+			  <property name="digits">0</property>
+			  <property name="numeric">False</property>
+			  <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+			  <property name="snap_to_ticks">False</property>
+			  <property name="wrap">False</property>
+			  <property name="adjustment">1 -1 2147480000 1 10 10</property>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">True</property>
+			  <property name="fill">True</property>
+			</packing>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">True</property>
+		      <property name="fill">True</property>
+		    </packing>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="left_attach">1</property>
+		  <property name="right_attach">2</property>
+		  <property name="top_attach">1</property>
+		  <property name="bottom_attach">2</property>
+		  <property name="x_options">fill</property>
+		  <property name="y_options">fill</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkHBox" id="hbox17">
+		  <property name="visible">True</property>
+		  <property name="homogeneous">False</property>
+		  <property name="spacing">0</property>
+
+		  <child>
+		    <widget class="GtkEntry" id="sp_played_entry">
+		      <property name="visible">True</property>
+		      <property name="tooltip" translatable="yes">'DD/MM/YYYY HH:MM &lt; d &lt; DD/MM/YYYY HH:MM' or similar. Press 'enter' when finished.</property>
+		      <property name="can_focus">True</property>
+		      <property name="editable">True</property>
+		      <property name="visibility">True</property>
+		      <property name="max_length">0</property>
+		      <property name="text" translatable="yes"></property>
+		      <property name="has_frame">True</property>
+		      <property name="invisible_char">*</property>
+		      <property name="activates_default">False</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">True</property>
+		      <property name="fill">True</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkLabel" id="label49">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes"></property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">False</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkButton" id="sp_played_cal_button">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="label" translatable="yes">Calendar</property>
+		      <property name="use_underline">True</property>
+		      <property name="relief">GTK_RELIEF_NORMAL</property>
+		      <property name="focus_on_click">True</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="left_attach">1</property>
+		  <property name="right_attach">2</property>
+		  <property name="top_attach">2</property>
+		  <property name="bottom_attach">3</property>
+		  <property name="x_options">fill</property>
+		  <property name="y_options">fill</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkHBox" id="hbox18">
+		  <property name="visible">True</property>
+		  <property name="homogeneous">False</property>
+		  <property name="spacing">0</property>
+
+		  <child>
+		    <widget class="GtkEntry" id="sp_modified_entry">
+		      <property name="visible">True</property>
+		      <property name="tooltip" translatable="yes">'DD/MM/YYYY HH:MM &lt; d &lt; DD/MM/YYYY HH:MM' or similar. Press 'enter' when finished.</property>
+		      <property name="can_focus">True</property>
+		      <property name="editable">True</property>
+		      <property name="visibility">True</property>
+		      <property name="max_length">0</property>
+		      <property name="text" translatable="yes"></property>
+		      <property name="has_frame">True</property>
+		      <property name="invisible_char">*</property>
+		      <property name="activates_default">False</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">True</property>
+		      <property name="fill">True</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkLabel" id="label50">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes"></property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">False</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkButton" id="sp_modified_cal_button">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="label" translatable="yes">Calendar</property>
+		      <property name="use_underline">True</property>
+		      <property name="relief">GTK_RELIEF_NORMAL</property>
+		      <property name="focus_on_click">True</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="left_attach">1</property>
+		  <property name="right_attach">2</property>
+		  <property name="top_attach">3</property>
+		  <property name="bottom_attach">4</property>
+		  <property name="x_options">fill</property>
+		  <property name="y_options">fill</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkCheckButton" id="sp_playcount_button">
+		  <property name="visible">True</property>
+		  <property name="tooltip" translatable="yes">Specify interval</property>
+		  <property name="can_focus">True</property>
+		  <property name="label" translatable="yes">Playcount</property>
+		  <property name="use_underline">True</property>
+		  <property name="relief">GTK_RELIEF_NORMAL</property>
+		  <property name="focus_on_click">True</property>
+		  <property name="active">False</property>
+		  <property name="inconsistent">False</property>
+		  <property name="draw_indicator">True</property>
+		</widget>
+		<packing>
+		  <property name="left_attach">0</property>
+		  <property name="right_attach">1</property>
+		  <property name="top_attach">1</property>
+		  <property name="bottom_attach">2</property>
+		  <property name="x_padding">2</property>
+		  <property name="x_options">fill</property>
+		  <property name="y_options"></property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkCheckButton" id="sp_rating_button">
+		  <property name="visible">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="label" translatable="yes">Rating</property>
+		  <property name="use_underline">True</property>
+		  <property name="relief">GTK_RELIEF_NORMAL</property>
+		  <property name="focus_on_click">True</property>
+		  <property name="active">False</property>
+		  <property name="inconsistent">False</property>
+		  <property name="draw_indicator">True</property>
+		</widget>
+		<packing>
+		  <property name="left_attach">0</property>
+		  <property name="right_attach">1</property>
+		  <property name="top_attach">0</property>
+		  <property name="bottom_attach">1</property>
+		  <property name="x_padding">2</property>
+		  <property name="x_options">fill</property>
+		  <property name="y_options"></property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkCheckButton" id="sp_played_button">
+		  <property name="visible">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="label" translatable="yes">Played</property>
+		  <property name="use_underline">True</property>
+		  <property name="relief">GTK_RELIEF_NORMAL</property>
+		  <property name="focus_on_click">True</property>
+		  <property name="active">False</property>
+		  <property name="inconsistent">False</property>
+		  <property name="draw_indicator">True</property>
+		</widget>
+		<packing>
+		  <property name="left_attach">0</property>
+		  <property name="right_attach">1</property>
+		  <property name="top_attach">2</property>
+		  <property name="bottom_attach">3</property>
+		  <property name="x_padding">2</property>
+		  <property name="x_options">fill</property>
+		  <property name="y_options"></property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkCheckButton" id="sp_modified_button">
+		  <property name="visible">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="label" translatable="yes">Modified</property>
+		  <property name="use_underline">True</property>
+		  <property name="relief">GTK_RELIEF_NORMAL</property>
+		  <property name="focus_on_click">True</property>
+		  <property name="active">False</property>
+		  <property name="inconsistent">False</property>
+		  <property name="draw_indicator">True</property>
+		</widget>
+		<packing>
+		  <property name="left_attach">0</property>
+		  <property name="right_attach">1</property>
+		  <property name="top_attach">3</property>
+		  <property name="bottom_attach">4</property>
+		  <property name="x_padding">2</property>
+		  <property name="x_options">fill</property>
+		  <property name="y_options"></property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkHBox" id="hbox57">
+		  <property name="visible">True</property>
+		  <property name="homogeneous">False</property>
+		  <property name="spacing">0</property>
+
+		  <child>
+		    <widget class="GtkEntry" id="sp_added_entry">
+		      <property name="visible">True</property>
+		      <property name="tooltip" translatable="yes">'DD/MM/YYYY HH:MM &lt; d &lt; DD/MM/YYYY HH:MM' or similar. Press 'enter' when finished.</property>
+		      <property name="can_focus">True</property>
+		      <property name="editable">True</property>
+		      <property name="visibility">True</property>
+		      <property name="max_length">0</property>
+		      <property name="text" translatable="yes"></property>
+		      <property name="has_frame">True</property>
+		      <property name="invisible_char">*</property>
+		      <property name="activates_default">False</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">True</property>
+		      <property name="fill">True</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkLabel" id="label159">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes"></property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">False</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkButton" id="sp_added_cal_button">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="label" translatable="yes">Calendar</property>
+		      <property name="use_underline">True</property>
+		      <property name="relief">GTK_RELIEF_NORMAL</property>
+		      <property name="focus_on_click">True</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="left_attach">1</property>
+		  <property name="right_attach">2</property>
+		  <property name="top_attach">4</property>
+		  <property name="bottom_attach">5</property>
+		  <property name="x_options">fill</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkCheckButton" id="sp_added_button">
+		  <property name="visible">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="label" translatable="yes">Added</property>
+		  <property name="use_underline">True</property>
+		  <property name="relief">GTK_RELIEF_NORMAL</property>
+		  <property name="focus_on_click">True</property>
+		  <property name="active">False</property>
+		  <property name="inconsistent">False</property>
+		  <property name="draw_indicator">True</property>
+		</widget>
+		<packing>
+		  <property name="left_attach">0</property>
+		  <property name="right_attach">1</property>
+		  <property name="top_attach">4</property>
+		  <property name="bottom_attach">5</property>
+		  <property name="x_options">fill</property>
+		  <property name="y_options"></property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkHSeparator" id="hseparator2">
+	      <property name="visible">True</property>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkHBox" id="hbox21">
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">0</property>
+
+	      <child>
+		<widget class="GtkButton" id="sp_go">
+		  <property name="visible">True</property>
+		  <property name="tooltip" translatable="yes">Display tracks that match the criteria entered above.</property>
+		  <property name="can_focus">True</property>
+		  <property name="relief">GTK_RELIEF_NORMAL</property>
+		  <property name="focus_on_click">True</property>
+
+		  <child>
+		    <widget class="GtkAlignment" id="alignment1">
+		      <property name="visible">True</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xscale">0</property>
+		      <property name="yscale">0</property>
+		      <property name="top_padding">0</property>
+		      <property name="bottom_padding">0</property>
+		      <property name="left_padding">0</property>
+		      <property name="right_padding">0</property>
+
+		      <child>
+			<widget class="GtkHBox" id="hbox22">
+			  <property name="visible">True</property>
+			  <property name="homogeneous">False</property>
+			  <property name="spacing">2</property>
+
+			  <child>
+			    <widget class="GtkImage" id="image1056">
+			      <property name="visible">True</property>
+			      <property name="stock">gtk-execute</property>
+			      <property name="icon_size">4</property>
+			      <property name="xalign">0.5</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">False</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="label53">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">_Display</property>
+			      <property name="use_underline">True</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0.5</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">False</property>
+			    </packing>
+			  </child>
+			</widget>
+		      </child>
+		    </widget>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">2</property>
+		  <property name="expand">False</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkCheckButton" id="sp_go_always">
+		  <property name="visible">True</property>
+		  <property name="tooltip" translatable="yes">Automatically start displaying tracks that match the criteria entered above. If not selected, you must press 'Display' to start displaying.</property>
+		  <property name="can_focus">True</property>
+		  <property name="label" translatable="yes">Start display automatically</property>
+		  <property name="use_underline">True</property>
+		  <property name="relief">GTK_RELIEF_NORMAL</property>
+		  <property name="focus_on_click">True</property>
+		  <property name="active">False</property>
+		  <property name="inconsistent">False</property>
+		  <property name="draw_indicator">True</property>
+		</widget>
+		<packing>
+		  <property name="padding">2</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
+	    </packing>
+	  </child>
+	</widget>
+      </child>
+    </widget>
+  </child>
+</widget>
+
+<widget class="GtkWindow" id="calendar_window">
+  <property name="title" translatable="yes">Calendar</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_NONE</property>
+  <property name="modal">False</property>
+  <property name="default_width">480</property>
+  <property name="default_height">290</property>
+  <property name="resizable">True</property>
+  <property name="destroy_with_parent">False</property>
+  <property name="icon">gtkpod-icon-48.png</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
+  <property name="urgency_hint">False</property>
+
+  <child>
+    <widget class="GtkScrolledWindow" id="scrolledwindow4">
+      <property name="visible">True</property>
+      <property name="can_focus">True</property>
+      <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+      <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+      <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
+      <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+      <child>
+	<widget class="GtkViewport" id="viewport1">
+	  <property name="visible">True</property>
+	  <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
+
+	  <child>
+	    <widget class="GtkVBox" id="vbox43">
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">0</property>
+
+	      <child>
+		<widget class="GtkHBox" id="hbox29">
+		  <property name="visible">True</property>
+		  <property name="homogeneous">False</property>
+		  <property name="spacing">0</property>
+
+		  <child>
+		    <widget class="GtkLabel" id="label64">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="label" translatable="yes">Sorttab: </property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">False</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">True</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">3</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkSpinButton" id="sorttab_num_spin">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="climb_rate">1</property>
+		      <property name="digits">0</property>
+		      <property name="numeric">False</property>
+		      <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+		      <property name="snap_to_ticks">False</property>
+		      <property name="wrap">False</property>
+		      <property name="adjustment">1 0 100 1 10 10</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkLabel" id="label65">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">     </property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">False</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkLabel" id="label66">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="label" translatable="yes">Category: </property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">False</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">True</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">3</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkCombo" id="cat_combo">
+		      <property name="visible">True</property>
+		      <property name="value_in_list">True</property>
+		      <property name="allow_empty">False</property>
+		      <property name="case_sensitive">False</property>
+		      <property name="enable_arrow_keys">True</property>
+		      <property name="enable_arrows_always">False</property>
+
+		      <child internal-child="entry">
+			<widget class="GtkEntry" id="cat_entry">
+			  <property name="visible">True</property>
+			  <property name="can_focus">True</property>
+			  <property name="editable">True</property>
+			  <property name="visibility">True</property>
+			  <property name="max_length">0</property>
+			  <property name="text" translatable="yes"></property>
+			  <property name="has_frame">True</property>
+			  <property name="invisible_char">*</property>
+			  <property name="activates_default">False</property>
+			</widget>
+		      </child>
+
+		      <child internal-child="list">
+			<widget class="GtkList" id="cat_list">
+			  <property name="visible">True</property>
+			  <property name="selection_mode">GTK_SELECTION_BROWSE</property>
+			</widget>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">2</property>
+		  <property name="expand">False</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkHSeparator" id="hseparator6">
+		  <property name="visible">True</property>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkLabel" id="label63">
+		  <property name="visible">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="label" translatable="yes">Please specify a time interval</property>
+		  <property name="use_underline">False</property>
+		  <property name="use_markup">False</property>
+		  <property name="justify">GTK_JUSTIFY_LEFT</property>
+		  <property name="wrap">True</property>
+		  <property name="selectable">True</property>
+		  <property name="xalign">0.5</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xpad">0</property>
+		  <property name="ypad">0</property>
+		  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		  <property name="width_chars">-1</property>
+		  <property name="single_line_mode">False</property>
+		  <property name="angle">0</property>
+		</widget>
+		<packing>
+		  <property name="padding">3</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkHSeparator" id="hseparator5">
+		  <property name="visible">True</property>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkHBox" id="hbox25">
+		  <property name="visible">True</property>
+		  <property name="homogeneous">False</property>
+		  <property name="spacing">0</property>
+
+		  <child>
+		    <widget class="GtkVBox" id="vbox44">
+		      <property name="visible">True</property>
+		      <property name="homogeneous">False</property>
+		      <property name="spacing">0</property>
+
+		      <child>
+			<widget class="GtkLabel" id="label57">
+			  <property name="visible">True</property>
+			  <property name="can_focus">True</property>
+			  <property name="label" translatable="yes">Lower Margin</property>
+			  <property name="use_underline">False</property>
+			  <property name="use_markup">False</property>
+			  <property name="justify">GTK_JUSTIFY_LEFT</property>
+			  <property name="wrap">False</property>
+			  <property name="selectable">True</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			  <property name="width_chars">-1</property>
+			  <property name="single_line_mode">False</property>
+			  <property name="angle">0</property>
+			</widget>
+			<packing>
+			  <property name="padding">2</property>
+			  <property name="expand">False</property>
+			  <property name="fill">False</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkVBox" id="lower_cal_box">
+			  <property name="visible">True</property>
+			  <property name="homogeneous">False</property>
+			  <property name="spacing">0</property>
+
+			  <child>
+			    <widget class="GtkCalendar" id="lower_cal">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="display_options">GTK_CALENDAR_SHOW_HEADING|GTK_CALENDAR_SHOW_DAY_NAMES|GTK_CALENDAR_WEEK_START_MONDAY</property>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">True</property>
+			      <property name="fill">True</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHBox" id="lower_time_fullbox">
+			      <property name="visible">True</property>
+			      <property name="homogeneous">False</property>
+			      <property name="spacing">0</property>
+
+			      <child>
+				<widget class="GtkCheckButton" id="lower_time">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="label" translatable="yes">Time:</property>
+				  <property name="use_underline">True</property>
+				  <property name="relief">GTK_RELIEF_NORMAL</property>
+				  <property name="focus_on_click">True</property>
+				  <property name="active">False</property>
+				  <property name="inconsistent">False</property>
+				  <property name="draw_indicator">True</property>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkHBox" id="lower_time_box">
+				  <property name="visible">True</property>
+				  <property name="homogeneous">False</property>
+				  <property name="spacing">0</property>
+
+				  <child>
+				    <widget class="GtkSpinButton" id="lower_hours">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="climb_rate">1</property>
+				      <property name="digits">0</property>
+				      <property name="numeric">True</property>
+				      <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+				      <property name="snap_to_ticks">False</property>
+				      <property name="wrap">True</property>
+				      <property name="adjustment">0 0 23 1 2 10</property>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">True</property>
+				      <property name="fill">True</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="label59">
+				      <property name="visible">True</property>
+				      <property name="label" translatable="yes">:</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0.5</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkSpinButton" id="lower_minutes">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="climb_rate">1</property>
+				      <property name="digits">0</property>
+				      <property name="numeric">True</property>
+				      <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+				      <property name="snap_to_ticks">False</property>
+				      <property name="wrap">True</property>
+				      <property name="adjustment">3 0 59 1 5 2</property>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">True</property>
+				      <property name="fill">True</property>
+				    </packing>
+				  </child>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">True</property>
+			      <property name="fill">True</property>
+			    </packing>
+			  </child>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">False</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkHSeparator" id="hseparator3">
+			  <property name="visible">True</property>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">False</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkCheckButton" id="no_lower_margin">
+			  <property name="visible">True</property>
+			  <property name="can_focus">True</property>
+			  <property name="label" translatable="yes">No lower margin</property>
+			  <property name="use_underline">True</property>
+			  <property name="relief">GTK_RELIEF_NORMAL</property>
+			  <property name="focus_on_click">True</property>
+			  <property name="active">False</property>
+			  <property name="inconsistent">False</property>
+			  <property name="draw_indicator">True</property>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">False</property>
+			</packing>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">True</property>
+		      <property name="fill">True</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkVSeparator" id="vseparator1">
+		      <property name="visible">True</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkVBox" id="vbox47">
+		      <property name="visible">True</property>
+		      <property name="homogeneous">False</property>
+		      <property name="spacing">0</property>
+
+		      <child>
+			<widget class="GtkLabel" id="label58">
+			  <property name="visible">True</property>
+			  <property name="can_focus">True</property>
+			  <property name="label" translatable="yes">Upper margin</property>
+			  <property name="use_underline">False</property>
+			  <property name="use_markup">False</property>
+			  <property name="justify">GTK_JUSTIFY_LEFT</property>
+			  <property name="wrap">False</property>
+			  <property name="selectable">True</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			  <property name="width_chars">-1</property>
+			  <property name="single_line_mode">False</property>
+			  <property name="angle">0</property>
+			</widget>
+			<packing>
+			  <property name="padding">2</property>
+			  <property name="expand">False</property>
+			  <property name="fill">False</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkVBox" id="upper_cal_box">
+			  <property name="visible">True</property>
+			  <property name="homogeneous">False</property>
+			  <property name="spacing">0</property>
+
+			  <child>
+			    <widget class="GtkCalendar" id="upper_cal">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="display_options">GTK_CALENDAR_SHOW_HEADING|GTK_CALENDAR_SHOW_DAY_NAMES|GTK_CALENDAR_WEEK_START_MONDAY</property>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">True</property>
+			      <property name="fill">True</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHBox" id="upper_time_fullbox">
+			      <property name="visible">True</property>
+			      <property name="homogeneous">False</property>
+			      <property name="spacing">0</property>
+
+			      <child>
+				<widget class="GtkCheckButton" id="upper_time">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="label" translatable="yes">Time:</property>
+				  <property name="use_underline">True</property>
+				  <property name="relief">GTK_RELIEF_NORMAL</property>
+				  <property name="focus_on_click">True</property>
+				  <property name="active">False</property>
+				  <property name="inconsistent">False</property>
+				  <property name="draw_indicator">True</property>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkHBox" id="upper_time_box">
+				  <property name="visible">True</property>
+				  <property name="homogeneous">False</property>
+				  <property name="spacing">0</property>
+
+				  <child>
+				    <widget class="GtkSpinButton" id="upper_hours">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="climb_rate">1</property>
+				      <property name="digits">0</property>
+				      <property name="numeric">True</property>
+				      <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+				      <property name="snap_to_ticks">False</property>
+				      <property name="wrap">True</property>
+				      <property name="adjustment">0 0 23 1 2 10</property>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">True</property>
+				      <property name="fill">True</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="label62">
+				      <property name="visible">True</property>
+				      <property name="label" translatable="yes">:</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0.5</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkSpinButton" id="upper_minutes">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="climb_rate">1</property>
+				      <property name="digits">0</property>
+				      <property name="numeric">True</property>
+				      <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+				      <property name="snap_to_ticks">False</property>
+				      <property name="wrap">True</property>
+				      <property name="adjustment">3 0 59 1 5 2</property>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">True</property>
+				      <property name="fill">True</property>
+				    </packing>
+				  </child>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">True</property>
+			      <property name="fill">True</property>
+			    </packing>
+			  </child>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">False</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkHSeparator" id="hseparator4">
+			  <property name="visible">True</property>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">False</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkCheckButton" id="no_upper_margin">
+			  <property name="visible">True</property>
+			  <property name="can_focus">True</property>
+			  <property name="label" translatable="yes">No upper margin</property>
+			  <property name="use_underline">True</property>
+			  <property name="relief">GTK_RELIEF_NORMAL</property>
+			  <property name="focus_on_click">True</property>
+			  <property name="active">False</property>
+			  <property name="inconsistent">False</property>
+			  <property name="draw_indicator">True</property>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">False</property>
+			</packing>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">True</property>
+		      <property name="fill">True</property>
+		    </packing>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkHSeparator" id="hseparator7">
+		  <property name="visible">True</property>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkHButtonBox" id="hbuttonbox7">
+		  <property name="visible">True</property>
+		  <property name="layout_style">GTK_BUTTONBOX_SPREAD</property>
+		  <property name="spacing">0</property>
+
+		  <child>
+		    <widget class="GtkButton" id="cal_apply">
+		      <property name="visible">True</property>
+		      <property name="can_default">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="label">gtk-apply</property>
+		      <property name="use_stock">True</property>
+		      <property name="relief">GTK_RELIEF_NORMAL</property>
+		      <property name="focus_on_click">True</property>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkButton" id="cal_cancel">
+		      <property name="visible">True</property>
+		      <property name="can_default">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="label">gtk-cancel</property>
+		      <property name="use_stock">True</property>
+		      <property name="relief">GTK_RELIEF_NORMAL</property>
+		      <property name="focus_on_click">True</property>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkButton" id="cal_ok">
+		      <property name="visible">True</property>
+		      <property name="can_default">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="label">gtk-ok</property>
+		      <property name="use_stock">True</property>
+		      <property name="relief">GTK_RELIEF_NORMAL</property>
+		      <property name="focus_on_click">True</property>
+		    </widget>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">2</property>
+		  <property name="expand">False</property>
+		  <property name="fill">True</property>
+		  <property name="pack_type">GTK_PACK_END</property>
+		</packing>
+	      </child>
+	    </widget>
+	  </child>
+	</widget>
+      </child>
+    </widget>
+  </child>
+</widget>
+
+<widget class="GtkWindow" id="sort_window">
+  <property name="title" translatable="yes">Sorting Options</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_NONE</property>
+  <property name="modal">False</property>
+  <property name="resizable">True</property>
+  <property name="destroy_with_parent">False</property>
+  <property name="icon">gtkpod-icon-48.png</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
+  <property name="urgency_hint">False</property>
+  <signal name="delete_event" handler="on_sort_window_delete_event" last_modification_time="Mon, 22 Sep 2003 11:54:32 GMT"/>
+
+  <child>
+    <widget class="GtkVBox" id="vbox52">
+      <property name="border_width">6</property>
+      <property name="visible">True</property>
+      <property name="homogeneous">False</property>
+      <property name="spacing">4</property>
+
+      <child>
+	<widget class="GtkVBox" id="vbox135">
+	  <property name="visible">True</property>
+	  <property name="homogeneous">False</property>
+	  <property name="spacing">6</property>
+
+	  <child>
+	    <widget class="GtkLabel" id="label283">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">&lt;b&gt;Sort Order&lt;/b&gt;</property>
+	      <property name="use_underline">False</property>
+	      <property name="use_markup">True</property>
+	      <property name="justify">GTK_JUSTIFY_LEFT</property>
+	      <property name="wrap">False</property>
+	      <property name="selectable">False</property>
+	      <property name="xalign">0</property>
+	      <property name="yalign">0.5</property>
+	      <property name="xpad">0</property>
+	      <property name="ypad">0</property>
+	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	      <property name="width_chars">-1</property>
+	      <property name="single_line_mode">False</property>
+	      <property name="angle">0</property>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkHBox" id="hbox128">
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">0</property>
+
+	      <child>
+		<widget class="GtkLabel" id="label284">
+		  <property name="visible">True</property>
+		  <property name="label" translatable="yes">    </property>
+		  <property name="use_underline">False</property>
+		  <property name="use_markup">False</property>
+		  <property name="justify">GTK_JUSTIFY_LEFT</property>
+		  <property name="wrap">False</property>
+		  <property name="selectable">False</property>
+		  <property name="xalign">0.5</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xpad">0</property>
+		  <property name="ypad">0</property>
+		  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		  <property name="width_chars">-1</property>
+		  <property name="single_line_mode">False</property>
+		  <property name="angle">0</property>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkVBox" id="vbox53">
+		  <property name="visible">True</property>
+		  <property name="homogeneous">False</property>
+		  <property name="spacing">0</property>
+
+		  <child>
+		    <widget class="GtkLabel" id="label296">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="label" translatable="yes">In order to save the displayed track order to the iPod choose 'Save Displayed Track Order' from the 'Edit' menu or select 'Auto Store' below.</property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">False</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">True</property>
+		      <property name="selectable">True</property>
+		      <property name="xalign">0.0399999991059</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">4</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkHBox" id="hbox30">
+		      <property name="visible">True</property>
+		      <property name="homogeneous">False</property>
+		      <property name="spacing">0</property>
+
+		      <child>
+			<widget class="GtkTable" id="table11">
+			  <property name="border_width">4</property>
+			  <property name="visible">True</property>
+			  <property name="n_rows">9</property>
+			  <property name="n_columns">11</property>
+			  <property name="homogeneous">False</property>
+			  <property name="row_spacing">0</property>
+			  <property name="column_spacing">0</property>
+
+			  <child>
+			    <widget class="GtkHBox" id="hbox34">
+			      <property name="visible">True</property>
+			      <property name="homogeneous">True</property>
+			      <property name="spacing">0</property>
+
+			      <child>
+				<widget class="GtkRadioButton" id="st_ascend">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="relief">GTK_RELIEF_NORMAL</property>
+				  <property name="focus_on_click">True</property>
+				  <property name="active">False</property>
+				  <property name="inconsistent">False</property>
+				  <property name="draw_indicator">True</property>
+				  <signal name="toggled" handler="on_st_ascend_toggled" last_modification_time="Mon, 22 Sep 2003 11:25:58 GMT"/>
+
+				  <child>
+				    <widget class="GtkImage" id="image1931">
+				      <property name="visible">True</property>
+				      <property name="stock">gtk-sort-ascending</property>
+				      <property name="icon_size">4</property>
+				      <property name="xalign">0.5</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				    </widget>
+				  </child>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">3</property>
+			      <property name="right_attach">4</property>
+			      <property name="top_attach">5</property>
+			      <property name="bottom_attach">6</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options">fill</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHBox" id="hbox35">
+			      <property name="visible">True</property>
+			      <property name="homogeneous">True</property>
+			      <property name="spacing">0</property>
+
+			      <child>
+				<widget class="GtkRadioButton" id="st_descend">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="relief">GTK_RELIEF_NORMAL</property>
+				  <property name="focus_on_click">True</property>
+				  <property name="active">False</property>
+				  <property name="inconsistent">False</property>
+				  <property name="draw_indicator">True</property>
+				  <property name="group">st_ascend</property>
+				  <signal name="toggled" handler="on_st_descend_toggled" last_modification_time="Mon, 22 Sep 2003 11:25:53 GMT"/>
+
+				  <child>
+				    <widget class="GtkImage" id="image1932">
+				      <property name="visible">True</property>
+				      <property name="stock">gtk-sort-descending</property>
+				      <property name="icon_size">4</property>
+				      <property name="xalign">0.5</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				    </widget>
+				  </child>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">5</property>
+			      <property name="right_attach">6</property>
+			      <property name="top_attach">5</property>
+			      <property name="bottom_attach">6</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options">fill</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHBox" id="hbox36">
+			      <property name="visible">True</property>
+			      <property name="homogeneous">True</property>
+			      <property name="spacing">0</property>
+
+			      <child>
+				<widget class="GtkRadioButton" id="st_none">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="relief">GTK_RELIEF_NORMAL</property>
+				  <property name="focus_on_click">True</property>
+				  <property name="active">False</property>
+				  <property name="inconsistent">False</property>
+				  <property name="draw_indicator">True</property>
+				  <property name="group">st_ascend</property>
+				  <signal name="toggled" handler="on_st_none_toggled" last_modification_time="Mon, 22 Sep 2003 11:25:46 GMT"/>
+
+				  <child>
+				    <widget class="GtkImage" id="image1933">
+				      <property name="visible">True</property>
+				      <property name="stock">gtk-undo</property>
+				      <property name="icon_size">4</property>
+				      <property name="xalign">0.5</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				    </widget>
+				  </child>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">7</property>
+			      <property name="right_attach">8</property>
+			      <property name="top_attach">5</property>
+			      <property name="bottom_attach">6</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options">fill</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHBox" id="hbox33">
+			      <property name="visible">True</property>
+			      <property name="homogeneous">True</property>
+			      <property name="spacing">0</property>
+
+			      <child>
+				<widget class="GtkRadioButton" id="pm_none">
+				  <property name="can_focus">True</property>
+				  <property name="relief">GTK_RELIEF_NORMAL</property>
+				  <property name="focus_on_click">True</property>
+				  <property name="active">False</property>
+				  <property name="inconsistent">False</property>
+				  <property name="draw_indicator">True</property>
+				  <signal name="toggled" handler="on_pm_none_toggled" last_modification_time="Mon, 22 Sep 2003 11:26:52 GMT"/>
+
+				  <child>
+				    <widget class="GtkImage" id="image1930">
+				      <property name="visible">True</property>
+				      <property name="stock">gtk-undo</property>
+				      <property name="icon_size">4</property>
+				      <property name="xalign">0.5</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				    </widget>
+				  </child>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">7</property>
+			      <property name="right_attach">8</property>
+			      <property name="top_attach">3</property>
+			      <property name="bottom_attach">4</property>
+			      <property name="y_options">fill</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHBox" id="hbox32">
+			      <property name="homogeneous">True</property>
+			      <property name="spacing">0</property>
+
+			      <child>
+				<widget class="GtkRadioButton" id="pm_descend">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="relief">GTK_RELIEF_NORMAL</property>
+				  <property name="focus_on_click">True</property>
+				  <property name="active">False</property>
+				  <property name="inconsistent">False</property>
+				  <property name="draw_indicator">True</property>
+				  <property name="group">pm_none</property>
+				  <signal name="toggled" handler="on_pm_descend_toggled" last_modification_time="Mon, 22 Sep 2003 11:26:59 GMT"/>
+
+				  <child>
+				    <widget class="GtkImage" id="image1929">
+				      <property name="visible">True</property>
+				      <property name="stock">gtk-sort-descending</property>
+				      <property name="icon_size">4</property>
+				      <property name="xalign">0.5</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				    </widget>
+				  </child>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">5</property>
+			      <property name="right_attach">6</property>
+			      <property name="top_attach">3</property>
+			      <property name="bottom_attach">4</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options">fill</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHBox" id="hbox37">
+			      <property name="homogeneous">True</property>
+			      <property name="spacing">0</property>
+
+			      <child>
+				<widget class="GtkRadioButton" id="pm_ascend">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="relief">GTK_RELIEF_NORMAL</property>
+				  <property name="focus_on_click">True</property>
+				  <property name="active">False</property>
+				  <property name="inconsistent">False</property>
+				  <property name="draw_indicator">True</property>
+				  <property name="group">pm_none</property>
+				  <signal name="toggled" handler="on_pm_ascend_toggled" last_modification_time="Mon, 22 Sep 2003 11:27:07 GMT"/>
+
+				  <child>
+				    <widget class="GtkImage" id="image1928">
+				      <property name="visible">True</property>
+				      <property name="stock">gtk-sort-ascending</property>
+				      <property name="icon_size">4</property>
+				      <property name="xalign">0.5</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				    </widget>
+				  </child>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">3</property>
+			      <property name="right_attach">4</property>
+			      <property name="top_attach">3</property>
+			      <property name="bottom_attach">4</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options">fill</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkVSeparator" id="vseparator2">
+			      <property name="visible">True</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">0</property>
+			      <property name="right_attach">1</property>
+			      <property name="top_attach">1</property>
+			      <property name="bottom_attach">8</property>
+			      <property name="x_options"></property>
+			      <property name="y_options">fill</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkVSeparator" id="vseparator3">
+			      <property name="visible">True</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">8</property>
+			      <property name="right_attach">9</property>
+			      <property name="top_attach">1</property>
+			      <property name="bottom_attach">8</property>
+			      <property name="x_options"></property>
+			      <property name="y_options">fill</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkVSeparator" id="vseparator6">
+			      <property name="visible">True</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">2</property>
+			      <property name="right_attach">3</property>
+			      <property name="top_attach">1</property>
+			      <property name="bottom_attach">8</property>
+			      <property name="x_options"></property>
+			      <property name="y_options">fill</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkVSeparator" id="vseparator8">
+			      <property name="visible">True</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">6</property>
+			      <property name="right_attach">7</property>
+			      <property name="top_attach">1</property>
+			      <property name="bottom_attach">8</property>
+			      <property name="x_options"></property>
+			      <property name="y_options">fill</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkTable" id="table12">
+			      <property name="border_width">3</property>
+			      <property name="visible">True</property>
+			      <property name="n_rows">1</property>
+			      <property name="n_columns">1</property>
+			      <property name="homogeneous">False</property>
+			      <property name="row_spacing">0</property>
+			      <property name="column_spacing">0</property>
+
+			      <child>
+				<widget class="GtkLabel" id="label82">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="label" translatable="yes">Ascending</property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">True</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="left_attach">0</property>
+				  <property name="right_attach">1</property>
+				  <property name="top_attach">0</property>
+				  <property name="bottom_attach">1</property>
+				  <property name="y_options"></property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">3</property>
+			      <property name="right_attach">4</property>
+			      <property name="top_attach">1</property>
+			      <property name="bottom_attach">2</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options">fill</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkTable" id="table13">
+			      <property name="border_width">3</property>
+			      <property name="visible">True</property>
+			      <property name="n_rows">1</property>
+			      <property name="n_columns">1</property>
+			      <property name="homogeneous">False</property>
+			      <property name="row_spacing">0</property>
+			      <property name="column_spacing">0</property>
+
+			      <child>
+				<widget class="GtkLabel" id="label85">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="label" translatable="yes">Descending</property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">True</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="left_attach">0</property>
+				  <property name="right_attach">1</property>
+				  <property name="top_attach">0</property>
+				  <property name="bottom_attach">1</property>
+				  <property name="y_options"></property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">5</property>
+			      <property name="right_attach">6</property>
+			      <property name="top_attach">1</property>
+			      <property name="bottom_attach">2</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options">fill</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkTable" id="table14">
+			      <property name="border_width">3</property>
+			      <property name="visible">True</property>
+			      <property name="n_rows">1</property>
+			      <property name="n_columns">1</property>
+			      <property name="homogeneous">False</property>
+			      <property name="row_spacing">0</property>
+			      <property name="column_spacing">0</property>
+
+			      <child>
+				<widget class="GtkLabel" id="label86">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="label" translatable="yes">None</property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">True</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="left_attach">0</property>
+				  <property name="right_attach">1</property>
+				  <property name="top_attach">0</property>
+				  <property name="bottom_attach">1</property>
+				  <property name="y_options"></property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">7</property>
+			      <property name="right_attach">8</property>
+			      <property name="top_attach">1</property>
+			      <property name="bottom_attach">2</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options">fill</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkTable" id="table15">
+			      <property name="border_width">3</property>
+			      <property name="visible">True</property>
+			      <property name="n_rows">1</property>
+			      <property name="n_columns">1</property>
+			      <property name="homogeneous">False</property>
+			      <property name="row_spacing">0</property>
+			      <property name="column_spacing">0</property>
+
+			      <child>
+				<widget class="GtkLabel" id="label87">
+				  <property name="can_focus">True</property>
+				  <property name="label" translatable="yes">Playlists</property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">True</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="left_attach">0</property>
+				  <property name="right_attach">1</property>
+				  <property name="top_attach">0</property>
+				  <property name="bottom_attach">1</property>
+				  <property name="x_options">fill</property>
+				  <property name="y_options"></property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">1</property>
+			      <property name="right_attach">2</property>
+			      <property name="top_attach">3</property>
+			      <property name="bottom_attach">4</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options">fill</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkTable" id="table16">
+			      <property name="border_width">3</property>
+			      <property name="visible">True</property>
+			      <property name="n_rows">1</property>
+			      <property name="n_columns">1</property>
+			      <property name="homogeneous">False</property>
+			      <property name="row_spacing">0</property>
+			      <property name="column_spacing">0</property>
+
+			      <child>
+				<widget class="GtkLabel" id="label88">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="label" translatable="yes">Sorttabs</property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">True</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="left_attach">0</property>
+				  <property name="right_attach">1</property>
+				  <property name="top_attach">0</property>
+				  <property name="bottom_attach">1</property>
+				  <property name="x_options">fill</property>
+				  <property name="y_options"></property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">1</property>
+			      <property name="right_attach">2</property>
+			      <property name="top_attach">5</property>
+			      <property name="bottom_attach">6</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options">fill</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkTable" id="table17">
+			      <property name="border_width">3</property>
+			      <property name="visible">True</property>
+			      <property name="n_rows">1</property>
+			      <property name="n_columns">1</property>
+			      <property name="homogeneous">False</property>
+			      <property name="row_spacing">0</property>
+			      <property name="column_spacing">0</property>
+
+			      <child>
+				<widget class="GtkLabel" id="label89">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="label" translatable="yes">Tracks</property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">True</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="left_attach">0</property>
+				  <property name="right_attach">1</property>
+				  <property name="top_attach">0</property>
+				  <property name="bottom_attach">1</property>
+				  <property name="x_options">fill</property>
+				  <property name="y_options"></property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">1</property>
+			      <property name="right_attach">2</property>
+			      <property name="top_attach">7</property>
+			      <property name="bottom_attach">8</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options">fill</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="label91">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes"></property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">1</property>
+			      <property name="right_attach">2</property>
+			      <property name="top_attach">1</property>
+			      <property name="bottom_attach">2</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHSeparator" id="hseparator9">
+			      <property name="visible">True</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">0</property>
+			      <property name="right_attach">11</property>
+			      <property name="top_attach">0</property>
+			      <property name="bottom_attach">1</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHSeparator" id="hseparator10">
+			      <property name="visible">True</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">0</property>
+			      <property name="right_attach">11</property>
+			      <property name="top_attach">8</property>
+			      <property name="bottom_attach">9</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHSeparator" id="hseparator13">
+			      <property name="visible">True</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">1</property>
+			      <property name="right_attach">10</property>
+			      <property name="top_attach">6</property>
+			      <property name="bottom_attach">7</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options">fill</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHSeparator" id="hseparator12">
+			    </widget>
+			    <packing>
+			      <property name="left_attach">1</property>
+			      <property name="right_attach">10</property>
+			      <property name="top_attach">4</property>
+			      <property name="bottom_attach">5</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHSeparator" id="hseparator11">
+			      <property name="visible">True</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">1</property>
+			      <property name="right_attach">10</property>
+			      <property name="top_attach">2</property>
+			      <property name="bottom_attach">3</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkVSeparator" id="vseparator9">
+			      <property name="visible">True</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">10</property>
+			      <property name="right_attach">11</property>
+			      <property name="top_attach">1</property>
+			      <property name="bottom_attach">8</property>
+			      <property name="x_options"></property>
+			      <property name="y_options">fill</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkTable" id="table19">
+			      <property name="border_width">3</property>
+			      <property name="visible">True</property>
+			      <property name="n_rows">1</property>
+			      <property name="n_columns">1</property>
+			      <property name="homogeneous">False</property>
+			      <property name="row_spacing">0</property>
+			      <property name="column_spacing">0</property>
+
+			      <child>
+				<widget class="GtkLabel" id="label95">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="label" translatable="yes">Auto Store</property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">True</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="left_attach">0</property>
+				  <property name="right_attach">1</property>
+				  <property name="top_attach">0</property>
+				  <property name="bottom_attach">1</property>
+				  <property name="y_options"></property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">9</property>
+			      <property name="right_attach">10</property>
+			      <property name="top_attach">1</property>
+			      <property name="bottom_attach">2</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options">fill</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHBox" id="hbox41">
+			      <property name="visible">True</property>
+			      <property name="homogeneous">True</property>
+			      <property name="spacing">0</property>
+
+			      <child>
+				<widget class="GtkCheckButton" id="tm_autostore">
+				  <property name="visible">True</property>
+				  <property name="tooltip" translatable="yes">Please refer to the notice below.</property>
+				  <property name="can_focus">True</property>
+				  <property name="relief">GTK_RELIEF_NORMAL</property>
+				  <property name="focus_on_click">True</property>
+				  <property name="active">False</property>
+				  <property name="inconsistent">False</property>
+				  <property name="draw_indicator">True</property>
+				  <signal name="toggled" handler="on_tm_autostore_toggled" last_modification_time="Mon, 22 Sep 2003 13:30:09 GMT"/>
+
+				  <child>
+				    <placeholder/>
+				  </child>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">9</property>
+			      <property name="right_attach">10</property>
+			      <property name="top_attach">7</property>
+			      <property name="bottom_attach">8</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options">fill</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="label96">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes">n/a</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_CENTER</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">True</property>
+			      <property name="xalign">0.5</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">9</property>
+			      <property name="right_attach">10</property>
+			      <property name="top_attach">5</property>
+			      <property name="bottom_attach">6</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHBox" id="hbox43">
+			      <property name="visible">True</property>
+			      <property name="homogeneous">True</property>
+			      <property name="spacing">0</property>
+
+			      <child>
+				<widget class="GtkRadioButton" id="tm_ascend">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="relief">GTK_RELIEF_NORMAL</property>
+				  <property name="focus_on_click">True</property>
+				  <property name="active">False</property>
+				  <property name="inconsistent">False</property>
+				  <property name="draw_indicator">True</property>
+				  <signal name="toggled" handler="on_tm_ascend_toggled" last_modification_time="Tue, 23 Sep 2003 03:07:09 GMT"/>
+
+				  <child>
+				    <widget class="GtkImage" id="image2013">
+				      <property name="visible">True</property>
+				      <property name="stock">gtk-sort-ascending</property>
+				      <property name="icon_size">4</property>
+				      <property name="xalign">0.5</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				    </widget>
+				  </child>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">3</property>
+			      <property name="right_attach">4</property>
+			      <property name="top_attach">7</property>
+			      <property name="bottom_attach">8</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options">fill</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkVSeparator" id="vseparator7">
+			      <property name="visible">True</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">4</property>
+			      <property name="right_attach">5</property>
+			      <property name="top_attach">1</property>
+			      <property name="bottom_attach">8</property>
+			      <property name="x_options"></property>
+			      <property name="y_options">fill</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHBox" id="hbox44">
+			      <property name="visible">True</property>
+			      <property name="homogeneous">True</property>
+			      <property name="spacing">0</property>
+
+			      <child>
+				<widget class="GtkRadioButton" id="tm_descend">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="relief">GTK_RELIEF_NORMAL</property>
+				  <property name="focus_on_click">True</property>
+				  <property name="active">False</property>
+				  <property name="inconsistent">False</property>
+				  <property name="draw_indicator">True</property>
+				  <property name="group">tm_ascend</property>
+				  <signal name="toggled" handler="on_tm_descend_toggled" last_modification_time="Tue, 23 Sep 2003 03:07:03 GMT"/>
+
+				  <child>
+				    <widget class="GtkImage" id="image2014">
+				      <property name="visible">True</property>
+				      <property name="stock">gtk-sort-descending</property>
+				      <property name="icon_size">4</property>
+				      <property name="xalign">0.5</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				    </widget>
+				  </child>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">5</property>
+			      <property name="right_attach">6</property>
+			      <property name="top_attach">7</property>
+			      <property name="bottom_attach">8</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options">fill</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHBox" id="hbox45">
+			      <property name="visible">True</property>
+			      <property name="homogeneous">True</property>
+			      <property name="spacing">0</property>
+
+			      <child>
+				<widget class="GtkRadioButton" id="tm_none">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="relief">GTK_RELIEF_NORMAL</property>
+				  <property name="focus_on_click">True</property>
+				  <property name="active">False</property>
+				  <property name="inconsistent">False</property>
+				  <property name="draw_indicator">True</property>
+				  <property name="group">tm_ascend</property>
+				  <signal name="toggled" handler="on_tm_none_toggled" last_modification_time="Tue, 23 Sep 2003 03:06:56 GMT"/>
+
+				  <child>
+				    <widget class="GtkImage" id="image2015">
+				      <property name="visible">True</property>
+				      <property name="stock">gtk-undo</property>
+				      <property name="icon_size">4</property>
+				      <property name="xalign">0.5</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				    </widget>
+				  </child>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">7</property>
+			      <property name="right_attach">8</property>
+			      <property name="top_attach">7</property>
+			      <property name="bottom_attach">8</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options">fill</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="label431">
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes">n/a</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_CENTER</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">True</property>
+			      <property name="xalign">0.5</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">9</property>
+			      <property name="right_attach">10</property>
+			      <property name="top_attach">3</property>
+			      <property name="bottom_attach">4</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">False</property>
+			</packing>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">True</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkHBox" id="hbox46">
+		      <property name="visible">True</property>
+		      <property name="homogeneous">False</property>
+		      <property name="spacing">0</property>
+
+		      <child>
+			<widget class="GtkLabel" id="label97">
+			  <property name="visible">True</property>
+			  <property name="can_focus">True</property>
+			  <property name="label" translatable="yes">Sort tracks according to: </property>
+			  <property name="use_underline">False</property>
+			  <property name="use_markup">False</property>
+			  <property name="justify">GTK_JUSTIFY_LEFT</property>
+			  <property name="wrap">False</property>
+			  <property name="selectable">True</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			  <property name="width_chars">-1</property>
+			  <property name="single_line_mode">False</property>
+			  <property name="angle">0</property>
+			</widget>
+			<packing>
+			  <property name="padding">4</property>
+			  <property name="expand">False</property>
+			  <property name="fill">False</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkCombo" id="sort_combo">
+			  <property name="visible">True</property>
+			  <property name="value_in_list">False</property>
+			  <property name="allow_empty">True</property>
+			  <property name="case_sensitive">False</property>
+			  <property name="enable_arrow_keys">True</property>
+			  <property name="enable_arrows_always">False</property>
+
+			  <child internal-child="entry">
+			    <widget class="GtkEntry" id="sort_combo-entry">
+			      <property name="visible">True</property>
+			      <property name="tooltip" translatable="yes">You can also use the table headers, but this allows you to sort according to a column that is not displayed.</property>
+			      <property name="can_focus">True</property>
+			      <property name="editable">True</property>
+			      <property name="visibility">True</property>
+			      <property name="max_length">0</property>
+			      <property name="text" translatable="yes"></property>
+			      <property name="has_frame">True</property>
+			      <property name="invisible_char">*</property>
+			      <property name="activates_default">False</property>
+			    </widget>
+			  </child>
+
+			  <child internal-child="list">
+			    <widget class="GtkList" id="sort_combo-list">
+			      <property name="visible">True</property>
+			      <property name="selection_mode">GTK_SELECTION_BROWSE</property>
+			    </widget>
+			  </child>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">True</property>
+			  <property name="fill">True</property>
+			</packing>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">True</property>
+		      <property name="fill">True</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkCheckButton" id="cfg_case_sensitive">
+		      <property name="visible">True</property>
+		      <property name="tooltip" translatable="yes">If checked, sorting will be case sensitive. Please note that case sensitive sorting will not work well with most charsets.</property>
+		      <property name="can_focus">True</property>
+		      <property name="label" translatable="yes">Sorting case sensitive</property>
+		      <property name="use_underline">True</property>
+		      <property name="relief">GTK_RELIEF_NORMAL</property>
+		      <property name="focus_on_click">True</property>
+		      <property name="active">False</property>
+		      <property name="inconsistent">False</property>
+		      <property name="draw_indicator">True</property>
+		      <signal name="toggled" handler="on_sort_case_sensitive_toggled" last_modification_time="Sun, 21 Sep 2003 14:47:47 GMT"/>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">True</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">True</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">True</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkVBox" id="vbox136">
+	  <property name="visible">True</property>
+	  <property name="homogeneous">False</property>
+	  <property name="spacing">6</property>
+
+	  <child>
+	    <widget class="GtkLabel" id="label297">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">&lt;b&gt;Ignore Frequent Words&lt;/b&gt;</property>
+	      <property name="use_underline">False</property>
+	      <property name="use_markup">True</property>
+	      <property name="justify">GTK_JUSTIFY_LEFT</property>
+	      <property name="wrap">False</property>
+	      <property name="selectable">False</property>
+	      <property name="xalign">0</property>
+	      <property name="yalign">0.5</property>
+	      <property name="xpad">0</property>
+	      <property name="ypad">0</property>
+	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	      <property name="width_chars">-1</property>
+	      <property name="single_line_mode">False</property>
+	      <property name="angle">0</property>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkHBox" id="hbox143">
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">0</property>
+
+	      <child>
+		<widget class="GtkLabel" id="label298">
+		  <property name="visible">True</property>
+		  <property name="label" translatable="yes">    </property>
+		  <property name="use_underline">False</property>
+		  <property name="use_markup">False</property>
+		  <property name="justify">GTK_JUSTIFY_LEFT</property>
+		  <property name="wrap">False</property>
+		  <property name="selectable">False</property>
+		  <property name="xalign">0.5</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xpad">0</property>
+		  <property name="ypad">0</property>
+		  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		  <property name="width_chars">-1</property>
+		  <property name="single_line_mode">False</property>
+		  <property name="angle">0</property>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkVBox" id="vbox137">
+		  <property name="visible">True</property>
+		  <property name="homogeneous">False</property>
+		  <property name="spacing">0</property>
+
+		  <child>
+		    <widget class="GtkScrolledWindow" id="scrolledwindow15">
+		      <property name="border_width">4</property>
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+		      <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+		      <property name="shadow_type">GTK_SHADOW_IN</property>
+		      <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+		      <child>
+			<widget class="GtkTextView" id="sort_ign_strings">
+			  <property name="visible">True</property>
+			  <property name="can_focus">True</property>
+			  <property name="editable">True</property>
+			  <property name="overwrite">False</property>
+			  <property name="accepts_tab">True</property>
+			  <property name="justification">GTK_JUSTIFY_LEFT</property>
+			  <property name="wrap_mode">GTK_WRAP_NONE</property>
+			  <property name="cursor_visible">True</property>
+			  <property name="pixels_above_lines">0</property>
+			  <property name="pixels_below_lines">0</property>
+			  <property name="pixels_inside_wrap">0</property>
+			  <property name="left_margin">0</property>
+			  <property name="right_margin">0</property>
+			  <property name="indent">0</property>
+			  <property name="text" translatable="yes"></property>
+			</widget>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">True</property>
+		      <property name="fill">True</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkLabel" id="label310">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="label" translatable="yes">Ignore these words when at the beginning of the following fields:</property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">False</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">True</property>
+		      <property name="selectable">True</property>
+		      <property name="xalign">0.0399999991059</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">4</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkHBox" id="hbox158">
+		      <property name="visible">True</property>
+		      <property name="homogeneous">False</property>
+		      <property name="spacing">0</property>
+
+		      <child>
+			<widget class="GtkVBox" id="vbox138">
+			  <property name="visible">True</property>
+			  <property name="homogeneous">False</property>
+			  <property name="spacing">0</property>
+
+			  <child>
+			    <widget class="GtkCheckButton" id="sort_ign_field_3">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes"></property>
+			      <property name="use_underline">True</property>
+			      <property name="relief">GTK_RELIEF_NORMAL</property>
+			      <property name="focus_on_click">True</property>
+			      <property name="active">False</property>
+			      <property name="inconsistent">False</property>
+			      <property name="draw_indicator">True</property>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">False</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkCheckButton" id="sort_ign_field_1">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes"></property>
+			      <property name="use_underline">True</property>
+			      <property name="relief">GTK_RELIEF_NORMAL</property>
+			      <property name="focus_on_click">True</property>
+			      <property name="active">False</property>
+			      <property name="inconsistent">False</property>
+			      <property name="draw_indicator">True</property>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">False</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <placeholder/>
+			  </child>
+
+			  <child>
+			    <placeholder/>
+			  </child>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">True</property>
+			  <property name="fill">True</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkVBox" id="vbox139">
+			  <property name="visible">True</property>
+			  <property name="homogeneous">False</property>
+			  <property name="spacing">0</property>
+
+			  <child>
+			    <widget class="GtkCheckButton" id="sort_ign_field_2">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes"></property>
+			      <property name="use_underline">True</property>
+			      <property name="relief">GTK_RELIEF_NORMAL</property>
+			      <property name="focus_on_click">True</property>
+			      <property name="active">False</property>
+			      <property name="inconsistent">False</property>
+			      <property name="draw_indicator">True</property>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">False</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkCheckButton" id="sort_ign_field_6">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes"></property>
+			      <property name="use_underline">True</property>
+			      <property name="relief">GTK_RELIEF_NORMAL</property>
+			      <property name="focus_on_click">True</property>
+			      <property name="active">False</property>
+			      <property name="inconsistent">False</property>
+			      <property name="draw_indicator">True</property>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">False</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <placeholder/>
+			  </child>
+
+			  <child>
+			    <placeholder/>
+			  </child>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">True</property>
+			  <property name="fill">True</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkVBox" id="vbox140">
+			  <property name="visible">True</property>
+			  <property name="homogeneous">False</property>
+			  <property name="spacing">0</property>
+
+			  <child>
+			    <placeholder/>
+			  </child>
+
+			  <child>
+			    <placeholder/>
+			  </child>
+
+			  <child>
+			    <placeholder/>
+			  </child>
+
+			  <child>
+			    <placeholder/>
+			  </child>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">True</property>
+			  <property name="fill">True</property>
+			</packing>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">True</property>
+		      <property name="fill">True</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <placeholder/>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">True</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">True</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">True</property>
+	  <property name="fill">True</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkHSeparator" id="hseparator49">
+	  <property name="visible">True</property>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">False</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkHButtonBox" id="hbuttonbox8">
+	  <property name="border_width">5</property>
+	  <property name="visible">True</property>
+	  <property name="layout_style">GTK_BUTTONBOX_SPREAD</property>
+	  <property name="spacing">0</property>
+
+	  <child>
+	    <widget class="GtkButton" id="sort_cancel">
+	      <property name="visible">True</property>
+	      <property name="can_default">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label">gtk-cancel</property>
+	      <property name="use_stock">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	      <signal name="clicked" handler="on_sort_cancel_clicked" last_modification_time="Mon, 22 Sep 2003 11:30:46 GMT"/>
+	    </widget>
+	  </child>
+
+	  <child>
+	    <widget class="GtkButton" id="sort_apply">
+	      <property name="visible">True</property>
+	      <property name="can_default">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label">gtk-apply</property>
+	      <property name="use_stock">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	      <signal name="clicked" handler="on_sort_apply_clicked" last_modification_time="Mon, 22 Sep 2003 11:30:39 GMT"/>
+	    </widget>
+	  </child>
+
+	  <child>
+	    <widget class="GtkButton" id="sort_ok">
+	      <property name="visible">True</property>
+	      <property name="can_default">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label">gtk-ok</property>
+	      <property name="use_stock">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	      <signal name="clicked" handler="on_sort_ok_clicked" last_modification_time="Mon, 22 Sep 2003 11:31:10 GMT"/>
+	    </widget>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">False</property>
+	</packing>
+      </child>
+    </widget>
+  </child>
+</widget>
+
+<widget class="GtkWindow" id="gtkpod_info">
+  <property name="title" translatable="yes">gtkpod Info</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_NONE</property>
+  <property name="modal">False</property>
+  <property name="resizable">True</property>
+  <property name="destroy_with_parent">False</property>
+  <property name="icon">gtkpod-icon-48.png</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
+  <property name="urgency_hint">False</property>
+  <signal name="delete_event" handler="on_gtkpod_info_delete_event" last_modification_time="Sun, 16 May 2004 04:40:47 GMT"/>
+
+  <child>
+    <widget class="GtkVBox" id="vbox56">
+      <property name="visible">True</property>
+      <property name="homogeneous">False</property>
+      <property name="spacing">0</property>
+
+      <child>
+	<placeholder/>
+      </child>
+
+      <child>
+	<widget class="GtkScrolledWindow" id="scrolledwindow10">
+	  <property name="visible">True</property>
+	  <property name="can_focus">True</property>
+	  <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+	  <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+	  <property name="shadow_type">GTK_SHADOW_NONE</property>
+	  <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+	  <child>
+	    <widget class="GtkViewport" id="viewport7">
+	      <property name="visible">True</property>
+	      <property name="shadow_type">GTK_SHADOW_IN</property>
+
+	      <child>
+		<widget class="GtkVBox" id="vbox57">
+		  <property name="border_width">6</property>
+		  <property name="visible">True</property>
+		  <property name="homogeneous">False</property>
+		  <property name="spacing">0</property>
+
+		  <child>
+		    <widget class="GtkHBox" id="hbox49">
+		      <property name="visible">True</property>
+		      <property name="homogeneous">False</property>
+		      <property name="spacing">0</property>
+
+		      <child>
+			<widget class="GtkTable" id="table22">
+			  <property name="border_width">4</property>
+			  <property name="visible">True</property>
+			  <property name="n_rows">21</property>
+			  <property name="n_columns">13</property>
+			  <property name="homogeneous">False</property>
+			  <property name="row_spacing">0</property>
+			  <property name="column_spacing">1</property>
+
+			  <child>
+			    <widget class="GtkHSeparator" id="hseparator39">
+			      <property name="visible">True</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">0</property>
+			      <property name="right_attach">5</property>
+			      <property name="top_attach">20</property>
+			      <property name="bottom_attach">21</property>
+			      <property name="x_options">fill</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="free_space">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes"></property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">True</property>
+			      <property name="xalign">1</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">3</property>
+			      <property name="right_attach">4</property>
+			      <property name="top_attach">19</property>
+			      <property name="bottom_attach">20</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="non_transferred_filesize">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes"></property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">True</property>
+			      <property name="xalign">1</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">3</property>
+			      <property name="right_attach">4</property>
+			      <property name="top_attach">17</property>
+			      <property name="bottom_attach">18</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHSeparator" id="hseparator37">
+			      <property name="visible">True</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">0</property>
+			      <property name="right_attach">5</property>
+			      <property name="top_attach">16</property>
+			      <property name="bottom_attach">17</property>
+			      <property name="x_options">fill</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="non_transferred_tracks">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes"></property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">True</property>
+			      <property name="xalign">1</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">3</property>
+			      <property name="right_attach">4</property>
+			      <property name="top_attach">15</property>
+			      <property name="bottom_attach">16</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkVSeparator" id="vseparator17">
+			      <property name="visible">True</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">0</property>
+			      <property name="right_attach">1</property>
+			      <property name="top_attach">1</property>
+			      <property name="bottom_attach">20</property>
+			      <property name="x_options"></property>
+			      <property name="y_options">fill</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkVSeparator" id="vseparator18">
+			      <property name="visible">True</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">2</property>
+			      <property name="right_attach">3</property>
+			      <property name="top_attach">1</property>
+			      <property name="bottom_attach">20</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options">fill</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkVSeparator" id="vseparator19">
+			      <property name="visible">True</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">4</property>
+			      <property name="right_attach">5</property>
+			      <property name="top_attach">1</property>
+			      <property name="bottom_attach">20</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options">fill</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHSeparator" id="hseparator42">
+			      <property name="visible">True</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">1</property>
+			      <property name="right_attach">4</property>
+			      <property name="top_attach">12</property>
+			      <property name="bottom_attach">13</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options">fill</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="deleted_filesize">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes"></property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">True</property>
+			      <property name="xalign">1</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">3</property>
+			      <property name="right_attach">4</property>
+			      <property name="top_attach">13</property>
+			      <property name="bottom_attach">14</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="deleted_tracks">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes"></property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">True</property>
+			      <property name="xalign">1</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">3</property>
+			      <property name="right_attach">4</property>
+			      <property name="top_attach">11</property>
+			      <property name="bottom_attach">12</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHSeparator" id="hseparator41">
+			      <property name="visible">True</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">1</property>
+			      <property name="right_attach">4</property>
+			      <property name="top_attach">14</property>
+			      <property name="bottom_attach">15</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options">fill</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHSeparator" id="hseparator38">
+			      <property name="visible">True</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">0</property>
+			      <property name="right_attach">5</property>
+			      <property name="top_attach">18</property>
+			      <property name="bottom_attach">19</property>
+			      <property name="x_options">fill</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="total_tracks_ipod">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes">      </property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">True</property>
+			      <property name="xalign">1</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">3</property>
+			      <property name="right_attach">4</property>
+			      <property name="top_attach">3</property>
+			      <property name="bottom_attach">4</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="total_playtime_ipod">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes"></property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">True</property>
+			      <property name="xalign">1</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">3</property>
+			      <property name="right_attach">4</property>
+			      <property name="top_attach">5</property>
+			      <property name="bottom_attach">6</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="total_filesize_ipod">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes"></property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">True</property>
+			      <property name="xalign">1</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">3</property>
+			      <property name="right_attach">4</property>
+			      <property name="top_attach">7</property>
+			      <property name="bottom_attach">8</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="total_playlists_ipod">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes">      </property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">True</property>
+			      <property name="xalign">1</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">3</property>
+			      <property name="right_attach">4</property>
+			      <property name="top_attach">9</property>
+			      <property name="bottom_attach">10</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="playlist_tracks">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes">      </property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">True</property>
+			      <property name="xalign">1</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">7</property>
+			      <property name="right_attach">8</property>
+			      <property name="top_attach">3</property>
+			      <property name="bottom_attach">4</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="playlist_playtime">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes"></property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">True</property>
+			      <property name="xalign">1</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">7</property>
+			      <property name="right_attach">8</property>
+			      <property name="top_attach">5</property>
+			      <property name="bottom_attach">6</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="playlist_filesize">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes"></property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">True</property>
+			      <property name="xalign">1</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">7</property>
+			      <property name="right_attach">8</property>
+			      <property name="top_attach">7</property>
+			      <property name="bottom_attach">8</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="tracks_displayed">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes"></property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">True</property>
+			      <property name="xalign">1</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">9</property>
+			      <property name="right_attach">10</property>
+			      <property name="top_attach">3</property>
+			      <property name="bottom_attach">4</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="playtime_displayed">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes"></property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">True</property>
+			      <property name="xalign">1</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">9</property>
+			      <property name="right_attach">10</property>
+			      <property name="top_attach">5</property>
+			      <property name="bottom_attach">6</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="filesize_displayed">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes"></property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">True</property>
+			      <property name="xalign">1</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">9</property>
+			      <property name="right_attach">10</property>
+			      <property name="top_attach">7</property>
+			      <property name="bottom_attach">8</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkVSeparator" id="vseparator21">
+			      <property name="visible">True</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">8</property>
+			      <property name="right_attach">9</property>
+			      <property name="top_attach">1</property>
+			      <property name="bottom_attach">8</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options">fill</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="tracks_selected">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes"></property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">True</property>
+			      <property name="xalign">1</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">11</property>
+			      <property name="right_attach">12</property>
+			      <property name="top_attach">3</property>
+			      <property name="bottom_attach">4</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="playtime_selected">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes"></property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">True</property>
+			      <property name="xalign">1</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">11</property>
+			      <property name="right_attach">12</property>
+			      <property name="top_attach">5</property>
+			      <property name="bottom_attach">6</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="filesize_selected">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes"></property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">True</property>
+			      <property name="xalign">1</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">11</property>
+			      <property name="right_attach">12</property>
+			      <property name="top_attach">7</property>
+			      <property name="bottom_attach">8</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkVSeparator" id="vseparator22">
+			      <property name="visible">True</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">10</property>
+			      <property name="right_attach">11</property>
+			      <property name="top_attach">1</property>
+			      <property name="bottom_attach">8</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options">fill</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="label137">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes">Number of tracks</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">True</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">1</property>
+			      <property name="right_attach">2</property>
+			      <property name="top_attach">3</property>
+			      <property name="bottom_attach">4</property>
+			      <property name="x_padding">1</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="label139">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes">Play time</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">True</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">1</property>
+			      <property name="right_attach">2</property>
+			      <property name="top_attach">5</property>
+			      <property name="bottom_attach">6</property>
+			      <property name="x_padding">1</property>
+			      <property name="y_padding">1</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="label141">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes">File size</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">True</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">1</property>
+			      <property name="right_attach">2</property>
+			      <property name="top_attach">7</property>
+			      <property name="bottom_attach">8</property>
+			      <property name="x_padding">1</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="label147">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes">Number of playlists</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">True</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">1</property>
+			      <property name="right_attach">2</property>
+			      <property name="top_attach">9</property>
+			      <property name="bottom_attach">10</property>
+			      <property name="x_padding">1</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="label149">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes">Deleted tracks</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">True</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">1</property>
+			      <property name="right_attach">2</property>
+			      <property name="top_attach">11</property>
+			      <property name="bottom_attach">12</property>
+			      <property name="x_padding">1</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="label150">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes">File size (deleted)</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">True</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">1</property>
+			      <property name="right_attach">2</property>
+			      <property name="top_attach">13</property>
+			      <property name="bottom_attach">14</property>
+			      <property name="x_padding">1</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="label143">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes">Non-transferred tracks</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">True</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">1</property>
+			      <property name="right_attach">2</property>
+			      <property name="top_attach">15</property>
+			      <property name="bottom_attach">16</property>
+			      <property name="x_padding">1</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="label145">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes">File size (non-transferred)</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">True</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">1</property>
+			      <property name="right_attach">2</property>
+			      <property name="top_attach">17</property>
+			      <property name="bottom_attach">18</property>
+			      <property name="x_padding">1</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="label146">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes">Effective free space</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">True</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">1</property>
+			      <property name="right_attach">2</property>
+			      <property name="top_attach">19</property>
+			      <property name="bottom_attach">20</property>
+			      <property name="x_padding">1</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="label99">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes">Total
+(iPod)</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_CENTER</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">True</property>
+			      <property name="xalign">0.5</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">3</property>
+			      <property name="right_attach">4</property>
+			      <property name="top_attach">1</property>
+			      <property name="bottom_attach">2</property>
+			      <property name="x_padding">1</property>
+			      <property name="y_padding">1</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="label153">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes">Selected
+Playlist</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_CENTER</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">True</property>
+			      <property name="xalign">0.5</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">7</property>
+			      <property name="right_attach">8</property>
+			      <property name="top_attach">1</property>
+			      <property name="bottom_attach">2</property>
+			      <property name="x_padding">1</property>
+			      <property name="y_padding">1</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="label154">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes">Displayed
+Tracks</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_CENTER</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">True</property>
+			      <property name="xalign">0.5</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">9</property>
+			      <property name="right_attach">10</property>
+			      <property name="top_attach">1</property>
+			      <property name="bottom_attach">2</property>
+			      <property name="x_padding">1</property>
+			      <property name="y_padding">1</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="label155">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes">Selected
+Tracks</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_CENTER</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">True</property>
+			      <property name="xalign">0.5</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">11</property>
+			      <property name="right_attach">12</property>
+			      <property name="top_attach">1</property>
+			      <property name="bottom_attach">2</property>
+			      <property name="x_padding">1</property>
+			      <property name="y_padding">1</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="label176">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes">Total
+(local)</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_CENTER</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">True</property>
+			      <property name="xalign">0.5</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">5</property>
+			      <property name="right_attach">6</property>
+			      <property name="top_attach">1</property>
+			      <property name="bottom_attach">2</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="total_tracks_local">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes">      </property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">True</property>
+			      <property name="xalign">1</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">5</property>
+			      <property name="right_attach">6</property>
+			      <property name="top_attach">3</property>
+			      <property name="bottom_attach">4</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="total_playtime_local">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes"></property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">True</property>
+			      <property name="xalign">1</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">5</property>
+			      <property name="right_attach">6</property>
+			      <property name="top_attach">5</property>
+			      <property name="bottom_attach">6</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="total_filesize_local">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes"></property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">True</property>
+			      <property name="xalign">1</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">5</property>
+			      <property name="right_attach">6</property>
+			      <property name="top_attach">7</property>
+			      <property name="bottom_attach">8</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkVBox" id="vbox58">
+			      <property name="visible">True</property>
+			      <property name="homogeneous">False</property>
+			      <property name="spacing">0</property>
+
+			      <child>
+				<widget class="GtkHBox" id="hbox50">
+				  <property name="visible">True</property>
+				  <property name="homogeneous">False</property>
+				  <property name="spacing">0</property>
+
+				  <child>
+				    <widget class="GtkHButtonBox" id="hbuttonbox9">
+				      <property name="border_width">5</property>
+				      <property name="visible">True</property>
+				      <property name="layout_style">GTK_BUTTONBOX_DEFAULT_STYLE</property>
+				      <property name="spacing">0</property>
+
+				      <child>
+					<widget class="GtkButton" id="info_close">
+					  <property name="visible">True</property>
+					  <property name="can_default">True</property>
+					  <property name="can_focus">True</property>
+					  <property name="label">gtk-close</property>
+					  <property name="use_stock">True</property>
+					  <property name="relief">GTK_RELIEF_NORMAL</property>
+					  <property name="focus_on_click">True</property>
+					  <signal name="clicked" handler="on_info_close_clicked" last_modification_time="Sun, 23 Nov 2003 15:28:50 GMT"/>
+					</widget>
+				      </child>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				      <property name="pack_type">GTK_PACK_END</property>
+				    </packing>
+				  </child>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				  <property name="pack_type">GTK_PACK_END</property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">5</property>
+			      <property name="right_attach">11</property>
+			      <property name="top_attach">11</property>
+			      <property name="bottom_attach">21</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options">fill</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="total_playlists_local">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes">      </property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">True</property>
+			      <property name="xalign">1</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">5</property>
+			      <property name="right_attach">6</property>
+			      <property name="top_attach">9</property>
+			      <property name="bottom_attach">10</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHSeparator" id="hseparator45">
+			      <property name="visible">True</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">0</property>
+			      <property name="right_attach">13</property>
+			      <property name="top_attach">0</property>
+			      <property name="bottom_attach">1</property>
+			      <property name="x_options">fill</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHSeparator" id="hseparator35">
+			      <property name="visible">True</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">0</property>
+			      <property name="right_attach">13</property>
+			      <property name="top_attach">2</property>
+			      <property name="bottom_attach">3</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHSeparator" id="hseparator32">
+			      <property name="visible">True</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">0</property>
+			      <property name="right_attach">13</property>
+			      <property name="top_attach">4</property>
+			      <property name="bottom_attach">5</property>
+			      <property name="x_options">fill</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHSeparator" id="hseparator33">
+			      <property name="visible">True</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">0</property>
+			      <property name="right_attach">13</property>
+			      <property name="top_attach">6</property>
+			      <property name="bottom_attach">7</property>
+			      <property name="x_options">fill</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHSeparator" id="hseparator34">
+			      <property name="visible">True</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">0</property>
+			      <property name="right_attach">13</property>
+			      <property name="top_attach">8</property>
+			      <property name="bottom_attach">9</property>
+			      <property name="x_options">fill</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkVSeparator" id="vseparator20">
+			      <property name="visible">True</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">6</property>
+			      <property name="right_attach">7</property>
+			      <property name="top_attach">1</property>
+			      <property name="bottom_attach">10</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options">fill</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHSeparator" id="hseparator36">
+			      <property name="visible">True</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">0</property>
+			      <property name="right_attach">7</property>
+			      <property name="top_attach">10</property>
+			      <property name="bottom_attach">11</property>
+			      <property name="x_options">fill</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkVSeparator" id="vseparator23">
+			      <property name="visible">True</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">12</property>
+			      <property name="right_attach">13</property>
+			      <property name="top_attach">1</property>
+			      <property name="bottom_attach">9</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options">fill</property>
+			    </packing>
+			  </child>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">False</property>
+			</packing>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="padding">6</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+		</widget>
+	      </child>
+	    </widget>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">True</property>
+	  <property name="fill">True</property>
+	</packing>
+      </child>
+    </widget>
+  </child>
+</widget>
+
+<widget class="GtkDialog" id="confirm_dialog">
+  <property name="title" translatable="yes"></property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_NONE</property>
+  <property name="modal">False</property>
+  <property name="resizable">True</property>
+  <property name="destroy_with_parent">False</property>
+  <property name="icon">gtkpod-icon-48.png</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
+  <property name="urgency_hint">False</property>
+  <property name="has_separator">True</property>
+
+  <child internal-child="vbox">
+    <widget class="GtkVBox" id="dialog-vbox1">
+      <property name="visible">True</property>
+      <property name="homogeneous">False</property>
+      <property name="spacing">0</property>
+
+      <child internal-child="action_area">
+	<widget class="GtkHButtonBox" id="dialog-action_area1">
+	  <property name="visible">True</property>
+	  <property name="layout_style">GTK_BUTTONBOX_END</property>
+
+	  <child>
+	    <widget class="GtkButton" id="cancel">
+	      <property name="visible">True</property>
+	      <property name="can_default">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label">gtk-cancel</property>
+	      <property name="use_stock">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	      <property name="response_id">-6</property>
+	    </widget>
+	  </child>
+
+	  <child>
+	    <widget class="GtkButton" id="apply">
+	      <property name="visible">True</property>
+	      <property name="can_default">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label">gtk-apply</property>
+	      <property name="use_stock">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	      <property name="response_id">-10</property>
+	    </widget>
+	  </child>
+
+	  <child>
+	    <widget class="GtkButton" id="ok">
+	      <property name="visible">True</property>
+	      <property name="can_default">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label">gtk-ok</property>
+	      <property name="use_stock">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	      <property name="response_id">-5</property>
+	    </widget>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">True</property>
+	  <property name="pack_type">GTK_PACK_END</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkVBox" id="vbox6">
+	  <property name="visible">True</property>
+	  <property name="homogeneous">False</property>
+	  <property name="spacing">0</property>
+
+	  <child>
+	    <widget class="GtkLabel" id="label">
+	      <property name="visible">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label" translatable="yes">label21</property>
+	      <property name="use_underline">False</property>
+	      <property name="use_markup">False</property>
+	      <property name="justify">GTK_JUSTIFY_LEFT</property>
+	      <property name="wrap">True</property>
+	      <property name="selectable">True</property>
+	      <property name="xalign">0.5</property>
+	      <property name="yalign">0</property>
+	      <property name="xpad">0</property>
+	      <property name="ypad">0</property>
+	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	      <property name="width_chars">-1</property>
+	      <property name="single_line_mode">False</property>
+	      <property name="angle">0</property>
+	    </widget>
+	    <packing>
+	      <property name="padding">6</property>
+	      <property name="expand">False</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkVBox" id="vbox7">
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">0</property>
+
+	      <child>
+		<widget class="GtkScrolledWindow" id="scroller">
+		  <property name="visible">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+		  <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+		  <property name="shadow_type">GTK_SHADOW_IN</property>
+		  <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+		  <child>
+		    <widget class="GtkTextView" id="text">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="editable">True</property>
+		      <property name="overwrite">False</property>
+		      <property name="accepts_tab">True</property>
+		      <property name="justification">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap_mode">GTK_WRAP_WORD</property>
+		      <property name="cursor_visible">True</property>
+		      <property name="pixels_above_lines">0</property>
+		      <property name="pixels_below_lines">0</property>
+		      <property name="pixels_inside_wrap">0</property>
+		      <property name="left_margin">0</property>
+		      <property name="right_margin">0</property>
+		      <property name="indent">0</property>
+		      <property name="text" translatable="yes"></property>
+		    </widget>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">True</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">True</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkHBox" id="option_hbox">
+	      <property name="visible">True</property>
+	      <property name="homogeneous">True</property>
+	      <property name="spacing">0</property>
+
+	      <child>
+		<widget class="GtkVBox" id="option_vbox">
+		  <property name="visible">True</property>
+		  <property name="homogeneous">False</property>
+		  <property name="spacing">0</property>
+
+		  <child>
+		    <placeholder/>
+		  </child>
+
+		  <child>
+		    <placeholder/>
+		  </child>
+
+		  <child>
+		    <widget class="GtkCheckButton" id="never_again">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="label" translatable="yes">Never show this dialogue again</property>
+		      <property name="use_underline">True</property>
+		      <property name="relief">GTK_RELIEF_NORMAL</property>
+		      <property name="focus_on_click">True</property>
+		      <property name="active">False</property>
+		      <property name="inconsistent">False</property>
+		      <property name="draw_indicator">True</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		      <property name="pack_type">GTK_PACK_END</property>
+		    </packing>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <placeholder/>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">True</property>
+	  <property name="fill">True</property>
+	</packing>
+      </child>
+    </widget>
+  </child>
+</widget>
+
+<widget class="GtkWindow" id="export_playlist_file_options">
+  <property name="title" translatable="yes">window1</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_NONE</property>
+  <property name="modal">False</property>
+  <property name="resizable">True</property>
+  <property name="destroy_with_parent">False</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
+  <property name="urgency_hint">False</property>
+
+  <child>
+    <widget class="GtkFrame" id="options_frame">
+      <property name="visible">True</property>
+      <property name="label_xalign">0</property>
+      <property name="label_yalign">0.5</property>
+      <property name="shadow_type">GTK_SHADOW_ETCHED_OUT</property>
+
+      <child>
+	<widget class="GtkAlignment" id="alignment4">
+	  <property name="border_width">5</property>
+	  <property name="visible">True</property>
+	  <property name="xalign">0.5</property>
+	  <property name="yalign">0.5</property>
+	  <property name="xscale">1</property>
+	  <property name="yscale">1</property>
+	  <property name="top_padding">0</property>
+	  <property name="bottom_padding">0</property>
+	  <property name="left_padding">12</property>
+	  <property name="right_padding">0</property>
+
+	  <child>
+	    <widget class="GtkVBox" id="vbox61">
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">0</property>
+
+	      <child>
+		<widget class="GtkTable" id="table29">
+		  <property name="visible">True</property>
+		  <property name="n_rows">2</property>
+		  <property name="n_columns">2</property>
+		  <property name="homogeneous">False</property>
+		  <property name="row_spacing">0</property>
+		  <property name="column_spacing">0</property>
+
+		  <child>
+		    <widget class="GtkHBox" id="hbox59">
+		      <property name="visible">True</property>
+		      <property name="homogeneous">False</property>
+		      <property name="spacing">10</property>
+
+		      <child>
+			<widget class="GtkRadioButton" id="type_m3u">
+			  <property name="visible">True</property>
+			  <property name="can_focus">True</property>
+			  <property name="label" translatable="yes">_M3U</property>
+			  <property name="use_underline">True</property>
+			  <property name="relief">GTK_RELIEF_NORMAL</property>
+			  <property name="focus_on_click">True</property>
+			  <property name="active">False</property>
+			  <property name="inconsistent">False</property>
+			  <property name="draw_indicator">True</property>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">False</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkRadioButton" id="type_pls">
+			  <property name="visible">True</property>
+			  <property name="can_focus">True</property>
+			  <property name="label" translatable="yes">_PLS</property>
+			  <property name="use_underline">True</property>
+			  <property name="relief">GTK_RELIEF_NORMAL</property>
+			  <property name="focus_on_click">True</property>
+			  <property name="active">False</property>
+			  <property name="inconsistent">False</property>
+			  <property name="draw_indicator">True</property>
+			  <property name="group">type_m3u</property>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">False</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<placeholder/>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="left_attach">1</property>
+		      <property name="right_attach">2</property>
+		      <property name="top_attach">0</property>
+		      <property name="bottom_attach">1</property>
+		      <property name="y_options">fill</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkHBox" id="hbox60">
+		      <property name="visible">True</property>
+		      <property name="homogeneous">False</property>
+		      <property name="spacing">10</property>
+
+		      <child>
+			<widget class="GtkRadioButton" id="source_prefer_local">
+			  <property name="visible">True</property>
+			  <property name="tooltip" translatable="yes">If available, the local copy of the track is referenced in the playlist. Otherwise the file on the iPod is used.</property>
+			  <property name="can_focus">True</property>
+			  <property name="label" translatable="yes">_Prefer Local</property>
+			  <property name="use_underline">True</property>
+			  <property name="relief">GTK_RELIEF_NORMAL</property>
+			  <property name="focus_on_click">True</property>
+			  <property name="active">False</property>
+			  <property name="inconsistent">False</property>
+			  <property name="draw_indicator">True</property>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">False</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkRadioButton" id="source_local">
+			  <property name="visible">True</property>
+			  <property name="tooltip" translatable="yes">The local copy of the track is referenced in the playlist. If the track is not available locally, an error message is displayed.</property>
+			  <property name="can_focus">True</property>
+			  <property name="label" translatable="yes">_Local</property>
+			  <property name="use_underline">True</property>
+			  <property name="relief">GTK_RELIEF_NORMAL</property>
+			  <property name="focus_on_click">True</property>
+			  <property name="active">False</property>
+			  <property name="inconsistent">False</property>
+			  <property name="draw_indicator">True</property>
+			  <property name="group">source_prefer_local</property>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">False</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkRadioButton" id="source_ipod">
+			  <property name="visible">True</property>
+			  <property name="tooltip" translatable="yes">The track on the iPod is referenced in the playlist file.</property>
+			  <property name="can_focus">True</property>
+			  <property name="label" translatable="yes">_iPod</property>
+			  <property name="use_underline">True</property>
+			  <property name="relief">GTK_RELIEF_NORMAL</property>
+			  <property name="focus_on_click">True</property>
+			  <property name="active">False</property>
+			  <property name="inconsistent">False</property>
+			  <property name="draw_indicator">True</property>
+			  <property name="group">source_prefer_local</property>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">False</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<placeholder/>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="left_attach">1</property>
+		      <property name="right_attach">2</property>
+		      <property name="top_attach">1</property>
+		      <property name="bottom_attach">2</property>
+		      <property name="x_options">fill</property>
+		      <property name="y_options">fill</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkLabel" id="label167">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">Playlist type:</property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">False</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
+		    </widget>
+		    <packing>
+		      <property name="left_attach">0</property>
+		      <property name="right_attach">1</property>
+		      <property name="top_attach">0</property>
+		      <property name="bottom_attach">1</property>
+		      <property name="y_padding">4</property>
+		      <property name="x_options">fill</property>
+		      <property name="y_options"></property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkLabel" id="label168">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">Source:</property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">False</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
+		    </widget>
+		    <packing>
+		      <property name="left_attach">0</property>
+		      <property name="right_attach">1</property>
+		      <property name="top_attach">1</property>
+		      <property name="bottom_attach">2</property>
+		      <property name="y_padding">4</property>
+		      <property name="x_options">fill</property>
+		      <property name="y_options"></property>
+		    </packing>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkHBox" id="hbox58">
+		  <property name="visible">True</property>
+		  <property name="homogeneous">False</property>
+		  <property name="spacing">0</property>
+
+		  <child>
+		    <widget class="GtkLabel" id="label165">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="label" translatable="yes">Template for info field: </property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">False</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">True</property>
+		      <property name="xalign">0</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkEntry" id="export_playlist_file_template">
+		      <property name="visible">True</property>
+		      <property name="tooltip" translatable="yes">Determines how the string for the info field should be constructed, e.g '%a/%A/%T - %t.mp3' or '%o'.  You can separate several templates by semicolons -- gtkpod will determine which one to use by the filename extension given. Artist: %a, album: %A, composer: %c, title: %t, genre: %G, track nr: %T, CD nr: %C, year: %Y, original filename (requires extended information file): %o, the character '%': %%.</property>
+		      <property name="can_focus">True</property>
+		      <property name="editable">True</property>
+		      <property name="visibility">True</property>
+		      <property name="max_length">0</property>
+		      <property name="text" translatable="yes"></property>
+		      <property name="has_frame">True</property>
+		      <property name="invisible_char">*</property>
+		      <property name="activates_default">False</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">True</property>
+		      <property name="fill">True</property>
+		    </packing>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+	    </widget>
+	  </child>
+	</widget>
+      </child>
+
+      <child>
+	<widget class="GtkLabel" id="label166">
+	  <property name="visible">True</property>
+	  <property name="label" translatable="yes">gtkpod options</property>
+	  <property name="use_underline">False</property>
+	  <property name="use_markup">True</property>
+	  <property name="justify">GTK_JUSTIFY_LEFT</property>
+	  <property name="wrap">False</property>
+	  <property name="selectable">False</property>
+	  <property name="xalign">0.5</property>
+	  <property name="yalign">0.5</property>
+	  <property name="xpad">0</property>
+	  <property name="ypad">0</property>
+	  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	  <property name="width_chars">-1</property>
+	  <property name="single_line_mode">False</property>
+	  <property name="angle">0</property>
+	</widget>
+	<packing>
+	  <property name="type">label_item</property>
+	</packing>
+      </child>
+    </widget>
+  </child>
+</widget>
+
+<widget class="GtkWindow" id="export_files_options">
+  <property name="title" translatable="yes">window1</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_NONE</property>
+  <property name="modal">False</property>
+  <property name="resizable">True</property>
+  <property name="destroy_with_parent">False</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
+  <property name="urgency_hint">False</property>
+
+  <child>
+    <widget class="GtkFrame" id="options_frame">
+      <property name="visible">True</property>
+      <property name="label_xalign">0</property>
+      <property name="label_yalign">0.5</property>
+      <property name="shadow_type">GTK_SHADOW_ETCHED_OUT</property>
+
+      <child>
+	<widget class="GtkVBox" id="vbox50">
+	  <property name="border_width">5</property>
+	  <property name="visible">True</property>
+	  <property name="homogeneous">False</property>
+	  <property name="spacing">0</property>
+
+	  <child>
+	    <widget class="GtkHBox" id="hbox51">
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">0</property>
+
+	      <child>
+		<widget class="GtkLabel" id="label70">
+		  <property name="visible">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="label" translatable="yes">Filename Format: </property>
+		  <property name="use_underline">False</property>
+		  <property name="use_markup">False</property>
+		  <property name="justify">GTK_JUSTIFY_LEFT</property>
+		  <property name="wrap">False</property>
+		  <property name="selectable">True</property>
+		  <property name="xalign">0</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xpad">0</property>
+		  <property name="ypad">0</property>
+		  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		  <property name="width_chars">-1</property>
+		  <property name="single_line_mode">False</property>
+		  <property name="angle">0</property>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkEntry" id="export_files_template">
+		  <property name="visible">True</property>
+		  <property name="tooltip" translatable="yes">Determines the filename of tracks you copy from the iPod, e.g '%a/%A/%T - %t.mp3' or '%o'.  You can separate several patterns by semicolons -- gtkpod will determine which one to use by the filename extension given. Artist: %a, album: %A, composer: %c, title: %t, genre: %G, track nr: %T, CD nr: %C, year: %Y, original filename (requires extended information file): %o, current playlist: %p, the character '%': %%.</property>
+		  <property name="can_focus">True</property>
+		  <property name="editable">True</property>
+		  <property name="visibility">True</property>
+		  <property name="max_length">0</property>
+		  <property name="text" translatable="yes"> </property>
+		  <property name="has_frame">True</property>
+		  <property name="invisible_char">*</property>
+		  <property name="activates_default">False</property>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">True</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkCheckButton" id="export_files_special_charset">
+	      <property name="visible">True</property>
+	      <property name="tooltip" translatable="yes">Normally the charset specified when first importing the track will be used for the filename. If you set this option you can set a different charset with the charset selector (Preferences/'Adding/Updating/Syncing'). Note: the charset info is stored in the extended information file (see Preferences/'Writing of the iTunesDB'). Tracks imported before V0.51 will have no charset stored. Instead the charset specified will be used.</property>
+	      <property name="can_focus">True</property>
+	      <property name="label" translatable="yes">Use selected charset (Preferences/'Adding/Updating/ Syncing')
+for this filename.</property>
+	      <property name="use_underline">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	      <property name="active">False</property>
+	      <property name="inconsistent">False</property>
+	      <property name="draw_indicator">True</property>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkCheckButton" id="export_files_check_existing">
+	      <property name="visible">True</property>
+	      <property name="tooltip" translatable="yes">When copying from iPod no check is performed on whether the destination file exists. Enabling this option will make gtkpod check whether the length of the destination file is the same as the file in the iPod. If so the file is skipped, allowing a quick sync of the iPod's contents.</property>
+	      <property name="can_focus">True</property>
+	      <property name="label" translatable="yes">Check for existing files when copying from iPod.</property>
+	      <property name="use_underline">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	      <property name="active">False</property>
+	      <property name="inconsistent">False</property>
+	      <property name="draw_indicator">True</property>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkVBox" id="message_box">
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">0</property>
+
+	      <child>
+		<widget class="GtkHSeparator" id="hseparator48">
+		  <property name="visible">True</property>
+		</widget>
+		<packing>
+		  <property name="padding">2</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkLabel" id="message">
+		  <property name="visible">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="label" translatable="yes"></property>
+		  <property name="use_underline">False</property>
+		  <property name="use_markup">False</property>
+		  <property name="justify">GTK_JUSTIFY_LEFT</property>
+		  <property name="wrap">True</property>
+		  <property name="selectable">True</property>
+		  <property name="xalign">0.5</property>
+		  <property name="yalign">0</property>
+		  <property name="xpad">0</property>
+		  <property name="ypad">0</property>
+		  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		  <property name="width_chars">-1</property>
+		  <property name="single_line_mode">False</property>
+		  <property name="angle">0</property>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkScrolledWindow" id="scrolledwindow13">
+		  <property name="visible">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+		  <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+		  <property name="shadow_type">GTK_SHADOW_IN</property>
+		  <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+		  <child>
+		    <widget class="GtkTextView" id="textview">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="editable">True</property>
+		      <property name="overwrite">False</property>
+		      <property name="accepts_tab">True</property>
+		      <property name="justification">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap_mode">GTK_WRAP_WORD</property>
+		      <property name="cursor_visible">True</property>
+		      <property name="pixels_above_lines">0</property>
+		      <property name="pixels_below_lines">0</property>
+		      <property name="pixels_inside_wrap">0</property>
+		      <property name="left_margin">0</property>
+		      <property name="right_margin">0</property>
+		      <property name="indent">0</property>
+		      <property name="text" translatable="yes"></property>
+		    </widget>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">True</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">2</property>
+	      <property name="expand">True</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
+	</widget>
+      </child>
+
+      <child>
+	<widget class="GtkLabel" id="label72">
+	  <property name="visible">True</property>
+	  <property name="can_focus">True</property>
+	  <property name="label" translatable="yes">gtkpod options</property>
+	  <property name="use_underline">False</property>
+	  <property name="use_markup">False</property>
+	  <property name="justify">GTK_JUSTIFY_LEFT</property>
+	  <property name="wrap">False</property>
+	  <property name="selectable">True</property>
+	  <property name="xalign">0.5</property>
+	  <property name="yalign">0.5</property>
+	  <property name="xpad">0</property>
+	  <property name="ypad">0</property>
+	  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	  <property name="width_chars">-1</property>
+	  <property name="single_line_mode">False</property>
+	  <property name="angle">0</property>
+	</widget>
+	<packing>
+	  <property name="type">label_item</property>
+	</packing>
+      </child>
+    </widget>
+  </child>
+</widget>
+
+<widget class="GtkWindow" id="spl_window">
+  <property name="title" translatable="yes">Smart Playlist</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_NONE</property>
+  <property name="modal">False</property>
+  <property name="resizable">True</property>
+  <property name="destroy_with_parent">False</property>
+  <property name="icon">gtkpod-icon-48.png</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
+  <property name="urgency_hint">False</property>
+
+  <child>
+    <widget class="GtkScrolledWindow" id="spl_scroll">
+      <property name="visible">True</property>
+      <property name="can_focus">True</property>
+      <property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
+      <property name="vscrollbar_policy">GTK_POLICY_NEVER</property>
+      <property name="shadow_type">GTK_SHADOW_IN</property>
+      <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+      <child>
+	<widget class="GtkViewport" id="spl_viewport">
+	  <property name="visible">True</property>
+	  <property name="shadow_type">GTK_SHADOW_IN</property>
+
+	  <child>
+	    <widget class="GtkVBox" id="vbox63">
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">0</property>
+
+	      <child>
+		<widget class="GtkHBox" id="spl_name_hbox">
+		  <property name="visible">True</property>
+		  <property name="homogeneous">False</property>
+		  <property name="spacing">0</property>
+
+		  <child>
+		    <widget class="GtkLabel" id="label175">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">Playlist name:</property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">False</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">5</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkEntry" id="spl_name_entry">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="editable">True</property>
+		      <property name="visibility">True</property>
+		      <property name="max_length">0</property>
+		      <property name="text" translatable="yes"></property>
+		      <property name="has_frame">True</property>
+		      <property name="invisible_char">*</property>
+		      <property name="activates_default">False</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">True</property>
+		      <property name="fill">True</property>
+		    </packing>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">4</property>
+		  <property name="expand">False</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkHSeparator" id="hseparator47">
+		  <property name="visible">True</property>
+		</widget>
+		<packing>
+		  <property name="padding">4</property>
+		  <property name="expand">False</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkHBox" id="hbox61">
+		  <property name="visible">True</property>
+		  <property name="homogeneous">False</property>
+		  <property name="spacing">0</property>
+
+		  <child>
+		    <widget class="GtkRadioButton" id="spl_all_radio">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="label" translatable="yes">Match al_l of the following</property>
+		      <property name="use_underline">True</property>
+		      <property name="relief">GTK_RELIEF_NORMAL</property>
+		      <property name="focus_on_click">True</property>
+		      <property name="active">False</property>
+		      <property name="inconsistent">False</property>
+		      <property name="draw_indicator">True</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">5</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkRadioButton" id="spl_any_radio">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="label" translatable="yes">Match an_y of the following</property>
+		      <property name="use_underline">True</property>
+		      <property name="relief">GTK_RELIEF_NORMAL</property>
+		      <property name="focus_on_click">True</property>
+		      <property name="active">False</property>
+		      <property name="inconsistent">False</property>
+		      <property name="draw_indicator">True</property>
+		      <property name="group">spl_all_radio</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">5</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkRadioButton" id="spl_none_radio">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="label" translatable="yes">_Ignore rules</property>
+		      <property name="use_underline">True</property>
+		      <property name="relief">GTK_RELIEF_NORMAL</property>
+		      <property name="focus_on_click">True</property>
+		      <property name="active">False</property>
+		      <property name="inconsistent">False</property>
+		      <property name="draw_indicator">True</property>
+		      <property name="group">spl_all_radio</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkFrame" id="spl_rules_frame">
+		  <property name="visible">True</property>
+		  <property name="label_xalign">0</property>
+		  <property name="label_yalign">0.5</property>
+		  <property name="shadow_type">GTK_SHADOW_ETCHED_OUT</property>
+
+		  <child>
+		    <widget class="GtkScrolledWindow" id="scrolledwindow16">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
+		      <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+		      <property name="shadow_type">GTK_SHADOW_NONE</property>
+		      <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+		      <child>
+			<widget class="GtkViewport" id="viewport10">
+			  <property name="visible">True</property>
+			  <property name="shadow_type">GTK_SHADOW_IN</property>
+
+			  <child>
+			    <widget class="GtkAlignment" id="spl_rules_table_align">
+			      <property name="visible">True</property>
+			      <property name="xalign">0.5</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xscale">1</property>
+			      <property name="yscale">1</property>
+			      <property name="top_padding">5</property>
+			      <property name="bottom_padding">5</property>
+			      <property name="left_padding">5</property>
+			      <property name="right_padding">5</property>
+
+			      <child>
+				<placeholder/>
+			      </child>
+			    </widget>
+			  </child>
+			</widget>
+		      </child>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkLabel" id="label174">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="label" translatable="yes">Rules</property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">True</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">True</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
+		    </widget>
+		    <packing>
+		      <property name="type">label_item</property>
+		    </packing>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">True</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkHBox" id="hbox62">
+		  <property name="visible">True</property>
+		  <property name="homogeneous">False</property>
+		  <property name="spacing">0</property>
+
+		  <child>
+		    <widget class="GtkCheckButton" id="spl_checklimits_button">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="label" translatable="yes">_Limit to</property>
+		      <property name="use_underline">True</property>
+		      <property name="relief">GTK_RELIEF_NORMAL</property>
+		      <property name="focus_on_click">True</property>
+		      <property name="active">False</property>
+		      <property name="inconsistent">False</property>
+		      <property name="draw_indicator">True</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">5</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkEntry" id="spl_limitvalue_entry">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="editable">True</property>
+		      <property name="visibility">True</property>
+		      <property name="max_length">12</property>
+		      <property name="text" translatable="yes"></property>
+		      <property name="has_frame">True</property>
+		      <property name="invisible_char">*</property>
+		      <property name="activates_default">False</property>
+		      <property name="width_chars">6</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkComboBox" id="spl_limittype_combobox">
+		      <property name="visible">True</property>
+		      <property name="add_tearoffs">False</property>
+		      <property name="focus_on_click">True</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">True</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkLabel" id="spl_limitsort_label">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">   Sort by:</property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">False</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">5</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkComboBox" id="spl_limitsort_combobox">
+		      <property name="visible">True</property>
+		      <property name="add_tearoffs">False</property>
+		      <property name="focus_on_click">True</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">True</property>
+		    </packing>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">2</property>
+		  <property name="expand">False</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkHBox" id="hbox63">
+		  <property name="visible">True</property>
+		  <property name="homogeneous">False</property>
+		  <property name="spacing">0</property>
+
+		  <child>
+		    <widget class="GtkCheckButton" id="spl_matchcheckedonly_button">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="label" translatable="yes">Match only _checked tracks</property>
+		      <property name="use_underline">True</property>
+		      <property name="relief">GTK_RELIEF_NORMAL</property>
+		      <property name="focus_on_click">True</property>
+		      <property name="active">False</property>
+		      <property name="inconsistent">False</property>
+		      <property name="draw_indicator">True</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">5</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">5</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkHBox" id="hbox64">
+		  <property name="visible">True</property>
+		  <property name="homogeneous">False</property>
+		  <property name="spacing">0</property>
+
+		  <child>
+		    <widget class="GtkCheckButton" id="spl_liveupdate_button">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="label" translatable="yes">Live _updating</property>
+		      <property name="use_underline">True</property>
+		      <property name="relief">GTK_RELIEF_NORMAL</property>
+		      <property name="focus_on_click">True</property>
+		      <property name="active">False</property>
+		      <property name="inconsistent">False</property>
+		      <property name="draw_indicator">True</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">5</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkHSeparator" id="hseparator46">
+		  <property name="visible">True</property>
+		</widget>
+		<packing>
+		  <property name="padding">4</property>
+		  <property name="expand">False</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkHBox" id="hbox65">
+		  <property name="visible">True</property>
+		  <property name="homogeneous">False</property>
+		  <property name="spacing">0</property>
+
+		  <child>
+		    <widget class="GtkHButtonBox" id="hbuttonbox11">
+		      <property name="visible">True</property>
+		      <property name="layout_style">GTK_BUTTONBOX_END</property>
+		      <property name="spacing">0</property>
+
+		      <child>
+			<widget class="GtkButton" id="spl_cancel_button">
+			  <property name="visible">True</property>
+			  <property name="can_default">True</property>
+			  <property name="can_focus">True</property>
+			  <property name="label">gtk-cancel</property>
+			  <property name="use_stock">True</property>
+			  <property name="relief">GTK_RELIEF_NORMAL</property>
+			  <property name="focus_on_click">True</property>
+			</widget>
+		      </child>
+
+		      <child>
+			<widget class="GtkButton" id="spl_ok_button">
+			  <property name="visible">True</property>
+			  <property name="can_default">True</property>
+			  <property name="can_focus">True</property>
+			  <property name="label">gtk-ok</property>
+			  <property name="use_stock">True</property>
+			  <property name="relief">GTK_RELIEF_NORMAL</property>
+			  <property name="focus_on_click">True</property>
+			</widget>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">True</property>
+		      <property name="fill">True</property>
+		    </packing>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+	    </widget>
+	  </child>
+	</widget>
+      </child>
+    </widget>
+  </child>
+</widget>
+
+<widget class="GtkWindow" id="prefs_window">
+  <property name="title" translatable="yes">Preferences</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_NONE</property>
+  <property name="modal">False</property>
+  <property name="resizable">True</property>
+  <property name="destroy_with_parent">False</property>
+  <property name="icon">gtkpod-icon-48.png</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
+  <property name="urgency_hint">False</property>
+  <signal name="delete_event" handler="on_prefs_window_delete_event" last_modification_time="Fri, 13 May 2005 17:19:54 GMT"/>
+
+  <child>
+    <widget class="GtkVBox" id="vbox64">
+      <property name="border_width">12</property>
+      <property name="visible">True</property>
+      <property name="homogeneous">False</property>
+      <property name="spacing">8</property>
+
+      <child>
+	<widget class="GtkNotebook" id="notebook">
+	  <property name="visible">True</property>
+	  <property name="can_focus">True</property>
+	  <property name="show_tabs">True</property>
+	  <property name="show_border">True</property>
+	  <property name="tab_pos">GTK_POS_TOP</property>
+	  <property name="scrollable">False</property>
+	  <property name="enable_popup">False</property>
+
+	  <child>
+	    <widget class="GtkScrolledWindow" id="scrolledwindow11">
+	      <property name="visible">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+	      <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+	      <property name="shadow_type">GTK_SHADOW_NONE</property>
+	      <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+	      <child>
+		<widget class="GtkViewport" id="viewport8">
+		  <property name="visible">True</property>
+		  <property name="shadow_type">GTK_SHADOW_IN</property>
+
+		  <child>
+		    <widget class="GtkVBox" id="vbox111">
+		      <property name="border_width">12</property>
+		      <property name="visible">True</property>
+		      <property name="homogeneous">False</property>
+		      <property name="spacing">18</property>
+
+		      <child>
+			<widget class="GtkVBox" id="vbox166">
+			  <property name="visible">True</property>
+			  <property name="homogeneous">False</property>
+			  <property name="spacing">6</property>
+
+			  <child>
+			    <widget class="GtkLabel" id="label418">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">&lt;b&gt;Mountpoint and individual repository/playlist options&lt;/b&gt;</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">True</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">False</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHBox" id="hbox202">
+			      <property name="visible">True</property>
+			      <property name="homogeneous">False</property>
+			      <property name="spacing">8</property>
+
+			      <child>
+				<widget class="GtkLabel" id="label419">
+				  <property name="visible">True</property>
+				  <property name="label">    </property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkVBox" id="vbox167">
+				  <property name="visible">True</property>
+				  <property name="homogeneous">False</property>
+				  <property name="spacing">6</property>
+
+				  <child>
+				    <widget class="GtkButton" id="cfg_edit_repository_button">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">Set mountpoint or edit repository options</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <signal name="clicked" handler="on_edit_repository_clicked" last_modification_time="Mon, 01 May 2006 11:37:56 GMT"/>
+				    </widget>
+				    <packing>
+				      <property name="padding">3</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <placeholder/>
+				  </child>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">True</property>
+				  <property name="fill">True</property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">True</property>
+			      <property name="fill">True</property>
+			    </packing>
+			  </child>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">False</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<placeholder/>
+		      </child>
+
+		      <child>
+			<widget class="GtkVBox" id="vbox114">
+			  <property name="visible">True</property>
+			  <property name="homogeneous">False</property>
+			  <property name="spacing">6</property>
+
+			  <child>
+			    <widget class="GtkLabel" id="label256">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">&lt;b&gt;Adding/Updating/Syncing&lt;/b&gt;</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">True</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">False</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHBox" id="hbox109">
+			      <property name="visible">True</property>
+			      <property name="homogeneous">False</property>
+			      <property name="spacing">8</property>
+
+			      <child>
+				<widget class="GtkLabel" id="label257">
+				  <property name="visible">True</property>
+				  <property name="label">    </property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkVBox" id="vbox115">
+				  <property name="visible">True</property>
+				  <property name="homogeneous">False</property>
+				  <property name="spacing">6</property>
+
+				  <child>
+				    <widget class="GtkHBox" id="hbox205">
+				      <property name="visible">True</property>
+				      <property name="homogeneous">False</property>
+				      <property name="spacing">8</property>
+
+				      <child>
+					<widget class="GtkLabel" id="label435">
+					  <property name="visible">True</property>
+					  <property name="label" translatable="yes">Exclude file mask(s)</property>
+					  <property name="use_underline">False</property>
+					  <property name="use_markup">False</property>
+					  <property name="justify">GTK_JUSTIFY_LEFT</property>
+					  <property name="wrap">False</property>
+					  <property name="selectable">False</property>
+					  <property name="xalign">0</property>
+					  <property name="yalign">0.5</property>
+					  <property name="xpad">0</property>
+					  <property name="ypad">0</property>
+					  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+					  <property name="width_chars">-1</property>
+					  <property name="single_line_mode">False</property>
+					  <property name="angle">0</property>
+					</widget>
+					<packing>
+					  <property name="padding">0</property>
+					  <property name="expand">False</property>
+					  <property name="fill">False</property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkEntry" id="exclude_file_mask_entry">
+					  <property name="visible">True</property>
+					  <property name="tooltip" translatable="yes">Semicolon separated list of file exclusion masks, e.g. '*.mp3'</property>
+					  <property name="can_focus">True</property>
+					  <property name="editable">True</property>
+					  <property name="visibility">True</property>
+					  <property name="max_length">0</property>
+					  <property name="text" translatable="yes"></property>
+					  <property name="has_frame">True</property>
+					  <property name="invisible_char">*</property>
+					  <property name="activates_default">False</property>
+					  <signal name="changed" handler="on_exclude_file_mask_entry_changed" last_modification_time="Mon, 21 Aug 2006 10:37:14 GMT"/>
+					</widget>
+					<packing>
+					  <property name="padding">0</property>
+					  <property name="expand">True</property>
+					  <property name="fill">True</property>
+					</packing>
+				      </child>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">True</property>
+				      <property name="fill">True</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkHBox" id="hbox110">
+				      <property name="visible">True</property>
+				      <property name="homogeneous">False</property>
+				      <property name="spacing">8</property>
+
+				      <child>
+					<widget class="GtkLabel" id="label258">
+					  <property name="visible">True</property>
+					  <property name="label" translatable="yes">_Encoding (ID3, files):</property>
+					  <property name="use_underline">True</property>
+					  <property name="use_markup">False</property>
+					  <property name="justify">GTK_JUSTIFY_LEFT</property>
+					  <property name="wrap">False</property>
+					  <property name="selectable">False</property>
+					  <property name="xalign">0.5</property>
+					  <property name="yalign">0.5</property>
+					  <property name="xpad">0</property>
+					  <property name="ypad">0</property>
+					  <property name="mnemonic_widget">charset_combo_entry</property>
+					  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+					  <property name="width_chars">-1</property>
+					  <property name="single_line_mode">False</property>
+					  <property name="angle">0</property>
+					</widget>
+					<packing>
+					  <property name="padding">0</property>
+					  <property name="expand">False</property>
+					  <property name="fill">False</property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkCombo" id="charset_combo">
+					  <property name="visible">True</property>
+					  <property name="value_in_list">False</property>
+					  <property name="allow_empty">True</property>
+					  <property name="case_sensitive">False</property>
+					  <property name="enable_arrow_keys">True</property>
+					  <property name="enable_arrows_always">False</property>
+
+					  <child internal-child="entry">
+					    <widget class="GtkEntry" id="charset_combo_entry">
+					      <property name="visible">True</property>
+					      <property name="tooltip" translatable="yes">gtkpod expects the ID3 tags and the filenames to be in the encoding specified here. You can change it for consecutive 'Add Files' and 'Add Dirs' operation. 'System Charset' is the charset used by your current locale.</property>
+					      <property name="can_focus">True</property>
+					      <property name="editable">False</property>
+					      <property name="visibility">True</property>
+					      <property name="max_length">0</property>
+					      <property name="text" translatable="yes"></property>
+					      <property name="has_frame">True</property>
+					      <property name="invisible_char">*</property>
+					      <property name="activates_default">False</property>
+					      <signal name="changed" handler="on_charset_combo_entry_changed" last_modification_time="Tue, 14 Jan 2003 13:53:44 GMT"/>
+					    </widget>
+					  </child>
+
+					  <child internal-child="list">
+					    <widget class="GtkList" id="list1">
+					      <property name="visible">True</property>
+					      <property name="selection_mode">GTK_SELECTION_BROWSE</property>
+					    </widget>
+					  </child>
+					</widget>
+					<packing>
+					  <property name="padding">0</property>
+					  <property name="expand">True</property>
+					  <property name="fill">True</property>
+					</packing>
+				      </child>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">True</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkCheckButton" id="file_convert_background_transfer_button">
+				      <property name="visible">True</property>
+				      <property name="tooltip" translatable="yes">Tracks can be transferred in the background as soon as they are added to an iPod repository. Otherwise they will be transferred when ejecting the contents of the iPod completely unchanged until then.</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">Transfer tracks to the iPod in the background</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <property name="active">False</property>
+				      <property name="inconsistent">False</property>
+				      <property name="draw_indicator">True</property>
+				      <signal name="toggled" handler="on_cfg_update_charset_toggled" last_modification_time="Thu, 14 Apr 2005 19:38:42 GMT"/>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkCheckButton" id="cfg_update_charset">
+				      <property name="visible">True</property>
+				      <property name="tooltip" translatable="yes">Normally the charset specified when first importing the track will be used to update the track information. If you have chosen a wrong charset when first importing a track and want to correct it using the 'Update Track' function, you must check this option. Note: the charset info is stored in the extended information file (see 'Writing of iTunesDB' below) and tracks imported before V0.51 will have no charset stored. Instead the charset specified above will be used then.</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">Use selected encoding also when updating or syncing tracks</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <property name="active">False</property>
+				      <property name="inconsistent">False</property>
+				      <property name="draw_indicator">True</property>
+				      <signal name="toggled" handler="on_cfg_update_charset_toggled" last_modification_time="Thu, 14 Apr 2005 19:38:42 GMT"/>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkCheckButton" id="cfg_add_recursively">
+				      <property name="visible">True</property>
+				      <property name="tooltip" translatable="yes">If you check this, gtkpod will descend into subdirectories recursively.</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">Add directories recursively</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <property name="active">False</property>
+				      <property name="inconsistent">False</property>
+				      <property name="draw_indicator">True</property>
+				      <signal name="toggled" handler="on_cfg_add_recursively_toggled" last_modification_time="Thu, 14 Apr 2005 19:38:51 GMT"/>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkCheckButton" id="cfg_sha1tracks">
+				      <property name="visible">True</property>
+				      <property name="tooltip" translatable="yes">Duplicate Recognition is based on a (modified) sha1 hash over the file.</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">Don't allow file duplication</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <property name="active">False</property>
+				      <property name="inconsistent">False</property>
+				      <property name="draw_indicator">True</property>
+				      <signal name="toggled" handler="on_cfg_sha1tracks_toggled" last_modification_time="Sat, 07 Apr 2007 04:29:18 GMT"/>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkHBox" id="hbox111">
+				      <property name="visible">True</property>
+				      <property name="homogeneous">False</property>
+				      <property name="spacing">0</property>
+
+				      <child>
+					<widget class="GtkLabel" id="label259">
+					  <property name="visible">True</property>
+					  <property name="label">    </property>
+					  <property name="use_underline">False</property>
+					  <property name="use_markup">False</property>
+					  <property name="justify">GTK_JUSTIFY_LEFT</property>
+					  <property name="wrap">False</property>
+					  <property name="selectable">False</property>
+					  <property name="xalign">0.5</property>
+					  <property name="yalign">0.5</property>
+					  <property name="xpad">0</property>
+					  <property name="ypad">0</property>
+					  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+					  <property name="width_chars">-1</property>
+					  <property name="single_line_mode">False</property>
+					  <property name="angle">0</property>
+					</widget>
+					<packing>
+					  <property name="padding">0</property>
+					  <property name="expand">False</property>
+					  <property name="fill">False</property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkCheckButton" id="cfg_show_duplicates">
+					  <property name="visible">True</property>
+					  <property name="tooltip" translatable="yes">Display the list of duplicates that have been detected after adding files.</property>
+					  <property name="can_focus">True</property>
+					  <property name="label" translatable="yes">Display info about detected duplicates</property>
+					  <property name="use_underline">True</property>
+					  <property name="relief">GTK_RELIEF_NORMAL</property>
+					  <property name="focus_on_click">True</property>
+					  <property name="active">False</property>
+					  <property name="inconsistent">False</property>
+					  <property name="draw_indicator">True</property>
+					  <signal name="toggled" handler="on_cfg_show_duplicates_toggled" last_modification_time="Thu, 14 Apr 2005 19:39:08 GMT"/>
+					</widget>
+					<packing>
+					  <property name="padding">0</property>
+					  <property name="expand">False</property>
+					  <property name="fill">False</property>
+					</packing>
+				      </child>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">True</property>
+				      <property name="fill">True</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkCheckButton" id="cfg_update_existing">
+				      <property name="visible">True</property>
+				      <property name="tooltip" translatable="yes">If the filename (full path) of an existing track matches that of a track to be added, this option allows you to update the information about the existing track rather than just skipping the track altogether. No update will take place if the file hasn't changed and you have selected the 'Don't allow file duplication' option above.</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">When adding dirs/files, update information of
+existing tracks with identical filenames</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <property name="active">False</property>
+				      <property name="inconsistent">False</property>
+				      <property name="draw_indicator">True</property>
+				      <signal name="toggled" handler="on_cfg_update_existing_toggled" last_modification_time="Thu, 14 Apr 2005 19:39:15 GMT"/>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkHBox" id="hbox112">
+				      <property name="visible">True</property>
+				      <property name="homogeneous">False</property>
+				      <property name="spacing">0</property>
+
+				      <child>
+					<widget class="GtkLabel" id="label260">
+					  <property name="visible">True</property>
+					  <property name="label">    </property>
+					  <property name="use_underline">False</property>
+					  <property name="use_markup">False</property>
+					  <property name="justify">GTK_JUSTIFY_LEFT</property>
+					  <property name="wrap">False</property>
+					  <property name="selectable">False</property>
+					  <property name="xalign">0.5</property>
+					  <property name="yalign">0.5</property>
+					  <property name="xpad">0</property>
+					  <property name="ypad">0</property>
+					  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+					  <property name="width_chars">-1</property>
+					  <property name="single_line_mode">False</property>
+					  <property name="angle">0</property>
+					</widget>
+					<packing>
+					  <property name="padding">0</property>
+					  <property name="expand">False</property>
+					  <property name="fill">False</property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkCheckButton" id="cfg_show_updated">
+					  <property name="visible">True</property>
+					  <property name="tooltip" translatable="yes">Display a list of tracks that could actually be updated.</property>
+					  <property name="can_focus">True</property>
+					  <property name="label" translatable="yes">Display info about updated tracks</property>
+					  <property name="use_underline">True</property>
+					  <property name="relief">GTK_RELIEF_NORMAL</property>
+					  <property name="focus_on_click">True</property>
+					  <property name="active">False</property>
+					  <property name="inconsistent">False</property>
+					  <property name="draw_indicator">True</property>
+					  <signal name="toggled" handler="on_cfg_show_updated_toggled" last_modification_time="Thu, 14 Apr 2005 19:39:19 GMT"/>
+					</widget>
+					<packing>
+					  <property name="padding">0</property>
+					  <property name="expand">False</property>
+					  <property name="fill">False</property>
+					</packing>
+				      </child>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkHBox" id="hbox113">
+				      <property name="visible">True</property>
+				      <property name="homogeneous">False</property>
+				      <property name="spacing">0</property>
+
+				      <child>
+					<widget class="GtkLabel" id="label261">
+					  <property name="visible">True</property>
+					  <property name="label">    </property>
+					  <property name="use_underline">False</property>
+					  <property name="use_markup">False</property>
+					  <property name="justify">GTK_JUSTIFY_LEFT</property>
+					  <property name="wrap">False</property>
+					  <property name="selectable">False</property>
+					  <property name="xalign">0.5</property>
+					  <property name="yalign">0.5</property>
+					  <property name="xpad">0</property>
+					  <property name="ypad">0</property>
+					  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+					  <property name="width_chars">-1</property>
+					  <property name="single_line_mode">False</property>
+					  <property name="angle">0</property>
+					</widget>
+					<packing>
+					  <property name="padding">0</property>
+					  <property name="expand">False</property>
+					  <property name="fill">False</property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkCheckButton" id="cfg_show_non_updated">
+					  <property name="visible">True</property>
+					  <property name="tooltip" translatable="yes">Display a list of tracks that could not be updated.</property>
+					  <property name="can_focus">True</property>
+					  <property name="label" translatable="yes">Display info about non-updated tracks</property>
+					  <property name="use_underline">True</property>
+					  <property name="relief">GTK_RELIEF_NORMAL</property>
+					  <property name="focus_on_click">True</property>
+					  <property name="active">False</property>
+					  <property name="inconsistent">False</property>
+					  <property name="draw_indicator">True</property>
+					  <signal name="toggled" handler="on_cfg_show_non_updated_toggled" last_modification_time="Thu, 14 Apr 2005 19:39:22 GMT"/>
+					</widget>
+					<packing>
+					  <property name="padding">0</property>
+					  <property name="expand">False</property>
+					  <property name="fill">False</property>
+					</packing>
+				      </child>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="label262">
+				      <property name="visible">True</property>
+				      <property name="label" translatable="yes">When syncing playlists</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkHBox" id="hbox114">
+				      <property name="visible">True</property>
+				      <property name="homogeneous">False</property>
+				      <property name="spacing">0</property>
+
+				      <child>
+					<widget class="GtkLabel" id="label263">
+					  <property name="visible">True</property>
+					  <property name="label">    </property>
+					  <property name="use_underline">False</property>
+					  <property name="use_markup">False</property>
+					  <property name="justify">GTK_JUSTIFY_LEFT</property>
+					  <property name="wrap">False</property>
+					  <property name="selectable">False</property>
+					  <property name="xalign">0.5</property>
+					  <property name="yalign">0.5</property>
+					  <property name="xpad">0</property>
+					  <property name="ypad">0</property>
+					  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+					  <property name="width_chars">-1</property>
+					  <property name="single_line_mode">False</property>
+					  <property name="angle">0</property>
+					</widget>
+					<packing>
+					  <property name="padding">0</property>
+					  <property name="expand">False</property>
+					  <property name="fill">False</property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkAlignment" id="alignment13">
+					  <property name="visible">True</property>
+					  <property name="xalign">0.5</property>
+					  <property name="yalign">0.5</property>
+					  <property name="xscale">1</property>
+					  <property name="yscale">1</property>
+					  <property name="top_padding">0</property>
+					  <property name="bottom_padding">0</property>
+					  <property name="left_padding">0</property>
+					  <property name="right_padding">0</property>
+
+					  <child>
+					    <widget class="GtkVBox" id="vbox116">
+					      <property name="visible">True</property>
+					      <property name="homogeneous">False</property>
+					      <property name="spacing">4</property>
+
+					      <child>
+						<widget class="GtkCheckButton" id="sync_confirm_dirs_toggle">
+						  <property name="can_focus">True</property>
+						  <property name="label" translatable="yes">Confirm lists of directories</property>
+						  <property name="use_underline">True</property>
+						  <property name="relief">GTK_RELIEF_NORMAL</property>
+						  <property name="focus_on_click">True</property>
+						  <property name="active">False</property>
+						  <property name="inconsistent">False</property>
+						  <property name="draw_indicator">True</property>
+						</widget>
+						<packing>
+						  <property name="padding">0</property>
+						  <property name="expand">False</property>
+						  <property name="fill">False</property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkCheckButton" id="sync_delete_tracks_toggle">
+						  <property name="visible">True</property>
+						  <property name="tooltip" translatable="yes">Normally, if a track is no longer present in the sync directory, it will be removed from the playlist, but not from the iPod or local repository.
+If this option is checked, tracks will be completely removed from the iPod or local repository, unless the track is a member of other playlists as well.
+NOTE: if you sync with the master playlist, you must check this option if you want tracks to be removed, because removing from the master playlist means removing from the iPod.</property>
+						  <property name="can_focus">True</property>
+						  <property name="label" translatable="yes">Delete tracks that are no longer present from the
+iPod or repository</property>
+						  <property name="use_underline">True</property>
+						  <property name="relief">GTK_RELIEF_NORMAL</property>
+						  <property name="focus_on_click">True</property>
+						  <property name="active">False</property>
+						  <property name="inconsistent">False</property>
+						  <property name="draw_indicator">True</property>
+						</widget>
+						<packing>
+						  <property name="padding">0</property>
+						  <property name="expand">False</property>
+						  <property name="fill">False</property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkCheckButton" id="sync_confirm_delete_toggle">
+						  <property name="visible">True</property>
+						  <property name="tooltip" translatable="yes">This is the same option as in 'Edit/Delete Confirmation'</property>
+						  <property name="can_focus">True</property>
+						  <property name="label" translatable="yes">Confirm before removing tracks from the iPod or repository</property>
+						  <property name="use_underline">True</property>
+						  <property name="relief">GTK_RELIEF_NORMAL</property>
+						  <property name="focus_on_click">True</property>
+						  <property name="active">False</property>
+						  <property name="inconsistent">False</property>
+						  <property name="draw_indicator">True</property>
+						  <signal name="toggled" handler="on_sync_confirm_delete_toggled" last_modification_time="Mon, 15 May 2006 15:28:49 GMT"/>
+						</widget>
+						<packing>
+						  <property name="padding">0</property>
+						  <property name="expand">False</property>
+						  <property name="fill">False</property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkCheckButton" id="sync_show_summary_toggle">
+						  <property name="visible">True</property>
+						  <property name="tooltip" translatable="yes">Will show a list of tracks removed and a list of tracks newly added or updated.</property>
+						  <property name="can_focus">True</property>
+						  <property name="label" translatable="yes">Show summary of sync result</property>
+						  <property name="use_underline">True</property>
+						  <property name="relief">GTK_RELIEF_NORMAL</property>
+						  <property name="focus_on_click">True</property>
+						  <property name="active">False</property>
+						  <property name="inconsistent">False</property>
+						  <property name="draw_indicator">True</property>
+						</widget>
+						<packing>
+						  <property name="padding">0</property>
+						  <property name="expand">False</property>
+						  <property name="fill">False</property>
+						</packing>
+					      </child>
+					    </widget>
+					  </child>
+					</widget>
+					<packing>
+					  <property name="padding">0</property>
+					  <property name="expand">True</property>
+					  <property name="fill">True</property>
+					</packing>
+				      </child>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">True</property>
+				      <property name="fill">True</property>
+				    </packing>
+				  </child>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">True</property>
+				  <property name="fill">True</property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">True</property>
+			      <property name="fill">True</property>
+			    </packing>
+			  </child>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">True</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkVBox" id="vbox117">
+			  <property name="visible">True</property>
+			  <property name="homogeneous">False</property>
+			  <property name="spacing">8</property>
+
+			  <child>
+			    <widget class="GtkLabel" id="label264">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">&lt;b&gt;Sync&lt;/b&gt;</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">True</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">False</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHBox" id="hbox115">
+			      <property name="visible">True</property>
+			      <property name="homogeneous">False</property>
+			      <property name="spacing">8</property>
+
+			      <child>
+				<widget class="GtkLabel" id="label265">
+				  <property name="visible">True</property>
+				  <property name="label">    </property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkCheckButton" id="cfg_write_extended">
+				  <property name="visible">True</property>
+				  <property name="tooltip" translatable="yes">Highly recommended for faster import when taking advantage of the duplication recognition. Also, having the PC filenames allows writing changed ID3 tags to disk, and even to reconstruct your iPod's contents in case of file system corruption (change the &quot;transferred=&quot; entries in your backuped database).</property>
+				  <property name="can_focus">True</property>
+				  <property name="label" translatable="yes">Write extended information (PC filenames, SHA1 hashes,
+encoding...). Recommended.</property>
+				  <property name="use_underline">True</property>
+				  <property name="relief">GTK_RELIEF_NORMAL</property>
+				  <property name="focus_on_click">True</property>
+				  <property name="active">False</property>
+				  <property name="inconsistent">False</property>
+				  <property name="draw_indicator">True</property>
+				  <signal name="toggled" handler="on_cfg_write_extended_info_toggled" last_modification_time="Sat, 04 Jan 2003 16:44:20 GMT"/>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">True</property>
+			    </packing>
+			  </child>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">True</property>
+			  <property name="fill">True</property>
+			</packing>
+		      </child>
+		    </widget>
+		  </child>
+		</widget>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="tab_expand">False</property>
+	      <property name="tab_fill">True</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkLabel" id="label252">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">_General</property>
+	      <property name="use_underline">True</property>
+	      <property name="use_markup">False</property>
+	      <property name="justify">GTK_JUSTIFY_LEFT</property>
+	      <property name="wrap">False</property>
+	      <property name="selectable">False</property>
+	      <property name="xalign">0.5</property>
+	      <property name="yalign">0.5</property>
+	      <property name="xpad">0</property>
+	      <property name="ypad">0</property>
+	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	      <property name="width_chars">-1</property>
+	      <property name="single_line_mode">False</property>
+	      <property name="angle">0</property>
+	    </widget>
+	    <packing>
+	      <property name="type">tab</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkScrolledWindow" id="scrolledwindow29">
+	      <property name="visible">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+	      <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+	      <property name="shadow_type">GTK_SHADOW_NONE</property>
+	      <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+	      <child>
+		<widget class="GtkViewport" id="viewport24">
+		  <property name="visible">True</property>
+		  <property name="shadow_type">GTK_SHADOW_IN</property>
+
+		  <child>
+		    <widget class="GtkVBox" id="vbox72">
+		      <property name="border_width">12</property>
+		      <property name="visible">True</property>
+		      <property name="homogeneous">False</property>
+		      <property name="spacing">19</property>
+
+		      <child>
+			<widget class="GtkVBox" id="vbox73">
+			  <property name="visible">True</property>
+			  <property name="homogeneous">False</property>
+			  <property name="spacing">6</property>
+
+			  <child>
+			    <widget class="GtkLabel" id="label191">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">&lt;b&gt;Tag Reading&lt;/b&gt;</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">True</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">False</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHBox" id="hbox75">
+			      <property name="visible">True</property>
+			      <property name="homogeneous">False</property>
+			      <property name="spacing">8</property>
+
+			      <child>
+				<widget class="GtkLabel" id="label192">
+				  <property name="visible">True</property>
+				  <property name="label">    </property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkVBox" id="vbox74">
+				  <property name="visible">True</property>
+				  <property name="homogeneous">False</property>
+				  <property name="spacing">0</property>
+
+				  <child>
+				    <widget class="GtkCheckButton" id="readtags">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">Read tags from file contents (e.g. ID3 tags in MP3 files)</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <property name="active">False</property>
+				      <property name="inconsistent">False</property>
+				      <property name="draw_indicator">True</property>
+				      <signal name="toggled" handler="on_readtags_toggled" last_modification_time="Thu, 26 May 2005 15:28:01 GMT"/>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkCheckButton" id="parsetags">
+				      <property name="visible">True</property>
+				      <property name="tooltip" translatable="yes">artist: %a, album: %A, composer: %c, title: %t, genre: %G, track nr: %T, CD nr: %C, year: %Y, skip data: %*, the character '%': %%. You can separate several templates by a ';'. The first one matching the filename will be used. Example: '%a - %A/%T %t.mp3;%t.wav'.</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">Use this template to parse filename for tag information:</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <property name="active">False</property>
+				      <property name="inconsistent">False</property>
+				      <property name="draw_indicator">True</property>
+				      <signal name="toggled" handler="on_parsetags_toggled" last_modification_time="Thu, 26 May 2005 15:27:49 GMT"/>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkHBox" id="hbox76">
+				      <property name="visible">True</property>
+				      <property name="homogeneous">False</property>
+				      <property name="spacing">0</property>
+
+				      <child>
+					<widget class="GtkLabel" id="label193">
+					  <property name="visible">True</property>
+					  <property name="label">    </property>
+					  <property name="use_underline">False</property>
+					  <property name="use_markup">False</property>
+					  <property name="justify">GTK_JUSTIFY_LEFT</property>
+					  <property name="wrap">False</property>
+					  <property name="selectable">False</property>
+					  <property name="xalign">0.5</property>
+					  <property name="yalign">0.5</property>
+					  <property name="xpad">0</property>
+					  <property name="ypad">0</property>
+					  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+					  <property name="width_chars">-1</property>
+					  <property name="single_line_mode">False</property>
+					  <property name="angle">0</property>
+					</widget>
+					<packing>
+					  <property name="padding">0</property>
+					  <property name="expand">False</property>
+					  <property name="fill">False</property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkVBox" id="vbox75">
+					  <property name="visible">True</property>
+					  <property name="homogeneous">False</property>
+					  <property name="spacing">8</property>
+
+					  <child>
+					    <widget class="GtkEntry" id="parsetags_template">
+					      <property name="visible">True</property>
+					      <property name="can_focus">True</property>
+					      <property name="editable">True</property>
+					      <property name="visibility">True</property>
+					      <property name="max_length">0</property>
+					      <property name="text" translatable="yes"></property>
+					      <property name="has_frame">True</property>
+					      <property name="invisible_char">*</property>
+					      <property name="activates_default">False</property>
+					      <signal name="changed" handler="on_parsetags_template_changed" last_modification_time="Thu, 26 May 2005 15:28:19 GMT"/>
+					    </widget>
+					    <packing>
+					      <property name="padding">0</property>
+					      <property name="expand">False</property>
+					      <property name="fill">False</property>
+					    </packing>
+					  </child>
+
+					  <child>
+					    <widget class="GtkCheckButton" id="parsetags_overwrite">
+					      <property name="visible">True</property>
+					      <property name="can_focus">True</property>
+					      <property name="label" translatable="yes">Overwrite tags that are already set</property>
+					      <property name="use_underline">True</property>
+					      <property name="relief">GTK_RELIEF_NORMAL</property>
+					      <property name="focus_on_click">True</property>
+					      <property name="active">False</property>
+					      <property name="inconsistent">False</property>
+					      <property name="draw_indicator">True</property>
+					      <signal name="toggled" handler="on_parsetags_overwrite_toggled" last_modification_time="Thu, 26 May 2005 15:28:32 GMT"/>
+					    </widget>
+					    <packing>
+					      <property name="padding">0</property>
+					      <property name="expand">False</property>
+					      <property name="fill">False</property>
+					    </packing>
+					  </child>
+					</widget>
+					<packing>
+					  <property name="padding">0</property>
+					  <property name="expand">True</property>
+					  <property name="fill">True</property>
+					</packing>
+				      </child>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="label194">
+				      <property name="visible">True</property>
+				      <property name="label" translatable="yes">As a last resort set the following tags to the
+filename if they are (still) empty:</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkTable" id="table32">
+				      <property name="visible">True</property>
+				      <property name="n_rows">2</property>
+				      <property name="n_columns">3</property>
+				      <property name="homogeneous">True</property>
+				      <property name="row_spacing">0</property>
+				      <property name="column_spacing">8</property>
+
+				      <child>
+					<widget class="GtkCheckButton" id="tag_autoset1">
+					  <property name="visible">True</property>
+					  <property name="can_focus">True</property>
+					  <property name="label" translatable="yes">Artist</property>
+					  <property name="use_underline">True</property>
+					  <property name="relief">GTK_RELIEF_NORMAL</property>
+					  <property name="focus_on_click">True</property>
+					  <property name="active">False</property>
+					  <property name="inconsistent">False</property>
+					  <property name="draw_indicator">True</property>
+					</widget>
+					<packing>
+					  <property name="left_attach">0</property>
+					  <property name="right_attach">1</property>
+					  <property name="top_attach">0</property>
+					  <property name="bottom_attach">1</property>
+					  <property name="x_options">fill</property>
+					  <property name="y_options"></property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkCheckButton" id="tag_autoset3">
+					  <property name="visible">True</property>
+					  <property name="can_focus">True</property>
+					  <property name="label" translatable="yes">Genre</property>
+					  <property name="use_underline">True</property>
+					  <property name="relief">GTK_RELIEF_NORMAL</property>
+					  <property name="focus_on_click">True</property>
+					  <property name="active">False</property>
+					  <property name="inconsistent">False</property>
+					  <property name="draw_indicator">True</property>
+					</widget>
+					<packing>
+					  <property name="left_attach">0</property>
+					  <property name="right_attach">1</property>
+					  <property name="top_attach">1</property>
+					  <property name="bottom_attach">2</property>
+					  <property name="x_options">fill</property>
+					  <property name="y_options"></property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkCheckButton" id="tag_autoset2">
+					  <property name="visible">True</property>
+					  <property name="can_focus">True</property>
+					  <property name="label" translatable="yes">Album</property>
+					  <property name="use_underline">True</property>
+					  <property name="relief">GTK_RELIEF_NORMAL</property>
+					  <property name="focus_on_click">True</property>
+					  <property name="active">False</property>
+					  <property name="inconsistent">False</property>
+					  <property name="draw_indicator">True</property>
+					</widget>
+					<packing>
+					  <property name="left_attach">1</property>
+					  <property name="right_attach">2</property>
+					  <property name="top_attach">0</property>
+					  <property name="bottom_attach">1</property>
+					  <property name="x_options">fill</property>
+					  <property name="y_options"></property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkCheckButton" id="tag_autoset4">
+					  <property name="visible">True</property>
+					  <property name="can_focus">True</property>
+					  <property name="label" translatable="yes">Composer</property>
+					  <property name="use_underline">True</property>
+					  <property name="relief">GTK_RELIEF_NORMAL</property>
+					  <property name="focus_on_click">True</property>
+					  <property name="active">False</property>
+					  <property name="inconsistent">False</property>
+					  <property name="draw_indicator">True</property>
+					</widget>
+					<packing>
+					  <property name="left_attach">1</property>
+					  <property name="right_attach">2</property>
+					  <property name="top_attach">1</property>
+					  <property name="bottom_attach">2</property>
+					  <property name="x_options">fill</property>
+					  <property name="y_options"></property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkCheckButton" id="tag_autoset0">
+					  <property name="visible">True</property>
+					  <property name="can_focus">True</property>
+					  <property name="label" translatable="yes">Title</property>
+					  <property name="use_underline">True</property>
+					  <property name="relief">GTK_RELIEF_NORMAL</property>
+					  <property name="focus_on_click">True</property>
+					  <property name="active">False</property>
+					  <property name="inconsistent">False</property>
+					  <property name="draw_indicator">True</property>
+					</widget>
+					<packing>
+					  <property name="left_attach">2</property>
+					  <property name="right_attach">3</property>
+					  <property name="top_attach">0</property>
+					  <property name="bottom_attach">1</property>
+					  <property name="x_options">fill</property>
+					  <property name="y_options"></property>
+					</packing>
+				      </child>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">True</property>
+				      <property name="fill">True</property>
+				    </packing>
+				  </child>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">True</property>
+				  <property name="fill">True</property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">True</property>
+			      <property name="fill">True</property>
+			    </packing>
+			  </child>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">True</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkVBox" id="vbox155">
+			  <property name="visible">True</property>
+			  <property name="homogeneous">False</property>
+			  <property name="spacing">6</property>
+
+			  <child>
+			    <widget class="GtkLabel" id="label394">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">&lt;b&gt;Coverart&lt;/b&gt;</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">True</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">False</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHBox" id="hbox195">
+			      <property name="visible">True</property>
+			      <property name="homogeneous">False</property>
+			      <property name="spacing">8</property>
+
+			      <child>
+				<widget class="GtkLabel" id="label395">
+				  <property name="visible">True</property>
+				  <property name="label">    </property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkVBox" id="vbox156">
+				  <property name="visible">True</property>
+				  <property name="homogeneous">False</property>
+				  <property name="spacing">0</property>
+
+				  <child>
+				    <widget class="GtkCheckButton" id="coverart_apic">
+				      <property name="visible">True</property>
+				      <property name="tooltip" translatable="yes">Music files can have images embedded in the APIC tag. Currently this is only supported for MP3 files.</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">Read coverart from embedded APIC data</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <property name="active">False</property>
+				      <property name="inconsistent">False</property>
+				      <property name="draw_indicator">True</property>
+				      <signal name="toggled" handler="on_coverart_apic_toggled" last_modification_time="Mon, 18 Sep 2006 06:14:57 GMT"/>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkCheckButton" id="coverart_file">
+				      <property name="visible">True</property>
+				      <property name="tooltip" translatable="yes">artist: %a, album: %A, composer: %c, title: %t, genre: %G, track nr: %T, CD nr: %C, year: %Y, skip data: %*, the character '%': %%. You can separate several templates by a ';'. The first one matching the filename will be used. Example: '%a - %A/%T %t.mp3;%t.wav'.</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">Add coverart from file using the following template</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <property name="active">False</property>
+				      <property name="inconsistent">False</property>
+				      <property name="draw_indicator">True</property>
+				      <signal name="toggled" handler="on_coverart_file_toggled" last_modification_time="Mon, 18 Sep 2006 06:14:44 GMT"/>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkHBox" id="hbox196">
+				      <property name="visible">True</property>
+				      <property name="homogeneous">False</property>
+				      <property name="spacing">0</property>
+
+				      <child>
+					<widget class="GtkLabel" id="label396">
+					  <property name="visible">True</property>
+					  <property name="label">    </property>
+					  <property name="use_underline">False</property>
+					  <property name="use_markup">False</property>
+					  <property name="justify">GTK_JUSTIFY_LEFT</property>
+					  <property name="wrap">False</property>
+					  <property name="selectable">False</property>
+					  <property name="xalign">0.5</property>
+					  <property name="yalign">0.5</property>
+					  <property name="xpad">0</property>
+					  <property name="ypad">0</property>
+					  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+					  <property name="width_chars">-1</property>
+					  <property name="single_line_mode">False</property>
+					  <property name="angle">0</property>
+					</widget>
+					<packing>
+					  <property name="padding">0</property>
+					  <property name="expand">False</property>
+					  <property name="fill">False</property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkVBox" id="vbox157">
+					  <property name="visible">True</property>
+					  <property name="homogeneous">False</property>
+					  <property name="spacing">6</property>
+
+					  <child>
+					    <widget class="GtkEntry" id="coverart_template">
+					      <property name="visible">True</property>
+					      <property name="tooltip" translatable="yes">Determines the name of the file with the cover art. You can separate several patterns by semicolons which will be tried in order. Artist: %a, album: %A, composer: %c, title: %t, genre: %G, track nr: %T, CD nr: %C, year: %Y, original filename (requires extended information file): %o, original filename without file extension: %O, current playlist: %p, the character '%': %%.</property>
+					      <property name="can_focus">True</property>
+					      <property name="editable">True</property>
+					      <property name="visibility">True</property>
+					      <property name="max_length">0</property>
+					      <property name="text" translatable="yes"></property>
+					      <property name="has_frame">True</property>
+					      <property name="invisible_char">*</property>
+					      <property name="activates_default">False</property>
+					      <signal name="changed" handler="on_coverart_template_changed" last_modification_time="Sat, 10 Dec 2005 13:42:35 GMT"/>
+					    </widget>
+					    <packing>
+					      <property name="padding">0</property>
+					      <property name="expand">False</property>
+					      <property name="fill">False</property>
+					    </packing>
+					  </child>
+
+					  <child>
+					    <widget class="GtkLabel" id="label397">
+					      <property name="visible">True</property>
+					      <property name="label" translatable="yes">&lt;b&gt;Examples&lt;/b&gt;</property>
+					      <property name="use_underline">False</property>
+					      <property name="use_markup">True</property>
+					      <property name="justify">GTK_JUSTIFY_LEFT</property>
+					      <property name="wrap">False</property>
+					      <property name="selectable">False</property>
+					      <property name="xalign">0</property>
+					      <property name="yalign">0.5</property>
+					      <property name="xpad">0</property>
+					      <property name="ypad">0</property>
+					      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+					      <property name="width_chars">-1</property>
+					      <property name="single_line_mode">False</property>
+					      <property name="angle">0</property>
+					    </widget>
+					    <packing>
+					      <property name="padding">0</property>
+					      <property name="expand">False</property>
+					      <property name="fill">False</property>
+					    </packing>
+					  </child>
+
+					  <child>
+					    <widget class="GtkTable" id="table42">
+					      <property name="visible">True</property>
+					      <property name="n_rows">6</property>
+					      <property name="n_columns">2</property>
+					      <property name="homogeneous">False</property>
+					      <property name="row_spacing">2</property>
+					      <property name="column_spacing">20</property>
+
+					      <child>
+						<widget class="GtkLabel" id="label398">
+						  <property name="visible">True</property>
+						  <property name="label" translatable="yes">folder.jpg</property>
+						  <property name="use_underline">False</property>
+						  <property name="use_markup">False</property>
+						  <property name="justify">GTK_JUSTIFY_LEFT</property>
+						  <property name="wrap">False</property>
+						  <property name="selectable">False</property>
+						  <property name="xalign">0</property>
+						  <property name="yalign">0.5</property>
+						  <property name="xpad">0</property>
+						  <property name="ypad">0</property>
+						  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+						  <property name="width_chars">-1</property>
+						  <property name="single_line_mode">False</property>
+						  <property name="angle">0</property>
+						</widget>
+						<packing>
+						  <property name="left_attach">0</property>
+						  <property name="right_attach">1</property>
+						  <property name="top_attach">0</property>
+						  <property name="bottom_attach">1</property>
+						  <property name="x_options">fill</property>
+						  <property name="y_options"></property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkLabel" id="label399">
+						  <property name="visible">True</property>
+						  <property name="label" translatable="yes">folder</property>
+						  <property name="use_underline">False</property>
+						  <property name="use_markup">False</property>
+						  <property name="justify">GTK_JUSTIFY_LEFT</property>
+						  <property name="wrap">False</property>
+						  <property name="selectable">False</property>
+						  <property name="xalign">0</property>
+						  <property name="yalign">0.5</property>
+						  <property name="xpad">0</property>
+						  <property name="ypad">0</property>
+						  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+						  <property name="width_chars">-1</property>
+						  <property name="single_line_mode">False</property>
+						  <property name="angle">0</property>
+						</widget>
+						<packing>
+						  <property name="left_attach">0</property>
+						  <property name="right_attach">1</property>
+						  <property name="top_attach">1</property>
+						  <property name="bottom_attach">2</property>
+						  <property name="x_options">fill</property>
+						  <property name="y_options"></property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkLabel" id="label400">
+						  <property name="visible">True</property>
+						  <property name="label" translatable="yes">../%A.jpg</property>
+						  <property name="use_underline">False</property>
+						  <property name="use_markup">False</property>
+						  <property name="justify">GTK_JUSTIFY_LEFT</property>
+						  <property name="wrap">False</property>
+						  <property name="selectable">False</property>
+						  <property name="xalign">0</property>
+						  <property name="yalign">0.5</property>
+						  <property name="xpad">0</property>
+						  <property name="ypad">0</property>
+						  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+						  <property name="width_chars">-1</property>
+						  <property name="single_line_mode">False</property>
+						  <property name="angle">0</property>
+						</widget>
+						<packing>
+						  <property name="left_attach">0</property>
+						  <property name="right_attach">1</property>
+						  <property name="top_attach">2</property>
+						  <property name="bottom_attach">3</property>
+						  <property name="x_options">fill</property>
+						  <property name="y_options"></property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkLabel" id="label401">
+						  <property name="visible">True</property>
+						  <property name="label" translatable="yes">%A</property>
+						  <property name="use_underline">False</property>
+						  <property name="use_markup">False</property>
+						  <property name="justify">GTK_JUSTIFY_LEFT</property>
+						  <property name="wrap">False</property>
+						  <property name="selectable">False</property>
+						  <property name="xalign">0</property>
+						  <property name="yalign">0.5</property>
+						  <property name="xpad">0</property>
+						  <property name="ypad">0</property>
+						  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+						  <property name="width_chars">-1</property>
+						  <property name="single_line_mode">False</property>
+						  <property name="angle">0</property>
+						</widget>
+						<packing>
+						  <property name="left_attach">0</property>
+						  <property name="right_attach">1</property>
+						  <property name="top_attach">3</property>
+						  <property name="bottom_attach">4</property>
+						  <property name="x_options">fill</property>
+						  <property name="y_options"></property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkLabel" id="label402">
+						  <property name="visible">True</property>
+						  <property name="label" translatable="yes">Use &lt;i&gt;folder.jpg&lt;/i&gt; as cover art.</property>
+						  <property name="use_underline">False</property>
+						  <property name="use_markup">True</property>
+						  <property name="justify">GTK_JUSTIFY_LEFT</property>
+						  <property name="wrap">False</property>
+						  <property name="selectable">False</property>
+						  <property name="xalign">0</property>
+						  <property name="yalign">0.5</property>
+						  <property name="xpad">0</property>
+						  <property name="ypad">0</property>
+						  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+						  <property name="width_chars">-1</property>
+						  <property name="single_line_mode">False</property>
+						  <property name="angle">0</property>
+						</widget>
+						<packing>
+						  <property name="left_attach">1</property>
+						  <property name="right_attach">2</property>
+						  <property name="top_attach">0</property>
+						  <property name="bottom_attach">1</property>
+						  <property name="x_options">fill</property>
+						  <property name="y_options"></property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkLabel" id="label403">
+						  <property name="visible">True</property>
+						  <property name="label" translatable="yes">Use &lt;i&gt;folder.jpg&lt;/i&gt;, &lt;i&gt;folder.png&lt;/i&gt;...</property>
+						  <property name="use_underline">False</property>
+						  <property name="use_markup">True</property>
+						  <property name="justify">GTK_JUSTIFY_LEFT</property>
+						  <property name="wrap">False</property>
+						  <property name="selectable">False</property>
+						  <property name="xalign">0</property>
+						  <property name="yalign">0.5</property>
+						  <property name="xpad">0</property>
+						  <property name="ypad">0</property>
+						  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+						  <property name="width_chars">-1</property>
+						  <property name="single_line_mode">False</property>
+						  <property name="angle">0</property>
+						</widget>
+						<packing>
+						  <property name="left_attach">1</property>
+						  <property name="right_attach">2</property>
+						  <property name="top_attach">1</property>
+						  <property name="bottom_attach">2</property>
+						  <property name="x_options">fill</property>
+						  <property name="y_options"></property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkLabel" id="label404">
+						  <property name="visible">True</property>
+						  <property name="label" translatable="yes">Use &lt;i&gt;&amp;lt;Album&amp;gt;.jpg&lt;/i&gt; in the parent directory</property>
+						  <property name="use_underline">False</property>
+						  <property name="use_markup">True</property>
+						  <property name="justify">GTK_JUSTIFY_LEFT</property>
+						  <property name="wrap">False</property>
+						  <property name="selectable">False</property>
+						  <property name="xalign">0</property>
+						  <property name="yalign">0.5</property>
+						  <property name="xpad">0</property>
+						  <property name="ypad">0</property>
+						  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+						  <property name="width_chars">-1</property>
+						  <property name="single_line_mode">False</property>
+						  <property name="angle">0</property>
+						</widget>
+						<packing>
+						  <property name="left_attach">1</property>
+						  <property name="right_attach">2</property>
+						  <property name="top_attach">2</property>
+						  <property name="bottom_attach">3</property>
+						  <property name="x_options">fill</property>
+						  <property name="y_options"></property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkLabel" id="label405">
+						  <property name="visible">True</property>
+						  <property name="label" translatable="yes">Use &lt;i&gt;&amp;lt;Album&amp;gt;.jpg&lt;/i&gt;, &lt;i&gt;&amp;lt;Album&amp;gt;.png&lt;/i&gt;...</property>
+						  <property name="use_underline">False</property>
+						  <property name="use_markup">True</property>
+						  <property name="justify">GTK_JUSTIFY_LEFT</property>
+						  <property name="wrap">False</property>
+						  <property name="selectable">False</property>
+						  <property name="xalign">0</property>
+						  <property name="yalign">0.5</property>
+						  <property name="xpad">0</property>
+						  <property name="ypad">0</property>
+						  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+						  <property name="width_chars">-1</property>
+						  <property name="single_line_mode">False</property>
+						  <property name="angle">0</property>
+						</widget>
+						<packing>
+						  <property name="left_attach">1</property>
+						  <property name="right_attach">2</property>
+						  <property name="top_attach">3</property>
+						  <property name="bottom_attach">4</property>
+						  <property name="x_options">fill</property>
+						  <property name="y_options"></property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkLabel" id="label406">
+						  <property name="visible">True</property>
+						  <property name="label" translatable="yes">folder.jpg;%a.jpg</property>
+						  <property name="use_underline">False</property>
+						  <property name="use_markup">False</property>
+						  <property name="justify">GTK_JUSTIFY_LEFT</property>
+						  <property name="wrap">False</property>
+						  <property name="selectable">False</property>
+						  <property name="xalign">0</property>
+						  <property name="yalign">0.5</property>
+						  <property name="xpad">0</property>
+						  <property name="ypad">0</property>
+						  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+						  <property name="width_chars">-1</property>
+						  <property name="single_line_mode">False</property>
+						  <property name="angle">0</property>
+						</widget>
+						<packing>
+						  <property name="left_attach">0</property>
+						  <property name="right_attach">1</property>
+						  <property name="top_attach">4</property>
+						  <property name="bottom_attach">5</property>
+						  <property name="x_options">fill</property>
+						  <property name="y_options"></property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkLabel" id="label407">
+						  <property name="visible">True</property>
+						  <property name="label" translatable="yes">First try &lt;i&gt;folder.jpg&lt;/i&gt;, then &lt;i&gt;&amp;lt;artist&amp;gt;.jpg&lt;/i&gt;</property>
+						  <property name="use_underline">False</property>
+						  <property name="use_markup">True</property>
+						  <property name="justify">GTK_JUSTIFY_LEFT</property>
+						  <property name="wrap">False</property>
+						  <property name="selectable">False</property>
+						  <property name="xalign">0</property>
+						  <property name="yalign">0.5</property>
+						  <property name="xpad">0</property>
+						  <property name="ypad">0</property>
+						  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+						  <property name="width_chars">-1</property>
+						  <property name="single_line_mode">False</property>
+						  <property name="angle">0</property>
+						</widget>
+						<packing>
+						  <property name="left_attach">1</property>
+						  <property name="right_attach">2</property>
+						  <property name="top_attach">4</property>
+						  <property name="bottom_attach">5</property>
+						  <property name="x_options">fill</property>
+						  <property name="y_options"></property>
+						</packing>
+					      </child>
+					    </widget>
+					    <packing>
+					      <property name="padding">0</property>
+					      <property name="expand">True</property>
+					      <property name="fill">True</property>
+					    </packing>
+					  </child>
+
+					  <child>
+					    <placeholder/>
+					  </child>
+
+					  <child>
+					    <placeholder/>
+					  </child>
+					</widget>
+					<packing>
+					  <property name="padding">0</property>
+					  <property name="expand">True</property>
+					  <property name="fill">True</property>
+					</packing>
+				      </child>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="label436">
+				      <property name="visible">True</property>
+				      <property name="label" translatable="yes">If both options are selected, embedded APIC data takes precedence.</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="padding">4</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">True</property>
+				  <property name="fill">True</property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">True</property>
+			      <property name="fill">True</property>
+			    </packing>
+			  </child>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">False</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkVBox" id="vbox76">
+			  <property name="visible">True</property>
+			  <property name="homogeneous">False</property>
+			  <property name="spacing">6</property>
+
+			  <child>
+			    <widget class="GtkLabel" id="label195">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">&lt;b&gt;mserv&lt;/b&gt;</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">True</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">False</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHBox" id="hbox77">
+			      <property name="visible">True</property>
+			      <property name="homogeneous">False</property>
+			      <property name="spacing">8</property>
+
+			      <child>
+				<widget class="GtkLabel" id="label196">
+				  <property name="visible">True</property>
+				  <property name="label">    </property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkVBox" id="vbox77">
+				  <property name="visible">True</property>
+				  <property name="homogeneous">False</property>
+				  <property name="spacing">8</property>
+
+				  <child>
+				    <widget class="GtkCheckButton" id="cfg_mserv_use">
+				      <property name="visible">True</property>
+				      <property name="tooltip" translatable="yes">Currently only rating is supported.</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">Use mserv database to fill additional information</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <property name="active">False</property>
+				      <property name="inconsistent">False</property>
+				      <property name="draw_indicator">True</property>
+				      <signal name="toggled" handler="on_mserv_use_toggled" last_modification_time="Sat, 16 Apr 2005 11:22:56 GMT"/>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkTable" id="table33">
+				      <property name="visible">True</property>
+				      <property name="n_rows">3</property>
+				      <property name="n_columns">3</property>
+				      <property name="homogeneous">False</property>
+				      <property name="row_spacing">6</property>
+				      <property name="column_spacing">12</property>
+
+				      <child>
+					<widget class="GtkLabel" id="label198">
+					  <property name="visible">True</property>
+					  <property name="label" translatable="yes">Music Root:</property>
+					  <property name="use_underline">False</property>
+					  <property name="use_markup">False</property>
+					  <property name="justify">GTK_JUSTIFY_LEFT</property>
+					  <property name="wrap">False</property>
+					  <property name="selectable">False</property>
+					  <property name="xalign">0</property>
+					  <property name="yalign">0.5</property>
+					  <property name="xpad">0</property>
+					  <property name="ypad">0</property>
+					  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+					  <property name="width_chars">-1</property>
+					  <property name="single_line_mode">False</property>
+					  <property name="angle">0</property>
+					</widget>
+					<packing>
+					  <property name="left_attach">0</property>
+					  <property name="right_attach">1</property>
+					  <property name="top_attach">0</property>
+					  <property name="bottom_attach">1</property>
+					  <property name="x_options">fill</property>
+					  <property name="y_options"></property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkEntry" id="mserv_music_root_entry">
+					  <property name="visible">True</property>
+					  <property name="tooltip" translatable="yes">mserv database lookup will be done for music in this directory.</property>
+					  <property name="can_focus">True</property>
+					  <property name="editable">True</property>
+					  <property name="visibility">True</property>
+					  <property name="max_length">0</property>
+					  <property name="text" translatable="yes"></property>
+					  <property name="has_frame">True</property>
+					  <property name="invisible_char">*</property>
+					  <property name="activates_default">False</property>
+					</widget>
+					<packing>
+					  <property name="left_attach">1</property>
+					  <property name="right_attach">2</property>
+					  <property name="top_attach">0</property>
+					  <property name="bottom_attach">1</property>
+					  <property name="y_options"></property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkLabel" id="label199">
+					  <property name="visible">True</property>
+					  <property name="label" translatable="yes">mserv Root:</property>
+					  <property name="use_underline">False</property>
+					  <property name="use_markup">False</property>
+					  <property name="justify">GTK_JUSTIFY_LEFT</property>
+					  <property name="wrap">False</property>
+					  <property name="selectable">False</property>
+					  <property name="xalign">0</property>
+					  <property name="yalign">0.5</property>
+					  <property name="xpad">0</property>
+					  <property name="ypad">0</property>
+					  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+					  <property name="width_chars">-1</property>
+					  <property name="single_line_mode">False</property>
+					  <property name="angle">0</property>
+					</widget>
+					<packing>
+					  <property name="left_attach">0</property>
+					  <property name="right_attach">1</property>
+					  <property name="top_attach">1</property>
+					  <property name="bottom_attach">2</property>
+					  <property name="x_options">fill</property>
+					  <property name="y_options"></property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkEntry" id="mserv_trackinfo_root_entry">
+					  <property name="visible">True</property>
+					  <property name="tooltip" translatable="yes">Root directory of mserv database (trackinfo root).</property>
+					  <property name="can_focus">True</property>
+					  <property name="editable">True</property>
+					  <property name="visibility">True</property>
+					  <property name="max_length">0</property>
+					  <property name="text" translatable="yes"></property>
+					  <property name="has_frame">True</property>
+					  <property name="invisible_char">*</property>
+					  <property name="activates_default">False</property>
+					</widget>
+					<packing>
+					  <property name="left_attach">1</property>
+					  <property name="right_attach">2</property>
+					  <property name="top_attach">1</property>
+					  <property name="bottom_attach">2</property>
+					  <property name="y_options"></property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkLabel" id="label200">
+					  <property name="visible">True</property>
+					  <property name="label" translatable="yes">Username:</property>
+					  <property name="use_underline">False</property>
+					  <property name="use_markup">False</property>
+					  <property name="justify">GTK_JUSTIFY_LEFT</property>
+					  <property name="wrap">False</property>
+					  <property name="selectable">False</property>
+					  <property name="xalign">0</property>
+					  <property name="yalign">0.5</property>
+					  <property name="xpad">0</property>
+					  <property name="ypad">0</property>
+					  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+					  <property name="width_chars">-1</property>
+					  <property name="single_line_mode">False</property>
+					  <property name="angle">0</property>
+					</widget>
+					<packing>
+					  <property name="left_attach">0</property>
+					  <property name="right_attach">1</property>
+					  <property name="top_attach">2</property>
+					  <property name="bottom_attach">3</property>
+					  <property name="x_options">fill</property>
+					  <property name="y_options"></property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkEntry" id="mserv_username_entry">
+					  <property name="visible">True</property>
+					  <property name="tooltip" translatable="yes">Username to be used for mserv database lookup.</property>
+					  <property name="can_focus">True</property>
+					  <property name="editable">True</property>
+					  <property name="visibility">True</property>
+					  <property name="max_length">0</property>
+					  <property name="text" translatable="yes"></property>
+					  <property name="has_frame">True</property>
+					  <property name="invisible_char">*</property>
+					  <property name="activates_default">False</property>
+					  <signal name="changed" handler="on_mserv_username_entry_changed" last_modification_time="Thu, 26 May 2005 15:29:20 GMT"/>
+					</widget>
+					<packing>
+					  <property name="left_attach">1</property>
+					  <property name="right_attach">2</property>
+					  <property name="top_attach">2</property>
+					  <property name="bottom_attach">3</property>
+					  <property name="y_options"></property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkButton" id="mserv_music_root_button">
+					  <property name="visible">True</property>
+					  <property name="can_focus">True</property>
+					  <property name="label" translatable="yes">Browse</property>
+					  <property name="use_underline">True</property>
+					  <property name="relief">GTK_RELIEF_NORMAL</property>
+					  <property name="focus_on_click">True</property>
+					</widget>
+					<packing>
+					  <property name="left_attach">2</property>
+					  <property name="right_attach">3</property>
+					  <property name="top_attach">0</property>
+					  <property name="bottom_attach">1</property>
+					  <property name="x_options">fill</property>
+					  <property name="y_options"></property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkButton" id="mserv_trackinfo_root_button">
+					  <property name="visible">True</property>
+					  <property name="can_focus">True</property>
+					  <property name="label" translatable="yes">Browse</property>
+					  <property name="use_underline">True</property>
+					  <property name="relief">GTK_RELIEF_NORMAL</property>
+					  <property name="focus_on_click">True</property>
+					</widget>
+					<packing>
+					  <property name="left_attach">2</property>
+					  <property name="right_attach">3</property>
+					  <property name="top_attach">1</property>
+					  <property name="bottom_attach">2</property>
+					  <property name="x_options">fill</property>
+					  <property name="y_options"></property>
+					</packing>
+				      </child>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">True</property>
+				      <property name="fill">True</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkCheckButton" id="cfg_mserv_report_probs">
+				      <property name="visible">True</property>
+				      <property name="tooltip" translatable="yes">Currently only rating is supported.</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">Show information about problems when accessing mserv</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <property name="active">False</property>
+				      <property name="inconsistent">False</property>
+				      <property name="draw_indicator">True</property>
+				      <signal name="toggled" handler="on_mserv_report_probs_toggled" last_modification_time="Sat, 16 Apr 2005 11:22:09 GMT"/>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">True</property>
+				  <property name="fill">True</property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">True</property>
+			    </packing>
+			  </child>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">True</property>
+			</packing>
+		      </child>
+		    </widget>
+		  </child>
+		</widget>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="tab_expand">False</property>
+	      <property name="tab_fill">True</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkLabel" id="label178">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">_Track Info</property>
+	      <property name="use_underline">True</property>
+	      <property name="use_markup">False</property>
+	      <property name="justify">GTK_JUSTIFY_LEFT</property>
+	      <property name="wrap">False</property>
+	      <property name="selectable">False</property>
+	      <property name="xalign">0.5</property>
+	      <property name="yalign">0.5</property>
+	      <property name="xpad">0</property>
+	      <property name="ypad">0</property>
+	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	      <property name="width_chars">-1</property>
+	      <property name="single_line_mode">False</property>
+	      <property name="angle">0</property>
+	    </widget>
+	    <packing>
+	      <property name="type">tab</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkScrolledWindow" id="scrolledwindow12">
+	      <property name="visible">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+	      <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+	      <property name="shadow_type">GTK_SHADOW_NONE</property>
+	      <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+	      <child>
+		<widget class="GtkViewport" id="viewport9">
+		  <property name="visible">True</property>
+		  <property name="shadow_type">GTK_SHADOW_IN</property>
+
+		  <child>
+		    <widget class="GtkVBox" id="vbox118">
+		      <property name="border_width">12</property>
+		      <property name="visible">True</property>
+		      <property name="homogeneous">False</property>
+		      <property name="spacing">18</property>
+
+		      <child>
+			<widget class="GtkVBox" id="vbox119">
+			  <property name="visible">True</property>
+			  <property name="homogeneous">False</property>
+			  <property name="spacing">6</property>
+
+			  <child>
+			    <widget class="GtkLabel" id="label267">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">&lt;b&gt;Track Attributes&lt;/b&gt;</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">True</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">False</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHBox" id="visible_cols_hbox">
+			      <property name="visible">True</property>
+			      <property name="homogeneous">False</property>
+			      <property name="spacing">8</property>
+
+			      <child>
+				<widget class="GtkLabel" id="label268">
+				  <property name="visible">True</property>
+				  <property name="label">    </property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkTable" id="table54">
+				  <property name="visible">True</property>
+				  <property name="n_rows">2</property>
+				  <property name="n_columns">3</property>
+				  <property name="homogeneous">False</property>
+				  <property name="row_spacing">5</property>
+				  <property name="column_spacing">10</property>
+
+				  <child>
+				    <widget class="GtkLabel" id="label469">
+				      <property name="visible">True</property>
+				      <property name="label" translatable="yes">Available:</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">0</property>
+				      <property name="right_attach">1</property>
+				      <property name="top_attach">0</property>
+				      <property name="bottom_attach">1</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="label470">
+				      <property name="visible">True</property>
+				      <property name="label" translatable="yes">Displayed:</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">2</property>
+				      <property name="right_attach">3</property>
+				      <property name="top_attach">0</property>
+				      <property name="bottom_attach">1</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkVBox" id="vbox183">
+				      <property name="visible">True</property>
+				      <property name="homogeneous">False</property>
+				      <property name="spacing">0</property>
+
+				      <child>
+					<widget class="GtkVBox" id="vbox184">
+					  <property name="visible">True</property>
+					  <property name="homogeneous">False</property>
+					  <property name="spacing">5</property>
+
+					  <child>
+					    <widget class="GtkButton" id="track_cols_show_button">
+					      <property name="visible">True</property>
+					      <property name="tooltip" translatable="yes">Move selected attributes to the displayed list</property>
+					      <property name="can_focus">True</property>
+					      <property name="relief">GTK_RELIEF_NORMAL</property>
+					      <property name="focus_on_click">True</property>
+
+					      <child>
+						<widget class="GtkImage" id="image4020">
+						  <property name="visible">True</property>
+						  <property name="stock">gtk-go-forward</property>
+						  <property name="icon_size">4</property>
+						  <property name="xalign">0.5</property>
+						  <property name="yalign">0.5</property>
+						  <property name="xpad">0</property>
+						  <property name="ypad">0</property>
+						</widget>
+					      </child>
+					    </widget>
+					    <packing>
+					      <property name="padding">0</property>
+					      <property name="expand">False</property>
+					      <property name="fill">False</property>
+					    </packing>
+					  </child>
+
+					  <child>
+					    <widget class="GtkButton" id="track_cols_hide_button">
+					      <property name="visible">True</property>
+					      <property name="tooltip" translatable="yes">Remove selected attributes from the displayed list</property>
+					      <property name="can_focus">True</property>
+					      <property name="relief">GTK_RELIEF_NORMAL</property>
+					      <property name="focus_on_click">True</property>
+
+					      <child>
+						<widget class="GtkImage" id="image4021">
+						  <property name="visible">True</property>
+						  <property name="stock">gtk-go-back</property>
+						  <property name="icon_size">4</property>
+						  <property name="xalign">0.5</property>
+						  <property name="yalign">0.5</property>
+						  <property name="xpad">0</property>
+						  <property name="ypad">0</property>
+						</widget>
+					      </child>
+					    </widget>
+					    <packing>
+					      <property name="padding">0</property>
+					      <property name="expand">False</property>
+					      <property name="fill">False</property>
+					    </packing>
+					  </child>
+					</widget>
+					<packing>
+					  <property name="padding">0</property>
+					  <property name="expand">True</property>
+					  <property name="fill">False</property>
+					</packing>
+				      </child>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">1</property>
+				      <property name="right_attach">2</property>
+				      <property name="top_attach">1</property>
+				      <property name="bottom_attach">2</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options">fill</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkScrolledWindow" id="scrolledwindow35">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+				      <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+				      <property name="shadow_type">GTK_SHADOW_IN</property>
+				      <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+				      <child>
+					<widget class="GtkTreeView" id="track_cols_show_tv">
+					  <property name="visible">True</property>
+					  <property name="can_focus">True</property>
+					  <property name="headers_visible">False</property>
+					  <property name="rules_hint">False</property>
+					  <property name="reorderable">False</property>
+					  <property name="enable_search">True</property>
+					  <property name="fixed_height_mode">False</property>
+					  <property name="hover_selection">False</property>
+					  <property name="hover_expand">False</property>
+					</widget>
+				      </child>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">2</property>
+				      <property name="right_attach">3</property>
+				      <property name="top_attach">1</property>
+				      <property name="bottom_attach">2</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkScrolledWindow" id="scrolledwindow34">
+				      <property name="height_request">120</property>
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+				      <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+				      <property name="shadow_type">GTK_SHADOW_IN</property>
+				      <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+				      <child>
+					<widget class="GtkTreeView" id="track_cols_hide_tv">
+					  <property name="visible">True</property>
+					  <property name="can_focus">True</property>
+					  <property name="headers_visible">False</property>
+					  <property name="rules_hint">False</property>
+					  <property name="reorderable">False</property>
+					  <property name="enable_search">True</property>
+					  <property name="fixed_height_mode">False</property>
+					  <property name="hover_selection">False</property>
+					  <property name="hover_expand">False</property>
+					</widget>
+				      </child>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">0</property>
+				      <property name="right_attach">1</property>
+				      <property name="top_attach">1</property>
+				      <property name="bottom_attach">2</property>
+				    </packing>
+				  </child>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">True</property>
+				  <property name="fill">True</property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">True</property>
+			    </packing>
+			  </child>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">True</property>
+			  <property name="fill">True</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkVBox" id="vbox124">
+			  <property name="visible">True</property>
+			  <property name="homogeneous">False</property>
+			  <property name="spacing">6</property>
+
+			  <child>
+			    <widget class="GtkLabel" id="label269">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">&lt;b&gt;Sort Tabs&lt;/b&gt;</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">True</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">False</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHBox" id="hbox118">
+			      <property name="visible">True</property>
+			      <property name="homogeneous">False</property>
+			      <property name="spacing">8</property>
+
+			      <child>
+				<widget class="GtkLabel" id="label270">
+				  <property name="visible">True</property>
+				  <property name="label">    </property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkVBox" id="vbox125">
+				  <property name="visible">True</property>
+				  <property name="homogeneous">False</property>
+				  <property name="spacing">6</property>
+
+				  <child>
+				    <widget class="GtkCheckButton" id="cfg_group_compilations">
+				      <property name="visible">True</property>
+				      <property name="tooltip" translatable="yes">Keeps all compilation CDs grouped together in the artists sort tab.</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">Group artists on compilation CDs</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <property name="active">False</property>
+				      <property name="inconsistent">False</property>
+				      <property name="draw_indicator">True</property>
+				      <signal name="toggled" handler="on_cfg_group_compilations_toggled" last_modification_time="Sun, 23 Nov 2003 22:23:00 GMT"/>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkHBox" id="hbox119">
+				      <property name="visible">True</property>
+				      <property name="homogeneous">False</property>
+				      <property name="spacing">12</property>
+
+				      <child>
+					<widget class="GtkLabel" id="label271">
+					  <property name="visible">True</property>
+					  <property name="label" translatable="yes">_Number of sort tabs:</property>
+					  <property name="use_underline">True</property>
+					  <property name="use_markup">False</property>
+					  <property name="justify">GTK_JUSTIFY_LEFT</property>
+					  <property name="wrap">False</property>
+					  <property name="selectable">False</property>
+					  <property name="xalign">0.5</property>
+					  <property name="yalign">0.5</property>
+					  <property name="xpad">0</property>
+					  <property name="ypad">0</property>
+					  <property name="mnemonic_widget">cfg_sort_tab_num_sb</property>
+					  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+					  <property name="width_chars">-1</property>
+					  <property name="single_line_mode">False</property>
+					  <property name="angle">0</property>
+					</widget>
+					<packing>
+					  <property name="padding">0</property>
+					  <property name="expand">False</property>
+					  <property name="fill">False</property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkSpinButton" id="cfg_sort_tab_num_sb">
+					  <property name="visible">True</property>
+					  <property name="can_focus">True</property>
+					  <property name="climb_rate">1</property>
+					  <property name="digits">0</property>
+					  <property name="numeric">False</property>
+					  <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+					  <property name="snap_to_ticks">False</property>
+					  <property name="wrap">False</property>
+					  <property name="adjustment">0 0 100 1 10 10</property>
+					  <signal name="value_changed" handler="on_cfg_sort_tab_num_sb_value_changed" last_modification_time="Thu, 14 Apr 2005 19:41:27 GMT"/>
+					</widget>
+					<packing>
+					  <property name="padding">0</property>
+					  <property name="expand">True</property>
+					  <property name="fill">True</property>
+					</packing>
+				      </child>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">True</property>
+				      <property name="fill">True</property>
+				    </packing>
+				  </child>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">True</property>
+				  <property name="fill">True</property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">True</property>
+			    </packing>
+			  </child>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">True</property>
+			  <property name="fill">True</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkVBox" id="vbox126">
+			  <property name="visible">True</property>
+			  <property name="homogeneous">False</property>
+			  <property name="spacing">6</property>
+
+			  <child>
+			    <widget class="GtkLabel" id="label272">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">&lt;b&gt;Automatically select...&lt;/b&gt;</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">True</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">False</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHBox" id="hbox121">
+			      <property name="visible">True</property>
+			      <property name="homogeneous">False</property>
+			      <property name="spacing">8</property>
+
+			      <child>
+				<widget class="GtkLabel" id="label273">
+				  <property name="visible">True</property>
+				  <property name="label">    </property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkVBox" id="autoselect_vbox">
+				  <property name="visible">True</property>
+				  <property name="homogeneous">False</property>
+				  <property name="spacing">8</property>
+
+				  <child>
+				    <widget class="GtkCheckButton" id="cfg_mpl_autoselect">
+				      <property name="visible">True</property>
+				      <property name="tooltip" translatable="yes">If you don't select the master playlist automatically, the initial database import is much faster because the display dosn't have to be updated.</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">...master playlist</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <property name="active">False</property>
+				      <property name="inconsistent">False</property>
+				      <property name="draw_indicator">True</property>
+				      <signal name="toggled" handler="on_cfg_mpl_autoselect_toggled" last_modification_time="Sun, 09 Feb 2003 07:01:19 GMT"/>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="label274">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">...entry 'All' in sort tab...</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">True</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">20</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkHBox" id="autoselect_hbox">
+				      <property name="visible">True</property>
+				      <property name="homogeneous">False</property>
+				      <property name="spacing">0</property>
+
+				      <child>
+					<placeholder/>
+				      </child>
+
+				      <child>
+					<placeholder/>
+				      </child>
+
+				      <child>
+					<placeholder/>
+				      </child>
+
+				      <child>
+					<placeholder/>
+				      </child>
+
+				      <child>
+					<placeholder/>
+				      </child>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">True</property>
+				      <property name="fill">True</property>
+				    </packing>
+				  </child>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">True</property>
+				  <property name="fill">True</property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">True</property>
+			      <property name="fill">True</property>
+			    </packing>
+			  </child>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">True</property>
+			  <property name="fill">True</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkVBox" id="vbox128">
+			  <property name="visible">True</property>
+			  <property name="homogeneous">False</property>
+			  <property name="spacing">6</property>
+
+			  <child>
+			    <widget class="GtkLabel" id="label275">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">&lt;b&gt;Tooltips&lt;/b&gt;</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">True</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">False</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHBox" id="hbox123">
+			      <property name="visible">True</property>
+			      <property name="homogeneous">False</property>
+			      <property name="spacing">8</property>
+
+			      <child>
+				<widget class="GtkLabel" id="label276">
+				  <property name="visible">True</property>
+				  <property name="label">    </property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkVBox" id="vbox129">
+				  <property name="visible">True</property>
+				  <property name="homogeneous">False</property>
+				  <property name="spacing">6</property>
+
+				  <child>
+				    <widget class="GtkCheckButton" id="cfg_display_tooltips_main">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">Display tooltips in main window</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <property name="active">False</property>
+				      <property name="inconsistent">False</property>
+				      <property name="draw_indicator">True</property>
+				      <signal name="toggled" handler="on_cfg_display_tooltips_main_toggled" last_modification_time="Sat, 14 Jun 2003 16:46:29 GMT"/>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkCheckButton" id="cfg_display_tooltips_prefs">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">Display tooltips in prefs window</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <property name="active">False</property>
+				      <property name="inconsistent">False</property>
+				      <property name="draw_indicator">True</property>
+				      <signal name="toggled" handler="on_cfg_display_tooltips_prefs_toggled" last_modification_time="Sat, 14 Jun 2003 16:46:49 GMT"/>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">True</property>
+				  <property name="fill">True</property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">True</property>
+			      <property name="fill">True</property>
+			    </packing>
+			  </child>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">True</property>
+			  <property name="fill">True</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkVBox" id="vbox132">
+			  <property name="visible">True</property>
+			  <property name="homogeneous">False</property>
+			  <property name="spacing">6</property>
+
+			  <child>
+			    <widget class="GtkLabel" id="label280">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">&lt;b&gt;Toolbar&lt;/b&gt;</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">True</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">False</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHBox" id="hbox126">
+			      <property name="visible">True</property>
+			      <property name="homogeneous">False</property>
+			      <property name="spacing">8</property>
+
+			      <child>
+				<widget class="GtkLabel" id="label281">
+				  <property name="visible">True</property>
+				  <property name="label">    </property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkVBox" id="vbox133">
+				  <property name="visible">True</property>
+				  <property name="homogeneous">False</property>
+				  <property name="spacing">6</property>
+
+				  <child>
+				    <widget class="GtkCheckButton" id="cfg_display_toolbar">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">Display toolbar...</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <property name="active">False</property>
+				      <property name="inconsistent">False</property>
+				      <property name="draw_indicator">True</property>
+				      <signal name="toggled" handler="on_cfg_display_toolbar_toggled" last_modification_time="Fri, 14 Mar 2003 11:50:10 GMT"/>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkHBox" id="hbox127">
+				      <property name="visible">True</property>
+				      <property name="homogeneous">False</property>
+				      <property name="spacing">0</property>
+
+				      <child>
+					<widget class="GtkLabel" id="label282">
+					  <property name="visible">True</property>
+					  <property name="label" translatable="yes">    </property>
+					  <property name="use_underline">False</property>
+					  <property name="use_markup">False</property>
+					  <property name="justify">GTK_JUSTIFY_LEFT</property>
+					  <property name="wrap">False</property>
+					  <property name="selectable">False</property>
+					  <property name="xalign">0.5</property>
+					  <property name="yalign">0.5</property>
+					  <property name="xpad">0</property>
+					  <property name="ypad">0</property>
+					  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+					  <property name="width_chars">-1</property>
+					  <property name="single_line_mode">False</property>
+					  <property name="angle">0</property>
+					</widget>
+					<packing>
+					  <property name="padding">0</property>
+					  <property name="expand">False</property>
+					  <property name="fill">False</property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkVBox" id="vbox134">
+					  <property name="visible">True</property>
+					  <property name="homogeneous">False</property>
+					  <property name="spacing">6</property>
+
+					  <child>
+					    <widget class="GtkRadioButton" id="cfg_toolbar_style_icons">
+					      <property name="visible">True</property>
+					      <property name="can_focus">True</property>
+					      <property name="label" translatable="yes">...as icons</property>
+					      <property name="use_underline">True</property>
+					      <property name="relief">GTK_RELIEF_NORMAL</property>
+					      <property name="focus_on_click">True</property>
+					      <property name="active">False</property>
+					      <property name="inconsistent">False</property>
+					      <property name="draw_indicator">True</property>
+					      <signal name="toggled" handler="on_cfg_toolbar_style_icons_toggled" last_modification_time="Fri, 14 Mar 2003 13:46:08 GMT"/>
+					    </widget>
+					    <packing>
+					      <property name="padding">0</property>
+					      <property name="expand">False</property>
+					      <property name="fill">False</property>
+					    </packing>
+					  </child>
+
+					  <child>
+					    <widget class="GtkRadioButton" id="cfg_toolbar_style_text">
+					      <property name="visible">True</property>
+					      <property name="can_focus">True</property>
+					      <property name="label" translatable="yes">...as text</property>
+					      <property name="use_underline">True</property>
+					      <property name="relief">GTK_RELIEF_NORMAL</property>
+					      <property name="focus_on_click">True</property>
+					      <property name="active">False</property>
+					      <property name="inconsistent">False</property>
+					      <property name="draw_indicator">True</property>
+					      <property name="group">cfg_toolbar_style_icons</property>
+					      <signal name="toggled" handler="on_cfg_toolbar_style_text_toggled" last_modification_time="Fri, 14 Mar 2003 13:29:43 GMT"/>
+					    </widget>
+					    <packing>
+					      <property name="padding">0</property>
+					      <property name="expand">False</property>
+					      <property name="fill">False</property>
+					    </packing>
+					  </child>
+
+					  <child>
+					    <widget class="GtkRadioButton" id="cfg_toolbar_style_both">
+					      <property name="visible">True</property>
+					      <property name="can_focus">True</property>
+					      <property name="label" translatable="yes">...both as icons and text</property>
+					      <property name="use_underline">True</property>
+					      <property name="relief">GTK_RELIEF_NORMAL</property>
+					      <property name="focus_on_click">True</property>
+					      <property name="active">False</property>
+					      <property name="inconsistent">False</property>
+					      <property name="draw_indicator">True</property>
+					      <property name="group">cfg_toolbar_style_icons</property>
+					      <signal name="toggled" handler="on_cfg_toolbar_style_both_toggled" last_modification_time="Fri, 14 Mar 2003 13:29:49 GMT"/>
+					    </widget>
+					    <packing>
+					      <property name="padding">0</property>
+					      <property name="expand">False</property>
+					      <property name="fill">False</property>
+					    </packing>
+					  </child>
+					</widget>
+					<packing>
+					  <property name="padding">0</property>
+					  <property name="expand">True</property>
+					  <property name="fill">True</property>
+					</packing>
+				      </child>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">True</property>
+				      <property name="fill">True</property>
+				    </packing>
+				  </child>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">True</property>
+				  <property name="fill">True</property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">True</property>
+			      <property name="fill">True</property>
+			    </packing>
+			  </child>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">True</property>
+			  <property name="fill">True</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkVBox" id="vbox130">
+			  <property name="visible">True</property>
+			  <property name="homogeneous">False</property>
+			  <property name="spacing">6</property>
+
+			  <child>
+			    <widget class="GtkLabel" id="label277">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">&lt;b&gt;Misc&lt;/b&gt;</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">True</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">False</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHBox" id="hbox124">
+			      <property name="visible">True</property>
+			      <property name="homogeneous">False</property>
+			      <property name="spacing">8</property>
+
+			      <child>
+				<widget class="GtkLabel" id="label278">
+				  <property name="visible">True</property>
+				  <property name="label">    </property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkVBox" id="vbox131">
+				  <property name="visible">True</property>
+				  <property name="homogeneous">False</property>
+				  <property name="spacing">6</property>
+
+				  <child>
+				    <widget class="GtkCheckButton" id="cfg_startup_messages">
+				      <property name="visible">True</property>
+				      <property name="tooltip" translatable="yes">This option will be re-activated when you upgrade gtkpod.</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">Display messages and warnings at startup</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <property name="active">False</property>
+				      <property name="inconsistent">False</property>
+				      <property name="draw_indicator">True</property>
+				      <signal name="toggled" handler="on_cfg_startup_messages" last_modification_time="Thu, 16 Dec 2004 12:49:12 GMT"/>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkButton" id="button8">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <signal name="clicked" handler="on_sorting_clicked" last_modification_time="Fri, 06 May 2005 18:33:34 GMT"/>
+
+				      <child>
+					<widget class="GtkAlignment" id="alignment5">
+					  <property name="visible">True</property>
+					  <property name="xalign">0.5</property>
+					  <property name="yalign">0.5</property>
+					  <property name="xscale">0</property>
+					  <property name="yscale">0</property>
+					  <property name="top_padding">0</property>
+					  <property name="bottom_padding">0</property>
+					  <property name="left_padding">0</property>
+					  <property name="right_padding">0</property>
+
+					  <child>
+					    <widget class="GtkHBox" id="hbox125">
+					      <property name="visible">True</property>
+					      <property name="homogeneous">False</property>
+					      <property name="spacing">2</property>
+
+					      <child>
+						<widget class="GtkImage" id="image2938">
+						  <property name="visible">True</property>
+						  <property name="stock">gtk-sort-ascending</property>
+						  <property name="icon_size">4</property>
+						  <property name="xalign">0.5</property>
+						  <property name="yalign">0.5</property>
+						  <property name="xpad">0</property>
+						  <property name="ypad">0</property>
+						</widget>
+						<packing>
+						  <property name="padding">0</property>
+						  <property name="expand">False</property>
+						  <property name="fill">False</property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkLabel" id="label279">
+						  <property name="visible">True</property>
+						  <property name="label" translatable="yes">Advanced Sorting Options</property>
+						  <property name="use_underline">True</property>
+						  <property name="use_markup">False</property>
+						  <property name="justify">GTK_JUSTIFY_LEFT</property>
+						  <property name="wrap">False</property>
+						  <property name="selectable">False</property>
+						  <property name="xalign">0.5</property>
+						  <property name="yalign">0.5</property>
+						  <property name="xpad">0</property>
+						  <property name="ypad">0</property>
+						  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+						  <property name="width_chars">-1</property>
+						  <property name="single_line_mode">False</property>
+						  <property name="angle">0</property>
+						</widget>
+						<packing>
+						  <property name="padding">0</property>
+						  <property name="expand">False</property>
+						  <property name="fill">False</property>
+						</packing>
+					      </child>
+					    </widget>
+					  </child>
+					</widget>
+				      </child>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <placeholder/>
+				  </child>
+
+				  <child>
+				    <placeholder/>
+				  </child>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">True</property>
+				  <property name="fill">True</property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">True</property>
+			      <property name="fill">True</property>
+			    </packing>
+			  </child>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">True</property>
+			  <property name="fill">True</property>
+			</packing>
+		      </child>
+		    </widget>
+		  </child>
+		</widget>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="tab_expand">False</property>
+	      <property name="tab_fill">True</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkLabel" id="label266">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">_Display</property>
+	      <property name="use_underline">True</property>
+	      <property name="use_markup">False</property>
+	      <property name="justify">GTK_JUSTIFY_LEFT</property>
+	      <property name="wrap">False</property>
+	      <property name="selectable">False</property>
+	      <property name="xalign">0.5</property>
+	      <property name="yalign">0.5</property>
+	      <property name="xpad">0</property>
+	      <property name="ypad">0</property>
+	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	      <property name="width_chars">-1</property>
+	      <property name="single_line_mode">False</property>
+	      <property name="angle">0</property>
+	    </widget>
+	    <packing>
+	      <property name="type">tab</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkScrolledWindow" id="scrolledwindow30">
+	      <property name="visible">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+	      <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+	      <property name="shadow_type">GTK_SHADOW_NONE</property>
+	      <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+	      <child>
+		<widget class="GtkViewport" id="viewport25">
+		  <property name="visible">True</property>
+		  <property name="shadow_type">GTK_SHADOW_IN</property>
+
+		  <child>
+		    <widget class="GtkVBox" id="vbox78">
+		      <property name="border_width">12</property>
+		      <property name="visible">True</property>
+		      <property name="homogeneous">False</property>
+		      <property name="spacing">18</property>
+
+		      <child>
+			<widget class="GtkVBox" id="vbox79">
+			  <property name="visible">True</property>
+			  <property name="homogeneous">False</property>
+			  <property name="spacing">6</property>
+
+			  <child>
+			    <widget class="GtkLabel" id="label202">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">&lt;b&gt;Track Editing&lt;/b&gt;</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">True</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">False</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHBox" id="hbox79">
+			      <property name="visible">True</property>
+			      <property name="homogeneous">False</property>
+			      <property name="spacing">8</property>
+
+			      <child>
+				<widget class="GtkLabel" id="label203">
+				  <property name="visible">True</property>
+				  <property name="label">    </property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkVBox" id="vbox80">
+				  <property name="visible">True</property>
+				  <property name="homogeneous">False</property>
+				  <property name="spacing">8</property>
+
+				  <child>
+				    <widget class="GtkCheckButton" id="cfg_id3_write">
+				      <property name="visible">True</property>
+				      <property name="tooltip" translatable="yes">The tags are written to the files on your harddrive and on the iPod (if available).</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">Write ID3 tags to disk when modified in gtkpod</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <property name="active">False</property>
+				      <property name="inconsistent">False</property>
+				      <property name="draw_indicator">True</property>
+				      <signal name="toggled" handler="on_cfg_id3_write_toggled" last_modification_time="Thu, 28 Apr 2005 18:07:39 GMT"/>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkHBox" id="hbox80">
+				      <property name="visible">True</property>
+				      <property name="homogeneous">False</property>
+				      <property name="spacing">0</property>
+
+				      <child>
+					<widget class="GtkLabel" id="label204">
+					  <property name="visible">True</property>
+					  <property name="label" translatable="yes">    </property>
+					  <property name="use_underline">False</property>
+					  <property name="use_markup">False</property>
+					  <property name="justify">GTK_JUSTIFY_LEFT</property>
+					  <property name="wrap">False</property>
+					  <property name="selectable">False</property>
+					  <property name="xalign">0.5</property>
+					  <property name="yalign">0.5</property>
+					  <property name="xpad">0</property>
+					  <property name="ypad">0</property>
+					  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+					  <property name="width_chars">-1</property>
+					  <property name="single_line_mode">False</property>
+					  <property name="angle">0</property>
+					</widget>
+					<packing>
+					  <property name="padding">0</property>
+					  <property name="expand">False</property>
+					  <property name="fill">False</property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkVBox" id="vbox81">
+					  <property name="visible">True</property>
+					  <property name="homogeneous">False</property>
+					  <property name="spacing">0</property>
+
+					  <child>
+					    <widget class="GtkCheckButton" id="cfg_write_charset">
+					      <property name="visible">True</property>
+					      <property name="tooltip" translatable="yes">Normally the charset specified when first importing the track will be used to write the tags. If you have chosen a wrong charset when first importing a track, you should select this option along with the correct charset.  Note: uses the extended information file to store the charset information (see 'Writing of the iTunesDB' on the 'Input/Output' page) and tracks imported before V0.51 will have no charset stored -- the charset specified on the 'Input/Output' page will be used.</property>
+					      <property name="can_focus">True</property>
+					      <property name="label" translatable="yes">Use selected encoding (on the 'General' page)
+when writing tags</property>
+					      <property name="use_underline">True</property>
+					      <property name="relief">GTK_RELIEF_NORMAL</property>
+					      <property name="focus_on_click">True</property>
+					      <property name="active">False</property>
+					      <property name="inconsistent">False</property>
+					      <property name="draw_indicator">True</property>
+					      <signal name="toggled" handler="on_cfg_write_charset_toggled" last_modification_time="Thu, 26 May 2005 15:32:16 GMT"/>
+					    </widget>
+					    <packing>
+					      <property name="padding">0</property>
+					      <property name="expand">False</property>
+					      <property name="fill">False</property>
+					    </packing>
+					  </child>
+
+					  <child>
+					    <widget class="GtkCheckButton" id="cfg_id3_write_id3v24">
+					      <property name="visible">True</property>
+					      <property name="tooltip" translatable="yes">This is the way to go, but maybe not all programs support it yet. ID3v2.4 uses unicode to store the tags, so you won't have to worry about charsets any more. gtkpod will use UTF8 encoding as this will not increase the size of pure ASCII tags. ID3v2.2/4 tags will also be written if they are already present in the file to write to.</property>
+					      <property name="can_focus">True</property>
+					      <property name="label" translatable="yes">Always write ID3v2.4 tags (only applies to MP3)</property>
+					      <property name="use_underline">True</property>
+					      <property name="relief">GTK_RELIEF_NORMAL</property>
+					      <property name="focus_on_click">True</property>
+					      <property name="active">False</property>
+					      <property name="inconsistent">False</property>
+					      <property name="draw_indicator">True</property>
+					      <signal name="toggled" handler="on_cfg_id3_write_id3v24_toggled" last_modification_time="Thu, 26 May 2005 15:32:35 GMT"/>
+					    </widget>
+					    <packing>
+					      <property name="padding">0</property>
+					      <property name="expand">False</property>
+					      <property name="fill">False</property>
+					    </packing>
+					  </child>
+					</widget>
+					<packing>
+					  <property name="padding">0</property>
+					  <property name="expand">False</property>
+					  <property name="fill">False</property>
+					</packing>
+				      </child>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">True</property>
+				      <property name="fill">True</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkCheckButton" id="cfg_multi_edit">
+				      <property name="visible">True</property>
+				      <property name="tooltip" translatable="yes">If you select several tracks in the track list and edit a tag of the first track, the tags in the other tracks are updated as well.</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">Use 'Multi-Edit' for tracks selections</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <property name="active">False</property>
+				      <property name="inconsistent">False</property>
+				      <property name="draw_indicator">True</property>
+				      <signal name="toggled" handler="on_cfg_multi_edit_toggled" last_modification_time="Thu, 28 Apr 2005 18:08:31 GMT"/>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkHBox" id="hbox81">
+				      <property name="visible">True</property>
+				      <property name="homogeneous">False</property>
+				      <property name="spacing">0</property>
+
+				      <child>
+					<widget class="GtkLabel" id="label205">
+					  <property name="visible">True</property>
+					  <property name="label" translatable="yes">    </property>
+					  <property name="use_underline">False</property>
+					  <property name="use_markup">False</property>
+					  <property name="justify">GTK_JUSTIFY_LEFT</property>
+					  <property name="wrap">False</property>
+					  <property name="selectable">False</property>
+					  <property name="xalign">0.5</property>
+					  <property name="yalign">0.5</property>
+					  <property name="xpad">0</property>
+					  <property name="ypad">0</property>
+					  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+					  <property name="width_chars">-1</property>
+					  <property name="single_line_mode">False</property>
+					  <property name="angle">0</property>
+					</widget>
+					<packing>
+					  <property name="padding">0</property>
+					  <property name="expand">False</property>
+					  <property name="fill">False</property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkCheckButton" id="cfg_multi_edit_title">
+					  <property name="visible">True</property>
+					  <property name="tooltip" translatable="yes">Usually you don't want to set the title of several tracks to the same text. This option might avoid unwanted results (especially since there is no 'undo' yet).</property>
+					  <property name="can_focus">True</property>
+					  <property name="label" translatable="yes">Use 'Multi-Edit' also for title field</property>
+					  <property name="use_underline">True</property>
+					  <property name="relief">GTK_RELIEF_NORMAL</property>
+					  <property name="focus_on_click">True</property>
+					  <property name="active">False</property>
+					  <property name="inconsistent">False</property>
+					  <property name="draw_indicator">True</property>
+					  <signal name="toggled" handler="on_cfg_multi_edit_title_toggled" last_modification_time="Thu, 26 May 2005 15:32:53 GMT"/>
+					</widget>
+					<packing>
+					  <property name="padding">0</property>
+					  <property name="expand">False</property>
+					  <property name="fill">False</property>
+					</packing>
+				      </child>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">True</property>
+				      <property name="fill">True</property>
+				    </packing>
+				  </child>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">True</property>
+				  <property name="fill">True</property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">True</property>
+			      <property name="fill">True</property>
+			    </packing>
+			  </child>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">True</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkVBox" id="vbox82">
+			  <property name="visible">True</property>
+			  <property name="homogeneous">False</property>
+			  <property name="spacing">6</property>
+
+			  <child>
+			    <widget class="GtkLabel" id="label206">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">&lt;b&gt;Auto-Generated Playlists&lt;/b&gt;</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">True</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">False</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHBox" id="hbox82">
+			      <property name="visible">True</property>
+			      <property name="homogeneous">False</property>
+			      <property name="spacing">8</property>
+
+			      <child>
+				<widget class="GtkLabel" id="label207">
+				  <property name="visible">True</property>
+				  <property name="label">    </property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkVBox" id="vbox83">
+				  <property name="visible">True</property>
+				  <property name="homogeneous">False</property>
+				  <property name="spacing">8</property>
+
+				  <child>
+				    <widget class="GtkHBox" id="hbox83">
+				      <property name="visible">True</property>
+				      <property name="homogeneous">False</property>
+				      <property name="spacing">8</property>
+
+				      <child>
+					<widget class="GtkLabel" id="label208">
+					  <property name="visible">True</property>
+					  <property name="label" translatable="yes">Number of tracks in generated playlists:</property>
+					  <property name="use_underline">False</property>
+					  <property name="use_markup">False</property>
+					  <property name="justify">GTK_JUSTIFY_LEFT</property>
+					  <property name="wrap">False</property>
+					  <property name="selectable">False</property>
+					  <property name="xalign">0.5</property>
+					  <property name="yalign">0.5</property>
+					  <property name="xpad">0</property>
+					  <property name="ypad">0</property>
+					  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+					  <property name="width_chars">-1</property>
+					  <property name="single_line_mode">False</property>
+					  <property name="angle">0</property>
+					</widget>
+					<packing>
+					  <property name="padding">0</property>
+					  <property name="expand">False</property>
+					  <property name="fill">False</property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkSpinButton" id="cfg_misc_track_nr">
+					  <property name="visible">True</property>
+					  <property name="tooltip" translatable="yes">Number of tracks in the generated playlists 'Most Often Listened', 'Best Rated' and 'Most Recently Played'. Choose '0' for 'no limit'.</property>
+					  <property name="can_focus">True</property>
+					  <property name="climb_rate">1</property>
+					  <property name="digits">0</property>
+					  <property name="numeric">False</property>
+					  <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+					  <property name="snap_to_ticks">False</property>
+					  <property name="wrap">False</property>
+					  <property name="adjustment">20 0 100 1 10 10</property>
+					  <signal name="value_changed" handler="on_cfg_misc_track_nr_value_changed" last_modification_time="Thu, 28 Apr 2005 18:09:09 GMT"/>
+					</widget>
+					<packing>
+					  <property name="padding">0</property>
+					  <property name="expand">True</property>
+					  <property name="fill">True</property>
+					</packing>
+				      </child>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">True</property>
+				      <property name="fill">True</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkCheckButton" id="cfg_not_played_track">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">Also include tracks never played in &quot;Best Rated&quot; playlist</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <property name="active">False</property>
+				      <property name="inconsistent">False</property>
+				      <property name="draw_indicator">True</property>
+				      <signal name="toggled" handler="on_cfg_not_played_track_toggled" last_modification_time="Thu, 28 Apr 2005 18:08:52 GMT"/>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">True</property>
+				  <property name="fill">True</property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">True</property>
+			      <property name="fill">True</property>
+			    </packing>
+			  </child>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">True</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkVBox" id="vbox84">
+			  <property name="visible">True</property>
+			  <property name="homogeneous">False</property>
+			  <property name="spacing">6</property>
+
+			  <child>
+			    <widget class="GtkLabel" id="label209">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">&lt;b&gt;Delete Confirmation&lt;/b&gt;</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">True</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">False</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHBox" id="hbox84">
+			      <property name="visible">True</property>
+			      <property name="homogeneous">False</property>
+			      <property name="spacing">8</property>
+
+			      <child>
+				<widget class="GtkLabel" id="label210">
+				  <property name="visible">True</property>
+				  <property name="label">    </property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkVBox" id="vbox85">
+				  <property name="visible">True</property>
+				  <property name="homogeneous">False</property>
+				  <property name="spacing">8</property>
+
+				  <child>
+				    <widget class="GtkCheckButton" id="cfg_delete_track_from_playlist">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">Before removing playlists or tracks from a playlist</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <property name="active">False</property>
+				      <property name="inconsistent">False</property>
+				      <property name="draw_indicator">True</property>
+				      <signal name="toggled" handler="on_cfg_delete_track_from_playlist_toggled" last_modification_time="Thu, 28 Apr 2005 18:09:28 GMT"/>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkCheckButton" id="cfg_delete_track_from_ipod">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">Before removing tracks from the iPod</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <property name="active">False</property>
+				      <property name="inconsistent">False</property>
+				      <property name="draw_indicator">True</property>
+				      <signal name="toggled" handler="on_cfg_delete_track_from_ipod_toggled" last_modification_time="Thu, 28 Apr 2005 18:09:36 GMT"/>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkCheckButton" id="cfg_track_local_file_deletion">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">Before removing tracks from the harddisk</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <property name="active">False</property>
+				      <property name="inconsistent">False</property>
+				      <property name="draw_indicator">True</property>
+				      <signal name="toggled" handler="on_cfg_track_local_file_deletion_toggled" last_modification_time="Tue, 24 May 2005 14:27:44 GMT"/>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkCheckButton" id="cfg_track_database_deletion">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">Before removing tracks from the local database</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <property name="active">False</property>
+				      <property name="inconsistent">False</property>
+				      <property name="draw_indicator">True</property>
+				      <signal name="toggled" handler="on_cfg_track_database_deletion_toggled" last_modification_time="Tue, 24 May 2005 14:28:06 GMT"/>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkCheckButton" id="sync_confirm_delete_toggle2">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">Confirm before removing tracks from the iPod or repository
+when syncing playlists</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <property name="active">False</property>
+				      <property name="inconsistent">False</property>
+				      <property name="draw_indicator">True</property>
+				      <signal name="toggled" handler="on_sync_confirm_delete_toggled" last_modification_time="Mon, 15 May 2006 15:29:44 GMT"/>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkCheckButton" id="photo_library_confirm_delete_toggle">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">Check before removing photos from a photo album whether
+they should be deleted from the Photo Database.</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <property name="active">False</property>
+				      <property name="inconsistent">False</property>
+				      <property name="draw_indicator">True</property>
+				      <signal name="toggled" handler="on_photo_library_confirm_delete_toggled" last_modification_time="Fri, 09 Nov 2007 01:03:03 GMT"/>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">True</property>
+				  <property name="fill">True</property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">True</property>
+			      <property name="fill">True</property>
+			    </packing>
+			  </child>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">True</property>
+			</packing>
+		      </child>
+		    </widget>
+		  </child>
+		</widget>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="tab_expand">False</property>
+	      <property name="tab_fill">True</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkLabel" id="label201">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">_Edit</property>
+	      <property name="use_underline">True</property>
+	      <property name="use_markup">False</property>
+	      <property name="justify">GTK_JUSTIFY_LEFT</property>
+	      <property name="wrap">False</property>
+	      <property name="selectable">False</property>
+	      <property name="xalign">0.5</property>
+	      <property name="yalign">0.5</property>
+	      <property name="xpad">0</property>
+	      <property name="ypad">0</property>
+	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	      <property name="width_chars">-1</property>
+	      <property name="single_line_mode">False</property>
+	      <property name="angle">0</property>
+	    </widget>
+	    <packing>
+	      <property name="type">tab</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkScrolledWindow" id="scrolledwindow31">
+	      <property name="visible">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+	      <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+	      <property name="shadow_type">GTK_SHADOW_NONE</property>
+	      <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+	      <child>
+		<widget class="GtkViewport" id="viewport26">
+		  <property name="visible">True</property>
+		  <property name="shadow_type">GTK_SHADOW_IN</property>
+
+		  <child>
+		    <widget class="GtkVBox" id="vbox86">
+		      <property name="border_width">12</property>
+		      <property name="visible">True</property>
+		      <property name="homogeneous">False</property>
+		      <property name="spacing">18</property>
+
+		      <child>
+			<widget class="GtkVBox" id="vbox87">
+			  <property name="visible">True</property>
+			  <property name="homogeneous">False</property>
+			  <property name="spacing">6</property>
+
+			  <child>
+			    <widget class="GtkLabel" id="label212">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">&lt;b&gt;Play&lt;/b&gt;</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">True</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">False</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHBox" id="hbox85">
+			      <property name="visible">True</property>
+			      <property name="homogeneous">False</property>
+			      <property name="spacing">8</property>
+
+			      <child>
+				<widget class="GtkLabel" id="label213">
+				  <property name="visible">True</property>
+				  <property name="label">    </property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkTable" id="table50">
+				  <property name="visible">True</property>
+				  <property name="n_rows">2</property>
+				  <property name="n_columns">3</property>
+				  <property name="homogeneous">False</property>
+				  <property name="row_spacing">8</property>
+				  <property name="column_spacing">8</property>
+
+				  <child>
+				    <widget class="GtkLabel" id="label214">
+				      <property name="visible">True</property>
+				      <property name="label" translatable="yes">Command for 'Play now':</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">0</property>
+				      <property name="right_attach">1</property>
+				      <property name="top_attach">0</property>
+				      <property name="bottom_attach">1</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="label215">
+				      <property name="visible">True</property>
+				      <property name="label" translatable="yes">Command for 'Enqueue':</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">0</property>
+				      <property name="right_attach">1</property>
+				      <property name="top_attach">1</property>
+				      <property name="bottom_attach">2</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkEntry" id="play_now_path_entry">
+				      <property name="visible">True</property>
+				      <property name="tooltip" translatable="yes">For example, 'xmms %s' will clear xmms' current playlist, add the selected tracks and start playing.</property>
+				      <property name="can_focus">True</property>
+				      <property name="editable">True</property>
+				      <property name="visibility">True</property>
+				      <property name="max_length">0</property>
+				      <property name="text" translatable="yes"></property>
+				      <property name="has_frame">True</property>
+				      <property name="invisible_char">*</property>
+				      <property name="activates_default">False</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">1</property>
+				      <property name="right_attach">2</property>
+				      <property name="top_attach">0</property>
+				      <property name="bottom_attach">1</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkEntry" id="play_enqueue_path_entry">
+				      <property name="visible">True</property>
+				      <property name="tooltip" translatable="yes">For example, 'xmms -e %s' will append (enqueue) the selected tracks to xmms' current playlist.</property>
+				      <property name="can_focus">True</property>
+				      <property name="editable">True</property>
+				      <property name="visibility">True</property>
+				      <property name="max_length">0</property>
+				      <property name="text" translatable="yes"></property>
+				      <property name="has_frame">True</property>
+				      <property name="invisible_char">*</property>
+				      <property name="activates_default">False</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">1</property>
+				      <property name="right_attach">2</property>
+				      <property name="top_attach">1</property>
+				      <property name="bottom_attach">2</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkButton" id="play_now_path_button">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">Browse</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">2</property>
+				      <property name="right_attach">3</property>
+				      <property name="top_attach">0</property>
+				      <property name="bottom_attach">1</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkButton" id="play_enqueue_path_button">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">Browse</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">2</property>
+				      <property name="right_attach">3</property>
+				      <property name="top_attach">1</property>
+				      <property name="bottom_attach">2</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">True</property>
+				  <property name="fill">True</property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">True</property>
+			      <property name="fill">True</property>
+			    </packing>
+			  </child>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">True</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkVBox" id="vbox89">
+			  <property name="visible">True</property>
+			  <property name="homogeneous">False</property>
+			  <property name="spacing">6</property>
+
+			  <child>
+			    <widget class="GtkLabel" id="label216">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">&lt;b&gt;Volume Normalization&lt;/b&gt;</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">True</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">False</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHBox" id="hbox88">
+			      <property name="visible">True</property>
+			      <property name="homogeneous">False</property>
+			      <property name="spacing">8</property>
+
+			      <child>
+				<widget class="GtkLabel" id="label218">
+				  <property name="visible">True</property>
+				  <property name="label">    </property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkTable" id="table49">
+				  <property name="visible">True</property>
+				  <property name="n_rows">2</property>
+				  <property name="n_columns">3</property>
+				  <property name="homogeneous">False</property>
+				  <property name="row_spacing">8</property>
+				  <property name="column_spacing">8</property>
+
+				  <child>
+				    <widget class="GtkLabel" id="label219">
+				      <property name="visible">True</property>
+				      <property name="label" translatable="yes">'mp3gain' executable:</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">0</property>
+				      <property name="right_attach">1</property>
+				      <property name="top_attach">0</property>
+				      <property name="bottom_attach">1</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkEntry" id="mp3gain_path_entry">
+				      <property name="visible">True</property>
+				      <property name="tooltip" translatable="yes">Set this to 'mp3gain -q -k' to use the 'Normalize volume' functionality in the Tools Menu. If this is set, missing normalization data for mp3 files will be calculated and written to your mp3 file using this command.</property>
+				      <property name="can_focus">True</property>
+				      <property name="editable">True</property>
+				      <property name="visibility">True</property>
+				      <property name="max_length">0</property>
+				      <property name="text" translatable="yes"></property>
+				      <property name="has_frame">True</property>
+				      <property name="invisible_char">*</property>
+				      <property name="activates_default">False</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">1</property>
+				      <property name="right_attach">2</property>
+				      <property name="top_attach">0</property>
+				      <property name="bottom_attach">1</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkButton" id="mp3gain_path_button">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">Browse</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">2</property>
+				      <property name="right_attach">3</property>
+				      <property name="top_attach">0</property>
+				      <property name="bottom_attach">1</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="label432">
+				      <property name="visible">True</property>
+				      <property name="label" translatable="yes">'aacgain' executable:</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">0</property>
+				      <property name="right_attach">1</property>
+				      <property name="top_attach">1</property>
+				      <property name="bottom_attach">2</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkEntry" id="aacgain_path_entry">
+				      <property name="visible">True</property>
+				      <property name="tooltip" translatable="yes">Set this to 'aacgain -q -k' to use the 'Normalize volume' functionality in the Tools Menu. If this is set, missing normalization data for .m4a and .m4b files will be calculated and written to your music file using this command.</property>
+				      <property name="can_focus">True</property>
+				      <property name="editable">True</property>
+				      <property name="visibility">True</property>
+				      <property name="max_length">0</property>
+				      <property name="text" translatable="yes"></property>
+				      <property name="has_frame">True</property>
+				      <property name="invisible_char">*</property>
+				      <property name="activates_default">False</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">1</property>
+				      <property name="right_attach">2</property>
+				      <property name="top_attach">1</property>
+				      <property name="bottom_attach">2</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkButton" id="aacgain_path_button">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">Browse</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">2</property>
+				      <property name="right_attach">3</property>
+				      <property name="top_attach">1</property>
+				      <property name="bottom_attach">2</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">True</property>
+				  <property name="fill">True</property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">True</property>
+			      <property name="fill">True</property>
+			    </packing>
+			  </child>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">True</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkVBox" id="vbox90">
+			  <property name="visible">True</property>
+			  <property name="homogeneous">False</property>
+			  <property name="spacing">6</property>
+
+			  <child>
+			    <widget class="GtkLabel" id="label220">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">&lt;b&gt;Calendar/Contacts/Notes&lt;/b&gt;</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">True</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">False</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHBox" id="hbox90">
+			      <property name="visible">True</property>
+			      <property name="homogeneous">False</property>
+			      <property name="spacing">8</property>
+
+			      <child>
+				<widget class="GtkLabel" id="label221">
+				  <property name="visible">True</property>
+				  <property name="label">    </property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkVBox" id="vbox91">
+				  <property name="visible">True</property>
+				  <property name="homogeneous">False</property>
+				  <property name="spacing">6</property>
+
+				  <child>
+				    <widget class="GtkButton" id="button23">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">Set options for Calendar/Contacts/Notes</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <signal name="clicked" handler="on_calendar_contact_notes_options_clicked" last_modification_time="Tue, 09 May 2006 15:54:43 GMT"/>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <placeholder/>
+				  </child>
+
+				  <child>
+				    <placeholder/>
+				  </child>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">True</property>
+				  <property name="fill">True</property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">True</property>
+			      <property name="fill">True</property>
+			    </packing>
+			  </child>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">True</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkVBox" id="vbox174">
+			  <property name="visible">True</property>
+			  <property name="homogeneous">False</property>
+			  <property name="spacing">6</property>
+
+			  <child>
+			    <widget class="GtkLabel" id="label432">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">&lt;b&gt;On-the-fly Conversion&lt;/b&gt;</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">True</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">False</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHBox" id="hbox210">
+			      <property name="visible">True</property>
+			      <property name="homogeneous">False</property>
+			      <property name="spacing">8</property>
+
+			      <child>
+				<widget class="GtkLabel" id="label457">
+				  <property name="visible">True</property>
+				  <property name="label">    </property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkVBox" id="vbox181">
+				  <property name="visible">True</property>
+				  <property name="homogeneous">False</property>
+				  <property name="spacing">7</property>
+
+				  <child>
+				    <widget class="GtkTable" id="convert_table">
+				      <property name="visible">True</property>
+				      <property name="n_rows">5</property>
+				      <property name="n_columns">4</property>
+				      <property name="homogeneous">False</property>
+				      <property name="row_spacing">8</property>
+				      <property name="column_spacing">8</property>
+
+				      <child>
+					<widget class="GtkLabel" id="label436">
+					  <property name="visible">True</property>
+					  <property name="label" translatable="yes">Ogg with :</property>
+					  <property name="use_underline">False</property>
+					  <property name="use_markup">False</property>
+					  <property name="justify">GTK_JUSTIFY_LEFT</property>
+					  <property name="wrap">False</property>
+					  <property name="selectable">False</property>
+					  <property name="xalign">0.5</property>
+					  <property name="yalign">0.5</property>
+					  <property name="xpad">0</property>
+					  <property name="ypad">0</property>
+					  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+					  <property name="width_chars">-1</property>
+					  <property name="single_line_mode">False</property>
+					  <property name="angle">0</property>
+					</widget>
+					<packing>
+					  <property name="left_attach">1</property>
+					  <property name="right_attach">2</property>
+					  <property name="top_attach">0</property>
+					  <property name="bottom_attach">1</property>
+					  <property name="x_options">fill</property>
+					  <property name="y_options"></property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkEntry" id="path_conv_ogg_entry">
+					  <property name="visible">True</property>
+					  <property name="can_focus">True</property>
+					  <property name="editable">True</property>
+					  <property name="visibility">True</property>
+					  <property name="max_length">0</property>
+					  <property name="text" translatable="yes"></property>
+					  <property name="has_frame">True</property>
+					  <property name="invisible_char">*</property>
+					  <property name="activates_default">False</property>
+					</widget>
+					<packing>
+					  <property name="left_attach">2</property>
+					  <property name="right_attach">3</property>
+					  <property name="top_attach">0</property>
+					  <property name="bottom_attach">1</property>
+					  <property name="y_options"></property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkButton" id="path_conv_ogg_button">
+					  <property name="visible">True</property>
+					  <property name="can_focus">True</property>
+					  <property name="label" translatable="yes">Browse</property>
+					  <property name="use_underline">True</property>
+					  <property name="relief">GTK_RELIEF_NORMAL</property>
+					  <property name="focus_on_click">True</property>
+					</widget>
+					<packing>
+					  <property name="left_attach">3</property>
+					  <property name="right_attach">4</property>
+					  <property name="top_attach">0</property>
+					  <property name="bottom_attach">1</property>
+					  <property name="x_options">fill</property>
+					  <property name="y_options"></property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkLabel" id="label449">
+					  <property name="visible">True</property>
+					  <property name="label" translatable="yes">Flac with :</property>
+					  <property name="use_underline">False</property>
+					  <property name="use_markup">False</property>
+					  <property name="justify">GTK_JUSTIFY_LEFT</property>
+					  <property name="wrap">False</property>
+					  <property name="selectable">False</property>
+					  <property name="xalign">0.5</property>
+					  <property name="yalign">0.5</property>
+					  <property name="xpad">0</property>
+					  <property name="ypad">0</property>
+					  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+					  <property name="width_chars">-1</property>
+					  <property name="single_line_mode">False</property>
+					  <property name="angle">0</property>
+					</widget>
+					<packing>
+					  <property name="left_attach">1</property>
+					  <property name="right_attach">2</property>
+					  <property name="top_attach">1</property>
+					  <property name="bottom_attach">2</property>
+					  <property name="x_options">fill</property>
+					  <property name="y_options"></property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkEntry" id="path_conv_flac_entry">
+					  <property name="visible">True</property>
+					  <property name="can_focus">True</property>
+					  <property name="editable">True</property>
+					  <property name="visibility">True</property>
+					  <property name="max_length">0</property>
+					  <property name="text" translatable="yes"></property>
+					  <property name="has_frame">True</property>
+					  <property name="invisible_char">*</property>
+					  <property name="activates_default">False</property>
+					</widget>
+					<packing>
+					  <property name="left_attach">2</property>
+					  <property name="right_attach">3</property>
+					  <property name="top_attach">1</property>
+					  <property name="bottom_attach">2</property>
+					  <property name="y_options"></property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkButton" id="path_conv_flac_button">
+					  <property name="visible">True</property>
+					  <property name="can_focus">True</property>
+					  <property name="label" translatable="yes">Browse</property>
+					  <property name="use_underline">True</property>
+					  <property name="relief">GTK_RELIEF_NORMAL</property>
+					  <property name="focus_on_click">True</property>
+					</widget>
+					<packing>
+					  <property name="left_attach">3</property>
+					  <property name="right_attach">4</property>
+					  <property name="top_attach">1</property>
+					  <property name="bottom_attach">2</property>
+					  <property name="x_options">fill</property>
+					  <property name="y_options"></property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkLabel" id="label456">
+					  <property name="visible">True</property>
+					  <property name="label" translatable="yes">M4A with :</property>
+					  <property name="use_underline">False</property>
+					  <property name="use_markup">False</property>
+					  <property name="justify">GTK_JUSTIFY_LEFT</property>
+					  <property name="wrap">False</property>
+					  <property name="selectable">False</property>
+					  <property name="xalign">0.5</property>
+					  <property name="yalign">0.5</property>
+					  <property name="xpad">0</property>
+					  <property name="ypad">0</property>
+					  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+					  <property name="width_chars">-1</property>
+					  <property name="single_line_mode">False</property>
+					  <property name="angle">0</property>
+					</widget>
+					<packing>
+					  <property name="left_attach">1</property>
+					  <property name="right_attach">2</property>
+					  <property name="top_attach">2</property>
+					  <property name="bottom_attach">3</property>
+					  <property name="x_options">fill</property>
+					  <property name="y_options"></property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkEntry" id="path_conv_m4a_entry">
+					  <property name="visible">True</property>
+					  <property name="can_focus">True</property>
+					  <property name="editable">True</property>
+					  <property name="visibility">True</property>
+					  <property name="max_length">0</property>
+					  <property name="text" translatable="yes"></property>
+					  <property name="has_frame">True</property>
+					  <property name="invisible_char">*</property>
+					  <property name="activates_default">False</property>
+					</widget>
+					<packing>
+					  <property name="left_attach">2</property>
+					  <property name="right_attach">3</property>
+					  <property name="top_attach">2</property>
+					  <property name="bottom_attach">3</property>
+					  <property name="y_options"></property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkButton" id="path_conv_m4a_button">
+					  <property name="visible">True</property>
+					  <property name="can_focus">True</property>
+					  <property name="label" translatable="yes">Browse</property>
+					  <property name="use_underline">True</property>
+					  <property name="relief">GTK_RELIEF_NORMAL</property>
+					  <property name="focus_on_click">True</property>
+					</widget>
+					<packing>
+					  <property name="left_attach">3</property>
+					  <property name="right_attach">4</property>
+					  <property name="top_attach">2</property>
+					  <property name="bottom_attach">3</property>
+					  <property name="x_options">fill</property>
+					  <property name="y_options"></property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkLabel" id="label452">
+					  <property name="visible">True</property>
+					  <property name="label" translatable="yes">MP3 with :</property>
+					  <property name="use_underline">False</property>
+					  <property name="use_markup">False</property>
+					  <property name="justify">GTK_JUSTIFY_LEFT</property>
+					  <property name="wrap">False</property>
+					  <property name="selectable">False</property>
+					  <property name="xalign">0.5</property>
+					  <property name="yalign">0.5</property>
+					  <property name="xpad">0</property>
+					  <property name="ypad">0</property>
+					  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+					  <property name="width_chars">-1</property>
+					  <property name="single_line_mode">False</property>
+					  <property name="angle">0</property>
+					</widget>
+					<packing>
+					  <property name="left_attach">1</property>
+					  <property name="right_attach">2</property>
+					  <property name="top_attach">3</property>
+					  <property name="bottom_attach">4</property>
+					  <property name="x_options">fill</property>
+					  <property name="y_options"></property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkEntry" id="path_conv_mp3_entry">
+					  <property name="visible">True</property>
+					  <property name="can_focus">True</property>
+					  <property name="editable">True</property>
+					  <property name="visibility">True</property>
+					  <property name="max_length">0</property>
+					  <property name="text" translatable="yes"></property>
+					  <property name="has_frame">True</property>
+					  <property name="invisible_char">*</property>
+					  <property name="activates_default">False</property>
+					</widget>
+					<packing>
+					  <property name="left_attach">2</property>
+					  <property name="right_attach">3</property>
+					  <property name="top_attach">3</property>
+					  <property name="bottom_attach">4</property>
+					  <property name="y_options"></property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkButton" id="path_conv_mp3_button">
+					  <property name="visible">True</property>
+					  <property name="can_focus">True</property>
+					  <property name="label" translatable="yes">Browse</property>
+					  <property name="use_underline">True</property>
+					  <property name="relief">GTK_RELIEF_NORMAL</property>
+					  <property name="focus_on_click">True</property>
+					</widget>
+					<packing>
+					  <property name="left_attach">3</property>
+					  <property name="right_attach">4</property>
+					  <property name="top_attach">3</property>
+					  <property name="bottom_attach">4</property>
+					  <property name="x_options">fill</property>
+					  <property name="y_options"></property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkLabel" id="label454">
+					  <property name="visible">True</property>
+					  <property name="label" translatable="yes">WAV with :</property>
+					  <property name="use_underline">False</property>
+					  <property name="use_markup">False</property>
+					  <property name="justify">GTK_JUSTIFY_LEFT</property>
+					  <property name="wrap">False</property>
+					  <property name="selectable">False</property>
+					  <property name="xalign">0.5</property>
+					  <property name="yalign">0.5</property>
+					  <property name="xpad">0</property>
+					  <property name="ypad">0</property>
+					  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+					  <property name="width_chars">-1</property>
+					  <property name="single_line_mode">False</property>
+					  <property name="angle">0</property>
+					</widget>
+					<packing>
+					  <property name="left_attach">1</property>
+					  <property name="right_attach">2</property>
+					  <property name="top_attach">4</property>
+					  <property name="bottom_attach">5</property>
+					  <property name="x_options">fill</property>
+					  <property name="y_options"></property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkEntry" id="path_conv_wav_entry">
+					  <property name="visible">True</property>
+					  <property name="can_focus">True</property>
+					  <property name="editable">True</property>
+					  <property name="visibility">True</property>
+					  <property name="max_length">0</property>
+					  <property name="text" translatable="yes"></property>
+					  <property name="has_frame">True</property>
+					  <property name="invisible_char">*</property>
+					  <property name="activates_default">False</property>
+					</widget>
+					<packing>
+					  <property name="left_attach">2</property>
+					  <property name="right_attach">3</property>
+					  <property name="top_attach">4</property>
+					  <property name="bottom_attach">5</property>
+					  <property name="y_options"></property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkButton" id="path_conv_wav_button">
+					  <property name="visible">True</property>
+					  <property name="can_focus">True</property>
+					  <property name="label" translatable="yes">Browse</property>
+					  <property name="use_underline">True</property>
+					  <property name="relief">GTK_RELIEF_NORMAL</property>
+					  <property name="focus_on_click">True</property>
+					</widget>
+					<packing>
+					  <property name="left_attach">3</property>
+					  <property name="right_attach">4</property>
+					  <property name="top_attach">4</property>
+					  <property name="bottom_attach">5</property>
+					  <property name="x_options">fill</property>
+					  <property name="y_options"></property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkCheckButton" id="convert_ogg">
+					  <property name="visible">True</property>
+					  <property name="can_focus">True</property>
+					  <property name="label" translatable="yes"></property>
+					  <property name="use_underline">True</property>
+					  <property name="relief">GTK_RELIEF_NORMAL</property>
+					  <property name="focus_on_click">True</property>
+					  <property name="active">False</property>
+					  <property name="inconsistent">False</property>
+					  <property name="draw_indicator">True</property>
+					</widget>
+					<packing>
+					  <property name="left_attach">0</property>
+					  <property name="right_attach">1</property>
+					  <property name="top_attach">0</property>
+					  <property name="bottom_attach">1</property>
+					  <property name="x_options">fill</property>
+					  <property name="y_options"></property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkCheckButton" id="convert_flac">
+					  <property name="visible">True</property>
+					  <property name="can_focus">True</property>
+					  <property name="label" translatable="yes"></property>
+					  <property name="use_underline">True</property>
+					  <property name="relief">GTK_RELIEF_NORMAL</property>
+					  <property name="focus_on_click">True</property>
+					  <property name="active">False</property>
+					  <property name="inconsistent">False</property>
+					  <property name="draw_indicator">True</property>
+					</widget>
+					<packing>
+					  <property name="left_attach">0</property>
+					  <property name="right_attach">1</property>
+					  <property name="top_attach">1</property>
+					  <property name="bottom_attach">2</property>
+					  <property name="x_options">fill</property>
+					  <property name="y_options"></property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkCheckButton" id="convert_m4a">
+					  <property name="visible">True</property>
+					  <property name="can_focus">True</property>
+					  <property name="label" translatable="yes"></property>
+					  <property name="use_underline">True</property>
+					  <property name="relief">GTK_RELIEF_NORMAL</property>
+					  <property name="focus_on_click">True</property>
+					  <property name="active">False</property>
+					  <property name="inconsistent">False</property>
+					  <property name="draw_indicator">True</property>
+					</widget>
+					<packing>
+					  <property name="left_attach">0</property>
+					  <property name="right_attach">1</property>
+					  <property name="top_attach">2</property>
+					  <property name="bottom_attach">3</property>
+					  <property name="x_options">fill</property>
+					  <property name="y_options"></property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkCheckButton" id="convert_mp3">
+					  <property name="visible">True</property>
+					  <property name="can_focus">True</property>
+					  <property name="label" translatable="yes"></property>
+					  <property name="use_underline">True</property>
+					  <property name="relief">GTK_RELIEF_NORMAL</property>
+					  <property name="focus_on_click">True</property>
+					  <property name="active">False</property>
+					  <property name="inconsistent">False</property>
+					  <property name="draw_indicator">True</property>
+					</widget>
+					<packing>
+					  <property name="left_attach">0</property>
+					  <property name="right_attach">1</property>
+					  <property name="top_attach">3</property>
+					  <property name="bottom_attach">4</property>
+					  <property name="x_options">fill</property>
+					  <property name="y_options"></property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkCheckButton" id="convert_wav">
+					  <property name="visible">True</property>
+					  <property name="can_focus">True</property>
+					  <property name="label" translatable="yes"></property>
+					  <property name="use_underline">True</property>
+					  <property name="relief">GTK_RELIEF_NORMAL</property>
+					  <property name="focus_on_click">True</property>
+					  <property name="active">False</property>
+					  <property name="inconsistent">False</property>
+					  <property name="draw_indicator">True</property>
+					</widget>
+					<packing>
+					  <property name="left_attach">0</property>
+					  <property name="right_attach">1</property>
+					  <property name="top_attach">4</property>
+					  <property name="bottom_attach">5</property>
+					  <property name="x_options">fill</property>
+					  <property name="y_options"></property>
+					</packing>
+				      </child>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">True</property>
+				      <property name="fill">True</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkTable" id="table52">
+				      <property name="visible">True</property>
+				      <property name="n_rows">4</property>
+				      <property name="n_columns">2</property>
+				      <property name="homogeneous">False</property>
+				      <property name="row_spacing">8</property>
+				      <property name="column_spacing">8</property>
+
+				      <child>
+					<widget class="GtkLabel" id="label459">
+					  <property name="visible">True</property>
+					  <property name="label" translatable="yes">Maximum number of background threads:</property>
+					  <property name="use_underline">False</property>
+					  <property name="use_markup">False</property>
+					  <property name="justify">GTK_JUSTIFY_LEFT</property>
+					  <property name="wrap">False</property>
+					  <property name="selectable">False</property>
+					  <property name="xalign">0</property>
+					  <property name="yalign">0.5</property>
+					  <property name="xpad">0</property>
+					  <property name="ypad">0</property>
+					  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+					  <property name="width_chars">-1</property>
+					  <property name="single_line_mode">False</property>
+					  <property name="angle">0</property>
+					</widget>
+					<packing>
+					  <property name="left_attach">0</property>
+					  <property name="right_attach">1</property>
+					  <property name="top_attach">0</property>
+					  <property name="bottom_attach">1</property>
+					  <property name="x_options">fill</property>
+					  <property name="y_options"></property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkLabel" id="label460">
+					  <property name="visible">True</property>
+					  <property name="label" translatable="yes">Maximum size of cache directory (in GB):</property>
+					  <property name="use_underline">False</property>
+					  <property name="use_markup">False</property>
+					  <property name="justify">GTK_JUSTIFY_LEFT</property>
+					  <property name="wrap">False</property>
+					  <property name="selectable">False</property>
+					  <property name="xalign">0</property>
+					  <property name="yalign">0.5</property>
+					  <property name="xpad">0</property>
+					  <property name="ypad">0</property>
+					  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+					  <property name="width_chars">-1</property>
+					  <property name="single_line_mode">False</property>
+					  <property name="angle">0</property>
+					</widget>
+					<packing>
+					  <property name="left_attach">0</property>
+					  <property name="right_attach">1</property>
+					  <property name="top_attach">1</property>
+					  <property name="bottom_attach">2</property>
+					  <property name="x_options">fill</property>
+					  <property name="y_options"></property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkSpinButton" id="file_convert_max_threads_num_spinbutton">
+					  <property name="visible">True</property>
+					  <property name="tooltip" translatable="yes">Set to 0 to use as many background threads as CPUs are available on your system.</property>
+					  <property name="can_focus">True</property>
+					  <property name="climb_rate">1</property>
+					  <property name="digits">0</property>
+					  <property name="numeric">True</property>
+					  <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+					  <property name="snap_to_ticks">True</property>
+					  <property name="wrap">False</property>
+					  <property name="adjustment">0 0 1048576 1 10 10</property>
+					  <signal name="value_changed" handler="on_file_convert_max_threads_num_spinbutton_value_changed" last_modification_time="Sat, 21 Apr 2007 08:08:12 GMT"/>
+					</widget>
+					<packing>
+					  <property name="left_attach">1</property>
+					  <property name="right_attach">2</property>
+					  <property name="top_attach">0</property>
+					  <property name="bottom_attach">1</property>
+					  <property name="y_options"></property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkSpinButton" id="file_convert_maxdirsize_spinbutton">
+					  <property name="visible">True</property>
+					  <property name="tooltip" translatable="yes">Set to 0 to effectively disable caching (a maximum of one track will be cached at a time).</property>
+					  <property name="can_focus">True</property>
+					  <property name="climb_rate">1</property>
+					  <property name="digits">1</property>
+					  <property name="numeric">True</property>
+					  <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+					  <property name="snap_to_ticks">False</property>
+					  <property name="wrap">False</property>
+					  <property name="adjustment">4 0 1048576 1 10 10</property>
+					  <signal name="value_changed" handler="on_file_convert_maxdirsize_spinbutton_value_changed" last_modification_time="Sat, 21 Apr 2007 08:11:25 GMT"/>
+					</widget>
+					<packing>
+					  <property name="left_attach">1</property>
+					  <property name="right_attach">2</property>
+					  <property name="top_attach">1</property>
+					  <property name="bottom_attach">2</property>
+					  <property name="y_options"></property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkHBox" id="hbox212">
+					  <property name="visible">True</property>
+					  <property name="homogeneous">False</property>
+					  <property name="spacing">8</property>
+
+					  <child>
+					    <widget class="GtkLabel" id="label461">
+					      <property name="visible">True</property>
+					      <property name="label" translatable="yes">Cache directory:</property>
+					      <property name="use_underline">False</property>
+					      <property name="use_markup">False</property>
+					      <property name="justify">GTK_JUSTIFY_LEFT</property>
+					      <property name="wrap">False</property>
+					      <property name="selectable">False</property>
+					      <property name="xalign">0</property>
+					      <property name="yalign">0.5</property>
+					      <property name="xpad">0</property>
+					      <property name="ypad">0</property>
+					      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+					      <property name="width_chars">-1</property>
+					      <property name="single_line_mode">False</property>
+					      <property name="angle">0</property>
+					    </widget>
+					    <packing>
+					      <property name="padding">0</property>
+					      <property name="expand">False</property>
+					      <property name="fill">False</property>
+					    </packing>
+					  </child>
+
+					  <child>
+					    <widget class="GtkEntry" id="file_convert_cachedir_entry">
+					      <property name="visible">True</property>
+					      <property name="can_focus">True</property>
+					      <property name="editable">False</property>
+					      <property name="visibility">True</property>
+					      <property name="max_length">0</property>
+					      <property name="text" translatable="yes"></property>
+					      <property name="has_frame">False</property>
+					      <property name="invisible_char">*</property>
+					      <property name="activates_default">False</property>
+					    </widget>
+					    <packing>
+					      <property name="padding">0</property>
+					      <property name="expand">True</property>
+					      <property name="fill">True</property>
+					    </packing>
+					  </child>
+					</widget>
+					<packing>
+					  <property name="left_attach">0</property>
+					  <property name="right_attach">2</property>
+					  <property name="top_attach">2</property>
+					  <property name="bottom_attach">3</property>
+					  <property name="x_options">fill</property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkCheckButton" id="file_convert_display_log_button">
+					  <property name="visible">True</property>
+					  <property name="can_focus">True</property>
+					  <property name="label" translatable="yes">Display conversion log</property>
+					  <property name="use_underline">True</property>
+					  <property name="relief">GTK_RELIEF_NORMAL</property>
+					  <property name="focus_on_click">True</property>
+					  <property name="active">False</property>
+					  <property name="inconsistent">False</property>
+					  <property name="draw_indicator">True</property>
+					</widget>
+					<packing>
+					  <property name="left_attach">0</property>
+					  <property name="right_attach">2</property>
+					  <property name="top_attach">3</property>
+					  <property name="bottom_attach">4</property>
+					  <property name="x_options">fill</property>
+					  <property name="y_options"></property>
+					</packing>
+				      </child>
+				    </widget>
+				    <packing>
+				      <property name="padding">8</property>
+				      <property name="expand">True</property>
+				      <property name="fill">True</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <placeholder/>
+				  </child>
+
+				  <child>
+				    <placeholder/>
+				  </child>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">True</property>
+				  <property name="fill">True</property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">True</property>
+			      <property name="fill">True</property>
+			    </packing>
+			  </child>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">True</property>
+			</packing>
+		      </child>
+		    </widget>
+		  </child>
+		</widget>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="tab_expand">False</property>
+	      <property name="tab_fill">True</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkLabel" id="label211">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">_Tools</property>
+	      <property name="use_underline">True</property>
+	      <property name="use_markup">False</property>
+	      <property name="justify">GTK_JUSTIFY_LEFT</property>
+	      <property name="wrap">False</property>
+	      <property name="selectable">False</property>
+	      <property name="xalign">0.5</property>
+	      <property name="yalign">0.5</property>
+	      <property name="xpad">0</property>
+	      <property name="ypad">0</property>
+	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	      <property name="width_chars">-1</property>
+	      <property name="single_line_mode">False</property>
+	      <property name="angle">0</property>
+	    </widget>
+	    <packing>
+	      <property name="type">tab</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkScrolledWindow" id="scrolledwindowfm">
+	      <property name="visible">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+	      <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+	      <property name="shadow_type">GTK_SHADOW_NONE</property>
+	      <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+	      <child>
+		<widget class="GtkViewport" id="viewport27">
+		  <property name="visible">True</property>
+		  <property name="shadow_type">GTK_SHADOW_IN</property>
+
+		  <child>
+		    <widget class="GtkVBox" id="vboxfm">
+		      <property name="border_width">12</property>
+		      <property name="visible">True</property>
+		      <property name="homogeneous">False</property>
+		      <property name="spacing">18</property>
+
+		      <child>
+			<widget class="GtkVBox" id="vboxfm1">
+			  <property name="visible">True</property>
+			  <property name="homogeneous">False</property>
+			  <property name="spacing">6</property>
+
+			  <child>
+			    <widget class="GtkLabel" id="labelfm1">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">&lt;b&gt;Audioscrobbler&lt;/b&gt;</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">True</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">False</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHBox" id="hboxfm1">
+			      <property name="visible">True</property>
+			      <property name="homogeneous">False</property>
+			      <property name="spacing">8</property>
+
+			      <child>
+				<widget class="GtkLabel" id="label439">
+				  <property name="visible">True</property>
+				  <property name="label">    </property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkTable" id="tablefm1">
+				  <property name="visible">True</property>
+				  <property name="n_rows">1</property>
+				  <property name="n_columns">1</property>
+				  <property name="homogeneous">False</property>
+				  <property name="row_spacing">8</property>
+				  <property name="column_spacing">8</property>
+
+				  <child>
+				    <widget class="GtkCheckButton" id="lastfm_active">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">Scrobble Tracks?</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <property name="active">False</property>
+				      <property name="inconsistent">False</property>
+				      <property name="draw_indicator">True</property>
+				      <signal name="toggled" handler="on_lastfm_active_toggled" last_modification_time="Mon, 23 Oct 2006 09:12:05 GMT"/>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">0</property>
+				      <property name="right_attach">1</property>
+				      <property name="top_attach">0</property>
+				      <property name="bottom_attach">1</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">True</property>
+				  <property name="fill">True</property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">True</property>
+			      <property name="fill">True</property>
+			    </packing>
+			  </child>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">True</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkVBox" id="vboxfm2">
+			  <property name="visible">True</property>
+			  <property name="homogeneous">False</property>
+			  <property name="spacing">6</property>
+
+			  <child>
+			    <widget class="GtkLabel" id="labelfm2">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">&lt;b&gt;Account Information&lt;/b&gt;</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">True</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">False</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkHBox" id="hboxfm2">
+			      <property name="visible">True</property>
+			      <property name="homogeneous">False</property>
+			      <property name="spacing">8</property>
+
+			      <child>
+				<widget class="GtkLabel" id="label443">
+				  <property name="visible">True</property>
+				  <property name="label">    </property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkTable" id="tablefm2">
+				  <property name="visible">True</property>
+				  <property name="n_rows">2</property>
+				  <property name="n_columns">2</property>
+				  <property name="homogeneous">False</property>
+				  <property name="row_spacing">8</property>
+				  <property name="column_spacing">8</property>
+
+				  <child>
+				    <widget class="GtkLabel" id="labelfm21">
+				      <property name="visible">True</property>
+				      <property name="label" translatable="yes">Username:</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">0</property>
+				      <property name="right_attach">1</property>
+				      <property name="top_attach">0</property>
+				      <property name="bottom_attach">1</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkEntry" id="lastfm_username">
+				      <property name="visible">True</property>
+				      <property name="tooltip" translatable="yes">Set this to your last.fm username</property>
+				      <property name="can_focus">True</property>
+				      <property name="editable">True</property>
+				      <property name="visibility">True</property>
+				      <property name="max_length">20</property>
+				      <property name="text" translatable="yes"></property>
+				      <property name="has_frame">True</property>
+				      <property name="invisible_char">*</property>
+				      <property name="activates_default">False</property>
+				      <signal name="changed" handler="on_lastfm_username_entry_changed" last_modification_time="Mon, 23 Oct 2006 09:14:10 GMT"/>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">1</property>
+				      <property name="right_attach">2</property>
+				      <property name="top_attach">0</property>
+				      <property name="bottom_attach">1</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="label22">
+				      <property name="visible">True</property>
+				      <property name="label" translatable="yes">Password:</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">0</property>
+				      <property name="right_attach">1</property>
+				      <property name="top_attach">1</property>
+				      <property name="bottom_attach">2</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkEntry" id="lastfm_password">
+				      <property name="visible">True</property>
+				      <property name="tooltip" translatable="yes">Set this to your last.fm password</property>
+				      <property name="can_focus">True</property>
+				      <property name="editable">True</property>
+				      <property name="visibility">False</property>
+				      <property name="max_length">32</property>
+				      <property name="text" translatable="yes"></property>
+				      <property name="has_frame">True</property>
+				      <property name="invisible_char">*</property>
+				      <property name="activates_default">False</property>
+				      <signal name="changed" handler="on_lastfm_password_entry_changed" last_modification_time="Mon, 23 Oct 2006 09:15:27 GMT"/>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">1</property>
+				      <property name="right_attach">2</property>
+				      <property name="top_attach">1</property>
+				      <property name="bottom_attach">2</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">True</property>
+				  <property name="fill">True</property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">True</property>
+			      <property name="fill">True</property>
+			    </packing>
+			  </child>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">True</property>
+			</packing>
+		      </child>
+		    </widget>
+		  </child>
+		</widget>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="tab_expand">False</property>
+	      <property name="tab_fill">True</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkLabel" id="labelfm">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">_Last.FM</property>
+	      <property name="use_underline">True</property>
+	      <property name="use_markup">False</property>
+	      <property name="justify">GTK_JUSTIFY_LEFT</property>
+	      <property name="wrap">False</property>
+	      <property name="selectable">False</property>
+	      <property name="xalign">0.5</property>
+	      <property name="yalign">0.5</property>
+	      <property name="xpad">0</property>
+	      <property name="ypad">0</property>
+	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	      <property name="width_chars">-1</property>
+	      <property name="single_line_mode">False</property>
+	      <property name="angle">0</property>
+	    </widget>
+	    <packing>
+	      <property name="type">tab</property>
+	    </packing>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">True</property>
+	  <property name="fill">True</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkHButtonBox" id="hbuttonbox12">
+	  <property name="visible">True</property>
+	  <property name="layout_style">GTK_BUTTONBOX_END</property>
+	  <property name="spacing">8</property>
+
+	  <child>
+	    <widget class="GtkButton" id="prefs_apply">
+	      <property name="visible">True</property>
+	      <property name="can_default">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label">gtk-apply</property>
+	      <property name="use_stock">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	      <signal name="clicked" handler="on_prefs_apply_clicked" last_modification_time="Fri, 06 May 2005 17:42:20 GMT"/>
+	    </widget>
+	  </child>
+
+	  <child>
+	    <widget class="GtkButton" id="prefs_cancel">
+	      <property name="visible">True</property>
+	      <property name="can_default">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label">gtk-cancel</property>
+	      <property name="use_stock">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	      <signal name="clicked" handler="on_prefs_cancel_clicked" last_modification_time="Fri, 06 May 2005 17:41:59 GMT"/>
+	    </widget>
+	  </child>
+
+	  <child>
+	    <widget class="GtkButton" id="prefs_ok">
+	      <property name="visible">True</property>
+	      <property name="can_default">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label">gtk-ok</property>
+	      <property name="use_stock">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	      <signal name="clicked" handler="on_prefs_ok_clicked" last_modification_time="Fri, 06 May 2005 17:22:23 GMT"/>
+	    </widget>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">True</property>
+	</packing>
+      </child>
+    </widget>
+  </child>
+</widget>
+
+<widget class="GtkWindow" id="details_window">
+  <property name="title" translatable="yes">Details</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_NONE</property>
+  <property name="modal">False</property>
+  <property name="resizable">True</property>
+  <property name="destroy_with_parent">False</property>
+  <property name="icon">gtkpod-icon-48.png</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
+  <property name="urgency_hint">False</property>
+
+  <child>
+    <widget class="GtkVBox" id="vbox150">
+      <property name="border_width">6</property>
+      <property name="visible">True</property>
+      <property name="homogeneous">False</property>
+      <property name="spacing">4</property>
+
+      <child>
+	<widget class="GtkLabel" id="details_label_artist_title">
+	  <property name="visible">True</property>
+	  <property name="label">label</property>
+	  <property name="use_underline">False</property>
+	  <property name="use_markup">True</property>
+	  <property name="justify">GTK_JUSTIFY_LEFT</property>
+	  <property name="wrap">False</property>
+	  <property name="selectable">False</property>
+	  <property name="xalign">0</property>
+	  <property name="yalign">0.5</property>
+	  <property name="xpad">0</property>
+	  <property name="ypad">3</property>
+	  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	  <property name="width_chars">-1</property>
+	  <property name="single_line_mode">False</property>
+	  <property name="angle">0</property>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">False</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkViewport" id="details_viewport">
+	  <property name="border_width">2</property>
+	  <property name="visible">True</property>
+	  <property name="shadow_type">GTK_SHADOW_IN</property>
+
+	  <child>
+	    <widget class="GtkHBox" id="hbox188">
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">4</property>
+
+	      <child>
+		<widget class="GtkVBox" id="vbox151">
+		  <property name="visible">True</property>
+		  <property name="homogeneous">False</property>
+		  <property name="spacing">0</property>
+
+		  <child>
+		    <widget class="GtkLabel" id="label340">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">Cover</property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">False</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">6</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">2</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkViewport" id="viewport18">
+		      <property name="visible">True</property>
+		      <property name="shadow_type">GTK_SHADOW_IN</property>
+
+		      <child>
+			<widget class="GtkImage" id="details_image_thumbnail">
+			  <property name="visible">True</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">3</property>
+			  <property name="ypad">3</property>
+			</widget>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="padding">6</property>
+		      <property name="expand">False</property>
+		      <property name="fill">True</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkButton" id="details_button_set_artwork">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="relief">GTK_RELIEF_NORMAL</property>
+		      <property name="focus_on_click">True</property>
+
+		      <child>
+			<widget class="GtkAlignment" id="alignment6">
+			  <property name="visible">True</property>
+			  <property name="xalign">0</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xscale">0</property>
+			  <property name="yscale">0</property>
+			  <property name="top_padding">0</property>
+			  <property name="bottom_padding">0</property>
+			  <property name="left_padding">0</property>
+			  <property name="right_padding">0</property>
+
+			  <child>
+			    <widget class="GtkHBox" id="hbox190">
+			      <property name="visible">True</property>
+			      <property name="homogeneous">False</property>
+			      <property name="spacing">2</property>
+
+			      <child>
+				<widget class="GtkImage" id="image3072">
+				  <property name="visible">True</property>
+				  <property name="stock">gtk-open</property>
+				  <property name="icon_size">4</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkLabel" id="label341">
+				  <property name="visible">True</property>
+				  <property name="label" translatable="yes">Set Cover Art from _File</property>
+				  <property name="use_underline">True</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+			    </widget>
+			  </child>
+			</widget>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkCheckButton" id="details_checkbutton_writethrough">
+		      <property name="border_width">3</property>
+		      <property name="visible">True</property>
+		      <property name="tooltip" translatable="yes">If you check this, information (cover art and meta information) changed for this track will be copied to all other selected tracks as well. Use with care.</property>
+		      <property name="can_focus">True</property>
+		      <property name="relief">GTK_RELIEF_NORMAL</property>
+		      <property name="focus_on_click">True</property>
+		      <property name="active">False</property>
+		      <property name="inconsistent">False</property>
+		      <property name="draw_indicator">True</property>
+
+		      <child>
+			<widget class="GtkAlignment" id="alignment7">
+			  <property name="visible">True</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xscale">0</property>
+			  <property name="yscale">0</property>
+			  <property name="top_padding">0</property>
+			  <property name="bottom_padding">0</property>
+			  <property name="left_padding">0</property>
+			  <property name="right_padding">0</property>
+
+			  <child>
+			    <widget class="GtkHBox" id="hbox191">
+			      <property name="visible">True</property>
+			      <property name="homogeneous">False</property>
+			      <property name="spacing">2</property>
+
+			      <child>
+				<widget class="GtkImage" id="image3074">
+				  <property name="visible">True</property>
+				  <property name="stock">gtk-dialog-warning</property>
+				  <property name="icon_size">4</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkLabel" id="label342">
+				  <property name="visible">True</property>
+				  <property name="label" translatable="yes">Change all tracks
+simultaneously</property>
+				  <property name="use_underline">True</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+			    </widget>
+			  </child>
+			</widget>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="padding">6</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		      <property name="pack_type">GTK_PACK_END</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkHSeparator" id="hseparator56">
+		      <property name="visible">True</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">5</property>
+		      <property name="expand">False</property>
+		      <property name="fill">True</property>
+		      <property name="pack_type">GTK_PACK_END</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkButton" id="details_button_remove_artwork">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="relief">GTK_RELIEF_NORMAL</property>
+		      <property name="focus_on_click">True</property>
+
+		      <child>
+			<widget class="GtkAlignment" id="alignment8">
+			  <property name="visible">True</property>
+			  <property name="xalign">0</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xscale">0</property>
+			  <property name="yscale">0</property>
+			  <property name="top_padding">0</property>
+			  <property name="bottom_padding">0</property>
+			  <property name="left_padding">0</property>
+			  <property name="right_padding">0</property>
+
+			  <child>
+			    <widget class="GtkHBox" id="hbox192">
+			      <property name="visible">True</property>
+			      <property name="homogeneous">False</property>
+			      <property name="spacing">2</property>
+
+			      <child>
+				<widget class="GtkImage" id="image3075">
+				  <property name="visible">True</property>
+				  <property name="stock">gtk-delete</property>
+				  <property name="icon_size">4</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkLabel" id="label389">
+				  <property name="visible">True</property>
+				  <property name="label" translatable="yes">_Remove Cover Art</property>
+				  <property name="use_underline">True</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+			    </widget>
+			  </child>
+			</widget>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">2</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkNotebook" id="details_notebook">
+		  <property name="border_width">2</property>
+		  <property name="visible">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="show_tabs">True</property>
+		  <property name="show_border">True</property>
+		  <property name="tab_pos">GTK_POS_TOP</property>
+		  <property name="scrollable">False</property>
+		  <property name="enable_popup">False</property>
+
+		  <child>
+		    <widget class="GtkScrolledWindow" id="scrolledwindow20">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+		      <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+		      <property name="shadow_type">GTK_SHADOW_IN</property>
+		      <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+		      <child>
+			<widget class="GtkViewport" id="viewport14">
+			  <property name="visible">True</property>
+			  <property name="shadow_type">GTK_SHADOW_IN</property>
+
+			  <child>
+			    <widget class="GtkVBox" id="vbox153">
+			      <property name="border_width">6</property>
+			      <property name="visible">True</property>
+			      <property name="homogeneous">False</property>
+			      <property name="spacing">6</property>
+
+			      <child>
+				<widget class="GtkTable" id="table36">
+				  <property name="visible">True</property>
+				  <property name="n_rows">13</property>
+				  <property name="n_columns">4</property>
+				  <property name="homogeneous">False</property>
+				  <property name="row_spacing">2</property>
+				  <property name="column_spacing">10</property>
+
+				  <child>
+				    <widget class="GtkLabel" id="details_label_47">
+				      <property name="visible">True</property>
+				      <property name="label">label</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">0</property>
+				      <property name="right_attach">1</property>
+				      <property name="top_attach">0</property>
+				      <property name="bottom_attach">1</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkCheckButton" id="details_checkbutton_38">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="label">(Remember playback position)</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <property name="active">False</property>
+				      <property name="inconsistent">False</property>
+				      <property name="draw_indicator">True</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">2</property>
+				      <property name="right_attach">4</property>
+				      <property name="top_attach">10</property>
+				      <property name="bottom_attach">11</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkCheckButton" id="details_checkbutton_35">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">(Checked)</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <property name="active">False</property>
+				      <property name="inconsistent">False</property>
+				      <property name="draw_indicator">True</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">2</property>
+				      <property name="right_attach">4</property>
+				      <property name="top_attach">11</property>
+				      <property name="bottom_attach">12</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkCheckButton" id="details_checkbutton_28">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="label">(Compilation)</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <property name="active">False</property>
+				      <property name="inconsistent">False</property>
+				      <property name="draw_indicator">True</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">0</property>
+				      <property name="right_attach">2</property>
+				      <property name="top_attach">12</property>
+				      <property name="bottom_attach">13</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkCheckButton" id="details_checkbutton_39">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="label">(Skip when shuffling)</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <property name="active">False</property>
+				      <property name="inconsistent">False</property>
+				      <property name="draw_indicator">True</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">0</property>
+				      <property name="right_attach">2</property>
+				      <property name="top_attach">11</property>
+				      <property name="bottom_attach">12</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="details_label_41">
+				      <property name="visible">True</property>
+				      <property name="label">label</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">0</property>
+				      <property name="right_attach">1</property>
+				      <property name="top_attach">10</property>
+				      <property name="bottom_attach">11</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="details_label_11">
+				      <property name="visible">True</property>
+				      <property name="label">label</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">0</property>
+				      <property name="right_attach">1</property>
+				      <property name="top_attach">9</property>
+				      <property name="bottom_attach">10</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkEntry" id="details_entry_11">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="editable">True</property>
+				      <property name="visibility">True</property>
+				      <property name="max_length">0</property>
+				      <property name="text" translatable="yes"></property>
+				      <property name="has_frame">True</property>
+				      <property name="invisible_char">*</property>
+				      <property name="activates_default">False</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">1</property>
+				      <property name="right_attach">2</property>
+				      <property name="top_attach">9</property>
+				      <property name="bottom_attach">10</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="details_label_37">
+				      <property name="visible">True</property>
+				      <property name="label">label</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">2</property>
+				      <property name="right_attach">3</property>
+				      <property name="top_attach">9</property>
+				      <property name="bottom_attach">10</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkEntry" id="details_entry_37">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="editable">True</property>
+				      <property name="visibility">True</property>
+				      <property name="max_length">0</property>
+				      <property name="text" translatable="yes"></property>
+				      <property name="has_frame">True</property>
+				      <property name="invisible_char">*</property>
+				      <property name="activates_default">False</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">3</property>
+				      <property name="right_attach">4</property>
+				      <property name="top_attach">9</property>
+				      <property name="bottom_attach">10</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="details_label_26">
+				      <property name="visible">True</property>
+				      <property name="label">label</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">0</property>
+				      <property name="right_attach">1</property>
+				      <property name="top_attach">8</property>
+				      <property name="bottom_attach">9</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="details_label_18">
+				      <property name="visible">True</property>
+				      <property name="label">label</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">0</property>
+				      <property name="right_attach">1</property>
+				      <property name="top_attach">7</property>
+				      <property name="bottom_attach">8</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="details_label_25">
+				      <property name="visible">True</property>
+				      <property name="label">label</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">0</property>
+				      <property name="right_attach">1</property>
+				      <property name="top_attach">6</property>
+				      <property name="bottom_attach">7</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkEntry" id="details_entry_26">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="editable">True</property>
+				      <property name="visibility">True</property>
+				      <property name="max_length">0</property>
+				      <property name="text" translatable="yes"></property>
+				      <property name="has_frame">True</property>
+				      <property name="invisible_char">*</property>
+				      <property name="activates_default">False</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">1</property>
+				      <property name="right_attach">2</property>
+				      <property name="top_attach">8</property>
+				      <property name="bottom_attach">9</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkEntry" id="details_entry_18">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="editable">True</property>
+				      <property name="visibility">True</property>
+				      <property name="max_length">0</property>
+				      <property name="text" translatable="yes"></property>
+				      <property name="has_frame">True</property>
+				      <property name="invisible_char">*</property>
+				      <property name="activates_default">False</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">1</property>
+				      <property name="right_attach">2</property>
+				      <property name="top_attach">7</property>
+				      <property name="bottom_attach">8</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkEntry" id="details_entry_25">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="editable">True</property>
+				      <property name="visibility">True</property>
+				      <property name="max_length">0</property>
+				      <property name="text" translatable="yes"></property>
+				      <property name="has_frame">True</property>
+				      <property name="invisible_char">*</property>
+				      <property name="activates_default">False</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">1</property>
+				      <property name="right_attach">2</property>
+				      <property name="top_attach">6</property>
+				      <property name="bottom_attach">7</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="details_label_36">
+				      <property name="visible">True</property>
+				      <property name="label">label</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">2</property>
+				      <property name="right_attach">3</property>
+				      <property name="top_attach">8</property>
+				      <property name="bottom_attach">9</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="details_label_14">
+				      <property name="visible">True</property>
+				      <property name="label">label</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">2</property>
+				      <property name="right_attach">3</property>
+				      <property name="top_attach">7</property>
+				      <property name="bottom_attach">8</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="details_label_19">
+				      <property name="visible">True</property>
+				      <property name="label">label</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">2</property>
+				      <property name="right_attach">3</property>
+				      <property name="top_attach">6</property>
+				      <property name="bottom_attach">7</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkEntry" id="details_entry_36">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="editable">True</property>
+				      <property name="visibility">True</property>
+				      <property name="max_length">0</property>
+				      <property name="text" translatable="yes"></property>
+				      <property name="has_frame">True</property>
+				      <property name="invisible_char">*</property>
+				      <property name="activates_default">False</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">3</property>
+				      <property name="right_attach">4</property>
+				      <property name="top_attach">8</property>
+				      <property name="bottom_attach">9</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkEntry" id="details_entry_14">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="editable">True</property>
+				      <property name="visibility">True</property>
+				      <property name="max_length">0</property>
+				      <property name="text" translatable="yes"></property>
+				      <property name="has_frame">True</property>
+				      <property name="invisible_char">*</property>
+				      <property name="activates_default">False</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">3</property>
+				      <property name="right_attach">4</property>
+				      <property name="top_attach">7</property>
+				      <property name="bottom_attach">8</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkEntry" id="details_entry_19">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="editable">True</property>
+				      <property name="visibility">True</property>
+				      <property name="max_length">0</property>
+				      <property name="text" translatable="yes"></property>
+				      <property name="has_frame">True</property>
+				      <property name="invisible_char">*</property>
+				      <property name="activates_default">False</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">3</property>
+				      <property name="right_attach">4</property>
+				      <property name="top_attach">6</property>
+				      <property name="bottom_attach">7</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="details_label_4">
+				      <property name="visible">True</property>
+				      <property name="label">label</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">0</property>
+				      <property name="right_attach">1</property>
+				      <property name="top_attach">5</property>
+				      <property name="bottom_attach">6</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="details_label_6">
+				      <property name="visible">True</property>
+				      <property name="label">label</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">0</property>
+				      <property name="right_attach">1</property>
+				      <property name="top_attach">4</property>
+				      <property name="bottom_attach">5</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="details_label_3">
+				      <property name="visible">True</property>
+				      <property name="label">label</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">0</property>
+				      <property name="right_attach">1</property>
+				      <property name="top_attach">3</property>
+				      <property name="bottom_attach">4</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkEntry" id="details_entry_4">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="editable">True</property>
+				      <property name="visibility">True</property>
+				      <property name="max_length">0</property>
+				      <property name="text" translatable="yes"></property>
+				      <property name="has_frame">True</property>
+				      <property name="invisible_char">*</property>
+				      <property name="activates_default">False</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">1</property>
+				      <property name="right_attach">4</property>
+				      <property name="top_attach">5</property>
+				      <property name="bottom_attach">6</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkEntry" id="details_entry_6">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="editable">True</property>
+				      <property name="visibility">True</property>
+				      <property name="max_length">0</property>
+				      <property name="text" translatable="yes"></property>
+				      <property name="has_frame">True</property>
+				      <property name="invisible_char">*</property>
+				      <property name="activates_default">False</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">1</property>
+				      <property name="right_attach">4</property>
+				      <property name="top_attach">4</property>
+				      <property name="bottom_attach">5</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkEntry" id="details_entry_3">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="editable">True</property>
+				      <property name="visibility">True</property>
+				      <property name="max_length">0</property>
+				      <property name="text" translatable="yes"></property>
+				      <property name="has_frame">True</property>
+				      <property name="invisible_char">*</property>
+				      <property name="activates_default">False</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">1</property>
+				      <property name="right_attach">4</property>
+				      <property name="top_attach">3</property>
+				      <property name="bottom_attach">4</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkEntry" id="details_entry_47">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="editable">True</property>
+				      <property name="visibility">True</property>
+				      <property name="max_length">0</property>
+				      <property name="text" translatable="yes"></property>
+				      <property name="has_frame">True</property>
+				      <property name="invisible_char">*</property>
+				      <property name="activates_default">False</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">1</property>
+				      <property name="right_attach">4</property>
+				      <property name="top_attach">0</property>
+				      <property name="bottom_attach">1</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkComboBox" id="details_combobox_41">
+				      <property name="visible">True</property>
+				      <property name="add_tearoffs">False</property>
+				      <property name="focus_on_click">True</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">1</property>
+				      <property name="right_attach">2</property>
+				      <property name="top_attach">10</property>
+				      <property name="bottom_attach">11</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="details_label_1">
+				      <property name="visible">True</property>
+				      <property name="label">label</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">0</property>
+				      <property name="right_attach">1</property>
+				      <property name="top_attach">2</property>
+				      <property name="bottom_attach">3</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkEntry" id="details_entry_1">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="editable">True</property>
+				      <property name="visibility">True</property>
+				      <property name="max_length">0</property>
+				      <property name="text" translatable="yes"></property>
+				      <property name="has_frame">True</property>
+				      <property name="invisible_char">*</property>
+				      <property name="activates_default">False</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">1</property>
+				      <property name="right_attach">4</property>
+				      <property name="top_attach">2</property>
+				      <property name="bottom_attach">3</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="details_label_2">
+				      <property name="visible">True</property>
+				      <property name="label">label</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">0</property>
+				      <property name="right_attach">1</property>
+				      <property name="top_attach">1</property>
+				      <property name="bottom_attach">2</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkEntry" id="details_entry_2">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="editable">True</property>
+				      <property name="visibility">True</property>
+				      <property name="max_length">0</property>
+				      <property name="text" translatable="yes"></property>
+				      <property name="has_frame">True</property>
+				      <property name="invisible_char">*</property>
+				      <property name="activates_default">False</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">1</property>
+				      <property name="right_attach">4</property>
+				      <property name="top_attach">1</property>
+				      <property name="bottom_attach">2</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">True</property>
+				</packing>
+			      </child>
+
+			      <child>
+				<placeholder/>
+			      </child>
+			    </widget>
+			  </child>
+			</widget>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="tab_expand">False</property>
+		      <property name="tab_fill">True</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkLabel" id="label343">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">_General</property>
+		      <property name="use_underline">True</property>
+		      <property name="use_markup">False</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		      <property name="mnemonic_widget">scrolledwindow20</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
+		    </widget>
+		    <packing>
+		      <property name="type">tab</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkScrolledWindow" id="scrolledwindow32">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+		      <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+		      <property name="shadow_type">GTK_SHADOW_IN</property>
+		      <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+		      <child>
+			<widget class="GtkViewport" id="viewport28">
+			  <property name="visible">True</property>
+			  <property name="shadow_type">GTK_SHADOW_IN</property>
+
+			  <child>
+			    <widget class="GtkTable" id="table53">
+			      <property name="border_width">6</property>
+			      <property name="visible">True</property>
+			      <property name="n_rows">6</property>
+			      <property name="n_columns">2</property>
+			      <property name="homogeneous">False</property>
+			      <property name="row_spacing">2</property>
+			      <property name="column_spacing">10</property>
+
+			      <child>
+				<widget class="GtkLabel" id="details_label_51">
+				  <property name="visible">True</property>
+				  <property name="label">label</property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="left_attach">0</property>
+				  <property name="right_attach">1</property>
+				  <property name="top_attach">0</property>
+				  <property name="bottom_attach">1</property>
+				  <property name="x_options">fill</property>
+				  <property name="y_options"></property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkLabel" id="details_label_48">
+				  <property name="visible">True</property>
+				  <property name="label">label</property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="left_attach">0</property>
+				  <property name="right_attach">1</property>
+				  <property name="top_attach">1</property>
+				  <property name="bottom_attach">2</property>
+				  <property name="x_options">fill</property>
+				  <property name="y_options"></property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkLabel" id="details_label_50">
+				  <property name="visible">True</property>
+				  <property name="label">label</property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="left_attach">0</property>
+				  <property name="right_attach">1</property>
+				  <property name="top_attach">2</property>
+				  <property name="bottom_attach">3</property>
+				  <property name="x_options">fill</property>
+				  <property name="y_options"></property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkLabel" id="details_label_49">
+				  <property name="visible">True</property>
+				  <property name="label">label</property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="left_attach">0</property>
+				  <property name="right_attach">1</property>
+				  <property name="top_attach">3</property>
+				  <property name="bottom_attach">4</property>
+				  <property name="x_options">fill</property>
+				  <property name="y_options"></property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkLabel" id="details_label_52">
+				  <property name="visible">True</property>
+				  <property name="label">label</property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="left_attach">0</property>
+				  <property name="right_attach">1</property>
+				  <property name="top_attach">4</property>
+				  <property name="bottom_attach">5</property>
+				  <property name="x_options">fill</property>
+				  <property name="y_options"></property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkEntry" id="details_entry_51">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="editable">True</property>
+				  <property name="visibility">True</property>
+				  <property name="max_length">0</property>
+				  <property name="text" translatable="yes"></property>
+				  <property name="has_frame">True</property>
+				  <property name="invisible_char">*</property>
+				  <property name="activates_default">False</property>
+				</widget>
+				<packing>
+				  <property name="left_attach">1</property>
+				  <property name="right_attach">2</property>
+				  <property name="top_attach">0</property>
+				  <property name="bottom_attach">1</property>
+				  <property name="y_options"></property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkEntry" id="details_entry_48">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="editable">True</property>
+				  <property name="visibility">True</property>
+				  <property name="max_length">0</property>
+				  <property name="text" translatable="yes"></property>
+				  <property name="has_frame">True</property>
+				  <property name="invisible_char">*</property>
+				  <property name="activates_default">False</property>
+				</widget>
+				<packing>
+				  <property name="left_attach">1</property>
+				  <property name="right_attach">2</property>
+				  <property name="top_attach">1</property>
+				  <property name="bottom_attach">2</property>
+				  <property name="y_options"></property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkEntry" id="details_entry_50">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="editable">True</property>
+				  <property name="visibility">True</property>
+				  <property name="max_length">0</property>
+				  <property name="text" translatable="yes"></property>
+				  <property name="has_frame">True</property>
+				  <property name="invisible_char">*</property>
+				  <property name="activates_default">False</property>
+				</widget>
+				<packing>
+				  <property name="left_attach">1</property>
+				  <property name="right_attach">2</property>
+				  <property name="top_attach">2</property>
+				  <property name="bottom_attach">3</property>
+				  <property name="y_options"></property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkEntry" id="details_entry_49">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="editable">True</property>
+				  <property name="visibility">True</property>
+				  <property name="max_length">0</property>
+				  <property name="text" translatable="yes"></property>
+				  <property name="has_frame">True</property>
+				  <property name="invisible_char">*</property>
+				  <property name="activates_default">False</property>
+				</widget>
+				<packing>
+				  <property name="left_attach">1</property>
+				  <property name="right_attach">2</property>
+				  <property name="top_attach">3</property>
+				  <property name="bottom_attach">4</property>
+				  <property name="y_options"></property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkEntry" id="details_entry_52">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="editable">True</property>
+				  <property name="visibility">True</property>
+				  <property name="max_length">0</property>
+				  <property name="text" translatable="yes"></property>
+				  <property name="has_frame">True</property>
+				  <property name="invisible_char">*</property>
+				  <property name="activates_default">False</property>
+				</widget>
+				<packing>
+				  <property name="left_attach">1</property>
+				  <property name="right_attach">2</property>
+				  <property name="top_attach">4</property>
+				  <property name="bottom_attach">5</property>
+				  <property name="y_options"></property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkLabel" id="details_label_53">
+				  <property name="visible">True</property>
+				  <property name="label">label</property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="left_attach">0</property>
+				  <property name="right_attach">1</property>
+				  <property name="top_attach">5</property>
+				  <property name="bottom_attach">6</property>
+				  <property name="x_options">fill</property>
+				  <property name="y_options"></property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkEntry" id="details_entry_53">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="editable">True</property>
+				  <property name="visibility">True</property>
+				  <property name="max_length">0</property>
+				  <property name="text" translatable="yes"></property>
+				  <property name="has_frame">True</property>
+				  <property name="invisible_char">*</property>
+				  <property name="activates_default">False</property>
+				</widget>
+				<packing>
+				  <property name="left_attach">1</property>
+				  <property name="right_attach">2</property>
+				  <property name="top_attach">5</property>
+				  <property name="bottom_attach">6</property>
+				  <property name="y_options"></property>
+				</packing>
+			      </child>
+			    </widget>
+			  </child>
+			</widget>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="tab_expand">False</property>
+		      <property name="tab_fill">True</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkLabel" id="label465">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">_Sorting</property>
+		      <property name="use_underline">True</property>
+		      <property name="use_markup">False</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		      <property name="mnemonic_widget">details_notebook</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
+		    </widget>
+		    <packing>
+		      <property name="type">tab</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkScrolledWindow" id="scrolledwindow22">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+		      <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+		      <property name="shadow_type">GTK_SHADOW_IN</property>
+		      <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+		      <child>
+			<widget class="GtkViewport" id="viewport16">
+			  <property name="visible">True</property>
+			  <property name="shadow_type">GTK_SHADOW_IN</property>
+
+			  <child>
+			    <widget class="GtkTable" id="table41">
+			      <property name="border_width">6</property>
+			      <property name="visible">True</property>
+			      <property name="n_rows">6</property>
+			      <property name="n_columns">5</property>
+			      <property name="homogeneous">False</property>
+			      <property name="row_spacing">2</property>
+			      <property name="column_spacing">10</property>
+
+			      <child>
+				<widget class="GtkLabel" id="details_label_5">
+				  <property name="visible">True</property>
+				  <property name="label">label</property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="left_attach">0</property>
+				  <property name="right_attach">1</property>
+				  <property name="top_attach">4</property>
+				  <property name="bottom_attach">5</property>
+				  <property name="x_options">fill</property>
+				  <property name="y_options"></property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkLabel" id="details_label_31">
+				  <property name="visible">True</property>
+				  <property name="label">label</property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="left_attach">0</property>
+				  <property name="right_attach">1</property>
+				  <property name="top_attach">0</property>
+				  <property name="bottom_attach">1</property>
+				  <property name="x_options">fill</property>
+				  <property name="y_options"></property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkLabel" id="details_label_34">
+				  <property name="visible">True</property>
+				  <property name="label">label</property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="left_attach">0</property>
+				  <property name="right_attach">1</property>
+				  <property name="top_attach">1</property>
+				  <property name="bottom_attach">2</property>
+				  <property name="x_options">fill</property>
+				  <property name="y_options"></property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkLabel" id="details_label_33">
+				  <property name="visible">True</property>
+				  <property name="label">label</property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="left_attach">0</property>
+				  <property name="right_attach">1</property>
+				  <property name="top_attach">5</property>
+				  <property name="bottom_attach">6</property>
+				  <property name="x_options">fill</property>
+				  <property name="y_options"></property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkLabel" id="details_label_30">
+				  <property name="visible">True</property>
+				  <property name="label">label</property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="left_attach">0</property>
+				  <property name="right_attach">1</property>
+				  <property name="top_attach">3</property>
+				  <property name="bottom_attach">4</property>
+				  <property name="x_options">fill</property>
+				  <property name="y_options"></property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkLabel" id="details_label_32">
+				  <property name="visible">True</property>
+				  <property name="label">label</property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="left_attach">0</property>
+				  <property name="right_attach">1</property>
+				  <property name="top_attach">2</property>
+				  <property name="bottom_attach">3</property>
+				  <property name="x_options">fill</property>
+				  <property name="y_options"></property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkEntry" id="details_entry_31">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="editable">True</property>
+				  <property name="visibility">True</property>
+				  <property name="max_length">0</property>
+				  <property name="text" translatable="yes"></property>
+				  <property name="has_frame">True</property>
+				  <property name="invisible_char">*</property>
+				  <property name="activates_default">False</property>
+				</widget>
+				<packing>
+				  <property name="left_attach">1</property>
+				  <property name="right_attach">5</property>
+				  <property name="top_attach">0</property>
+				  <property name="bottom_attach">1</property>
+				  <property name="y_options"></property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkEntry" id="details_entry_34">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="editable">True</property>
+				  <property name="visibility">True</property>
+				  <property name="max_length">0</property>
+				  <property name="text" translatable="yes"></property>
+				  <property name="has_frame">True</property>
+				  <property name="invisible_char">*</property>
+				  <property name="activates_default">False</property>
+				</widget>
+				<packing>
+				  <property name="left_attach">1</property>
+				  <property name="right_attach">5</property>
+				  <property name="top_attach">1</property>
+				  <property name="bottom_attach">2</property>
+				  <property name="y_options"></property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkEntry" id="details_entry_32">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="editable">True</property>
+				  <property name="visibility">True</property>
+				  <property name="max_length">0</property>
+				  <property name="text" translatable="yes"></property>
+				  <property name="has_frame">True</property>
+				  <property name="invisible_char">*</property>
+				  <property name="activates_default">False</property>
+				</widget>
+				<packing>
+				  <property name="left_attach">1</property>
+				  <property name="right_attach">5</property>
+				  <property name="top_attach">2</property>
+				  <property name="bottom_attach">3</property>
+				  <property name="y_options"></property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkScrolledWindow" id="scrolledwindow25">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
+				  <property name="vscrollbar_policy">GTK_POLICY_ALWAYS</property>
+				  <property name="shadow_type">GTK_SHADOW_IN</property>
+				  <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+				  <child>
+				    <widget class="GtkTextView" id="details_textview_5">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="editable">True</property>
+				      <property name="overwrite">False</property>
+				      <property name="accepts_tab">True</property>
+				      <property name="justification">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap_mode">GTK_WRAP_WORD</property>
+				      <property name="cursor_visible">True</property>
+				      <property name="pixels_above_lines">0</property>
+				      <property name="pixels_below_lines">0</property>
+				      <property name="pixels_inside_wrap">0</property>
+				      <property name="left_margin">0</property>
+				      <property name="right_margin">0</property>
+				      <property name="indent">0</property>
+				      <property name="text"></property>
+				    </widget>
+				  </child>
+				</widget>
+				<packing>
+				  <property name="left_attach">1</property>
+				  <property name="right_attach">5</property>
+				  <property name="top_attach">4</property>
+				  <property name="bottom_attach">5</property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkScrolledWindow" id="scrolledwindow26">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
+				  <property name="vscrollbar_policy">GTK_POLICY_ALWAYS</property>
+				  <property name="shadow_type">GTK_SHADOW_IN</property>
+				  <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+				  <child>
+				    <widget class="GtkTextView" id="details_textview_33">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="editable">True</property>
+				      <property name="overwrite">False</property>
+				      <property name="accepts_tab">True</property>
+				      <property name="justification">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap_mode">GTK_WRAP_WORD</property>
+				      <property name="cursor_visible">True</property>
+				      <property name="pixels_above_lines">0</property>
+				      <property name="pixels_below_lines">0</property>
+				      <property name="pixels_inside_wrap">0</property>
+				      <property name="left_margin">0</property>
+				      <property name="right_margin">0</property>
+				      <property name="indent">0</property>
+				      <property name="text"></property>
+				    </widget>
+				  </child>
+				</widget>
+				<packing>
+				  <property name="left_attach">1</property>
+				  <property name="right_attach">5</property>
+				  <property name="top_attach">5</property>
+				  <property name="bottom_attach">6</property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkScrolledWindow" id="scrolledwindow24">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
+				  <property name="vscrollbar_policy">GTK_POLICY_ALWAYS</property>
+				  <property name="shadow_type">GTK_SHADOW_IN</property>
+				  <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+				  <child>
+				    <widget class="GtkTextView" id="details_textview_30">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="editable">True</property>
+				      <property name="overwrite">False</property>
+				      <property name="accepts_tab">True</property>
+				      <property name="justification">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap_mode">GTK_WRAP_WORD</property>
+				      <property name="cursor_visible">True</property>
+				      <property name="pixels_above_lines">0</property>
+				      <property name="pixels_below_lines">0</property>
+				      <property name="pixels_inside_wrap">0</property>
+				      <property name="left_margin">0</property>
+				      <property name="right_margin">0</property>
+				      <property name="indent">0</property>
+				      <property name="text"></property>
+				    </widget>
+				  </child>
+				</widget>
+				<packing>
+				  <property name="left_attach">1</property>
+				  <property name="right_attach">5</property>
+				  <property name="top_attach">3</property>
+				  <property name="bottom_attach">4</property>
+				</packing>
+			      </child>
+			    </widget>
+			  </child>
+			</widget>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="tab_expand">False</property>
+		      <property name="tab_fill">True</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkLabel" id="label345">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">_Podcasts</property>
+		      <property name="use_underline">True</property>
+		      <property name="use_markup">False</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		      <property name="mnemonic_widget">scrolledwindow20</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
+		    </widget>
+		    <packing>
+		      <property name="type">tab</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkScrolledWindow" id="scrolledwindow28">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+		      <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+		      <property name="shadow_type">GTK_SHADOW_IN</property>
+		      <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+		      <child>
+			<widget class="GtkViewport" id="viewport23">
+			  <property name="visible">True</property>
+			  <property name="shadow_type">GTK_SHADOW_IN</property>
+
+			  <child>
+			    <widget class="GtkTable" id="table51">
+			      <property name="border_width">6</property>
+			      <property name="visible">True</property>
+			      <property name="n_rows">5</property>
+			      <property name="n_columns">2</property>
+			      <property name="homogeneous">False</property>
+			      <property name="row_spacing">2</property>
+			      <property name="column_spacing">10</property>
+
+			      <child>
+				<widget class="GtkLabel" id="details_label_42">
+				  <property name="visible">True</property>
+				  <property name="label">label</property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="left_attach">0</property>
+				  <property name="right_attach">1</property>
+				  <property name="top_attach">0</property>
+				  <property name="bottom_attach">1</property>
+				  <property name="x_options">fill</property>
+				  <property name="y_options"></property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkLabel" id="details_label_43">
+				  <property name="visible">True</property>
+				  <property name="label">label</property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="left_attach">0</property>
+				  <property name="right_attach">1</property>
+				  <property name="top_attach">1</property>
+				  <property name="bottom_attach">2</property>
+				  <property name="x_options">fill</property>
+				  <property name="y_options"></property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkLabel" id="details_label_44">
+				  <property name="visible">True</property>
+				  <property name="label">label</property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="left_attach">0</property>
+				  <property name="right_attach">1</property>
+				  <property name="top_attach">2</property>
+				  <property name="bottom_attach">3</property>
+				  <property name="x_options">fill</property>
+				  <property name="y_options"></property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkLabel" id="details_label_45">
+				  <property name="visible">True</property>
+				  <property name="label">label</property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="left_attach">0</property>
+				  <property name="right_attach">1</property>
+				  <property name="top_attach">3</property>
+				  <property name="bottom_attach">4</property>
+				  <property name="x_options">fill</property>
+				  <property name="y_options"></property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkLabel" id="details_label_46">
+				  <property name="visible">True</property>
+				  <property name="label">label</property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="left_attach">0</property>
+				  <property name="right_attach">1</property>
+				  <property name="top_attach">4</property>
+				  <property name="bottom_attach">5</property>
+				  <property name="x_options">fill</property>
+				  <property name="y_options"></property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkEntry" id="details_entry_42">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="editable">True</property>
+				  <property name="visibility">True</property>
+				  <property name="max_length">0</property>
+				  <property name="text" translatable="yes"></property>
+				  <property name="has_frame">True</property>
+				  <property name="invisible_char">*</property>
+				  <property name="activates_default">False</property>
+				</widget>
+				<packing>
+				  <property name="left_attach">1</property>
+				  <property name="right_attach">2</property>
+				  <property name="top_attach">0</property>
+				  <property name="bottom_attach">1</property>
+				  <property name="y_options"></property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkEntry" id="details_entry_43">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="editable">True</property>
+				  <property name="visibility">True</property>
+				  <property name="max_length">0</property>
+				  <property name="text" translatable="yes"></property>
+				  <property name="has_frame">True</property>
+				  <property name="invisible_char">*</property>
+				  <property name="activates_default">False</property>
+				</widget>
+				<packing>
+				  <property name="left_attach">1</property>
+				  <property name="right_attach">2</property>
+				  <property name="top_attach">1</property>
+				  <property name="bottom_attach">2</property>
+				  <property name="y_options"></property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkEntry" id="details_entry_44">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="editable">True</property>
+				  <property name="visibility">True</property>
+				  <property name="max_length">0</property>
+				  <property name="text" translatable="yes"></property>
+				  <property name="has_frame">True</property>
+				  <property name="invisible_char">*</property>
+				  <property name="activates_default">False</property>
+				</widget>
+				<packing>
+				  <property name="left_attach">1</property>
+				  <property name="right_attach">2</property>
+				  <property name="top_attach">2</property>
+				  <property name="bottom_attach">3</property>
+				  <property name="y_options"></property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkEntry" id="details_entry_45">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="editable">True</property>
+				  <property name="visibility">True</property>
+				  <property name="max_length">0</property>
+				  <property name="text" translatable="yes"></property>
+				  <property name="has_frame">True</property>
+				  <property name="invisible_char">*</property>
+				  <property name="activates_default">False</property>
+				</widget>
+				<packing>
+				  <property name="left_attach">1</property>
+				  <property name="right_attach">2</property>
+				  <property name="top_attach">3</property>
+				  <property name="bottom_attach">4</property>
+				  <property name="y_options"></property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkEntry" id="details_entry_46">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="editable">True</property>
+				  <property name="visibility">True</property>
+				  <property name="max_length">0</property>
+				  <property name="text" translatable="yes"></property>
+				  <property name="has_frame">True</property>
+				  <property name="invisible_char">*</property>
+				  <property name="activates_default">False</property>
+				</widget>
+				<packing>
+				  <property name="left_attach">1</property>
+				  <property name="right_attach">2</property>
+				  <property name="top_attach">4</property>
+				  <property name="bottom_attach">5</property>
+				  <property name="y_options"></property>
+				</packing>
+			      </child>
+			    </widget>
+			  </child>
+			</widget>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="tab_expand">False</property>
+		      <property name="tab_fill">True</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkLabel" id="label444">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">_Video</property>
+		      <property name="use_underline">True</property>
+		      <property name="use_markup">False</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		      <property name="mnemonic_widget">details_notebook</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
+		    </widget>
+		    <packing>
+		      <property name="type">tab</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkScrolledWindow" id="scrolledwindow23">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+		      <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+		      <property name="shadow_type">GTK_SHADOW_IN</property>
+		      <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+		      <child>
+			<widget class="GtkViewport" id="viewport17">
+			  <property name="visible">True</property>
+			  <property name="shadow_type">GTK_SHADOW_IN</property>
+
+			  <child>
+			    <widget class="GtkVBox" id="vbox152">
+			      <property name="visible">True</property>
+			      <property name="homogeneous">False</property>
+			      <property name="spacing">0</property>
+
+			      <child>
+				<widget class="GtkTable" id="table37">
+				  <property name="border_width">6</property>
+				  <property name="visible">True</property>
+				  <property name="n_rows">13</property>
+				  <property name="n_columns">4</property>
+				  <property name="homogeneous">False</property>
+				  <property name="row_spacing">2</property>
+				  <property name="column_spacing">10</property>
+
+				  <child>
+				    <widget class="GtkLabel" id="details_label_20">
+				      <property name="visible">True</property>
+				      <property name="label">label</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">0</property>
+				      <property name="right_attach">1</property>
+				      <property name="top_attach">2</property>
+				      <property name="bottom_attach">3</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="details_label_22">
+				      <property name="visible">True</property>
+				      <property name="label">label</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">0</property>
+				      <property name="right_attach">1</property>
+				      <property name="top_attach">3</property>
+				      <property name="bottom_attach">4</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="details_label_21">
+				      <property name="visible">True</property>
+				      <property name="label">label</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">0</property>
+				      <property name="right_attach">1</property>
+				      <property name="top_attach">4</property>
+				      <property name="bottom_attach">5</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="details_label_27">
+				      <property name="visible">True</property>
+				      <property name="label">label</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">0</property>
+				      <property name="right_attach">1</property>
+				      <property name="top_attach">0</property>
+				      <property name="bottom_attach">1</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="details_label_29">
+				      <property name="visible">True</property>
+				      <property name="label">label</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">0</property>
+				      <property name="right_attach">1</property>
+				      <property name="top_attach">1</property>
+				      <property name="bottom_attach">2</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="details_label_8">
+				      <property name="visible">True</property>
+				      <property name="label">label</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">0</property>
+				      <property name="right_attach">1</property>
+				      <property name="top_attach">5</property>
+				      <property name="bottom_attach">6</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="details_label_9">
+				      <property name="visible">True</property>
+				      <property name="label">label</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">0</property>
+				      <property name="right_attach">1</property>
+				      <property name="top_attach">6</property>
+				      <property name="bottom_attach">7</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="details_label_12">
+				      <property name="visible">True</property>
+				      <property name="label">label</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">0</property>
+				      <property name="right_attach">1</property>
+				      <property name="top_attach">12</property>
+				      <property name="bottom_attach">13</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="details_label_17">
+				      <property name="visible">True</property>
+				      <property name="label">label</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">0</property>
+				      <property name="right_attach">1</property>
+				      <property name="top_attach">11</property>
+				      <property name="bottom_attach">12</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="details_label_15">
+				      <property name="visible">True</property>
+				      <property name="label">label</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">0</property>
+				      <property name="right_attach">1</property>
+				      <property name="top_attach">10</property>
+				      <property name="bottom_attach">11</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="details_label_23">
+				      <property name="visible">True</property>
+				      <property name="label">label</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">0</property>
+				      <property name="right_attach">1</property>
+				      <property name="top_attach">9</property>
+				      <property name="bottom_attach">10</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="details_label_7">
+				      <property name="visible">True</property>
+				      <property name="label">label</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">0</property>
+				      <property name="right_attach">1</property>
+				      <property name="top_attach">8</property>
+				      <property name="bottom_attach">9</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="details_label_13">
+				      <property name="visible">True</property>
+				      <property name="label">label</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">2</property>
+				      <property name="right_attach">3</property>
+				      <property name="top_attach">11</property>
+				      <property name="bottom_attach">12</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="details_label_16">
+				      <property name="visible">True</property>
+				      <property name="label">label</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">2</property>
+				      <property name="right_attach">3</property>
+				      <property name="top_attach">10</property>
+				      <property name="bottom_attach">11</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="details_label_24">
+				      <property name="visible">True</property>
+				      <property name="label">label</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">2</property>
+				      <property name="right_attach">3</property>
+				      <property name="top_attach">9</property>
+				      <property name="bottom_attach">10</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="details_label_10">
+				      <property name="visible">True</property>
+				      <property name="label">label</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">2</property>
+				      <property name="right_attach">3</property>
+				      <property name="top_attach">8</property>
+				      <property name="bottom_attach">9</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkEntry" id="details_entry_13">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="editable">True</property>
+				      <property name="visibility">True</property>
+				      <property name="max_length">0</property>
+				      <property name="text" translatable="yes"></property>
+				      <property name="has_frame">True</property>
+				      <property name="invisible_char">*</property>
+				      <property name="activates_default">False</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">3</property>
+				      <property name="right_attach">4</property>
+				      <property name="top_attach">11</property>
+				      <property name="bottom_attach">12</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="details_label_40">
+				      <property name="visible">True</property>
+				      <property name="label">label</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">0</property>
+				      <property name="right_attach">1</property>
+				      <property name="top_attach">7</property>
+				      <property name="bottom_attach">8</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkEntry" id="details_entry_40">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="editable">False</property>
+				      <property name="visibility">True</property>
+				      <property name="max_length">0</property>
+				      <property name="text" translatable="yes"></property>
+				      <property name="has_frame">False</property>
+				      <property name="invisible_char">*</property>
+				      <property name="activates_default">False</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">1</property>
+				      <property name="right_attach">4</property>
+				      <property name="top_attach">7</property>
+				      <property name="bottom_attach">8</property>
+				      <property name="x_padding">1</property>
+				      <property name="y_padding">1</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkEntry" id="details_entry_9">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="editable">False</property>
+				      <property name="visibility">True</property>
+				      <property name="max_length">0</property>
+				      <property name="text" translatable="yes"></property>
+				      <property name="has_frame">False</property>
+				      <property name="invisible_char">*</property>
+				      <property name="activates_default">False</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">1</property>
+				      <property name="right_attach">4</property>
+				      <property name="top_attach">6</property>
+				      <property name="bottom_attach">7</property>
+				      <property name="x_padding">1</property>
+				      <property name="y_padding">1</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkEntry" id="details_entry_8">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="editable">False</property>
+				      <property name="visibility">True</property>
+				      <property name="max_length">0</property>
+				      <property name="text" translatable="yes"></property>
+				      <property name="has_frame">False</property>
+				      <property name="invisible_char">*</property>
+				      <property name="activates_default">False</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">1</property>
+				      <property name="right_attach">4</property>
+				      <property name="top_attach">5</property>
+				      <property name="bottom_attach">6</property>
+				      <property name="x_padding">1</property>
+				      <property name="y_padding">1</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkEntry" id="details_entry_21">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="editable">True</property>
+				      <property name="visibility">True</property>
+				      <property name="max_length">0</property>
+				      <property name="text" translatable="yes"></property>
+				      <property name="has_frame">True</property>
+				      <property name="invisible_char">*</property>
+				      <property name="activates_default">False</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">1</property>
+				      <property name="right_attach">4</property>
+				      <property name="top_attach">4</property>
+				      <property name="bottom_attach">5</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkEntry" id="details_entry_22">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="editable">True</property>
+				      <property name="visibility">True</property>
+				      <property name="max_length">0</property>
+				      <property name="text" translatable="yes"></property>
+				      <property name="has_frame">True</property>
+				      <property name="invisible_char">*</property>
+				      <property name="activates_default">False</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">1</property>
+				      <property name="right_attach">4</property>
+				      <property name="top_attach">3</property>
+				      <property name="bottom_attach">4</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkEntry" id="details_entry_20">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="editable">True</property>
+				      <property name="visibility">True</property>
+				      <property name="max_length">0</property>
+				      <property name="text" translatable="yes"></property>
+				      <property name="has_frame">True</property>
+				      <property name="invisible_char">*</property>
+				      <property name="activates_default">False</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">1</property>
+				      <property name="right_attach">4</property>
+				      <property name="top_attach">2</property>
+				      <property name="bottom_attach">3</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkEntry" id="details_entry_29">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="editable">True</property>
+				      <property name="visibility">True</property>
+				      <property name="max_length">0</property>
+				      <property name="text" translatable="yes"></property>
+				      <property name="has_frame">True</property>
+				      <property name="invisible_char">*</property>
+				      <property name="activates_default">False</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">1</property>
+				      <property name="right_attach">4</property>
+				      <property name="top_attach">1</property>
+				      <property name="bottom_attach">2</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkEntry" id="details_entry_27">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="editable">True</property>
+				      <property name="visibility">True</property>
+				      <property name="max_length">0</property>
+				      <property name="text" translatable="yes"></property>
+				      <property name="has_frame">True</property>
+				      <property name="invisible_char">*</property>
+				      <property name="activates_default">False</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">1</property>
+				      <property name="right_attach">4</property>
+				      <property name="top_attach">0</property>
+				      <property name="bottom_attach">1</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkCheckButton" id="details_checkbutton_12">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes"></property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <property name="active">False</property>
+				      <property name="inconsistent">False</property>
+				      <property name="draw_indicator">True</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">1</property>
+				      <property name="right_attach">2</property>
+				      <property name="top_attach">12</property>
+				      <property name="bottom_attach">13</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkEntry" id="details_entry_17">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="editable">True</property>
+				      <property name="visibility">True</property>
+				      <property name="max_length">0</property>
+				      <property name="text" translatable="yes"></property>
+				      <property name="has_frame">True</property>
+				      <property name="invisible_char">*</property>
+				      <property name="activates_default">False</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">1</property>
+				      <property name="right_attach">2</property>
+				      <property name="top_attach">11</property>
+				      <property name="bottom_attach">12</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkEntry" id="details_entry_15">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="editable">True</property>
+				      <property name="visibility">True</property>
+				      <property name="max_length">0</property>
+				      <property name="text" translatable="yes"></property>
+				      <property name="has_frame">True</property>
+				      <property name="invisible_char">*</property>
+				      <property name="activates_default">False</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">1</property>
+				      <property name="right_attach">2</property>
+				      <property name="top_attach">10</property>
+				      <property name="bottom_attach">11</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkEntry" id="details_entry_23">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="editable">True</property>
+				      <property name="visibility">True</property>
+				      <property name="max_length">0</property>
+				      <property name="text" translatable="yes"></property>
+				      <property name="has_frame">True</property>
+				      <property name="invisible_char">*</property>
+				      <property name="activates_default">False</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">1</property>
+				      <property name="right_attach">2</property>
+				      <property name="top_attach">9</property>
+				      <property name="bottom_attach">10</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkEntry" id="details_entry_7">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="editable">True</property>
+				      <property name="visibility">True</property>
+				      <property name="max_length">0</property>
+				      <property name="text" translatable="yes"></property>
+				      <property name="has_frame">True</property>
+				      <property name="invisible_char">*</property>
+				      <property name="activates_default">False</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">1</property>
+				      <property name="right_attach">2</property>
+				      <property name="top_attach">8</property>
+				      <property name="bottom_attach">9</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkEntry" id="details_entry_10">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="editable">False</property>
+				      <property name="visibility">True</property>
+				      <property name="max_length">0</property>
+				      <property name="text" translatable="yes"></property>
+				      <property name="has_frame">False</property>
+				      <property name="invisible_char">*</property>
+				      <property name="activates_default">False</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">3</property>
+				      <property name="right_attach">4</property>
+				      <property name="top_attach">8</property>
+				      <property name="bottom_attach">9</property>
+				      <property name="x_padding">1</property>
+				      <property name="y_padding">1</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkEntry" id="details_entry_24">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="editable">True</property>
+				      <property name="visibility">True</property>
+				      <property name="max_length">0</property>
+				      <property name="text" translatable="yes"></property>
+				      <property name="has_frame">True</property>
+				      <property name="invisible_char">*</property>
+				      <property name="activates_default">False</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">3</property>
+				      <property name="right_attach">4</property>
+				      <property name="top_attach">9</property>
+				      <property name="bottom_attach">10</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkEntry" id="details_entry_16">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="editable">True</property>
+				      <property name="visibility">True</property>
+				      <property name="max_length">0</property>
+				      <property name="text" translatable="yes"></property>
+				      <property name="has_frame">True</property>
+				      <property name="invisible_char">*</property>
+				      <property name="activates_default">False</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">3</property>
+				      <property name="right_attach">4</property>
+				      <property name="top_attach">10</property>
+				      <property name="bottom_attach">11</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="details_label_54">
+				      <property name="visible">True</property>
+				      <property name="label">label</property>
+				      <property name="use_underline">False</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">2</property>
+				      <property name="right_attach">3</property>
+				      <property name="top_attach">12</property>
+				      <property name="bottom_attach">13</property>
+				      <property name="x_options">fill</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkCheckButton" id="details_checkbutton_54">
+				      <property name="visible">True</property>
+				      <property name="sensitive">False</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes"></property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <property name="active">False</property>
+				      <property name="inconsistent">False</property>
+				      <property name="draw_indicator">True</property>
+				    </widget>
+				    <packing>
+				      <property name="left_attach">3</property>
+				      <property name="right_attach">4</property>
+				      <property name="top_attach">12</property>
+				      <property name="bottom_attach">13</property>
+				      <property name="y_options"></property>
+				    </packing>
+				  </child>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">True</property>
+				  <property name="fill">True</property>
+				</packing>
+			      </child>
+
+			      <child>
+				<placeholder/>
+			      </child>
+
+			      <child>
+				<placeholder/>
+			      </child>
+			    </widget>
+			  </child>
+			</widget>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="tab_expand">False</property>
+		      <property name="tab_fill">True</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkLabel" id="label346">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">_Misc.</property>
+		      <property name="use_underline">True</property>
+		      <property name="use_markup">False</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		      <property name="mnemonic_widget">scrolledwindow20</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
+		    </widget>
+		    <packing>
+		      <property name="type">tab</property>
+		    </packing>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">True</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+	    </widget>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">True</property>
+	  <property name="fill">True</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkHSeparator" id="hseparator55">
+	  <property name="visible">True</property>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">False</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkHBox" id="hbox187">
+	  <property name="visible">True</property>
+	  <property name="homogeneous">False</property>
+	  <property name="spacing">0</property>
+
+	  <child>
+	    <widget class="GtkHBox" id="hbox186">
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">0</property>
+
+	      <child>
+		<widget class="GtkButton" id="details_button_first">
+		  <property name="visible">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="relief">GTK_RELIEF_NORMAL</property>
+		  <property name="focus_on_click">True</property>
+
+		  <child>
+		    <widget class="GtkImage" id="image3068">
+		      <property name="visible">True</property>
+		      <property name="stock">gtk-goto-first</property>
+		      <property name="icon_size">4</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		    </widget>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkButton" id="details_button_previous">
+		  <property name="visible">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="relief">GTK_RELIEF_NORMAL</property>
+		  <property name="focus_on_click">True</property>
+
+		  <child>
+		    <widget class="GtkImage" id="image3069">
+		      <property name="visible">True</property>
+		      <property name="stock">gtk-go-back</property>
+		      <property name="icon_size">4</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		    </widget>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkLabel" id="details_label_index">
+		  <property name="visible">True</property>
+		  <property name="label">n/n</property>
+		  <property name="use_underline">False</property>
+		  <property name="use_markup">False</property>
+		  <property name="justify">GTK_JUSTIFY_LEFT</property>
+		  <property name="wrap">False</property>
+		  <property name="selectable">False</property>
+		  <property name="xalign">0.5</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xpad">5</property>
+		  <property name="ypad">4</property>
+		  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		  <property name="width_chars">-1</property>
+		  <property name="single_line_mode">False</property>
+		  <property name="angle">0</property>
+		</widget>
+		<packing>
+		  <property name="padding">5</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkButton" id="details_button_next">
+		  <property name="visible">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="relief">GTK_RELIEF_NORMAL</property>
+		  <property name="focus_on_click">True</property>
+
+		  <child>
+		    <widget class="GtkImage" id="image3070">
+		      <property name="visible">True</property>
+		      <property name="stock">gtk-go-forward</property>
+		      <property name="icon_size">4</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		    </widget>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkButton" id="details_button_last">
+		  <property name="visible">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="relief">GTK_RELIEF_NORMAL</property>
+		  <property name="focus_on_click">True</property>
+
+		  <child>
+		    <widget class="GtkImage" id="image3071">
+		      <property name="visible">True</property>
+		      <property name="stock">gtk-goto-last</property>
+		      <property name="icon_size">4</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		    </widget>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkHButtonBox" id="hbuttonbox13">
+	      <property name="visible">True</property>
+	      <property name="layout_style">GTK_BUTTONBOX_END</property>
+	      <property name="spacing">7</property>
+
+	      <child>
+		<widget class="GtkButton" id="details_button_apply">
+		  <property name="visible">True</property>
+		  <property name="can_default">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="label">gtk-apply</property>
+		  <property name="use_stock">True</property>
+		  <property name="relief">GTK_RELIEF_NORMAL</property>
+		  <property name="focus_on_click">True</property>
+		</widget>
+	      </child>
+
+	      <child>
+		<widget class="GtkButton" id="details_button_cancel">
+		  <property name="visible">True</property>
+		  <property name="can_default">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="label">gtk-cancel</property>
+		  <property name="use_stock">True</property>
+		  <property name="relief">GTK_RELIEF_NORMAL</property>
+		  <property name="focus_on_click">True</property>
+		</widget>
+	      </child>
+
+	      <child>
+		<widget class="GtkButton" id="details_button_ok">
+		  <property name="visible">True</property>
+		  <property name="can_default">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="label">gtk-ok</property>
+		  <property name="use_stock">True</property>
+		  <property name="relief">GTK_RELIEF_NORMAL</property>
+		  <property name="focus_on_click">True</property>
+		</widget>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
+	      <property name="pack_type">GTK_PACK_END</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkHButtonBox" id="hbuttonbox14">
+	      <property name="visible">True</property>
+	      <property name="layout_style">GTK_BUTTONBOX_END</property>
+	      <property name="spacing">7</property>
+
+	      <child>
+		<widget class="GtkButton" id="details_button_undo_all">
+		  <property name="visible">True</property>
+		  <property name="can_default">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="relief">GTK_RELIEF_NORMAL</property>
+		  <property name="focus_on_click">True</property>
+
+		  <child>
+		    <widget class="GtkAlignment" id="alignment9">
+		      <property name="visible">True</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xscale">0</property>
+		      <property name="yscale">0</property>
+		      <property name="top_padding">0</property>
+		      <property name="bottom_padding">0</property>
+		      <property name="left_padding">0</property>
+		      <property name="right_padding">0</property>
+
+		      <child>
+			<widget class="GtkHBox" id="hbox193">
+			  <property name="visible">True</property>
+			  <property name="homogeneous">False</property>
+			  <property name="spacing">2</property>
+
+			  <child>
+			    <widget class="GtkImage" id="image3076">
+			      <property name="visible">True</property>
+			      <property name="stock">gtk-undo</property>
+			      <property name="icon_size">4</property>
+			      <property name="xalign">0.5</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">False</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="label390">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">_Undo All</property>
+			      <property name="use_underline">True</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0.5</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">False</property>
+			    </packing>
+			  </child>
+			</widget>
+		      </child>
+		    </widget>
+		  </child>
+		</widget>
+	      </child>
+
+	      <child>
+		<widget class="GtkButton" id="details_button_undo_track">
+		  <property name="visible">True</property>
+		  <property name="can_default">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="relief">GTK_RELIEF_NORMAL</property>
+		  <property name="focus_on_click">True</property>
+
+		  <child>
+		    <widget class="GtkAlignment" id="alignment10">
+		      <property name="visible">True</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xscale">0</property>
+		      <property name="yscale">0</property>
+		      <property name="top_padding">0</property>
+		      <property name="bottom_padding">0</property>
+		      <property name="left_padding">0</property>
+		      <property name="right_padding">0</property>
+
+		      <child>
+			<widget class="GtkHBox" id="hbox194">
+			  <property name="visible">True</property>
+			  <property name="homogeneous">False</property>
+			  <property name="spacing">2</property>
+
+			  <child>
+			    <widget class="GtkImage" id="image3077">
+			      <property name="visible">True</property>
+			      <property name="stock">gtk-undo</property>
+			      <property name="icon_size">4</property>
+			      <property name="xalign">0.5</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">False</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="label391">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Undo _Track</property>
+			      <property name="use_underline">True</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0.5</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">False</property>
+			    </packing>
+			  </child>
+			</widget>
+		      </child>
+		    </widget>
+		  </child>
+		</widget>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">True</property>
+	      <property name="fill">False</property>
+	    </packing>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">False</property>
+	</packing>
+      </child>
+    </widget>
+  </child>
+</widget>
+
+<widget class="GtkWindow" id="repository_window">
+  <property name="visible">True</property>
+  <property name="title" translatable="yes">Repository Options</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_NONE</property>
+  <property name="modal">False</property>
+  <property name="resizable">True</property>
+  <property name="destroy_with_parent">False</property>
+  <property name="icon">gtkpod-icon-48.png</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
+  <property name="urgency_hint">False</property>
+
+  <child>
+    <widget class="GtkVBox" id="vbox159">
+      <property name="border_width">12</property>
+      <property name="visible">True</property>
+      <property name="homogeneous">False</property>
+      <property name="spacing">4</property>
+
+      <child>
+	<widget class="GtkScrolledWindow" id="scrolledwindow27">
+	  <property name="visible">True</property>
+	  <property name="can_focus">True</property>
+	  <property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
+	  <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+	  <property name="shadow_type">GTK_SHADOW_NONE</property>
+	  <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+	  <child>
+	    <widget class="GtkViewport" id="viewport19">
+	      <property name="visible">True</property>
+	      <property name="shadow_type">GTK_SHADOW_NONE</property>
+
+	      <child>
+		<widget class="GtkVBox" id="vbox168">
+		  <property name="visible">True</property>
+		  <property name="homogeneous">False</property>
+		  <property name="spacing">10</property>
+
+		  <child>
+		    <widget class="GtkFrame" id="frame1">
+		      <property name="visible">True</property>
+		      <property name="label_xalign">0</property>
+		      <property name="label_yalign">0.5</property>
+		      <property name="shadow_type">GTK_SHADOW_IN</property>
+
+		      <child>
+			<widget class="GtkAlignment" id="alignment11">
+			  <property name="visible">True</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xscale">1</property>
+			  <property name="yscale">1</property>
+			  <property name="top_padding">0</property>
+			  <property name="bottom_padding">0</property>
+			  <property name="left_padding">0</property>
+			  <property name="right_padding">0</property>
+
+			  <child>
+			    <widget class="GtkViewport" id="viewport21">
+			      <property name="visible">True</property>
+			      <property name="shadow_type">GTK_SHADOW_NONE</property>
+
+			      <child>
+				<widget class="GtkVBox" id="vbox160">
+				  <property name="border_width">6</property>
+				  <property name="visible">True</property>
+				  <property name="homogeneous">False</property>
+				  <property name="spacing">4</property>
+
+				  <child>
+				    <widget class="GtkHBox" id="hbox198">
+				      <property name="visible">True</property>
+				      <property name="homogeneous">False</property>
+				      <property name="spacing">6</property>
+
+				      <child>
+					<widget class="GtkComboBox" id="repository_combo">
+					  <property name="visible">True</property>
+					  <property name="add_tearoffs">False</property>
+					  <property name="focus_on_click">True</property>
+					</widget>
+					<packing>
+					  <property name="padding">0</property>
+					  <property name="expand">False</property>
+					  <property name="fill">True</property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkLabel" id="repository_type_label">
+					  <property name="visible">True</property>
+					  <property name="label">&lt;i&gt;Repository type&lt;/i&gt;</property>
+					  <property name="use_underline">False</property>
+					  <property name="use_markup">True</property>
+					  <property name="justify">GTK_JUSTIFY_LEFT</property>
+					  <property name="wrap">False</property>
+					  <property name="selectable">False</property>
+					  <property name="xalign">0.5</property>
+					  <property name="yalign">0.5</property>
+					  <property name="xpad">0</property>
+					  <property name="ypad">0</property>
+					  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+					  <property name="width_chars">-1</property>
+					  <property name="single_line_mode">False</property>
+					  <property name="angle">0</property>
+					</widget>
+					<packing>
+					  <property name="padding">6</property>
+					  <property name="expand">False</property>
+					  <property name="fill">False</property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkButton" id="new_repository_button">
+					  <property name="visible">True</property>
+					  <property name="can_focus">True</property>
+					  <property name="label" translatable="yes">Add new repository/iPod</property>
+					  <property name="use_underline">True</property>
+					  <property name="relief">GTK_RELIEF_NORMAL</property>
+					  <property name="focus_on_click">True</property>
+					</widget>
+					<packing>
+					  <property name="padding">0</property>
+					  <property name="expand">False</property>
+					  <property name="fill">False</property>
+					  <property name="pack_type">GTK_PACK_END</property>
+					</packing>
+				      </child>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkHBox" id="hbox197">
+				      <property name="visible">True</property>
+				      <property name="homogeneous">False</property>
+				      <property name="spacing">8</property>
+
+				      <child>
+					<widget class="GtkLabel" id="label408">
+					  <property name="visible">True</property>
+					  <property name="label">    </property>
+					  <property name="use_underline">False</property>
+					  <property name="use_markup">False</property>
+					  <property name="justify">GTK_JUSTIFY_LEFT</property>
+					  <property name="wrap">False</property>
+					  <property name="selectable">False</property>
+					  <property name="xalign">0.5</property>
+					  <property name="yalign">0.5</property>
+					  <property name="xpad">0</property>
+					  <property name="ypad">0</property>
+					  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+					  <property name="width_chars">-1</property>
+					  <property name="single_line_mode">False</property>
+					  <property name="angle">0</property>
+					</widget>
+					<packing>
+					  <property name="padding">0</property>
+					  <property name="expand">False</property>
+					  <property name="fill">False</property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkVBox" id="repository_vbox">
+					  <property name="visible">True</property>
+					  <property name="homogeneous">False</property>
+					  <property name="spacing">4</property>
+
+					  <child>
+					    <widget class="GtkTable" id="path_table_ipod">
+					      <property name="visible">True</property>
+					      <property name="n_rows">10</property>
+					      <property name="n_columns">3</property>
+					      <property name="homogeneous">False</property>
+					      <property name="row_spacing">0</property>
+					      <property name="column_spacing">0</property>
+
+					      <child>
+						<widget class="GtkLabel" id="mountpoint_label">
+						  <property name="visible">True</property>
+						  <property name="label" translatable="yes">iPod mountpoint:</property>
+						  <property name="use_underline">False</property>
+						  <property name="use_markup">False</property>
+						  <property name="justify">GTK_JUSTIFY_LEFT</property>
+						  <property name="wrap">False</property>
+						  <property name="selectable">False</property>
+						  <property name="xalign">0</property>
+						  <property name="yalign">0.5</property>
+						  <property name="xpad">10</property>
+						  <property name="ypad">0</property>
+						  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+						  <property name="width_chars">-1</property>
+						  <property name="single_line_mode">False</property>
+						  <property name="angle">0</property>
+						</widget>
+						<packing>
+						  <property name="left_attach">0</property>
+						  <property name="right_attach">1</property>
+						  <property name="top_attach">0</property>
+						  <property name="bottom_attach">1</property>
+						  <property name="x_options">fill</property>
+						  <property name="y_options">fill</property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkLabel" id="backup_label">
+						  <property name="visible">True</property>
+						  <property name="label" translatable="yes">iTunesDB backup:</property>
+						  <property name="use_underline">False</property>
+						  <property name="use_markup">False</property>
+						  <property name="justify">GTK_JUSTIFY_LEFT</property>
+						  <property name="wrap">False</property>
+						  <property name="selectable">False</property>
+						  <property name="xalign">0</property>
+						  <property name="yalign">0.5</property>
+						  <property name="xpad">10</property>
+						  <property name="ypad">0</property>
+						  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+						  <property name="width_chars">-1</property>
+						  <property name="single_line_mode">False</property>
+						  <property name="angle">0</property>
+						</widget>
+						<packing>
+						  <property name="left_attach">0</property>
+						  <property name="right_attach">1</property>
+						  <property name="top_attach">1</property>
+						  <property name="bottom_attach">2</property>
+						  <property name="x_options">fill</property>
+						  <property name="y_options">fill</property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkLabel" id="ipod_model_label">
+						  <property name="visible">True</property>
+						  <property name="label" translatable="yes">Model:</property>
+						  <property name="use_underline">False</property>
+						  <property name="use_markup">False</property>
+						  <property name="justify">GTK_JUSTIFY_LEFT</property>
+						  <property name="wrap">False</property>
+						  <property name="selectable">False</property>
+						  <property name="xalign">0</property>
+						  <property name="yalign">0.5</property>
+						  <property name="xpad">10</property>
+						  <property name="ypad">0</property>
+						  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+						  <property name="width_chars">-1</property>
+						  <property name="single_line_mode">False</property>
+						  <property name="angle">0</property>
+						</widget>
+						<packing>
+						  <property name="left_attach">0</property>
+						  <property name="right_attach">1</property>
+						  <property name="top_attach">2</property>
+						  <property name="bottom_attach">3</property>
+						  <property name="x_options">fill</property>
+						  <property name="y_options">fill</property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkLabel" id="local_path_label">
+						  <property name="visible">True</property>
+						  <property name="label" translatable="yes">Path:</property>
+						  <property name="use_underline">False</property>
+						  <property name="use_markup">False</property>
+						  <property name="justify">GTK_JUSTIFY_LEFT</property>
+						  <property name="wrap">False</property>
+						  <property name="selectable">False</property>
+						  <property name="xalign">0</property>
+						  <property name="yalign">0.5</property>
+						  <property name="xpad">10</property>
+						  <property name="ypad">0</property>
+						  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+						  <property name="width_chars">-1</property>
+						  <property name="single_line_mode">False</property>
+						  <property name="angle">0</property>
+						</widget>
+						<packing>
+						  <property name="left_attach">0</property>
+						  <property name="right_attach">1</property>
+						  <property name="top_attach">3</property>
+						  <property name="bottom_attach">4</property>
+						  <property name="x_options">fill</property>
+						  <property name="y_options">fill</property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkLabel" id="ipod_sync_label">
+						  <property name="visible">True</property>
+						  <property name="label" translatable="yes">&lt;b&gt;Synchronization&lt;/b&gt;</property>
+						  <property name="use_underline">False</property>
+						  <property name="use_markup">True</property>
+						  <property name="justify">GTK_JUSTIFY_LEFT</property>
+						  <property name="wrap">False</property>
+						  <property name="selectable">False</property>
+						  <property name="xalign">0</property>
+						  <property name="yalign">1</property>
+						  <property name="xpad">0</property>
+						  <property name="ypad">0</property>
+						  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+						  <property name="width_chars">-1</property>
+						  <property name="single_line_mode">False</property>
+						  <property name="angle">0</property>
+						</widget>
+						<packing>
+						  <property name="left_attach">0</property>
+						  <property name="right_attach">1</property>
+						  <property name="top_attach">4</property>
+						  <property name="bottom_attach">5</property>
+						  <property name="y_padding">4</property>
+						  <property name="x_options">fill</property>
+						  <property name="y_options">fill</property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkLabel" id="spacer_label1">
+						  <property name="visible">True</property>
+						  <property name="label"></property>
+						  <property name="use_underline">False</property>
+						  <property name="use_markup">False</property>
+						  <property name="justify">GTK_JUSTIFY_LEFT</property>
+						  <property name="wrap">False</property>
+						  <property name="selectable">False</property>
+						  <property name="xalign">0</property>
+						  <property name="yalign">0.5</property>
+						  <property name="xpad">0</property>
+						  <property name="ypad">0</property>
+						  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+						  <property name="width_chars">-1</property>
+						  <property name="single_line_mode">False</property>
+						  <property name="angle">0</property>
+						</widget>
+						<packing>
+						  <property name="left_attach">1</property>
+						  <property name="right_attach">2</property>
+						  <property name="top_attach">4</property>
+						  <property name="bottom_attach">5</property>
+						  <property name="y_padding">6</property>
+						  <property name="x_options">fill</property>
+						  <property name="y_options">fill</property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkLabel" id="ipod_sync_contacts_label">
+						  <property name="visible">True</property>
+						  <property name="label" translatable="yes">Contacts sync command:</property>
+						  <property name="use_underline">False</property>
+						  <property name="use_markup">False</property>
+						  <property name="justify">GTK_JUSTIFY_LEFT</property>
+						  <property name="wrap">False</property>
+						  <property name="selectable">False</property>
+						  <property name="xalign">0</property>
+						  <property name="yalign">0.5</property>
+						  <property name="xpad">10</property>
+						  <property name="ypad">0</property>
+						  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+						  <property name="width_chars">-1</property>
+						  <property name="single_line_mode">False</property>
+						  <property name="angle">0</property>
+						</widget>
+						<packing>
+						  <property name="left_attach">0</property>
+						  <property name="right_attach">1</property>
+						  <property name="top_attach">5</property>
+						  <property name="bottom_attach">6</property>
+						  <property name="x_options">fill</property>
+						  <property name="y_options">fill</property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkLabel" id="ipod_sync_calendar_label">
+						  <property name="visible">True</property>
+						  <property name="label" translatable="yes">Calendar sync command:</property>
+						  <property name="use_underline">False</property>
+						  <property name="use_markup">False</property>
+						  <property name="justify">GTK_JUSTIFY_LEFT</property>
+						  <property name="wrap">False</property>
+						  <property name="selectable">False</property>
+						  <property name="xalign">0</property>
+						  <property name="yalign">0.5</property>
+						  <property name="xpad">10</property>
+						  <property name="ypad">0</property>
+						  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+						  <property name="width_chars">-1</property>
+						  <property name="single_line_mode">False</property>
+						  <property name="angle">0</property>
+						</widget>
+						<packing>
+						  <property name="left_attach">0</property>
+						  <property name="right_attach">1</property>
+						  <property name="top_attach">6</property>
+						  <property name="bottom_attach">7</property>
+						  <property name="x_options">fill</property>
+						  <property name="y_options">fill</property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkLabel" id="ipod_sync_notes_label">
+						  <property name="visible">True</property>
+						  <property name="label" translatable="yes">Notes sync command:</property>
+						  <property name="use_underline">False</property>
+						  <property name="use_markup">False</property>
+						  <property name="justify">GTK_JUSTIFY_LEFT</property>
+						  <property name="wrap">False</property>
+						  <property name="selectable">False</property>
+						  <property name="xalign">0</property>
+						  <property name="yalign">0.5</property>
+						  <property name="xpad">10</property>
+						  <property name="ypad">0</property>
+						  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+						  <property name="width_chars">-1</property>
+						  <property name="single_line_mode">False</property>
+						  <property name="angle">0</property>
+						</widget>
+						<packing>
+						  <property name="left_attach">0</property>
+						  <property name="right_attach">1</property>
+						  <property name="top_attach">7</property>
+						  <property name="bottom_attach">8</property>
+						  <property name="x_options">fill</property>
+						  <property name="y_options">fill</property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkCheckButton" id="ipod_concal_autosync_toggle">
+						  <property name="visible">True</property>
+						  <property name="can_focus">True</property>
+						  <property name="label" translatable="yes">Call automatically when synchronizing iTunesDB</property>
+						  <property name="use_underline">True</property>
+						  <property name="relief">GTK_RELIEF_NORMAL</property>
+						  <property name="focus_on_click">True</property>
+						  <property name="active">False</property>
+						  <property name="inconsistent">False</property>
+						  <property name="draw_indicator">True</property>
+						  <signal name="toggled" handler="on_concal_autosync_toggled" last_modification_time="Thu, 28 Apr 2005 18:12:10 GMT"/>
+						</widget>
+						<packing>
+						  <property name="left_attach">0</property>
+						  <property name="right_attach">3</property>
+						  <property name="top_attach">8</property>
+						  <property name="bottom_attach">9</property>
+						  <property name="x_padding">10</property>
+						  <property name="x_options">fill</property>
+						  <property name="y_options"></property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkEntry" id="mountpoint_entry">
+						  <property name="visible">True</property>
+						  <property name="tooltip" translatable="yes">Specify exact path including command line options. '%i' will be replaced with the mount point of the iPod.</property>
+						  <property name="can_focus">True</property>
+						  <property name="editable">True</property>
+						  <property name="visibility">True</property>
+						  <property name="max_length">0</property>
+						  <property name="text" translatable="yes"></property>
+						  <property name="has_frame">True</property>
+						  <property name="invisible_char">*</property>
+						  <property name="activates_default">False</property>
+						</widget>
+						<packing>
+						  <property name="left_attach">1</property>
+						  <property name="right_attach">2</property>
+						  <property name="top_attach">0</property>
+						  <property name="bottom_attach">1</property>
+						  <property name="x_padding">3</property>
+						  <property name="y_padding">3</property>
+						  <property name="y_options"></property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkEntry" id="backup_entry">
+						  <property name="visible">True</property>
+						  <property name="tooltip" translatable="yes">Specify exact path including command line options. '%i' will be replaced with the mount point of the iPod.</property>
+						  <property name="can_focus">True</property>
+						  <property name="editable">True</property>
+						  <property name="visibility">True</property>
+						  <property name="max_length">0</property>
+						  <property name="text" translatable="yes"></property>
+						  <property name="has_frame">True</property>
+						  <property name="invisible_char">*</property>
+						  <property name="activates_default">False</property>
+						</widget>
+						<packing>
+						  <property name="left_attach">1</property>
+						  <property name="right_attach">2</property>
+						  <property name="top_attach">1</property>
+						  <property name="bottom_attach">2</property>
+						  <property name="x_padding">3</property>
+						  <property name="y_padding">3</property>
+						  <property name="y_options"></property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkEntry" id="local_path_entry">
+						  <property name="visible">True</property>
+						  <property name="tooltip" translatable="yes">Specify exact path including command line options. '%i' will be replaced with the mount point of the iPod.</property>
+						  <property name="can_focus">True</property>
+						  <property name="editable">False</property>
+						  <property name="visibility">True</property>
+						  <property name="max_length">0</property>
+						  <property name="text" translatable="yes"></property>
+						  <property name="has_frame">True</property>
+						  <property name="invisible_char">*</property>
+						  <property name="activates_default">False</property>
+						</widget>
+						<packing>
+						  <property name="left_attach">1</property>
+						  <property name="right_attach">2</property>
+						  <property name="top_attach">3</property>
+						  <property name="bottom_attach">4</property>
+						  <property name="x_padding">3</property>
+						  <property name="y_padding">3</property>
+						  <property name="y_options"></property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkEntry" id="ipod_sync_contacts_entry">
+						  <property name="visible">True</property>
+						  <property name="tooltip" translatable="yes">Specify exact path including command line options. '%i' will be replaced with the mount point of the iPod.</property>
+						  <property name="can_focus">True</property>
+						  <property name="editable">True</property>
+						  <property name="visibility">True</property>
+						  <property name="max_length">0</property>
+						  <property name="text" translatable="yes"></property>
+						  <property name="has_frame">True</property>
+						  <property name="invisible_char">*</property>
+						  <property name="activates_default">False</property>
+						</widget>
+						<packing>
+						  <property name="left_attach">1</property>
+						  <property name="right_attach">2</property>
+						  <property name="top_attach">5</property>
+						  <property name="bottom_attach">6</property>
+						  <property name="x_padding">3</property>
+						  <property name="y_padding">3</property>
+						  <property name="y_options"></property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkEntry" id="ipod_sync_calendar_entry">
+						  <property name="visible">True</property>
+						  <property name="tooltip" translatable="yes">Specify exact path including command line options. '%i' will be replaced with the mount point of the iPod.</property>
+						  <property name="can_focus">True</property>
+						  <property name="editable">True</property>
+						  <property name="visibility">True</property>
+						  <property name="max_length">0</property>
+						  <property name="text" translatable="yes"></property>
+						  <property name="has_frame">True</property>
+						  <property name="invisible_char">*</property>
+						  <property name="activates_default">False</property>
+						</widget>
+						<packing>
+						  <property name="left_attach">1</property>
+						  <property name="right_attach">2</property>
+						  <property name="top_attach">6</property>
+						  <property name="bottom_attach">7</property>
+						  <property name="x_padding">3</property>
+						  <property name="y_padding">3</property>
+						  <property name="y_options"></property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkEntry" id="ipod_sync_notes_entry">
+						  <property name="visible">True</property>
+						  <property name="tooltip" translatable="yes">Specify exact path including command line options. '%i' will be replaced with the mount point of the iPod.</property>
+						  <property name="can_focus">True</property>
+						  <property name="editable">True</property>
+						  <property name="visibility">True</property>
+						  <property name="max_length">0</property>
+						  <property name="text" translatable="yes"></property>
+						  <property name="has_frame">True</property>
+						  <property name="invisible_char">*</property>
+						  <property name="activates_default">False</property>
+						</widget>
+						<packing>
+						  <property name="left_attach">1</property>
+						  <property name="right_attach">2</property>
+						  <property name="top_attach">7</property>
+						  <property name="bottom_attach">8</property>
+						  <property name="x_padding">3</property>
+						  <property name="y_padding">3</property>
+						  <property name="y_options"></property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkButton" id="mountpoint_button">
+						  <property name="visible">True</property>
+						  <property name="can_focus">True</property>
+						  <property name="label" translatable="yes">Browse</property>
+						  <property name="use_underline">True</property>
+						  <property name="relief">GTK_RELIEF_NORMAL</property>
+						  <property name="focus_on_click">True</property>
+						</widget>
+						<packing>
+						  <property name="left_attach">2</property>
+						  <property name="right_attach">3</property>
+						  <property name="top_attach">0</property>
+						  <property name="bottom_attach">1</property>
+						  <property name="x_padding">3</property>
+						  <property name="x_options">fill</property>
+						  <property name="y_options"></property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkButton" id="ipod_sync_contacts_button">
+						  <property name="visible">True</property>
+						  <property name="can_focus">True</property>
+						  <property name="label" translatable="yes">Browse</property>
+						  <property name="use_underline">True</property>
+						  <property name="relief">GTK_RELIEF_NORMAL</property>
+						  <property name="focus_on_click">True</property>
+						</widget>
+						<packing>
+						  <property name="left_attach">2</property>
+						  <property name="right_attach">3</property>
+						  <property name="top_attach">5</property>
+						  <property name="bottom_attach">6</property>
+						  <property name="x_padding">3</property>
+						  <property name="x_options">fill</property>
+						  <property name="y_options"></property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkButton" id="ipod_sync_calendar_button">
+						  <property name="visible">True</property>
+						  <property name="can_focus">True</property>
+						  <property name="label" translatable="yes">Browse</property>
+						  <property name="use_underline">True</property>
+						  <property name="relief">GTK_RELIEF_NORMAL</property>
+						  <property name="focus_on_click">True</property>
+						</widget>
+						<packing>
+						  <property name="left_attach">2</property>
+						  <property name="right_attach">3</property>
+						  <property name="top_attach">6</property>
+						  <property name="bottom_attach">7</property>
+						  <property name="x_padding">3</property>
+						  <property name="x_options">fill</property>
+						  <property name="y_options"></property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkButton" id="ipod_sync_notes_button">
+						  <property name="visible">True</property>
+						  <property name="can_focus">True</property>
+						  <property name="label" translatable="yes">Browse</property>
+						  <property name="use_underline">True</property>
+						  <property name="relief">GTK_RELIEF_NORMAL</property>
+						  <property name="focus_on_click">True</property>
+						</widget>
+						<packing>
+						  <property name="left_attach">2</property>
+						  <property name="right_attach">3</property>
+						  <property name="top_attach">7</property>
+						  <property name="bottom_attach">8</property>
+						  <property name="x_padding">3</property>
+						  <property name="x_options">fill</property>
+						  <property name="y_options"></property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkButton" id="backup_button">
+						  <property name="visible">True</property>
+						  <property name="can_focus">True</property>
+						  <property name="label" translatable="yes">Browse</property>
+						  <property name="use_underline">True</property>
+						  <property name="relief">GTK_RELIEF_NORMAL</property>
+						  <property name="focus_on_click">True</property>
+						</widget>
+						<packing>
+						  <property name="left_attach">2</property>
+						  <property name="right_attach">3</property>
+						  <property name="top_attach">1</property>
+						  <property name="bottom_attach">2</property>
+						  <property name="x_padding">3</property>
+						  <property name="x_options">fill</property>
+						  <property name="y_options"></property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkComboBoxEntry" id="ipod_model_combo">
+						  <property name="visible">True</property>
+						  <property name="add_tearoffs">False</property>
+						  <property name="has_frame">True</property>
+						  <property name="focus_on_click">True</property>
+						</widget>
+						<packing>
+						  <property name="left_attach">1</property>
+						  <property name="right_attach">2</property>
+						  <property name="top_attach">2</property>
+						  <property name="bottom_attach">3</property>
+						  <property name="x_padding">3</property>
+						  <property name="y_padding">3</property>
+						  <property name="x_options">fill</property>
+						  <property name="y_options">fill</property>
+						</packing>
+					      </child>
+					    </widget>
+					    <packing>
+					      <property name="padding">6</property>
+					      <property name="expand">False</property>
+					      <property name="fill">False</property>
+					    </packing>
+					  </child>
+
+					  <child>
+					    <widget class="GtkTable" id="table45">
+					      <property name="visible">True</property>
+					      <property name="n_rows">2</property>
+					      <property name="n_columns">2</property>
+					      <property name="homogeneous">False</property>
+					      <property name="row_spacing">0</property>
+					      <property name="column_spacing">12</property>
+
+					      <child>
+						<widget class="GtkButton" id="update_all_playlists_button">
+						  <property name="visible">True</property>
+						  <property name="can_focus">True</property>
+						  <property name="label" translatable="yes">Update/Sync all playlists now</property>
+						  <property name="use_underline">True</property>
+						  <property name="relief">GTK_RELIEF_NORMAL</property>
+						  <property name="focus_on_click">True</property>
+						</widget>
+						<packing>
+						  <property name="left_attach">0</property>
+						  <property name="right_attach">1</property>
+						  <property name="top_attach">0</property>
+						  <property name="bottom_attach">1</property>
+						  <property name="y_padding">3</property>
+						  <property name="x_options">fill</property>
+						  <property name="y_options"></property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkButton" id="delete_repository_button">
+						  <property name="visible">True</property>
+						  <property name="can_focus">True</property>
+						  <property name="label" translatable="yes">Delete repository</property>
+						  <property name="use_underline">True</property>
+						  <property name="relief">GTK_RELIEF_NORMAL</property>
+						  <property name="focus_on_click">True</property>
+						</widget>
+						<packing>
+						  <property name="left_attach">0</property>
+						  <property name="right_attach">1</property>
+						  <property name="top_attach">1</property>
+						  <property name="bottom_attach">2</property>
+						  <property name="y_padding">3</property>
+						  <property name="x_options">fill</property>
+						  <property name="y_options"></property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkCheckButton" id="delete_repository_checkbutton">
+						  <property name="visible">True</property>
+						  <property name="can_focus">True</property>
+						  <property name="label" translatable="yes">I'm sure</property>
+						  <property name="use_underline">True</property>
+						  <property name="relief">GTK_RELIEF_NORMAL</property>
+						  <property name="focus_on_click">True</property>
+						  <property name="active">False</property>
+						  <property name="inconsistent">False</property>
+						  <property name="draw_indicator">True</property>
+						</widget>
+						<packing>
+						  <property name="left_attach">1</property>
+						  <property name="right_attach">2</property>
+						  <property name="top_attach">1</property>
+						  <property name="bottom_attach">2</property>
+						  <property name="x_options">fill</property>
+						  <property name="y_options"></property>
+						</packing>
+					      </child>
+					    </widget>
+					    <packing>
+					      <property name="padding">6</property>
+					      <property name="expand">False</property>
+					      <property name="fill">False</property>
+					    </packing>
+					  </child>
+
+					  <child>
+					    <placeholder/>
+					  </child>
+					</widget>
+					<packing>
+					  <property name="padding">0</property>
+					  <property name="expand">True</property>
+					  <property name="fill">True</property>
+					</packing>
+				      </child>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">True</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <placeholder/>
+				  </child>
+				</widget>
+			      </child>
+			    </widget>
+			  </child>
+			</widget>
+		      </child>
+
+		      <child>
+			<widget class="GtkLabel" id="label423">
+			  <property name="visible">True</property>
+			  <property name="label" translatable="yes">&lt;b&gt;Repositories&lt;/b&gt;</property>
+			  <property name="use_underline">False</property>
+			  <property name="use_markup">True</property>
+			  <property name="justify">GTK_JUSTIFY_LEFT</property>
+			  <property name="wrap">False</property>
+			  <property name="selectable">False</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			  <property name="width_chars">-1</property>
+			  <property name="single_line_mode">False</property>
+			  <property name="angle">0</property>
+			</widget>
+			<packing>
+			  <property name="type">label_item</property>
+			</packing>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">True</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkHBox" id="hbox203">
+		      <property name="visible">True</property>
+		      <property name="homogeneous">False</property>
+		      <property name="spacing">8</property>
+
+		      <child>
+			<widget class="GtkLabel" id="label421">
+			  <property name="visible">True</property>
+			  <property name="label">    </property>
+			  <property name="use_underline">False</property>
+			  <property name="use_markup">False</property>
+			  <property name="justify">GTK_JUSTIFY_LEFT</property>
+			  <property name="wrap">False</property>
+			  <property name="selectable">False</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			  <property name="width_chars">-1</property>
+			  <property name="single_line_mode">False</property>
+			  <property name="angle">0</property>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">False</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkVBox" id="vbox169">
+			  <property name="visible">True</property>
+			  <property name="homogeneous">False</property>
+			  <property name="spacing">0</property>
+
+			  <child>
+			    <widget class="GtkFrame" id="playlist_frame">
+			      <property name="visible">True</property>
+			      <property name="label_xalign">0</property>
+			      <property name="label_yalign">0.5</property>
+			      <property name="shadow_type">GTK_SHADOW_IN</property>
+
+			      <child>
+				<widget class="GtkAlignment" id="alignment12">
+				  <property name="visible">True</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xscale">1</property>
+				  <property name="yscale">1</property>
+				  <property name="top_padding">0</property>
+				  <property name="bottom_padding">0</property>
+				  <property name="left_padding">0</property>
+				  <property name="right_padding">0</property>
+
+				  <child>
+				    <widget class="GtkViewport" id="viewport20">
+				      <property name="visible">True</property>
+				      <property name="shadow_type">GTK_SHADOW_NONE</property>
+
+				      <child>
+					<widget class="GtkVBox" id="vbox162">
+					  <property name="border_width">6</property>
+					  <property name="visible">True</property>
+					  <property name="homogeneous">False</property>
+					  <property name="spacing">4</property>
+
+					  <child>
+					    <widget class="GtkHBox" id="hbox199">
+					      <property name="visible">True</property>
+					      <property name="homogeneous">False</property>
+					      <property name="spacing">6</property>
+
+					      <child>
+						<widget class="GtkComboBox" id="playlist_combo">
+						  <property name="visible">True</property>
+						  <property name="add_tearoffs">False</property>
+						  <property name="focus_on_click">True</property>
+						</widget>
+						<packing>
+						  <property name="padding">0</property>
+						  <property name="expand">False</property>
+						  <property name="fill">True</property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkLabel" id="playlist_type_label">
+						  <property name="visible">True</property>
+						  <property name="label">&lt;i&gt;Playlist type&lt;/i&gt;</property>
+						  <property name="use_underline">False</property>
+						  <property name="use_markup">True</property>
+						  <property name="justify">GTK_JUSTIFY_LEFT</property>
+						  <property name="wrap">False</property>
+						  <property name="selectable">False</property>
+						  <property name="xalign">0.5</property>
+						  <property name="yalign">0.5</property>
+						  <property name="xpad">0</property>
+						  <property name="ypad">0</property>
+						  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+						  <property name="width_chars">-1</property>
+						  <property name="single_line_mode">False</property>
+						  <property name="angle">0</property>
+						</widget>
+						<packing>
+						  <property name="padding">6</property>
+						  <property name="expand">False</property>
+						  <property name="fill">False</property>
+						</packing>
+					      </child>
+
+					      <child>
+						<placeholder/>
+					      </child>
+					    </widget>
+					    <packing>
+					      <property name="padding">3</property>
+					      <property name="expand">False</property>
+					      <property name="fill">False</property>
+					    </packing>
+					  </child>
+
+					  <child>
+					    <widget class="GtkHBox" id="hbox200">
+					      <property name="border_width">4</property>
+					      <property name="visible">True</property>
+					      <property name="homogeneous">False</property>
+					      <property name="spacing">8</property>
+
+					      <child>
+						<widget class="GtkLabel" id="label416">
+						  <property name="visible">True</property>
+						  <property name="label">    </property>
+						  <property name="use_underline">False</property>
+						  <property name="use_markup">False</property>
+						  <property name="justify">GTK_JUSTIFY_LEFT</property>
+						  <property name="wrap">False</property>
+						  <property name="selectable">False</property>
+						  <property name="xalign">0.5</property>
+						  <property name="yalign">0.5</property>
+						  <property name="xpad">0</property>
+						  <property name="ypad">0</property>
+						  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+						  <property name="width_chars">-1</property>
+						  <property name="single_line_mode">False</property>
+						  <property name="angle">0</property>
+						</widget>
+						<packing>
+						  <property name="padding">0</property>
+						  <property name="expand">False</property>
+						  <property name="fill">False</property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkVBox" id="vbox164">
+						  <property name="visible">True</property>
+						  <property name="homogeneous">False</property>
+						  <property name="spacing">8</property>
+
+						  <child>
+						    <widget class="GtkVBox" id="standard_playlist_vbox">
+						      <property name="visible">True</property>
+						      <property name="homogeneous">False</property>
+						      <property name="spacing">8</property>
+
+						      <child>
+							<widget class="GtkRadioButton" id="sync_playlist_mode_automatic_radio">
+							  <property name="visible">True</property>
+							  <property name="tooltip" translatable="yes">Directories to sync with are determined from the filenames of the tracks in the playlist.</property>
+							  <property name="can_focus">True</property>
+							  <property name="label" translatable="yes">On startup automatically sync with playlist directories</property>
+							  <property name="use_underline">True</property>
+							  <property name="relief">GTK_RELIEF_NORMAL</property>
+							  <property name="focus_on_click">True</property>
+							  <property name="active">False</property>
+							  <property name="inconsistent">False</property>
+							  <property name="draw_indicator">True</property>
+							</widget>
+							<packing>
+							  <property name="padding">0</property>
+							  <property name="expand">False</property>
+							  <property name="fill">False</property>
+							</packing>
+						      </child>
+
+						      <child>
+							<widget class="GtkRadioButton" id="sync_playlist_mode_manual_radio">
+							  <property name="visible">True</property>
+							  <property name="can_focus">True</property>
+							  <property name="label" translatable="yes">On startup automatically sync with the following directory</property>
+							  <property name="use_underline">True</property>
+							  <property name="relief">GTK_RELIEF_NORMAL</property>
+							  <property name="focus_on_click">True</property>
+							  <property name="active">False</property>
+							  <property name="inconsistent">False</property>
+							  <property name="draw_indicator">True</property>
+							  <property name="group">sync_playlist_mode_automatic_radio</property>
+							</widget>
+							<packing>
+							  <property name="padding">0</property>
+							  <property name="expand">False</property>
+							  <property name="fill">False</property>
+							</packing>
+						      </child>
+
+						      <child>
+							<widget class="GtkHBox" id="hbox201">
+							  <property name="visible">True</property>
+							  <property name="homogeneous">False</property>
+							  <property name="spacing">0</property>
+
+							  <child>
+							    <widget class="GtkLabel" id="label417">
+							      <property name="visible">True</property>
+							      <property name="label">   </property>
+							      <property name="use_underline">False</property>
+							      <property name="use_markup">False</property>
+							      <property name="justify">GTK_JUSTIFY_LEFT</property>
+							      <property name="wrap">False</property>
+							      <property name="selectable">False</property>
+							      <property name="xalign">0.5</property>
+							      <property name="yalign">0.5</property>
+							      <property name="xpad">0</property>
+							      <property name="ypad">0</property>
+							      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+							      <property name="width_chars">-1</property>
+							      <property name="single_line_mode">False</property>
+							      <property name="angle">0</property>
+							    </widget>
+							    <packing>
+							      <property name="padding">1</property>
+							      <property name="expand">False</property>
+							      <property name="fill">False</property>
+							    </packing>
+							  </child>
+
+							  <child>
+							    <widget class="GtkEntry" id="manual_syncdir_entry">
+							      <property name="visible">True</property>
+							      <property name="tooltip" translatable="yes">Specify exact path including command line options. '%i' will be replaced with the mount point of the iPod.</property>
+							      <property name="can_focus">True</property>
+							      <property name="editable">True</property>
+							      <property name="visibility">True</property>
+							      <property name="max_length">0</property>
+							      <property name="text" translatable="yes"></property>
+							      <property name="has_frame">True</property>
+							      <property name="invisible_char">*</property>
+							      <property name="activates_default">False</property>
+							    </widget>
+							    <packing>
+							      <property name="padding">3</property>
+							      <property name="expand">True</property>
+							      <property name="fill">True</property>
+							    </packing>
+							  </child>
+
+							  <child>
+							    <widget class="GtkButton" id="manual_syncdir_button">
+							      <property name="visible">True</property>
+							      <property name="can_focus">True</property>
+							      <property name="label" translatable="yes">Browse</property>
+							      <property name="use_underline">True</property>
+							      <property name="relief">GTK_RELIEF_NORMAL</property>
+							      <property name="focus_on_click">True</property>
+							    </widget>
+							    <packing>
+							      <property name="padding">3</property>
+							      <property name="expand">False</property>
+							      <property name="fill">False</property>
+							    </packing>
+							  </child>
+							</widget>
+							<packing>
+							  <property name="padding">2</property>
+							  <property name="expand">False</property>
+							  <property name="fill">False</property>
+							</packing>
+						      </child>
+
+						      <child>
+							<widget class="GtkRadioButton" id="sync_playlist_mode_none_radio">
+							  <property name="visible">True</property>
+							  <property name="can_focus">True</property>
+							  <property name="label" translatable="yes">Don't automatically sync on startup</property>
+							  <property name="use_underline">True</property>
+							  <property name="relief">GTK_RELIEF_NORMAL</property>
+							  <property name="focus_on_click">True</property>
+							  <property name="active">False</property>
+							  <property name="inconsistent">False</property>
+							  <property name="draw_indicator">True</property>
+							  <property name="group">sync_playlist_mode_automatic_radio</property>
+							</widget>
+							<packing>
+							  <property name="padding">0</property>
+							  <property name="expand">False</property>
+							  <property name="fill">False</property>
+							</packing>
+						      </child>
+
+						      <child>
+							<widget class="GtkHBox" id="sync_options_hbox">
+							  <property name="visible">True</property>
+							  <property name="homogeneous">False</property>
+							  <property name="spacing">0</property>
+
+							  <child>
+							    <widget class="GtkLabel" id="label422">
+							      <property name="visible">True</property>
+							      <property name="label">  </property>
+							      <property name="use_underline">False</property>
+							      <property name="use_markup">False</property>
+							      <property name="justify">GTK_JUSTIFY_LEFT</property>
+							      <property name="wrap">False</property>
+							      <property name="selectable">False</property>
+							      <property name="xalign">0.5</property>
+							      <property name="yalign">0.5</property>
+							      <property name="xpad">0</property>
+							      <property name="ypad">0</property>
+							      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+							      <property name="width_chars">-1</property>
+							      <property name="single_line_mode">False</property>
+							      <property name="angle">0</property>
+							    </widget>
+							    <packing>
+							      <property name="padding">0</property>
+							      <property name="expand">False</property>
+							      <property name="fill">False</property>
+							    </packing>
+							  </child>
+
+							  <child>
+							    <widget class="GtkVBox" id="vbox_720">
+							      <property name="visible">True</property>
+							      <property name="homogeneous">False</property>
+							      <property name="spacing">8</property>
+
+							      <child>
+								<widget class="GtkCheckButton" id="playlist_sync_delete_tracks_toggle">
+								  <property name="visible">True</property>
+								  <property name="tooltip" translatable="yes">Normally, if a track is no longer present in the sync directory, it will be removed from the playlist, but not from the iPod or local repository.
+If this option is checked, tracks will be completely removed from the iPod or local repository, unless the track is a member of other playlists as well.
+NOTE: if you sync with the master playlist, you must check this option if you want tracks to be removed, because removing from the master playlist means removing from the iPod.</property>
+								  <property name="can_focus">True</property>
+								  <property name="label" translatable="yes">Delete tracks that are no longer present from the
+iPod or repository</property>
+								  <property name="use_underline">True</property>
+								  <property name="relief">GTK_RELIEF_NORMAL</property>
+								  <property name="focus_on_click">True</property>
+								  <property name="active">False</property>
+								  <property name="inconsistent">False</property>
+								  <property name="draw_indicator">True</property>
+								</widget>
+								<packing>
+								  <property name="padding">0</property>
+								  <property name="expand">False</property>
+								  <property name="fill">False</property>
+								</packing>
+							      </child>
+
+							      <child>
+								<widget class="GtkCheckButton" id="playlist_sync_confirm_delete_toggle">
+								  <property name="visible">True</property>
+								  <property name="can_focus">True</property>
+								  <property name="label" translatable="yes">Confirm before removing tracks from the iPod or repository</property>
+								  <property name="use_underline">True</property>
+								  <property name="relief">GTK_RELIEF_NORMAL</property>
+								  <property name="focus_on_click">True</property>
+								  <property name="active">False</property>
+								  <property name="inconsistent">False</property>
+								  <property name="draw_indicator">True</property>
+								</widget>
+								<packing>
+								  <property name="padding">0</property>
+								  <property name="expand">False</property>
+								  <property name="fill">False</property>
+								</packing>
+							      </child>
+
+							      <child>
+								<widget class="GtkCheckButton" id="playlist_sync_show_summary_toggle">
+								  <property name="visible">True</property>
+								  <property name="tooltip" translatable="yes">Will show a list of tracks removed and a list of tracks newly added or updated.</property>
+								  <property name="can_focus">True</property>
+								  <property name="label" translatable="yes">Show summary of sync result</property>
+								  <property name="use_underline">True</property>
+								  <property name="relief">GTK_RELIEF_NORMAL</property>
+								  <property name="focus_on_click">True</property>
+								  <property name="active">False</property>
+								  <property name="inconsistent">False</property>
+								  <property name="draw_indicator">True</property>
+								</widget>
+								<packing>
+								  <property name="padding">0</property>
+								  <property name="expand">False</property>
+								  <property name="fill">False</property>
+								</packing>
+							      </child>
+							    </widget>
+							    <packing>
+							      <property name="padding">0</property>
+							      <property name="expand">True</property>
+							      <property name="fill">True</property>
+							    </packing>
+							  </child>
+							</widget>
+							<packing>
+							  <property name="padding">4</property>
+							  <property name="expand">True</property>
+							  <property name="fill">True</property>
+							</packing>
+						      </child>
+						    </widget>
+						    <packing>
+						      <property name="padding">0</property>
+						      <property name="expand">False</property>
+						      <property name="fill">False</property>
+						    </packing>
+						  </child>
+
+						  <child>
+						    <widget class="GtkVBox" id="spl_vbox">
+						      <property name="visible">True</property>
+						      <property name="homogeneous">False</property>
+						      <property name="spacing">8</property>
+
+						      <child>
+							<widget class="GtkCheckButton" id="spl_live_update_toggle">
+							  <property name="visible">True</property>
+							  <property name="can_focus">True</property>
+							  <property name="label" translatable="yes">On startup automatically update (Live Playlist)</property>
+							  <property name="use_underline">True</property>
+							  <property name="relief">GTK_RELIEF_NORMAL</property>
+							  <property name="focus_on_click">True</property>
+							  <property name="active">False</property>
+							  <property name="inconsistent">False</property>
+							  <property name="draw_indicator">True</property>
+							</widget>
+							<packing>
+							  <property name="padding">0</property>
+							  <property name="expand">False</property>
+							  <property name="fill">False</property>
+							</packing>
+						      </child>
+
+						      <child>
+							<placeholder/>
+						      </child>
+						    </widget>
+						    <packing>
+						      <property name="padding">0</property>
+						      <property name="expand">False</property>
+						      <property name="fill">False</property>
+						    </packing>
+						  </child>
+
+						  <child>
+						    <widget class="GtkButton" id="update_playlist_button">
+						      <property name="visible">True</property>
+						      <property name="can_focus">True</property>
+						      <property name="label" translatable="yes">Update/Sync playlist now</property>
+						      <property name="use_underline">True</property>
+						      <property name="relief">GTK_RELIEF_NORMAL</property>
+						      <property name="focus_on_click">True</property>
+						    </widget>
+						    <packing>
+						      <property name="padding">0</property>
+						      <property name="expand">False</property>
+						      <property name="fill">False</property>
+						    </packing>
+						  </child>
+
+						  <child>
+						    <placeholder/>
+						  </child>
+
+						  <child>
+						    <placeholder/>
+						  </child>
+						</widget>
+						<packing>
+						  <property name="padding">0</property>
+						  <property name="expand">True</property>
+						  <property name="fill">True</property>
+						</packing>
+					      </child>
+					    </widget>
+					    <packing>
+					      <property name="padding">0</property>
+					      <property name="expand">True</property>
+					      <property name="fill">True</property>
+					    </packing>
+					  </child>
+
+					  <child>
+					    <placeholder/>
+					  </child>
+					</widget>
+				      </child>
+				    </widget>
+				  </child>
+				</widget>
+			      </child>
+
+			      <child>
+				<widget class="GtkLabel" id="label424">
+				  <property name="visible">True</property>
+				  <property name="label" translatable="yes">&lt;b&gt;Playlists&lt;/b&gt;</property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">True</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="type">label_item</property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">True</property>
+			    </packing>
+			  </child>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">True</property>
+			  <property name="fill">True</property>
+			</packing>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">True</property>
+		    </packing>
+		  </child>
+		</widget>
+	      </child>
+	    </widget>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">True</property>
+	  <property name="fill">True</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkHSeparator" id="hseparator57">
+	  <property name="visible">True</property>
+	</widget>
+	<packing>
+	  <property name="padding">2</property>
+	  <property name="expand">False</property>
+	  <property name="fill">False</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkHButtonBox" id="hbuttonbox15">
+	  <property name="visible">True</property>
+	  <property name="layout_style">GTK_BUTTONBOX_END</property>
+	  <property name="spacing">7</property>
+
+	  <child>
+	    <widget class="GtkButton" id="apply_button">
+	      <property name="visible">True</property>
+	      <property name="can_default">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label">gtk-apply</property>
+	      <property name="use_stock">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	    </widget>
+	  </child>
+
+	  <child>
+	    <widget class="GtkButton" id="cancel_button">
+	      <property name="visible">True</property>
+	      <property name="can_default">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label">gtk-cancel</property>
+	      <property name="use_stock">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	    </widget>
+	  </child>
+
+	  <child>
+	    <widget class="GtkButton" id="ok_button">
+	      <property name="visible">True</property>
+	      <property name="can_default">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label">gtk-ok</property>
+	      <property name="use_stock">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	    </widget>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">True</property>
+	</packing>
+      </child>
+    </widget>
+  </child>
+</widget>
+
+<widget class="GtkWindow" id="create_repository_window">
+  <property name="visible">True</property>
+  <property name="title" translatable="yes">Create Repository</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_NONE</property>
+  <property name="modal">True</property>
+  <property name="resizable">True</property>
+  <property name="destroy_with_parent">False</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
+  <property name="urgency_hint">False</property>
+
+  <child>
+    <widget class="GtkVBox" id="vbox170">
+      <property name="border_width">6</property>
+      <property name="visible">True</property>
+      <property name="homogeneous">False</property>
+      <property name="spacing">4</property>
+
+      <child>
+	<placeholder/>
+      </child>
+
+      <child>
+	<widget class="GtkTable" id="table46">
+	  <property name="visible">True</property>
+	  <property name="n_rows">7</property>
+	  <property name="n_columns">3</property>
+	  <property name="homogeneous">False</property>
+	  <property name="row_spacing">0</property>
+	  <property name="column_spacing">0</property>
+
+	  <child>
+	    <widget class="GtkLabel" id="local_path_label">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">Path:</property>
+	      <property name="use_underline">False</property>
+	      <property name="use_markup">False</property>
+	      <property name="justify">GTK_JUSTIFY_LEFT</property>
+	      <property name="wrap">False</property>
+	      <property name="selectable">False</property>
+	      <property name="xalign">0</property>
+	      <property name="yalign">0.5</property>
+	      <property name="xpad">10</property>
+	      <property name="ypad">0</property>
+	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	      <property name="width_chars">-1</property>
+	      <property name="single_line_mode">False</property>
+	      <property name="angle">0</property>
+	    </widget>
+	    <packing>
+	      <property name="left_attach">0</property>
+	      <property name="right_attach">1</property>
+	      <property name="top_attach">5</property>
+	      <property name="bottom_attach">6</property>
+	      <property name="x_options">fill</property>
+	      <property name="y_options">fill</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkLabel" id="ipod_model_label">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">Model:</property>
+	      <property name="use_underline">False</property>
+	      <property name="use_markup">False</property>
+	      <property name="justify">GTK_JUSTIFY_LEFT</property>
+	      <property name="wrap">False</property>
+	      <property name="selectable">False</property>
+	      <property name="xalign">0</property>
+	      <property name="yalign">0.5</property>
+	      <property name="xpad">10</property>
+	      <property name="ypad">0</property>
+	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	      <property name="width_chars">-1</property>
+	      <property name="single_line_mode">False</property>
+	      <property name="angle">0</property>
+	    </widget>
+	    <packing>
+	      <property name="left_attach">0</property>
+	      <property name="right_attach">1</property>
+	      <property name="top_attach">4</property>
+	      <property name="bottom_attach">5</property>
+	      <property name="x_options">fill</property>
+	      <property name="y_options">fill</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkLabel" id="backup_label">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">iTunesDB backup:</property>
+	      <property name="use_underline">False</property>
+	      <property name="use_markup">False</property>
+	      <property name="justify">GTK_JUSTIFY_LEFT</property>
+	      <property name="wrap">False</property>
+	      <property name="selectable">False</property>
+	      <property name="xalign">0</property>
+	      <property name="yalign">0.5</property>
+	      <property name="xpad">10</property>
+	      <property name="ypad">0</property>
+	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	      <property name="width_chars">-1</property>
+	      <property name="single_line_mode">False</property>
+	      <property name="angle">0</property>
+	    </widget>
+	    <packing>
+	      <property name="left_attach">0</property>
+	      <property name="right_attach">1</property>
+	      <property name="top_attach">3</property>
+	      <property name="bottom_attach">4</property>
+	      <property name="x_options">fill</property>
+	      <property name="y_options">fill</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkLabel" id="mountpoint_label">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">iPod mountpoint:</property>
+	      <property name="use_underline">False</property>
+	      <property name="use_markup">False</property>
+	      <property name="justify">GTK_JUSTIFY_LEFT</property>
+	      <property name="wrap">False</property>
+	      <property name="selectable">False</property>
+	      <property name="xalign">0</property>
+	      <property name="yalign">0.5</property>
+	      <property name="xpad">10</property>
+	      <property name="ypad">0</property>
+	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	      <property name="width_chars">-1</property>
+	      <property name="single_line_mode">False</property>
+	      <property name="angle">0</property>
+	    </widget>
+	    <packing>
+	      <property name="left_attach">0</property>
+	      <property name="right_attach">1</property>
+	      <property name="top_attach">2</property>
+	      <property name="bottom_attach">3</property>
+	      <property name="x_options">fill</property>
+	      <property name="y_options">fill</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkEntry" id="local_path_entry">
+	      <property name="visible">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="editable">False</property>
+	      <property name="visibility">True</property>
+	      <property name="max_length">0</property>
+	      <property name="text" translatable="yes"></property>
+	      <property name="has_frame">True</property>
+	      <property name="invisible_char">*</property>
+	      <property name="activates_default">False</property>
+	    </widget>
+	    <packing>
+	      <property name="left_attach">1</property>
+	      <property name="right_attach">2</property>
+	      <property name="top_attach">5</property>
+	      <property name="bottom_attach">6</property>
+	      <property name="x_padding">3</property>
+	      <property name="y_padding">3</property>
+	      <property name="y_options"></property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkEntry" id="backup_entry">
+	      <property name="visible">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="editable">False</property>
+	      <property name="visibility">True</property>
+	      <property name="max_length">0</property>
+	      <property name="text" translatable="yes"></property>
+	      <property name="has_frame">True</property>
+	      <property name="invisible_char">*</property>
+	      <property name="activates_default">False</property>
+	    </widget>
+	    <packing>
+	      <property name="left_attach">1</property>
+	      <property name="right_attach">2</property>
+	      <property name="top_attach">3</property>
+	      <property name="bottom_attach">4</property>
+	      <property name="x_padding">3</property>
+	      <property name="y_padding">3</property>
+	      <property name="y_options"></property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkButton" id="mountpoint_button">
+	      <property name="visible">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label" translatable="yes">Browse</property>
+	      <property name="use_underline">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	    </widget>
+	    <packing>
+	      <property name="left_attach">2</property>
+	      <property name="right_attach">3</property>
+	      <property name="top_attach">2</property>
+	      <property name="bottom_attach">3</property>
+	      <property name="x_padding">3</property>
+	      <property name="x_options">fill</property>
+	      <property name="y_options"></property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkEntry" id="mountpoint_entry">
+	      <property name="visible">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="editable">True</property>
+	      <property name="visibility">True</property>
+	      <property name="max_length">0</property>
+	      <property name="text" translatable="yes"></property>
+	      <property name="has_frame">True</property>
+	      <property name="invisible_char">*</property>
+	      <property name="activates_default">False</property>
+	    </widget>
+	    <packing>
+	      <property name="left_attach">1</property>
+	      <property name="right_attach">2</property>
+	      <property name="top_attach">2</property>
+	      <property name="bottom_attach">3</property>
+	      <property name="x_padding">3</property>
+	      <property name="y_padding">3</property>
+	      <property name="y_options"></property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkButton" id="backup_button">
+	      <property name="visible">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label" translatable="yes">Browse</property>
+	      <property name="use_underline">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	    </widget>
+	    <packing>
+	      <property name="left_attach">2</property>
+	      <property name="right_attach">3</property>
+	      <property name="top_attach">3</property>
+	      <property name="bottom_attach">4</property>
+	      <property name="x_padding">3</property>
+	      <property name="x_options">fill</property>
+	      <property name="y_options"></property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkButton" id="local_path_button">
+	      <property name="visible">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label" translatable="yes">Browse</property>
+	      <property name="use_underline">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	    </widget>
+	    <packing>
+	      <property name="left_attach">2</property>
+	      <property name="right_attach">3</property>
+	      <property name="top_attach">5</property>
+	      <property name="bottom_attach">6</property>
+	      <property name="x_padding">3</property>
+	      <property name="x_options">fill</property>
+	      <property name="y_options"></property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkComboBox" id="insert_before_after_combo">
+	      <property name="visible">True</property>
+	      <property name="items" translatable="yes">Insert before
+Insert after</property>
+	      <property name="add_tearoffs">False</property>
+	      <property name="focus_on_click">True</property>
+	    </widget>
+	    <packing>
+	      <property name="left_attach">0</property>
+	      <property name="right_attach">1</property>
+	      <property name="top_attach">6</property>
+	      <property name="bottom_attach">7</property>
+	      <property name="x_padding">3</property>
+	      <property name="y_padding">3</property>
+	      <property name="x_options">fill</property>
+	      <property name="y_options">fill</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkComboBox" id="repository_combo">
+	      <property name="visible">True</property>
+	      <property name="add_tearoffs">False</property>
+	      <property name="focus_on_click">True</property>
+	    </widget>
+	    <packing>
+	      <property name="left_attach">1</property>
+	      <property name="right_attach">2</property>
+	      <property name="top_attach">6</property>
+	      <property name="bottom_attach">7</property>
+	      <property name="x_padding">3</property>
+	      <property name="y_padding">3</property>
+	      <property name="x_options">fill</property>
+	      <property name="y_options">fill</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkLabel" id="repository_type_label">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">Repository type:</property>
+	      <property name="use_underline">False</property>
+	      <property name="use_markup">False</property>
+	      <property name="justify">GTK_JUSTIFY_LEFT</property>
+	      <property name="wrap">False</property>
+	      <property name="selectable">False</property>
+	      <property name="xalign">0</property>
+	      <property name="yalign">0.5</property>
+	      <property name="xpad">10</property>
+	      <property name="ypad">0</property>
+	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	      <property name="width_chars">-1</property>
+	      <property name="single_line_mode">False</property>
+	      <property name="angle">0</property>
+	    </widget>
+	    <packing>
+	      <property name="left_attach">0</property>
+	      <property name="right_attach">1</property>
+	      <property name="top_attach">0</property>
+	      <property name="bottom_attach">1</property>
+	      <property name="x_options">fill</property>
+	      <property name="y_options"></property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkComboBox" id="repository_type_combo">
+	      <property name="visible">True</property>
+	      <property name="items" translatable="yes" comments="These are the items for the 'Repository type' combo in the 'Create Repository' dialog. Keep the three items in order!">iPod
+Local Repository (Standard)
+Local Repository (Podcasts)
+</property>
+	      <property name="add_tearoffs">False</property>
+	      <property name="focus_on_click">True</property>
+	    </widget>
+	    <packing>
+	      <property name="left_attach">1</property>
+	      <property name="right_attach">2</property>
+	      <property name="top_attach">0</property>
+	      <property name="bottom_attach">1</property>
+	      <property name="x_padding">3</property>
+	      <property name="x_options">fill</property>
+	      <property name="y_options">fill</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkLabel" id="repository_name_label">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">Repository name:</property>
+	      <property name="use_underline">False</property>
+	      <property name="use_markup">False</property>
+	      <property name="justify">GTK_JUSTIFY_LEFT</property>
+	      <property name="wrap">False</property>
+	      <property name="selectable">False</property>
+	      <property name="xalign">0</property>
+	      <property name="yalign">0.5</property>
+	      <property name="xpad">10</property>
+	      <property name="ypad">0</property>
+	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	      <property name="width_chars">-1</property>
+	      <property name="single_line_mode">False</property>
+	      <property name="angle">0</property>
+	    </widget>
+	    <packing>
+	      <property name="left_attach">0</property>
+	      <property name="right_attach">1</property>
+	      <property name="top_attach">1</property>
+	      <property name="bottom_attach">2</property>
+	      <property name="x_options">fill</property>
+	      <property name="y_options"></property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkEntry" id="repository_name_entry">
+	      <property name="visible">True</property>
+	      <property name="tooltip" translatable="yes">Specify exact path including command line options. '%i' will be replaced with the mount point of the iPod.</property>
+	      <property name="can_focus">True</property>
+	      <property name="editable">True</property>
+	      <property name="visibility">True</property>
+	      <property name="max_length">0</property>
+	      <property name="text" translatable="yes"></property>
+	      <property name="has_frame">True</property>
+	      <property name="invisible_char">*</property>
+	      <property name="activates_default">False</property>
+	    </widget>
+	    <packing>
+	      <property name="left_attach">1</property>
+	      <property name="right_attach">2</property>
+	      <property name="top_attach">1</property>
+	      <property name="bottom_attach">2</property>
+	      <property name="x_padding">3</property>
+	      <property name="y_padding">3</property>
+	      <property name="y_options"></property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkComboBoxEntry" id="ipod_model_combo">
+	      <property name="visible">True</property>
+	      <property name="add_tearoffs">False</property>
+	      <property name="has_frame">True</property>
+	      <property name="focus_on_click">True</property>
+	    </widget>
+	    <packing>
+	      <property name="left_attach">1</property>
+	      <property name="right_attach">2</property>
+	      <property name="top_attach">4</property>
+	      <property name="bottom_attach">5</property>
+	      <property name="x_padding">3</property>
+	      <property name="y_padding">3</property>
+	      <property name="x_options">fill</property>
+	      <property name="y_options">fill</property>
+	    </packing>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">True</property>
+	  <property name="fill">True</property>
+	</packing>
+      </child>
+
+      <child>
+	<placeholder/>
+      </child>
+
+      <child>
+	<placeholder/>
+      </child>
+
+      <child>
+	<widget class="GtkHSeparator" id="hseparator58">
+	  <property name="visible">True</property>
+	</widget>
+	<packing>
+	  <property name="padding">2</property>
+	  <property name="expand">False</property>
+	  <property name="fill">False</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkHButtonBox" id="hbuttonbox16">
+	  <property name="visible">True</property>
+	  <property name="layout_style">GTK_BUTTONBOX_END</property>
+	  <property name="spacing">7</property>
+
+	  <child>
+	    <widget class="GtkButton" id="cancel_button">
+	      <property name="visible">True</property>
+	      <property name="can_default">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label">gtk-cancel</property>
+	      <property name="use_stock">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	    </widget>
+	  </child>
+
+	  <child>
+	    <widget class="GtkButton" id="ok_button">
+	      <property name="visible">True</property>
+	      <property name="can_default">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label">gtk-ok</property>
+	      <property name="use_stock">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	    </widget>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">False</property>
+	</packing>
+      </child>
+    </widget>
+  </child>
+</widget>
+
+<widget class="GtkDialog" id="ipod_init_dialog">
+  <property name="visible">True</property>
+  <property name="title" translatable="yes">Initialize iPod</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_NONE</property>
+  <property name="modal">False</property>
+  <property name="resizable">True</property>
+  <property name="destroy_with_parent">False</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
+  <property name="urgency_hint">False</property>
+  <property name="has_separator">True</property>
+
+  <child internal-child="vbox">
+    <widget class="GtkVBox" id="dialog-vbox2">
+      <property name="visible">True</property>
+      <property name="homogeneous">False</property>
+      <property name="spacing">0</property>
+
+      <child internal-child="action_area">
+	<widget class="GtkHButtonBox" id="dialog-action_area2">
+	  <property name="visible">True</property>
+	  <property name="layout_style">GTK_BUTTONBOX_END</property>
+
+	  <child>
+	    <widget class="GtkButton" id="cancelbutton1">
+	      <property name="visible">True</property>
+	      <property name="can_default">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label">gtk-cancel</property>
+	      <property name="use_stock">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	      <property name="response_id">-6</property>
+	    </widget>
+	  </child>
+
+	  <child>
+	    <widget class="GtkButton" id="okbutton1">
+	      <property name="visible">True</property>
+	      <property name="can_default">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label">gtk-ok</property>
+	      <property name="use_stock">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	      <property name="response_id">-5</property>
+	    </widget>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">True</property>
+	  <property name="pack_type">GTK_PACK_END</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkVBox" id="vbox172">
+	  <property name="border_width">5</property>
+	  <property name="visible">True</property>
+	  <property name="homogeneous">False</property>
+	  <property name="spacing">0</property>
+
+	  <child>
+	    <widget class="GtkLabel" id="ipod_init_label">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">&lt;b&gt;Please select mountpoint and your iPod model&lt;/b&gt;</property>
+	      <property name="use_underline">False</property>
+	      <property name="use_markup">True</property>
+	      <property name="justify">GTK_JUSTIFY_LEFT</property>
+	      <property name="wrap">False</property>
+	      <property name="selectable">False</property>
+	      <property name="xalign">0.5</property>
+	      <property name="yalign">0.5</property>
+	      <property name="xpad">0</property>
+	      <property name="ypad">0</property>
+	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	      <property name="width_chars">-1</property>
+	      <property name="single_line_mode">False</property>
+	      <property name="angle">0</property>
+	    </widget>
+	    <packing>
+	      <property name="padding">5</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkViewport" id="viewport22">
+	      <property name="visible">True</property>
+	      <property name="shadow_type">GTK_SHADOW_IN</property>
+
+	      <child>
+		<widget class="GtkVBox" id="vbox173">
+		  <property name="border_width">6</property>
+		  <property name="visible">True</property>
+		  <property name="homogeneous">False</property>
+		  <property name="spacing">4</property>
+
+		  <child>
+		    <widget class="GtkTable" id="table48">
+		      <property name="visible">True</property>
+		      <property name="n_rows">2</property>
+		      <property name="n_columns">3</property>
+		      <property name="homogeneous">False</property>
+		      <property name="row_spacing">0</property>
+		      <property name="column_spacing">0</property>
+
+		      <child>
+			<widget class="GtkLabel" id="label428">
+			  <property name="visible">True</property>
+			  <property name="label" translatable="yes">iPod mountpoint:</property>
+			  <property name="use_underline">False</property>
+			  <property name="use_markup">False</property>
+			  <property name="justify">GTK_JUSTIFY_LEFT</property>
+			  <property name="wrap">False</property>
+			  <property name="selectable">False</property>
+			  <property name="xalign">0</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">10</property>
+			  <property name="ypad">0</property>
+			  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			  <property name="width_chars">-1</property>
+			  <property name="single_line_mode">False</property>
+			  <property name="angle">0</property>
+			</widget>
+			<packing>
+			  <property name="left_attach">0</property>
+			  <property name="right_attach">1</property>
+			  <property name="top_attach">0</property>
+			  <property name="bottom_attach">1</property>
+			  <property name="x_options">fill</property>
+			  <property name="y_options">fill</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkEntry" id="mountpoint_entry">
+			  <property name="visible">True</property>
+			  <property name="can_focus">True</property>
+			  <property name="editable">True</property>
+			  <property name="visibility">True</property>
+			  <property name="max_length">0</property>
+			  <property name="text" translatable="yes"></property>
+			  <property name="has_frame">True</property>
+			  <property name="invisible_char">*</property>
+			  <property name="activates_default">False</property>
+			</widget>
+			<packing>
+			  <property name="left_attach">1</property>
+			  <property name="right_attach">2</property>
+			  <property name="top_attach">0</property>
+			  <property name="bottom_attach">1</property>
+			  <property name="x_padding">3</property>
+			  <property name="y_padding">3</property>
+			  <property name="y_options"></property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkButton" id="mountpoint_button">
+			  <property name="visible">True</property>
+			  <property name="can_focus">True</property>
+			  <property name="label" translatable="yes">Browse</property>
+			  <property name="use_underline">True</property>
+			  <property name="relief">GTK_RELIEF_NORMAL</property>
+			  <property name="focus_on_click">True</property>
+			</widget>
+			<packing>
+			  <property name="left_attach">2</property>
+			  <property name="right_attach">3</property>
+			  <property name="top_attach">0</property>
+			  <property name="bottom_attach">1</property>
+			  <property name="x_padding">3</property>
+			  <property name="x_options">fill</property>
+			  <property name="y_options"></property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkLabel" id="label430">
+			  <property name="visible">True</property>
+			  <property name="label" translatable="yes">Model:</property>
+			  <property name="use_underline">False</property>
+			  <property name="use_markup">False</property>
+			  <property name="justify">GTK_JUSTIFY_LEFT</property>
+			  <property name="wrap">False</property>
+			  <property name="selectable">False</property>
+			  <property name="xalign">0</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">10</property>
+			  <property name="ypad">0</property>
+			  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			  <property name="width_chars">-1</property>
+			  <property name="single_line_mode">False</property>
+			  <property name="angle">0</property>
+			</widget>
+			<packing>
+			  <property name="left_attach">0</property>
+			  <property name="right_attach">1</property>
+			  <property name="top_attach">1</property>
+			  <property name="bottom_attach">2</property>
+			  <property name="x_options">fill</property>
+			  <property name="y_options">fill</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkComboBoxEntry" id="model_combo">
+			  <property name="visible">True</property>
+			  <property name="add_tearoffs">False</property>
+			  <property name="has_frame">True</property>
+			  <property name="focus_on_click">True</property>
+			</widget>
+			<packing>
+			  <property name="left_attach">1</property>
+			  <property name="right_attach">3</property>
+			  <property name="top_attach">1</property>
+			  <property name="bottom_attach">2</property>
+			  <property name="x_padding">3</property>
+			  <property name="y_padding">3</property>
+			  <property name="x_options">fill</property>
+			  <property name="y_options">fill</property>
+			</packing>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="padding">6</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <placeholder/>
+		  </child>
+		</widget>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">True</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">True</property>
+	  <property name="fill">True</property>
+	</packing>
+      </child>
+    </widget>
+  </child>
+</widget>
+
+<widget class="GtkDialog" id="set_ipod_model_dialog">
+  <property name="visible">True</property>
+  <property name="title" translatable="yes">Initialize iPod</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_NONE</property>
+  <property name="modal">False</property>
+  <property name="resizable">True</property>
+  <property name="destroy_with_parent">False</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
+  <property name="urgency_hint">False</property>
+  <property name="has_separator">True</property>
+
+  <child internal-child="vbox">
+    <widget class="GtkVBox" id="dialog-vbox2">
+      <property name="visible">True</property>
+      <property name="homogeneous">False</property>
+      <property name="spacing">0</property>
+
+      <child internal-child="action_area">
+	<widget class="GtkHButtonBox" id="dialog-action_area2">
+	  <property name="visible">True</property>
+	  <property name="layout_style">GTK_BUTTONBOX_END</property>
+
+	  <child>
+	    <widget class="GtkButton" id="cancelbutton1">
+	      <property name="visible">True</property>
+	      <property name="can_default">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label">gtk-cancel</property>
+	      <property name="use_stock">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	      <property name="response_id">-6</property>
+	    </widget>
+	  </child>
+
+	  <child>
+	    <widget class="GtkButton" id="okbutton1">
+	      <property name="visible">True</property>
+	      <property name="can_default">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label">gtk-ok</property>
+	      <property name="use_stock">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	      <property name="response_id">-5</property>
+	    </widget>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">True</property>
+	  <property name="pack_type">GTK_PACK_END</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkVBox" id="vbox172">
+	  <property name="border_width">5</property>
+	  <property name="visible">True</property>
+	  <property name="homogeneous">False</property>
+	  <property name="spacing">0</property>
+
+	  <child>
+	    <widget class="GtkLabel" id="label">
+	      <property name="visible">True</property>
+	      <property name="label">label set by application</property>
+	      <property name="use_underline">False</property>
+	      <property name="use_markup">True</property>
+	      <property name="justify">GTK_JUSTIFY_LEFT</property>
+	      <property name="wrap">True</property>
+	      <property name="selectable">False</property>
+	      <property name="xalign">0.5</property>
+	      <property name="yalign">0.5</property>
+	      <property name="xpad">0</property>
+	      <property name="ypad">0</property>
+	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	      <property name="width_chars">-1</property>
+	      <property name="single_line_mode">False</property>
+	      <property name="angle">0</property>
+	    </widget>
+	    <packing>
+	      <property name="padding">5</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkViewport" id="viewport22">
+	      <property name="visible">True</property>
+	      <property name="shadow_type">GTK_SHADOW_IN</property>
+
+	      <child>
+		<widget class="GtkVBox" id="vbox173">
+		  <property name="border_width">6</property>
+		  <property name="visible">True</property>
+		  <property name="homogeneous">False</property>
+		  <property name="spacing">4</property>
+
+		  <child>
+		    <widget class="GtkTable" id="table48">
+		      <property name="visible">True</property>
+		      <property name="n_rows">2</property>
+		      <property name="n_columns">3</property>
+		      <property name="homogeneous">False</property>
+		      <property name="row_spacing">0</property>
+		      <property name="column_spacing">0</property>
+
+		      <child>
+			<widget class="GtkLabel" id="label430">
+			  <property name="visible">True</property>
+			  <property name="label" translatable="yes">Model:</property>
+			  <property name="use_underline">False</property>
+			  <property name="use_markup">False</property>
+			  <property name="justify">GTK_JUSTIFY_LEFT</property>
+			  <property name="wrap">False</property>
+			  <property name="selectable">False</property>
+			  <property name="xalign">0</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">10</property>
+			  <property name="ypad">0</property>
+			  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			  <property name="width_chars">-1</property>
+			  <property name="single_line_mode">False</property>
+			  <property name="angle">0</property>
+			</widget>
+			<packing>
+			  <property name="left_attach">0</property>
+			  <property name="right_attach">1</property>
+			  <property name="top_attach">1</property>
+			  <property name="bottom_attach">2</property>
+			  <property name="x_options">fill</property>
+			  <property name="y_options">fill</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkComboBoxEntry" id="model_combo">
+			  <property name="width_request">250</property>
+			  <property name="visible">True</property>
+			  <property name="add_tearoffs">False</property>
+			  <property name="has_frame">True</property>
+			  <property name="focus_on_click">True</property>
+			</widget>
+			<packing>
+			  <property name="left_attach">1</property>
+			  <property name="right_attach">3</property>
+			  <property name="top_attach">1</property>
+			  <property name="bottom_attach">2</property>
+			  <property name="x_padding">3</property>
+			  <property name="y_padding">3</property>
+			  <property name="y_options">fill</property>
+			</packing>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="padding">6</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <placeholder/>
+		  </child>
+		</widget>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">True</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">True</property>
+	  <property name="fill">True</property>
+	</packing>
+      </child>
+    </widget>
+  </child>
+</widget>
+
+<widget class="GtkWindow" id="file_transfer_information_dialog">
+  <property name="border_width">2</property>
+  <property name="title" translatable="yes">Progress Information</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_NONE</property>
+  <property name="modal">False</property>
+  <property name="resizable">True</property>
+  <property name="destroy_with_parent">False</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
+  <property name="urgency_hint">False</property>
+
+  <child>
+    <widget class="GtkVBox" id="vbox180">
+      <property name="border_width">5</property>
+      <property name="visible">True</property>
+      <property name="homogeneous">False</property>
+      <property name="spacing">5</property>
+
+      <child>
+	<widget class="GtkLabel" id="textlabel">
+	  <property name="visible">True</property>
+	  <property name="label">Some placeholder text to assure reasonable size.</property>
+	  <property name="use_underline">False</property>
+	  <property name="use_markup">False</property>
+	  <property name="justify">GTK_JUSTIFY_LEFT</property>
+	  <property name="wrap">False</property>
+	  <property name="selectable">False</property>
+	  <property name="xalign">0</property>
+	  <property name="yalign">0.5</property>
+	  <property name="xpad">0</property>
+	  <property name="ypad">0</property>
+	  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	  <property name="width_chars">-1</property>
+	  <property name="single_line_mode">False</property>
+	  <property name="angle">0</property>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">False</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkProgressBar" id="progressbar">
+	  <property name="visible">True</property>
+	  <property name="orientation">GTK_PROGRESS_LEFT_TO_RIGHT</property>
+	  <property name="fraction">0</property>
+	  <property name="pulse_step">0.10000000149</property>
+	  <property name="text"></property>
+	  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">False</property>
+	</packing>
+      </child>
+
+      <child>
+	<placeholder/>
+      </child>
+
+      <child>
+	<widget class="GtkHSeparator" id="hseparator59">
+	  <property name="visible">True</property>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">False</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkHButtonBox" id="hbuttonbox17">
+	  <property name="visible">True</property>
+	  <property name="layout_style">GTK_BUTTONBOX_DEFAULT_STYLE</property>
+	  <property name="spacing">0</property>
+
+	  <child>
+	    <widget class="GtkButton" id="abortbutton">
+	      <property name="border_width">2</property>
+	      <property name="visible">True</property>
+	      <property name="tooltip" translatable="yes">Export can be continued at a later time if canceled.</property>
+	      <property name="can_default">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label">gtk-cancel</property>
+	      <property name="use_stock">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	    </widget>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">False</property>
+	</packing>
+      </child>
+    </widget>
+  </child>
+</widget>
+
+<widget class="GtkWindow" id="conversion_log">
+  <property name="border_width">4</property>
+  <property name="title" translatable="yes">Conversion Progress Display</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_NONE</property>
+  <property name="modal">False</property>
+  <property name="resizable">True</property>
+  <property name="destroy_with_parent">False</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
+  <property name="urgency_hint">False</property>
+
+  <child>
+    <widget class="GtkVBox" id="conversion_vbox">
+      <property name="visible">True</property>
+      <property name="homogeneous">False</property>
+      <property name="spacing">4</property>
+
+      <child>
+	<widget class="GtkLabel" id="label463">
+	  <property name="visible">True</property>
+	  <property name="label" translatable="yes">The output of the background conversion scripts is copied below. Each page of the notebook corresponds to one background thread.</property>
+	  <property name="use_underline">False</property>
+	  <property name="use_markup">False</property>
+	  <property name="justify">GTK_JUSTIFY_LEFT</property>
+	  <property name="wrap">True</property>
+	  <property name="selectable">False</property>
+	  <property name="xalign">0</property>
+	  <property name="yalign">0.5</property>
+	  <property name="xpad">0</property>
+	  <property name="ypad">0</property>
+	  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	  <property name="width_chars">-1</property>
+	  <property name="single_line_mode">False</property>
+	  <property name="angle">0</property>
+	</widget>
+	<packing>
+	  <property name="padding">8</property>
+	  <property name="expand">False</property>
+	  <property name="fill">False</property>
+	</packing>
+      </child>
+
+      <child>
+	<placeholder/>
+      </child>
+
+      <child>
+	<widget class="GtkStatusbar" id="conversion_statusbar">
+	  <property name="visible">True</property>
+	  <property name="has_resize_grip">True</property>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">False</property>
+	  <property name="pack_type">GTK_PACK_END</property>
+	</packing>
+      </child>
+    </widget>
+  </child>
+</widget>
+
+<widget class="GtkDialog" id="coverart_preview_dialog">
+  <property name="visible">True</property>
+  <property name="title" translatable="yes">Artwork Preview</property>
+  <property name="type">GTK_WINDOW_POPUP</property>
+  <property name="window_position">GTK_WIN_POS_CENTER_ALWAYS</property>
+  <property name="modal">True</property>
+  <property name="resizable">True</property>
+  <property name="destroy_with_parent">False</property>
+  <property name="icon_name">gtk-dialog-info</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
+  <property name="urgency_hint">False</property>
+  <property name="has_separator">True</property>
+
+  <child internal-child="vbox">
+    <widget class="GtkVBox" id="dialog-vbox3">
+      <property name="visible">True</property>
+      <property name="homogeneous">False</property>
+      <property name="spacing">0</property>
+
+      <child internal-child="action_area">
+	<widget class="GtkHButtonBox" id="dialog-action_area3">
+	  <property name="visible">True</property>
+	  <property name="layout_style">GTK_BUTTONBOX_END</property>
+
+	  <child>
+	    <widget class="GtkButton" id="okbutton2">
+	      <property name="visible">True</property>
+	      <property name="can_default">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label">gtk-ok</property>
+	      <property name="use_stock">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	      <property name="response_id">-5</property>
+	    </widget>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">True</property>
+	  <property name="pack_type">GTK_PACK_END</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkVBox" id="coverart_preview_dialog_vbox">
+	  <property name="visible">True</property>
+	  <property name="homogeneous">False</property>
+	  <property name="spacing">0</property>
+
+	  <child>
+	    <placeholder/>
+	  </child>
+
+	  <child>
+	    <widget class="GtkLabel" id="coverart_preview_dialog_res_lbl">
+	      <property name="visible">True</property>
+	      <property name="label">&lt;b&gt;Placeholder for image information&lt;/b&gt;</property>
+	      <property name="use_underline">False</property>
+	      <property name="use_markup">True</property>
+	      <property name="justify">GTK_JUSTIFY_CENTER</property>
+	      <property name="wrap">True</property>
+	      <property name="selectable">False</property>
+	      <property name="xalign">0.5</property>
+	      <property name="yalign">0.5</property>
+	      <property name="xpad">0</property>
+	      <property name="ypad">0</property>
+	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	      <property name="width_chars">-1</property>
+	      <property name="single_line_mode">False</property>
+	      <property name="angle">0</property>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
+	      <property name="pack_type">GTK_PACK_END</property>
+	    </packing>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">True</property>
+	  <property name="fill">True</property>
+	</packing>
+      </child>
+    </widget>
+  </child>
+</widget>
+
+<widget class="GtkWindow" id="photo_panel">
+  <property name="visible">True</property>
+  <property name="title" translatable="yes">Photo Window</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_NONE</property>
+  <property name="modal">False</property>
+  <property name="resizable">True</property>
+  <property name="destroy_with_parent">False</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
+  <property name="urgency_hint">False</property>
+
+  <child>
+    <widget class="GtkViewport" id="photo_viewport">
+      <property name="border_width">5</property>
+      <property name="visible">True</property>
+      <property name="shadow_type">GTK_SHADOW_ETCHED_OUT</property>
+
+      <child>
+	<widget class="GtkHPaned" id="hpaned1">
+	  <property name="visible">True</property>
+	  <property name="can_focus">True</property>
+
+	  <child>
+	    <widget class="GtkVBox" id="vbox185">
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">0</property>
+
+	      <child>
+		<widget class="GtkMenuBar" id="menubar1">
+		  <property name="visible">True</property>
+		  <property name="pack_direction">GTK_PACK_DIRECTION_LTR</property>
+		  <property name="child_pack_direction">GTK_PACK_DIRECTION_LTR</property>
+
+		  <child>
+		    <widget class="GtkImageMenuItem" id="photo_album_menuItem">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">_Album</property>
+		      <property name="use_underline">True</property>
+		      <signal name="activate" handler="on_photo_album_menuItem_activate" last_modification_time="Mon, 05 Nov 2007 23:53:52 GMT"/>
+
+		      <child internal-child="image">
+			<widget class="GtkImage" id="image4266">
+			  <property name="visible">True</property>
+			  <property name="pixbuf">gphoto_album_menuitem-32.png</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			</widget>
+		      </child>
+
+		      <child>
+			<widget class="GtkMenu" id="photo_album_menuItem_menu">
+
+			  <child>
+			    <widget class="GtkImageMenuItem" id="photo_add_album_menuItem">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">_Add Album</property>
+			      <property name="use_underline">True</property>
+
+			      <child internal-child="image">
+				<widget class="GtkImage" id="image4267">
+				  <property name="visible">True</property>
+				  <property name="stock">gtk-justify-fill</property>
+				  <property name="icon_size">1</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				</widget>
+			      </child>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkImageMenuItem" id="photo_remove_album_menuItem">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">_Remove Album</property>
+			      <property name="use_underline">True</property>
+
+			      <child internal-child="image">
+				<widget class="GtkImage" id="image4268">
+				  <property name="visible">True</property>
+				  <property name="stock">gtk-remove</property>
+				  <property name="icon_size">1</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				</widget>
+			      </child>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="photo_rename_album_menuItem">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">R_ename Album</property>
+			      <property name="use_underline">True</property>
+			    </widget>
+			  </child>
+			</widget>
+		      </child>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkImageMenuItem" id="menuitem14">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">_Image</property>
+		      <property name="use_underline">True</property>
+
+		      <child internal-child="image">
+			<widget class="GtkImage" id="image4269">
+			  <property name="visible">True</property>
+			  <property name="pixbuf">gphoto_images_menuitem-32.png</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			</widget>
+		      </child>
+
+		      <child>
+			<widget class="GtkMenu" id="menuitem14_menu">
+
+			  <child>
+			    <widget class="GtkImageMenuItem" id="photo_add_image_menuItem">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">_Add Image</property>
+			      <property name="use_underline">True</property>
+
+			      <child internal-child="image">
+				<widget class="GtkImage" id="image4270">
+				  <property name="visible">True</property>
+				  <property name="stock">gtk-file</property>
+				  <property name="icon_size">1</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				</widget>
+			      </child>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkImageMenuItem" id="photo_add_image_dir_menuItem">
+			      <property name="visible">True</property>
+			      <property name="tooltip" translatable="yes">Add Images from a Directory</property>
+			      <property name="label" translatable="yes">Add Image_s</property>
+			      <property name="use_underline">True</property>
+
+			      <child internal-child="image">
+				<widget class="GtkImage" id="image4271">
+				  <property name="visible">True</property>
+				  <property name="stock">gtk-directory</property>
+				  <property name="icon_size">1</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				</widget>
+			      </child>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkImageMenuItem" id="photo_remove_image_menuItem">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">_Remove Images</property>
+			      <property name="use_underline">True</property>
+
+			      <child internal-child="image">
+				<widget class="GtkImage" id="image4272">
+				  <property name="visible">True</property>
+				  <property name="stock">gtk-missing-image</property>
+				  <property name="icon_size">1</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				</widget>
+			      </child>
+			    </widget>
+			  </child>
+			</widget>
+		      </child>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkImageMenuItem" id="menuitem15">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">_Tools</property>
+		      <property name="use_underline">True</property>
+
+		      <child internal-child="image">
+			<widget class="GtkImage" id="image4273">
+			  <property name="visible">True</property>
+			  <property name="pixbuf">gphoto_tools_menuitem-32.png</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			</widget>
+		      </child>
+
+		      <child>
+			<widget class="GtkMenu" id="menuitem15_menu">
+
+			  <child>
+			    <widget class="GtkImageMenuItem" id="photo_view_full_size_menuItem">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">View Full Size</property>
+			      <property name="use_underline">True</property>
+
+			      <child internal-child="image">
+				<widget class="GtkImage" id="image4274">
+				  <property name="visible">True</property>
+				  <property name="stock">gtk-zoom-fit</property>
+				  <property name="icon_size">1</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				</widget>
+			      </child>
+			    </widget>
+			  </child>
+			</widget>
+		      </child>
+		    </widget>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkScrolledWindow" id="photo_album_window">
+		  <property name="visible">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+		  <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+		  <property name="shadow_type">GTK_SHADOW_IN</property>
+		  <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+		  <child>
+		    <placeholder/>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">True</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkImage" id="photo_preview_image">
+		  <property name="width_request">250</property>
+		  <property name="height_request">176</property>
+		  <property name="visible">True</property>
+		  <property name="xalign">0.5</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xpad">0</property>
+		  <property name="ypad">0</property>
+		</widget>
+		<packing>
+		  <property name="padding">1</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="shrink">False</property>
+	      <property name="resize">False</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkScrolledWindow" id="photo_thumbnail_window">
+	      <property name="visible">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+	      <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+	      <property name="shadow_type">GTK_SHADOW_NONE</property>
+	      <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+	      <child>
+		<placeholder/>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="shrink">True</property>
+	      <property name="resize">True</property>
+	    </packing>
+	  </child>
+	</widget>
+      </child>
+    </widget>
+  </child>
+</widget>
+
+</glade-interface>

Added: trunk/data/icons/32x32/Makefile.am
===================================================================
--- trunk/data/icons/32x32/Makefile.am	                        (rev 0)
+++ trunk/data/icons/32x32/Makefile.am	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,4 @@
+appicondir = $(datadir)/icons/hicolor/32x32/apps
+appicon_DATA = gtkpod.png
+
+EXTRA_DIST = $(appicon_DATA)

Added: trunk/data/icons/32x32/Makefile.in
===================================================================
--- trunk/data/icons/32x32/Makefile.in	                        (rev 0)
+++ trunk/data/icons/32x32/Makefile.in	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,401 @@
+# Makefile.in generated by automake 1.10 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = data/icons/32x32
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(appicondir)"
+appiconDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(appicon_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALL_LINGUAS = @ALL_LINGUAS@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CURL_CFLAGS = @CURL_CFLAGS@
+CURL_LIBS = @CURL_LIBS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GMODULE_CFLAGS = @GMODULE_CFLAGS@
+GMODULE_LIBS = @GMODULE_LIBS@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GNOME_VFS_CFLAGS = @GNOME_VFS_CFLAGS@
+GNOME_VFS_LIBS = @GNOME_VFS_LIBS@
+GREP = @GREP@
+GTHREAD_CFLAGS = @GTHREAD_CFLAGS@
+GTHREAD_LIBS = @GTHREAD_LIBS@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
+HAL_CFLAGS = @HAL_CFLAGS@
+HAL_LIBS = @HAL_LIBS@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
+INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
+INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
+INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
+INTLTOOL_PERL = @INTLTOOL_PERL@
+INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
+INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
+INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
+INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
+INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
+INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
+INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
+INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
+INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
+INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
+INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
+INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
+LDFLAGS = @LDFLAGS@
+LEX = @LEX@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
+LIBGLADE_CFLAGS = @LIBGLADE_CFLAGS@
+LIBGLADE_LIBS = @LIBGLADE_LIBS@
+LIBGNOMECANVAS_CFLAGS = @LIBGNOMECANVAS_CFLAGS@
+LIBGNOMECANVAS_LIBS = @LIBGNOMECANVAS_LIBS@
+LIBGPOD_CFLAGS = @LIBGPOD_CFLAGS@
+LIBGPOD_LIBS = @LIBGPOD_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MOUNT = @MOUNT@
+MSGFMT = @MSGFMT@
+MSGFMT_OPTS = @MSGFMT_OPTS@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+POFILES = @POFILES@
+POSUB = @POSUB@
+PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
+PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+UMOUNT = @UMOUNT@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+appicondir = $(datadir)/icons/hicolor/32x32/apps
+appicon_DATA = gtkpod.png
+EXTRA_DIST = $(appicon_DATA)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  data/icons/32x32/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  data/icons/32x32/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-appiconDATA: $(appicon_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(appicondir)" || $(MKDIR_P) "$(DESTDIR)$(appicondir)"
+	@list='$(appicon_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(appiconDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(appicondir)/$$f'"; \
+	  $(appiconDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(appicondir)/$$f"; \
+	done
+
+uninstall-appiconDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(appicon_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(appicondir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(appicondir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(appicondir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-appiconDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-appiconDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-appiconDATA install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am uninstall uninstall-am uninstall-appiconDATA
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:

Added: trunk/data/icons/32x32/gtkpod.png
===================================================================
(Binary files differ)


Property changes on: trunk/data/icons/32x32/gtkpod.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/data/icons/48x48/Makefile.am
===================================================================
--- trunk/data/icons/48x48/Makefile.am	                        (rev 0)
+++ trunk/data/icons/48x48/Makefile.am	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,4 @@
+appicondir = $(datadir)/icons/hicolor/48x48/apps
+appicon_DATA = gtkpod.png
+
+EXTRA_DIST = $(appicon_DATA)

Added: trunk/data/icons/48x48/Makefile.in
===================================================================
--- trunk/data/icons/48x48/Makefile.in	                        (rev 0)
+++ trunk/data/icons/48x48/Makefile.in	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,401 @@
+# Makefile.in generated by automake 1.10 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = data/icons/48x48
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(appicondir)"
+appiconDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(appicon_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALL_LINGUAS = @ALL_LINGUAS@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CURL_CFLAGS = @CURL_CFLAGS@
+CURL_LIBS = @CURL_LIBS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GMODULE_CFLAGS = @GMODULE_CFLAGS@
+GMODULE_LIBS = @GMODULE_LIBS@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GNOME_VFS_CFLAGS = @GNOME_VFS_CFLAGS@
+GNOME_VFS_LIBS = @GNOME_VFS_LIBS@
+GREP = @GREP@
+GTHREAD_CFLAGS = @GTHREAD_CFLAGS@
+GTHREAD_LIBS = @GTHREAD_LIBS@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
+HAL_CFLAGS = @HAL_CFLAGS@
+HAL_LIBS = @HAL_LIBS@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
+INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
+INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
+INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
+INTLTOOL_PERL = @INTLTOOL_PERL@
+INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
+INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
+INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
+INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
+INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
+INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
+INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
+INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
+INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
+INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
+INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
+INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
+LDFLAGS = @LDFLAGS@
+LEX = @LEX@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
+LIBGLADE_CFLAGS = @LIBGLADE_CFLAGS@
+LIBGLADE_LIBS = @LIBGLADE_LIBS@
+LIBGNOMECANVAS_CFLAGS = @LIBGNOMECANVAS_CFLAGS@
+LIBGNOMECANVAS_LIBS = @LIBGNOMECANVAS_LIBS@
+LIBGPOD_CFLAGS = @LIBGPOD_CFLAGS@
+LIBGPOD_LIBS = @LIBGPOD_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MOUNT = @MOUNT@
+MSGFMT = @MSGFMT@
+MSGFMT_OPTS = @MSGFMT_OPTS@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+POFILES = @POFILES@
+POSUB = @POSUB@
+PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
+PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+UMOUNT = @UMOUNT@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+appicondir = $(datadir)/icons/hicolor/48x48/apps
+appicon_DATA = gtkpod.png
+EXTRA_DIST = $(appicon_DATA)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  data/icons/48x48/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  data/icons/48x48/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-appiconDATA: $(appicon_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(appicondir)" || $(MKDIR_P) "$(DESTDIR)$(appicondir)"
+	@list='$(appicon_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(appiconDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(appicondir)/$$f'"; \
+	  $(appiconDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(appicondir)/$$f"; \
+	done
+
+uninstall-appiconDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(appicon_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(appicondir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(appicondir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(appicondir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-appiconDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-appiconDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-appiconDATA install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am uninstall uninstall-am uninstall-appiconDATA
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:

Added: trunk/data/icons/48x48/gtkpod.png
===================================================================
(Binary files differ)


Property changes on: trunk/data/icons/48x48/gtkpod.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/data/icons/64x64/Makefile.am
===================================================================
--- trunk/data/icons/64x64/Makefile.am	                        (rev 0)
+++ trunk/data/icons/64x64/Makefile.am	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,4 @@
+appicondir = $(datadir)/icons/hicolor/64x64/apps
+appicon_DATA = gtkpod.png
+
+EXTRA_DIST = $(appicon_DATA)

Added: trunk/data/icons/64x64/Makefile.in
===================================================================
--- trunk/data/icons/64x64/Makefile.in	                        (rev 0)
+++ trunk/data/icons/64x64/Makefile.in	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,401 @@
+# Makefile.in generated by automake 1.10 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = data/icons/64x64
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(appicondir)"
+appiconDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(appicon_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALL_LINGUAS = @ALL_LINGUAS@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CURL_CFLAGS = @CURL_CFLAGS@
+CURL_LIBS = @CURL_LIBS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GMODULE_CFLAGS = @GMODULE_CFLAGS@
+GMODULE_LIBS = @GMODULE_LIBS@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GNOME_VFS_CFLAGS = @GNOME_VFS_CFLAGS@
+GNOME_VFS_LIBS = @GNOME_VFS_LIBS@
+GREP = @GREP@
+GTHREAD_CFLAGS = @GTHREAD_CFLAGS@
+GTHREAD_LIBS = @GTHREAD_LIBS@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
+HAL_CFLAGS = @HAL_CFLAGS@
+HAL_LIBS = @HAL_LIBS@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
+INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
+INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
+INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
+INTLTOOL_PERL = @INTLTOOL_PERL@
+INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
+INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
+INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
+INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
+INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
+INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
+INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
+INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
+INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
+INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
+INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
+INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
+LDFLAGS = @LDFLAGS@
+LEX = @LEX@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
+LIBGLADE_CFLAGS = @LIBGLADE_CFLAGS@
+LIBGLADE_LIBS = @LIBGLADE_LIBS@
+LIBGNOMECANVAS_CFLAGS = @LIBGNOMECANVAS_CFLAGS@
+LIBGNOMECANVAS_LIBS = @LIBGNOMECANVAS_LIBS@
+LIBGPOD_CFLAGS = @LIBGPOD_CFLAGS@
+LIBGPOD_LIBS = @LIBGPOD_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MOUNT = @MOUNT@
+MSGFMT = @MSGFMT@
+MSGFMT_OPTS = @MSGFMT_OPTS@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+POFILES = @POFILES@
+POSUB = @POSUB@
+PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
+PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+UMOUNT = @UMOUNT@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+appicondir = $(datadir)/icons/hicolor/64x64/apps
+appicon_DATA = gtkpod.png
+EXTRA_DIST = $(appicon_DATA)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  data/icons/64x64/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  data/icons/64x64/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-appiconDATA: $(appicon_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(appicondir)" || $(MKDIR_P) "$(DESTDIR)$(appicondir)"
+	@list='$(appicon_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(appiconDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(appicondir)/$$f'"; \
+	  $(appiconDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(appicondir)/$$f"; \
+	done
+
+uninstall-appiconDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(appicon_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(appicondir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(appicondir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(appicondir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-appiconDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-appiconDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-appiconDATA install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am uninstall uninstall-am uninstall-appiconDATA
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:

Added: trunk/data/icons/64x64/gtkpod.png
===================================================================
(Binary files differ)


Property changes on: trunk/data/icons/64x64/gtkpod.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/data/icons/Makefile.am
===================================================================
--- trunk/data/icons/Makefile.am	                        (rev 0)
+++ trunk/data/icons/Makefile.am	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,14 @@
+SUBDIRS = 32x32 48x48 64x64
+
+gtk_update_icon_cache = gtk-update-icon-cache -f -t $(datadir)/icons/hicolor
+
+install-data-hook: update-icon-cache
+uninstall-hook: update-icon-cache
+update-icon-cache:
+	@-if test -z "$(DESTDIR)"; then \
+		echo "Updating Gtk icon cache."; \
+		$(gtk_update_icon_cache); \
+	else \
+		echo "*** Icon cache not updated.  After (un)install, run this:"; \
+		echo "***   $(gtk_update_icon_cache)"; \
+	fi

Added: trunk/data/icons/Makefile.in
===================================================================
--- trunk/data/icons/Makefile.in	                        (rev 0)
+++ trunk/data/icons/Makefile.in	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,544 @@
+# Makefile.in generated by automake 1.10 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = data/icons
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+	html-recursive info-recursive install-data-recursive \
+	install-dvi-recursive install-exec-recursive \
+	install-html-recursive install-info-recursive \
+	install-pdf-recursive install-ps-recursive install-recursive \
+	installcheck-recursive installdirs-recursive pdf-recursive \
+	ps-recursive uninstall-recursive
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALL_LINGUAS = @ALL_LINGUAS@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CURL_CFLAGS = @CURL_CFLAGS@
+CURL_LIBS = @CURL_LIBS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GMODULE_CFLAGS = @GMODULE_CFLAGS@
+GMODULE_LIBS = @GMODULE_LIBS@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GNOME_VFS_CFLAGS = @GNOME_VFS_CFLAGS@
+GNOME_VFS_LIBS = @GNOME_VFS_LIBS@
+GREP = @GREP@
+GTHREAD_CFLAGS = @GTHREAD_CFLAGS@
+GTHREAD_LIBS = @GTHREAD_LIBS@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
+HAL_CFLAGS = @HAL_CFLAGS@
+HAL_LIBS = @HAL_LIBS@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
+INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
+INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
+INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
+INTLTOOL_PERL = @INTLTOOL_PERL@
+INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
+INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
+INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
+INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
+INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
+INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
+INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
+INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
+INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
+INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
+INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
+INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
+LDFLAGS = @LDFLAGS@
+LEX = @LEX@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
+LIBGLADE_CFLAGS = @LIBGLADE_CFLAGS@
+LIBGLADE_LIBS = @LIBGLADE_LIBS@
+LIBGNOMECANVAS_CFLAGS = @LIBGNOMECANVAS_CFLAGS@
+LIBGNOMECANVAS_LIBS = @LIBGNOMECANVAS_LIBS@
+LIBGPOD_CFLAGS = @LIBGPOD_CFLAGS@
+LIBGPOD_LIBS = @LIBGPOD_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MOUNT = @MOUNT@
+MSGFMT = @MSGFMT@
+MSGFMT_OPTS = @MSGFMT_OPTS@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+POFILES = @POFILES@
+POSUB = @POSUB@
+PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
+PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+UMOUNT = @UMOUNT@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+SUBDIRS = 32x32 48x48 64x64
+gtk_update_icon_cache = gtk-update-icon-cache -f -t $(datadir)/icons/hicolor
+all: all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  data/icons/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  data/icons/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+$(RECURSIVE_CLEAN_TARGETS):
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	rev=''; for subdir in $$list; do \
+	  if test "$$subdir" = "."; then :; else \
+	    rev="$$subdir $$rev"; \
+	  fi; \
+	done; \
+	rev="$$rev ."; \
+	target=`echo $@ | sed s/-recursive//`; \
+	for subdir in $$rev; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done && test -z "$$fail"
+tags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	done
+ctags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test -d "$(distdir)/$$subdir" \
+	    || $(MKDIR_P) "$(distdir)/$$subdir" \
+	    || exit 1; \
+	    distdir=`$(am__cd) $(distdir) && pwd`; \
+	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+	    (cd $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$top_distdir" \
+	        distdir="$$distdir/$$subdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-recursive
+all-am: Makefile
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+	@$(NORMAL_INSTALL)
+	$(MAKE) $(AM_MAKEFLAGS) install-data-hook
+
+install-dvi: install-dvi-recursive
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-info: install-info-recursive
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-ps: install-ps-recursive
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+	@$(NORMAL_INSTALL)
+	$(MAKE) $(AM_MAKEFLAGS) uninstall-hook
+
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
+	install-data-am install-strip uninstall-am
+
+.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
+	all all-am check check-am clean clean-generic ctags \
+	ctags-recursive distclean distclean-generic distclean-tags \
+	distdir dvi dvi-am html html-am info info-am install \
+	install-am install-data install-data-am install-data-hook \
+	install-dvi install-dvi-am install-exec install-exec-am \
+	install-html install-html-am install-info install-info-am \
+	install-man install-pdf install-pdf-am install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs installdirs-am maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \
+	uninstall-hook
+
+
+install-data-hook: update-icon-cache
+uninstall-hook: update-icon-cache
+update-icon-cache:
+	@-if test -z "$(DESTDIR)"; then \
+		echo "Updating Gtk icon cache."; \
+		$(gtk_update_icon_cache); \
+	else \
+		echo "*** Icon cache not updated.  After (un)install, run this:"; \
+		echo "***   $(gtk_update_icon_cache)"; \
+	fi
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:

Added: trunk/data/tunes_playlist_icon-48.png
===================================================================
(Binary files differ)


Property changes on: trunk/data/tunes_playlist_icon-48.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/debian/changelog
===================================================================
--- trunk/debian/changelog	                        (rev 0)
+++ trunk/debian/changelog	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,234 @@
+gtkpod (0.99.10-5) unstable; urgency=low
+
+  * Add changing mountpoint as well in prefs.c
+    to 01_mountpoint (Closes: #452056).
+  * Removed NEWS file as its last entry was before sarge.
+
+ -- Nico Golde <nion at debian.org>  Tue, 20 Nov 2007 14:22:12 +0100
+
+gtkpod (0.99.10-4) unstable; urgency=low
+
+  * Switched from Xs-Vcs to Vcs control field, dpkg supports them now.
+  * Switched from old Homepage tag to the new Homepage control field.
+  * New dependency on dpatch as we don't want to modify the source
+    directly any longer.
+  * Added previously modified source code as dpatch patches:
+    01_mountpoint, 02_missing_fclose
+  * Included 03_itdb-set-local-to-imported.dpatch to fix inability to import
+    into local repos (Closes: #451749).
+
+ -- Nico Golde <nion at debian.org>  Tue, 13 Nov 2007 16:18:58 +0100
+
+gtkpod (0.99.10-3) unstable; urgency=low
+
+  * Added missing fclose() call in mp3file.c to prevent too many open
+    file descriptors (Closes: #441308).
+  * Adapted .desktop file to current freedesktop standards.
+
+ -- Nico Golde <nion at debian.org>  Sun, 09 Sep 2007 20:13:31 +0200
+
+gtkpod (0.99.10-2) unstable; urgency=low
+
+  * Upload to unstable
+  * Update menu entry according to new menu policy
+  * Lintian: Don't ignore all errors from "make distclean"
+
+ -- Frank Lichtenheld <djpig at debian.org>  Tue, 10 Jul 2007 00:25:04 +0200
+
+gtkpod (0.99.10-1) experimental; urgency=low
+
+  * New upstream release
+    - Allows resizing the preferences dialog (Closes: #428011)
+  * Update man page debian/gtkpod.pod
+
+ -- Frank Lichtenheld <djpig at debian.org>  Thu, 28 Jun 2007 02:12:56 +0200
+
+gtkpod (0.99.8-3) unstable; urgency=low
+
+  [ Frank Lichtenheld ]
+  * Upload to unstable (Closes: #391812)
+  * Change Maintainer to pkg-gtkpod-devel list. Add myself
+    and Nico as Uploaders
+  * Add Vcs-{Svn,Browser} fields
+
+  [ Nico Golde ]
+  * Added Homepage tag to control.
+  * Bumped compat level since debhelper >= 5 is in etch.
+
+ -- Nico Golde <nion at debian.org>  Mon, 07 May 2007 17:40:39 +0200
+
+gtkpod (0.99.8-2) experimental; urgency=low
+
+  * Adapt for libgpod >= 0.4.2 (Patch by upstream).
+
+ -- Frank Lichtenheld <djpig at debian.org>  Sat, 10 Feb 2007 14:22:53 +0100
+
+gtkpod (0.99.8-1) experimental; urgency=low
+
+  * New upstream release
+    + Update libgpod-dev build-dependency to (>= 0.4.0)
+      and remove conflict against libgpod0
+      (upload to experimental because this version isn't
+       available in unstable yet)
+    + Change /mnt/ipod to /media/ipod as usual in new scripts
+  * Bump Standards-Version to 3.7.2 (no changes).
+  * Remove glade file symlinks on clean. Found by Martin Zobel-Helas.
+    (Closes: #395120)
+
+ -- Frank Lichtenheld <djpig at debian.org>  Fri, 22 Dec 2006 18:38:05 +0100
+
+gtkpod (0.99.4-2) unstable; urgency=low
+
+  * Add conflict against libgpod0 >= 0.4.0
+    to quiten up the BTS a bit.
+  * Bump Standards-Version to 3.7.2 (no changes).
+  * Remove glade file symlinks on clean. Found by Martin Zobel-Helas.
+    (Closes: #395120)
+
+ -- Frank Lichtenheld <djpig at debian.org>  Thu, 30 Nov 2006 23:12:32 +0100
+
+gtkpod (0.99.4-1) unstable; urgency=low
+
+  * New upstream release
+
+ -- Frank Lichtenheld <djpig at debian.org>  Sat,  8 Apr 2006 21:45:22 +0200
+
+gtkpod (0.99.2-1) unstable; urgency=low
+
+  * New upstream release (Closes: #343856)
+    + Fixes sorting bug (Closes: #330082)
+  * Add build-depends on libgpod-dev
+  * Add build-depends on flex
+  * Add suggests on python since one of the scripts uses it
+  * Update FSF address in debian/copyright
+
+ -- Frank Lichtenheld <djpig at debian.org>  Thu, 29 Dec 2005 17:38:38 +0100
+
+gtkpod (0.94.0-1) unstable; urgency=low
+
+  * New upstream release (Closes: #319408)
+    - support for new iTunes and new firmware version
+      (Closes: #317701)
+  * Add watch file, by  Filippo Giunchedi (Closes: #318760)
+
+ -- Frank Lichtenheld <djpig at debian.org>  Fri, 22 Jul 2005 13:23:13 +0200
+
+gtkpod (0.93.1-1) unstable; urgency=low
+
+  * New upstream release (Closes: #316399)
+    - New build-dependency libglade2-dev
+  * Bump Standards-Version to 3.6.2, no changes needed
+  * Don't create glade files as absolute links as that fails miserably
+    in a packaging situation
+
+ -- Frank Lichtenheld <djpig at debian.org>  Fri,  1 Jul 2005 02:24:13 +0200
+
+gtkpod (0.88.2-1) unstable; urgency=low
+
+  * New upstream release
+    - Fixes typo in preferences dialog reported by Michael Shields
+      (Closes: #289087)
+    - Included additional sync script previously offered for
+      download separatly (Closes: #302361)
+  * Include typo fixes for the German translation by Jens Seidel
+    (Closes: #314053)
+  * Add build dependency on gettext even though many other build
+    dependecies already get it for us. We shouldn't rely on that
+  * Fix syntax error in sync-notes.sh and change paths from
+    /mnt/ipod to /media/ipod as usual
+  * Add Suggests on recode as it is used in the scripts
+  * Replace the outdated, buggy, and GFDL licensed man page written in
+    docbook by the former Debian maintainer with an updated, more
+    extensive, GPL licensed version written in POD by me. Replace
+    build-depends on docbook-to-man by build-depends on perl.
+  * Rework copyright file to be more precise about which file is
+    copyrighted by whom
+  * Fix path to scripts in preferences window
+  * Replace ScsiEject code in src/misc.c with my new version from the
+    eject package which uses the newer SG ioctl interface. Add new
+    header check for scsi/sg.h to configure.in and regenerate configure
+    and config.h.in.
+  
+ -- Frank Lichtenheld <djpig at debian.org>  Thu, 16 Jun 2005 18:28:41 +0200
+
+gtkpod (0.88.1-1) unstable; urgency=low
+
+  * New upstream release
+    - fixes the iPod Shuffle support (Closes: #299768)
+      Thanks to Jörg Kurlbaum for pointing this out 
+
+ -- Frank Lichtenheld <djpig at debian.org>  Fri, 18 Mar 2005 13:15:17 +0100
+
+gtkpod (0.88-1) unstable; urgency=low
+
+  * New upstream version (Closes: #299053)
+  * Fix FTBFS with gcc-4.0; patch by Andreas Jochens
+    (Closes: #298273)
+
+ -- Frank Lichtenheld <djpig at debian.org>  Fri, 11 Mar 2005 18:50:52 +0100
+
+gtkpod (0.87.3-1) unstable; urgency=low
+
+  * New upstream version
+
+ -- Frank Lichtenheld <djpig at debian.org>  Fri,  4 Mar 2005 14:35:13 -0800
+
+gtkpod (0.85.0-1) unstable; urgency=low
+
+  * New maintainer (Closes: #287988)
+    Acknowledge my own NMU (Closes: #264682, #268340, #230898, #275363)
+  * Apply patch by Andreas Jochens to let gtkpod compile
+    with gcc-4.0 (Closes: #286926)
+
+ -- Frank Lichtenheld <djpig at debian.org>  Fri,  7 Jan 2005 01:01:58 +0100
+
+gtkpod (0.85.0-0.1) unstable; urgency=low
+
+  * NMU since maintainer is unresponsive to any contact
+    attempts for a log time now.
+  * New upstream release (Closes: #264682)
+  * debian/control:
+    + Shorten short description (Closes: #268340)
+    + Suggest mp3gain (Closes: #230898)
+    + Adjust debhelper build-dependency so that we can use dh_desktop
+  * debian/rules: Tidy up.
+  * debian/docs: Don't install empty NEWS file
+  * debian/menu:
+    + Quote values
+    + Use xpm icon created from the 32x32 icon
+  * debian/gtkpod.sgml: fix some <arg> vs. <option> mistakes
+  * debian/gtkpod.desktop: add .desktop file
+  * Change all occourences of /mnt/ipod to /media/ipod (Closes: #275363)
+    add a NEWS.Debian file to document this.
+  * Fix UTF-8 characters in several files
+  * Don't issue warning about not beeing able to "unsort" a table.
+    It's quite annyoing and the user has no possibility to fix it.
+
+ -- Frank Lichtenheld <djpig at debian.org>  Thu,  9 Dec 2004 18:17:17 +0100
+
+gtkpod (0.72-2-2) unstable; urgency=low
+
+  * Fix build dependencies (libid3tag0-dev).
+  * Change priority to extra.
+
+ -- Quôc Peyrot <chojin at debian.org>  Sat,  7 Feb 2004 05:14:03 +0000
+
+gtkpod (0.72-2-1) unstable; urgency=low
+
+  * New upstream release. Closes: #216155.
+  * Update policy revision to 3.6.1 (use UTF-8).
+  * Change the debian maintainer email to chojin at debian.org.
+
+ -- Quôc Peyrot <chojin at debian.org>  Tue,  3 Feb 2004 07:15:04 +0000
+
+gtkpod (0.51-1) unstable; urgency=low
+
+  * New upstream release
+
+ -- Quôc Peyrot <chojin at debian.org>  Sat, 17 May 2003 04:15:02 +0000
+
+gtkpod (0.50-1) unstable; urgency=low
+
+  * Initial Release. Closes: #182289.
+
+ -- Quôc Peyrot <chojin at debian.org>  Tue, 22 Apr 2003 05:16:37 +0000

Added: trunk/debian/compat
===================================================================
--- trunk/debian/compat	                        (rev 0)
+++ trunk/debian/compat	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1 @@
+5

Added: trunk/debian/control
===================================================================
--- trunk/debian/control	                        (rev 0)
+++ trunk/debian/control	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,21 @@
+Source: gtkpod
+Section: sound
+Priority: extra
+Maintainer: gtkpod Maintainers <pkg-gtkpod-devel at lists.alioth.debian.org>
+Uploaders: Frank Lichtenheld <djpig at debian.org>, Nico Golde <nion at debian.org>
+Build-Depends: debhelper (>= 5), gettext, flex, autotools-dev, perl, libxml-parser-perl, libgtk2.0-dev, libglade2-dev, libgnomecanvas2-dev, libgnomevfs2-dev, libid3tag0-dev, libvorbis-dev, libflac-dev, libgpod-dev (>= 0.5.2), libcurl4-gnutls-dev, libhal-dev, dpatch
+Standards-Version: 3.7.2
+Homepage: http://www.gtkpod.org
+Vcs-Svn: svn://svn.debian.org/svn/pkg-gtkpod/gtkpod/trunk
+Vcs-Browser: http://svn.debian.org/wsvn/pkg-gtkpod/gtkpod/trunk
+
+Package: gtkpod
+Architecture: any
+Depends: ${shlibs:Depends}
+Suggests: mp3gain, recode, python
+Description: manage songs and playlists on an Apple iPod
+ gtkpod is a platform independent GUI for Apple's iPod using GTK2. It
+ allows you to upload songs and playlists to your iPod. It supports ID3
+ tag editing, multiple charsets for ID3 tags, detects duplicate songs,
+ allows offline modification of the database with later synchronisation,
+ and more.

Added: trunk/debian/copyright
===================================================================
--- trunk/debian/copyright	                        (rev 0)
+++ trunk/debian/copyright	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,65 @@
+This package was debianized by Quôc Peyrot <chojin at debian.org> on
+Tue, 22 Apr 2003 05:16:37 +0000.
+
+It was downloaded from http://gtkpod.sourceforge.net/ 
+
+Upstream Authors: 
+Jorg Schuler <jcsjcs at users.sourceforge.net>
+Corey Donohoe <atmos at atmos.org>
+Adrian Ulrich <pab at blinkenlights.ch>
+
+Copyright:
+
+src/getopt*.{c,h}:
+	Copyright (C) 1987,88,89,90,91,92,93,94,95,96,98,99,2000,2001
+        	Free Software Foundation, Inc.
+src/misc.{c,h}:
+	Copyright (C) 1994-2001 Jeff Tranter <tranter at pobox.com>
+	Copyright (C) 2002-2003 Jorg Schuler <jcsjcs at users.sourceforge.net>
+src/dirbrowser.{c,h}:
+	Copyright (C) 1998-2000  Peter Alm, Mikael Alm, Olle Hallnas,
+        	                 Thomas Nilsson and 4Front Technologies
+	Copyright (C) 1999-2002  Haavard Kvaalen
+	Copyright (C) 2003 Jorg Schuler <jcsjcs at users.sourceforge.net>
+src/wavfile.{c,h}:
+	Copyright (C) 1998-2000  Peter Alm, Mikael Alm, Olle Hallnas,
+        	                 Thomas Nilsson and 4Front Technologies
+	Copyright (C) 2002-2003 Jorg Schuler <jcsjcs at users.sourceforge.net>
+src/prefs_window.{c,h},
+src/md5.{c,h},
+src/file_export.c,
+src/context_menus.{c,h}:
+	Copyright (C) 2002-2003 Corey Donohoe <atmos at atmos dot org>
+src/mp3file.{c,h}:
+	Copyright (C) 2000-2001  Cedric Tefft <cedric at earthling.net>
+	Copyright (C) 2002-2003 Jorg Schuler <jcsjcs at users.sourceforge.net>
+	Copyright (C) 2004 Jens Taprogge <jens.taprogge at post.rwth-aachen.de>
+src/playlist.{c,h}:
+	Copyright (C) 2002 Adrian Ulrich <pab at blinkenlights.ch>
+	Copyright (C) 2002-2003 Jorg Schuler <jcsjcs at users.sourceforge.net>
+src/itunessd.{c,h}:
+	Copyright 2005 Steve Wahl <steve at pro-ns dot net>
+
+All other files:
+	Copyright (C) 2002-2003 Jorg Schuler <jcsjcs at users.sourceforge.net>
+
+iTunes and iPod are trademarks of Apple.
+
+This product is not supported/written/published by Apple!
+
+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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ 
+On Debian GNU/Linux systems, the complete text of the GNU General
+Public License can be found in `/usr/share/common-licenses/GPL'.

Added: trunk/debian/dirs
===================================================================
--- trunk/debian/dirs	                        (rev 0)
+++ trunk/debian/dirs	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,2 @@
+usr/bin
+usr/share/pixmaps

Added: trunk/debian/docs
===================================================================
--- trunk/debian/docs	                        (rev 0)
+++ trunk/debian/docs	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1 @@
+README

Added: trunk/debian/gtkpod-icon-32x32.xpm
===================================================================
--- trunk/debian/gtkpod-icon-32x32.xpm	                        (rev 0)
+++ trunk/debian/gtkpod-icon-32x32.xpm	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,253 @@
+/* XPM */
+static char * gtkpod_icon_32x32_xpm[] = {
+"32 32 218 2",
+"  	c None",
+". 	c #CACACA",
+"+ 	c #C8C8C8",
+"@ 	c #C6C6C6",
+"# 	c #C4C4C4",
+"$ 	c #C3C3C3",
+"% 	c #C1C1C1",
+"& 	c #BFBFBF",
+"* 	c #BDBDBD",
+"= 	c #BCBCBC",
+"- 	c #BABABA",
+"; 	c #B9B9B9",
+"> 	c #B7B7B7",
+", 	c #B5B5B5",
+"' 	c #B3B3B3",
+") 	c #B1B1B1",
+"! 	c #ADADAD",
+"~ 	c #ABABAB",
+"{ 	c #E5E5E5",
+"] 	c #E2E2E2",
+"^ 	c #E1E1E1",
+"/ 	c #DFDFDF",
+"( 	c #DEDEDE",
+"_ 	c #DCDCDC",
+": 	c #DBDBDB",
+"< 	c #D9D9D9",
+"[ 	c #D8D8D8",
+"} 	c #D6D6D6",
+"| 	c #D5D5D5",
+"1 	c #D3D3D3",
+"2 	c #D2D2D2",
+"3 	c #D0D0D0",
+"4 	c #CFCFCF",
+"5 	c #CCCCCC",
+"6 	c #A6A6A6",
+"7 	c #E7E7E7",
+"8 	c #E2E3E2",
+"9 	c #DADCDB",
+"0 	c #D8DBDA",
+"a 	c #D8DAD9",
+"b 	c #D6D8D7",
+"c 	c #D4D7D6",
+"d 	c #D4D6D5",
+"e 	c #D2D5D3",
+"f 	c #D1D3D2",
+"g 	c #CFD2D1",
+"h 	c #CED0CF",
+"i 	c #CDCFCE",
+"j 	c #CCCECD",
+"k 	c #D0D1D1",
+"l 	c #D1D1D1",
+"m 	c #A1A1A1",
+"n 	c #E4E4E4",
+"o 	c #B6C1BC",
+"p 	c #879D93",
+"q 	c #869C92",
+"r 	c #859C92",
+"s 	c #B2BBB7",
+"t 	c #CDCDCD",
+"u 	c #9C9C9C",
+"v 	c #E3E3E3",
+"w 	c #A8B6B0",
+"x 	c #849B91",
+"y 	c #6E8179",
+"z 	c #6F827A",
+"A 	c #A6B3AD",
+"B 	c #CBCBCB",
+"C 	c #969696",
+"D 	c #E0E0E0",
+"E 	c #A7B5AF",
+"F 	c #839A90",
+"G 	c #38423E",
+"H 	c #2E3532",
+"I 	c #7F958B",
+"J 	c #A5B2AC",
+"K 	c #C9C9C9",
+"L 	c #909090",
+"M 	c #A7B5AE",
+"N 	c #82988F",
+"O 	c #535F5A",
+"P 	c #434D49",
+"Q 	c #A4B1AB",
+"R 	c #C7C7C7",
+"S 	c #8B8B8B",
+"T 	c #DDDDDD",
+"U 	c #A5B3AD",
+"V 	c #63756D",
+"W 	c #72867E",
+"X 	c #39433F",
+"Y 	c #82998F",
+"Z 	c #A3AFAA",
+"` 	c #C5C5C5",
+" .	c #858585",
+"..	c #DADADA",
+"+.	c #A5B3AC",
+"@.	c #81988E",
+"#.	c #56655E",
+"$.	c #7C9188",
+"%.	c #7B9087",
+"&.	c #2D3431",
+"*.	c #A2AEA9",
+"=.	c #C2C2C2",
+"-.	c #7F7F7F",
+";.	c #D7D7D7",
+">.	c #A4B2AC",
+",.	c #788A82",
+"'.	c #72857D",
+").	c #687971",
+"!.	c #61706A",
+"~.	c #788C83",
+"{.	c #A1ADA8",
+"].	c #797979",
+"^.	c #A3B1AB",
+"/.	c #7D9188",
+"(.	c #778C83",
+"_.	c #62716A",
+":.	c #5B6B65",
+"<.	c #6D7E77",
+"[.	c #80968C",
+"}.	c #A0ACA7",
+"|.	c #C0C0C0",
+"1.	c #BEBEBE",
+"2.	c #747474",
+"3.	c #D4D4D4",
+"4.	c #A2B0AA",
+"5.	c #9FABA6",
+"6.	c #6E6E6E",
+"7.	c #B0B9B5",
+"8.	c #8EA299",
+"9.	c #8DA199",
+"0.	c #8DA198",
+"a.	c #8CA098",
+"b.	c #8CA097",
+"c.	c #A8B0AD",
+"d.	c #BBBBBB",
+"e.	c #686868",
+"f.	c #CBCCCC",
+"g.	c #C3C6C5",
+"h.	c #C1C4C3",
+"i.	c #C0C3C2",
+"j.	c #BFC2C0",
+"k.	c #BEC0BF",
+"l.	c #BCBFBE",
+"m.	c #BBBEBD",
+"n.	c #BABDBB",
+"o.	c #B8BBBA",
+"p.	c #B7BAB9",
+"q.	c #B6B9B8",
+"r.	c #B5B8B7",
+"s.	c #B9BABA",
+"t.	c #B8B8B8",
+"u.	c #636363",
+"v.	c #CECECE",
+"w.	c #B6B6B6",
+"x.	c #5C5C5C",
+"y.	c #575757",
+"z.	c #9A9A9A",
+"A.	c #A3A3A3",
+"B.	c #ACACAC",
+"C.	c #B0B0B0",
+"D.	c #A8A8A8",
+"E.	c #B2B2B2",
+"F.	c #515151",
+"G.	c #888888",
+"H.	c #9E9E9E",
+"I.	c #999999",
+"J.	c #AFAFAF",
+"K.	c #4B4B4B",
+"L.	c #A2A2A2",
+"M.	c #454545",
+"N.	c #9F9F9F",
+"O.	c #404040",
+"P.	c #F0F0F0",
+"Q.	c #A9A9A9",
+"R.	c #3A3A3A",
+"S.	c #EAEAEA",
+"T.	c #E9E9E9",
+"U.	c #ECECEC",
+"V.	c #A7A7A7",
+"W.	c #343434",
+"X.	c #A4A4A4",
+"Y.	c #2E2E2E",
+"Z.	c #8C8C8C",
+"`.	c #EBEBEB",
+" +	c #F2F2F2",
+".+	c #292929",
+"++	c #F4F4F4",
+"@+	c #A0A0A0",
+"#+	c #232323",
+"$+	c #F7F7F7",
+"%+	c #1E1E1E",
+"&+	c #B4B4B4",
+"*+	c #F6F6F6",
+"=+	c #181818",
+"-+	c #E6E6E6",
+";+	c #EFEFEF",
+">+	c #F3F3F3",
+",+	c #9B9B9B",
+"'+	c #121212",
+")+	c #AEAEAE",
+"!+	c #AAAAAA",
+"~+	c #989898",
+"{+	c #0C0C0C",
+"]+	c #A5A5A5",
+"^+	c #979797",
+"/+	c #939393",
+"(+	c #060606",
+"_+	c #767676",
+":+	c #030303",
+"<+	c #737373",
+"[+	c #717171",
+"}+	c #707070",
+"|+	c #6D6D6D",
+"1+	c #6B6B6B",
+"2+	c #6A6A6A",
+"3+	c #696969",
+"4+	c #676767",
+"5+	c #5E5E5E",
+"                  . + @ # $ % & * = - ; > , ' ) ! ~             ",
+"                { ] ^ / ( _ : < [ } | 1 2 3 4 5 - 6             ",
+"              7 7 8 9 0 a b c d e f g h i j k l 5 m             ",
+"              { n o p q q q q q r r r r r p s 4 t u             ",
+"              v ] w x x x x x y z x x x x x A t B C             ",
+"              ^ D E x x x x F G H I x x x x J . K L             ",
+"              / ( M x x x x N O P y x x x x Q K R S             ",
+"              T : U x x x x V W y X Y x x x Z @ `  .            ",
+"              : ..+.x x x @.#.$.%.&.I x x x *.# =.-.            ",
+"              < ;.>.x x x ,.'.).y !.~.x x x {.=.% ].            ",
+"              ;.| ^.x x x /.(._.:.<.[.x x x }.|.1.2.            ",
+"              3.1 4.x x x x F F F F x x x x 5.1.= 6.            ",
+"              2 l 7.8.9.9.0.0.0.a.b.b.b.b.b.c.d.- e.            ",
+"              3 4 f.g.h.i.j.k.l.m.n.o.p.q.r.s.; t.u.            ",
+"              v.5 B . + R 5 3.;.} 2 R 1.d.- t.> w.x.            ",
+"              B . K R t [ 2 * ' ' = v.1 # t.w., ' y.            ",
+"              . + R % 1 w.z.A.B.) C.D., v.w., ' E.F.            ",
+"              + @ K 5 G.H.> * =.@ . v.& I.= * ) J.K.            ",
+"              ` ` } , L.; * =.@ . v.1 ;.v.t.4 ' ! M.            ",
+"              $ + l N.> * % R 3 2 2 ;.: / ` t d.~ O.            ",
+"              % 5 @ 6 * % @ T P.{ 4 ../ v ( ` # Q.R.            ",
+"              & v.= w.=.@ 5 S.T.^ =.v.v 7 U.K B V.W.            ",
+"              * 5 1.& @ . B 1 T < ! $ 7 U.P.2 B X.Y.            ",
+"              - R + d.. v.4 E.> ! Z.: `.P. +2 $ A..+            ",
+"              t.|.3 d.v.2 } t ~ X.v.`.P.++S.< w. at +#+            ",
+"              w.> 5 ` 4 } : / v 7 U.P.++$+^ 3 6 H.%+            ",
+"              &+' - 2 ; ;./ v 7 `.P.++*+_ ;.&+H.u =+            ",
+"              E.) C.A.d.1 : -+`.;+>+>+T.v.,+H.,+z.'+            ",
+"              C.)+! !+t.1 : ^ v { `.n ..> u z.I.~+{+            ",
+"              ! ! ~ Q.D.~ t.@ 5 5 + t.]+u I.~+^+/+(+            ",
+"              L.Q.Q.V.]+X.A.L.L.m H.,+z.I.^+C /+_+:+            ",
+"                  -._+<+[+}+6.6.|+1+2+3+e.4+4+5+                "};

Added: trunk/debian/gtkpod.desktop
===================================================================
--- trunk/debian/gtkpod.desktop	                        (rev 0)
+++ trunk/debian/gtkpod.desktop	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,8 @@
+[Desktop Entry]
+Name=gtkpod
+Icon=gtkpod-icon-32x32.png
+Comment=Manage songs and playlists on your Apple iPod
+Exec=gtkpod
+Terminal=false
+Type=Application
+Categories=GTK;AudioVideo;

Added: trunk/debian/gtkpod.pod
===================================================================
--- trunk/debian/gtkpod.pod	                        (rev 0)
+++ trunk/debian/gtkpod.pod	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,91 @@
+=head1 NAME
+
+gtkpod - GTK2 based software for managing songs and playlists on an Apple iPod
+
+=head1 SYNOPSIS
+
+B<gtkpod> [B<-h>] [B<-a>] [B<-c>] [B<-o>] [B<-m> I<path>] [B<-p> I<filename>] [B<--hash> I<filename>] 
+
+=head1 DESCRIPTION
+
+This manual page briefly describes the gtkpod command.
+
+=head1 OPTIONS
+
+B<gtkpod> supports the following options:
+
+=over 4
+
+=item B<-h>, B<--help>
+
+Displays the help message.
+
+=item B<-m>, B<--mountpoint> I<path>
+
+Define the mountpoint of your iPod.
+
+=item B<-p> I<filename>
+
+Increment playcount for file I<filename> by one.
+
+=item B<--hash> I<filename>
+
+Print gtkpod hash for file I<filename>.
+
+=item B<-a>, B<--auto>
+
+Import database automatically after start.
+
+=back
+
+=head1 FILES
+
+=over 4
+
+=item F<~/.gtkpod/prefs>
+
+Per user configuration file. Should normally only updated through
+the program itself.
+
+=item F</etc/gtkpod/prefs>
+
+Global configuration file. Used if no configuration file exist for the user
+starting gtkpod.
+
+=item F<~/.gtkpod/gtkpod.in>
+
+If this file exists, gtkpod will try to execute it at startup
+This is done before attempting to mount the iPod directory (optional)
+or read the iTunesDB (optional)).
+
+=item F<~/.gtkpod/gtkpod.out>
+
+If this file exists, gtkpod will try to execute it while exiting the
+program. This is done after attempting to unmount the iPod directory
+(optional) and sending the "eject" command to the iPod (optional).
+
+=item F</etc/gtkpod/gtkpod.in>, F</etc/gtkpod/gtkpod.out>
+
+Used instead of the per user scripts if the former ones don't exist
+and these do.
+
+=back
+
+=head1 AUTHOR
+
+ Jorg Schuler <jcsjcs at users.sourceforge.net>
+ Corey Donohoe <atmos at atmos.org>
+ Adrian Ulrich <pab at blinkenlights.ch>
+ and others
+
+This manpage was written by Frank Lichtenheld <frank at lichtenheld>.
+
+=head1 COPYRIGHT AND LICENCE
+
+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, or (at your option)
+any later version.
+
+On Debian systems, a copy of the GNU General Public License may be
+found in /usr/share/common-licenses/GPL.

Added: trunk/debian/install
===================================================================
--- trunk/debian/install	                        (rev 0)
+++ trunk/debian/install	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,2 @@
+debian/gtkpod-icon-32x32.xpm usr/share/pixmaps
+debian/gtkpod.desktop usr/share/applications

Added: trunk/debian/menu
===================================================================
--- trunk/debian/menu	                        (rev 0)
+++ trunk/debian/menu	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,3 @@
+?package(gtkpod):needs="X11" section="Applications/Sound" \
+  title="gtkpod" command="/usr/bin/gtkpod" \
+  icon="/usr/share/pixmaps/gtkpod-icon-32x32.xpm"

Added: trunk/debian/patches/00list
===================================================================
--- trunk/debian/patches/00list	                        (rev 0)
+++ trunk/debian/patches/00list	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,3 @@
+01_mountpoint
+02_missing_fclose
+03_itdb-set-local-to-imported

Added: trunk/debian/patches/01_mountpoint.dpatch
===================================================================
--- trunk/debian/patches/01_mountpoint.dpatch	                        (rev 0)
+++ trunk/debian/patches/01_mountpoint.dpatch	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,276 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## 01_mountpoint.dpatch by Nico Golde <nion at debian.org>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: No description.
+
+ at DPATCH@
+diff -urNad trunk~/README trunk/README
+--- trunk~/README	2007-11-18 16:47:22.000000000 +0100
++++ trunk/README	2007-11-20 14:20:36.000000000 +0100
+@@ -52,7 +52,7 @@
+ 1) If your iPod is not mounted automatically when connecting it to
+    your computer follow steps 1-7 in the "Connecting your iPod to a
+    Linux box" (basically you need to get the iPod partition mounted to
+-   /mnt/ipod).  In most cases this should not be necessary any more
++   /media/ipod).  In most cases this should not be necessary any more
+    these days.
+ 
+ 2) If you are using GNOME, starting with V1.0 of gtkpod your iPod will
+@@ -699,13 +699,13 @@
+    (Obviously you need to change the filesystem type from 'vfat' to
+    'hfsplus' when you use an HFS formatted iPod.)
+ 
+-   Then simply add a link from /mnt/ipod:
++   Then simply add a link from /media/ipod:
+ 
+-   ln -s /var/autofs/removable/ipod /mnt/ipod
++   ln -s /var/autofs/removable/ipod /media/ipod
+ 
+ 
+ Now your system is configured to mount the iPod every time you access
+-/mnt/ipod and to unmount it again after two seconds of inactivity. You
++/media/ipod and to unmount it again after two seconds of inactivity. You
+ won't have to worry about doing mounting/unmouting yourself any more.
+ 
+ 
+@@ -750,19 +750,19 @@
+     *                            -> NLS ISO 8859-1 (CONFIG_NLS_ISO8859_1) 
+ 
+ 
+-3) Create /mnt/ipod:
++3) Create /media/ipod:
+ 
+-   mkdir /mnt/ipod
++   mkdir /media/ipod
+ 
+ 4) Add a line to /etc/fstab. You should edit uid to match your user
+    id. Also, /dev/sda2 may not be appropriate, if you have other scsi
+    devices.
+ 
+-/dev/sda2	/mnt/ipod	vfat rw,user,noauto,noatime,errors=remount 0 0
++/dev/sda2	/media/ipod	vfat rw,user,noauto,noatime,errors=remount 0 0
+ 
+    (For HFS this line should read
+ 
+-/dev/sda  /mnt/ipod  hfsplus  rw,user,noauto,exec  0  0
++/dev/sda  /media/ipod  hfsplus  rw,user,noauto,exec  0  0
+ 
+     please note that it's just '/dev/sda')
+ 
+@@ -770,7 +770,7 @@
+ NOTE: Some users have had problems with newer versions of mount(newer than
+ mount-2.11h) The following fstab entry might work better for you.
+ 
+-/dev/sda2	/mnt/ipod	vfat rw,user,noauto,noatime,shortname=winnt 0 0
++/dev/sda2	/media/ipod	vfat rw,user,noauto,noatime,shortname=winnt 0 0
+ 
+ 5) Install the hotplug utilities
+    (http://linux-hotplug.sourceforge.net/, debian package: 'hotplug')
+@@ -819,13 +819,13 @@
+ 
+ 7) Mount the iPod hard drive
+ 
+-   mount /mnt/ipod
++   mount /media/ipod
+ 
+ 8) do whatever you need to do (e.g. start gtkpod, see below)
+ 
+ 9) Unmount the iPod:
+ 
+-    umount /mnt/ipod
++    umount /media/ipod
+ 
+ 10) Unload the module sbp2 (as most likely as root):
+ 
+@@ -874,19 +874,19 @@
+     *                          -> Codepage 437 (CONFIG_NLS_CODEPAGE_437)
+     *                          -> NLS ISO 8859-1 (CONFIG_NLS_ISO8859_1) 
+ 
+-3) Create /mnt/ipod:
++3) Create /media/ipod:
+ 
+-   mkdir /mnt/ipod
++   mkdir /media/ipod
+ 
+ 4) Add a line to /etc/fstab. You should edit uid to match your user
+    id. Also, /dev/sda2 may not be appropriate, if you have other scsi
+    devices.
+ 
+-/dev/sda2	/mnt/ipod	vfat rw,user,noauto,noatime 0 0
++/dev/sda2	/media/ipod	vfat rw,user,noauto,noatime 0 0
+ 
+    (For HFS this line should read
+ 
+-/dev/sda  /mnt/ipod  hfsplus  rw,user,noauto,exec  0  0
++/dev/sda  /media/ipod  hfsplus  rw,user,noauto,exec  0  0
+ 
+     please note that it's just '/dev/sda')
+ 
+@@ -894,7 +894,7 @@
+ NOTE: Some users have had problems with newer versions of mount(newer than
+ mount-2.11h) The following fstab entry might work better for you.
+ 
+-/dev/sda2	/mnt/ipod	vfat rw,user,noauto,noatime,shortname=winnt 0 0
++/dev/sda2	/media/ipod	vfat rw,user,noauto,noatime,shortname=winnt 0 0
+ 
+ NOTE: You can add ",umask=0" to the options to make the iPod
+ readable/writable for all users.
+@@ -934,13 +934,13 @@
+ 
+ 7) Mount the iPod hard drive
+ 
+-   mount /mnt/ipod
++   mount /media/ipod
+ 
+ 8) do whatever you need to do (e.g. start gtkpod, see below)
+ 
+ 9) Unmount the iPod:
+ 
+-    umount /mnt/ipod
++    umount /media/ipod
+ 
+ 10) Unload the module sbp2 (as most likely as root):
+ 
+@@ -974,7 +974,7 @@
+ - since the iPod's hdd was already spun up, the SCSI subsystem now
+   recognizes it and mounts it as /dev/sda
+ 
+-- You can then mount /dev/sda2 to /mnt/ipod as normal."
++- You can then mount /dev/sda2 to /media/ipod as normal."
+ 
+ On the other hand: with my 4G iPod under 2.6.9 and 2.6.10 I never had
+ any problem whatsoever getting the iPod to work. With IEEE it was
+@@ -1030,10 +1030,10 @@
+ /**********/
+ Add a line similar to the below to your /etc/fstab, this will enable users
+ to mount the ipod with read/write capabilities.  Example line assumes your
+-ipod mount point is /mnt/ipod and your ipod is detected as /dev/sda
++ipod mount point is /media/ipod and your ipod is detected as /dev/sda
+ 
+ ------------------------------- Begin Here ---------------------------------
+-/dev/sda2       /mnt/ipod       vfat    rw,user,noauto          0       0
++/dev/sda2       /media/ipod       vfat    rw,user,noauto          0       0
+ ------------------------------- End Here -----------------------------------
+ 
+ 
+diff -urNad trunk~/scripts/sync-abook.sh trunk/scripts/sync-abook.sh
+--- trunk~/scripts/sync-abook.sh	2007-11-18 16:28:19.000000000 +0100
++++ trunk/scripts/sync-abook.sh	2007-11-20 14:20:36.000000000 +0100
+@@ -9,7 +9,7 @@
+ #
+ # with the following defaults: 
+ 
+-IPOD_MOUNT='/mnt/ipod'				# mount point of ipod
++IPOD_MOUNT='/media/ipod'				# mount point of ipod
+ DATAFILE='~/.abook/addressbook'	                # the abook db
+ ENCODING_FROM=UTF-8                             # encoding used by abook
+ ENCODING=ISO-8859-15                            # encoding used by ipod
+diff -urNad trunk~/scripts/sync-evocalendar.sh trunk/scripts/sync-evocalendar.sh
+--- trunk~/scripts/sync-evocalendar.sh	2007-11-18 16:28:23.000000000 +0100
++++ trunk/scripts/sync-evocalendar.sh	2007-11-20 14:20:36.000000000 +0100
+@@ -10,7 +10,7 @@
+ #
+ # with the following defaults: 
+ 
+-IPOD_MOUNT=/mnt/ipod                          # mountpoint of ipod
++IPOD_MOUNT=/media/ipod                          # mountpoint of ipod
+ 
+ #the path to a script that will be passed the ical information from STDIN and filter, if needed
+ #FILTER_SCRIPT=
+diff -urNad trunk~/scripts/sync-evolution.sh trunk/scripts/sync-evolution.sh
+--- trunk~/scripts/sync-evolution.sh	2007-11-18 16:28:26.000000000 +0100
++++ trunk/scripts/sync-evolution.sh	2007-11-20 14:20:36.000000000 +0100
+@@ -13,7 +13,7 @@
+ #
+ # with the following defaults: 
+ 
+-IPOD_MOUNT=/mnt/ipod         # mountpoint of ipod
++IPOD_MOUNT=/media/ipod         # mountpoint of ipod
+ EVOPATH='/opt/gnome/libexec/evolution/2.0:/usr/lib/evolution/2.0:/opt/gnome/bin'                        # additional path
+ ENCODING=ISO-8859-15         # encoding used by ipod
+ 
+diff -urNad trunk~/scripts/sync-kaddressbook.sh trunk/scripts/sync-kaddressbook.sh
+--- trunk~/scripts/sync-kaddressbook.sh	2007-11-18 16:28:29.000000000 +0100
++++ trunk/scripts/sync-kaddressbook.sh	2007-11-20 14:20:36.000000000 +0100
+@@ -9,7 +9,7 @@
+ #
+ # with the following defaults: 
+ 
+-IPOD_MOUNT=/mnt/ipod                          # mountpoint of ipod
++IPOD_MOUNT=/media/ipod                          # mountpoint of ipod
+ DATAFILE=~/.kde/share/apps/kabc/std.vcf       # vcard file
+ ENCODING=ISO-8859-15                          # encoding used by ipod
+ 
+diff -urNad trunk~/scripts/sync-korganizer.sh trunk/scripts/sync-korganizer.sh
+--- trunk~/scripts/sync-korganizer.sh	2007-11-18 16:28:35.000000000 +0100
++++ trunk/scripts/sync-korganizer.sh	2007-11-20 14:20:36.000000000 +0100
+@@ -9,7 +9,7 @@
+ #
+ # with the following defaults: 
+ 
+-IPOD_MOUNT=/mnt/ipod                          # mountpoint of ipod
++IPOD_MOUNT=/media/ipod                          # mountpoint of ipod
+ DATAFILE=~/.kde/share/apps/korganizer/std.ics # calendar data file
+ ENCODING=ISO-8859-15                          # encoding used by ipod
+ 
+diff -urNad trunk~/scripts/sync-ldif.sh trunk/scripts/sync-ldif.sh
+--- trunk~/scripts/sync-ldif.sh	2007-11-19 18:49:28.000000000 +0100
++++ trunk/scripts/sync-ldif.sh	2007-11-20 14:20:36.000000000 +0100
+@@ -15,7 +15,7 @@
+ # differently...This is still Chinese for me!! :)
+ 
+ export LDIFAMILYNAME=contactIPOD	# Filenames will look like $LDIFAMILYNAMEXX.vcf, X=[0-9]
+-export IPOD_MOUNT=/mnt/ipod		# Mount point of the ipod
++export IPOD_MOUNT=/media/ipod		# Mount point of the ipod
+ declare LDIFILE=addressbook.ldif	# default filename 'addressbook.ldif'
+ declare ENCODING=ISO-8859-15            # To try others encodings : 'iconv --list'
+ declare DELETE="NO"			# To delete old .vcf files by default? 'NO'!!
+diff -urNad trunk~/scripts/sync-thunderbird-nano.sh trunk/scripts/sync-thunderbird-nano.sh
+--- trunk~/scripts/sync-thunderbird-nano.sh	2007-11-18 16:28:43.000000000 +0100
++++ trunk/scripts/sync-thunderbird-nano.sh	2007-11-20 14:20:36.000000000 +0100
+@@ -25,7 +25,7 @@
+ 
+ # with the following defaults: 
+ 
+-IPOD_MOUNT=/mnt/ipod         # mountpoint of ipod
++IPOD_MOUNT=/media/ipod         # mountpoint of ipod
+ ENCODING=ISO-8859-15         # encoding used by ipod
+ NAME=thunderbird             # default file export name
+ FILE_FLAG=''		     # flag used to determine end of file
+diff -urNad trunk~/scripts/sync-thunderbird.sh trunk/scripts/sync-thunderbird.sh
+--- trunk~/scripts/sync-thunderbird.sh	2007-11-18 16:28:46.000000000 +0100
++++ trunk/scripts/sync-thunderbird.sh	2007-11-20 14:20:36.000000000 +0100
+@@ -18,7 +18,7 @@
+ 
+ # with the following defaults: 
+ 
+-IPOD_MOUNT=/mnt/ipod         # mountpoint of ipod
++IPOD_MOUNT=/media/ipod         # mountpoint of ipod
+ ENCODING=ISO-8859-15         # encoding used by ipod
+ NAME=thunderbird             # default file export name
+ 
+diff -urNad trunk~/scripts/sync-webcalendar.sh trunk/scripts/sync-webcalendar.sh
+--- trunk~/scripts/sync-webcalendar.sh	2007-11-18 16:28:52.000000000 +0100
++++ trunk/scripts/sync-webcalendar.sh	2007-11-20 14:20:36.000000000 +0100
+@@ -9,7 +9,7 @@
+ # with the following defaults:
+ 
+ # mount point of ipod
+-IPOD_MOUNT='/mnt/ipod'
++IPOD_MOUNT='/media/ipod'
+ # uri for webcalendar (example)
+ DATAFILE='https://somewhere.local/calendar.ics'
+ # calendar name
+diff -urNad trunk~/src/prefs.c trunk/src/prefs.c
+--- trunk~/src/prefs.c	2007-11-18 16:45:09.000000000 +0100
++++ trunk/src/prefs.c	2007-11-20 14:20:44.000000000 +0100
+@@ -178,7 +178,7 @@
+     prefs_set_int("delete_file", TRUE);
+     prefs_set_int("delete_local_file", TRUE);
+     prefs_set_int("delete_database", TRUE);
+-    prefs_set_string("initial_mountpoint", "/mnt/ipod");
++    prefs_set_string("initial_mountpoint", "/media/ipod");
+     prefs_set_string ("path_play_now", "xmms %s");
+     prefs_set_string ("path_play_enqueue", "xmms -e %s");
+     prefs_set_string ("path_mserv_trackinfo_root", "/var/lib/mserv/trackinfo/");


Property changes on: trunk/debian/patches/01_mountpoint.dpatch
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/debian/patches/02_missing_fclose.dpatch
===================================================================
--- trunk/debian/patches/02_missing_fclose.dpatch	                        (rev 0)
+++ trunk/debian/patches/02_missing_fclose.dpatch	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,18 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## 02_missing_fclose.dpatch by Nico Golde <nion at debian.org>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: No description.
+
+ at DPATCH@
+diff -urNad gtkpod-0.99.10~/src/mp3file.c gtkpod-0.99.10/src/mp3file.c
+--- gtkpod-0.99.10~/src/mp3file.c	2007-06-27 21:29:33.000000000 +0200
++++ gtkpod-0.99.10/src/mp3file.c	2007-11-18 14:02:07.000000000 +0100
+@@ -2353,6 +2353,7 @@
+     gd->gapless_data = totaldatasize - finaleight;
+     /* total samples minus pre/postgap */
+     gd->samplecount = totalframes * mysamplesperframe - gd->pregap - gd->postgap;
++	fclose(file);
+ 
+     return TRUE;
+ 


Property changes on: trunk/debian/patches/02_missing_fclose.dpatch
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/debian/patches/03_itdb-set-local-to-imported.dpatch
===================================================================
--- trunk/debian/patches/03_itdb-set-local-to-imported.dpatch	                        (rev 0)
+++ trunk/debian/patches/03_itdb-set-local-to-imported.dpatch	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,32 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## itdb-set-local-to-imported.dpatch by John Dong <jdong at ubuntu.com>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: Set local iTunesDB's imported status to TRUE
+## DP: Stolen-from: Upstream SVN revno 1596
+## DP:  Resolves a bug where a fresh Local repository refuses to accept
+## DP:  new track additions, such as LP #145506
+
+ at DPATCH@
+diff -urNad gtkpod-aac-0.99.10~/src/display_itdb.c gtkpod-aac-0.99.10/src/display_itdb.c
+--- gtkpod-aac-0.99.10~/src/display_itdb.c	2007-06-27 15:29:33.000000000 -0400
++++ gtkpod-aac-0.99.10/src/display_itdb.c	2007-11-16 23:59:54.000000000 -0500
+@@ -998,8 +998,16 @@
+ 	    itdb_playlist_set_mpl (pl);
+ 	    itdb_playlist_add (itdb, pl, -1);
+ 
+-	    eitdb->data_changed = FALSE;
+-	    eitdb->itdb_imported = FALSE;
++           if ((type & GP_ITDB_TYPE_PODCASTS) || (type & GP_ITDB_TYPE_LOCAL))
++             {
++               eitdb->data_changed = TRUE;
++               eitdb->itdb_imported = TRUE;
++             }
++           else
++             {
++               eitdb->data_changed = FALSE;
++               eitdb->itdb_imported = FALSE;
++             }
+ 	}
+ 	else
+ 	{


Property changes on: trunk/debian/patches/03_itdb-set-local-to-imported.dpatch
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/debian/rules
===================================================================
--- trunk/debian/rules	                        (rev 0)
+++ trunk/debian/rules	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,66 @@
+#!/usr/bin/make -f
+
+DEB_HOST_GNU_TYPE   ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
+DEB_BUILD_GNU_TYPE  ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
+
+CFLAGS = -Wall -g
+
+include /usr/share/dpatch/dpatch.make
+
+ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
+	CFLAGS += -O0
+else
+	CFLAGS += -O2
+endif
+
+config.status: patch-stamp configure
+	dh_testdir
+	CFLAGS="$(CFLAGS)" ./configure --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) --prefix=/usr --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info
+
+build: build-stamp
+
+build-stamp:  config.status
+	dh_testdir
+
+	$(MAKE)
+	pod2man --release "gtkpod 0.99.10" --center "gtkpod Manual" debian/gtkpod.pod >gtkpod.1
+	touch build-stamp
+
+clean: unpatch
+	dh_testdir
+	dh_testroot
+	rm -f build-stamp gtkpod.1 pixmaps/gtkpod.glade*
+	[ ! -f Makefile ] || $(MAKE) distclean
+	dh_clean
+
+install: build
+	dh_testdir
+	dh_testroot
+	dh_clean -k
+	dh_installdirs
+	$(MAKE) install DESTDIR=$(CURDIR)/debian/gtkpod
+
+binary-indep: build install
+
+binary-arch: build install
+	dh_testdir
+	dh_testroot
+	dh_installchangelogs ChangeLog
+	dh_installdocs
+	dh_installmenu
+	dh_installman gtkpod.1
+	dh_install
+	dh_desktop
+	dh_link
+	dh_strip
+	dh_compress
+	dh_fixperms
+	dh_makeshlibs
+	dh_installdeb
+	dh_shlibdeps
+	dh_gencontrol
+	dh_md5sums
+	dh_builddeb
+
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install 


Property changes on: trunk/debian/rules
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/debian/watch
===================================================================
--- trunk/debian/watch	                        (rev 0)
+++ trunk/debian/watch	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,3 @@
+version=3
+# yes, this is to avoid sf's perverse mirror system
+http://qa.debian.org/watch/sf.php/gtkpod gtkpod-(.*).tar.gz

Added: trunk/depcomp
===================================================================
--- trunk/depcomp	                        (rev 0)
+++ trunk/depcomp	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,584 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2006-10-15.18
+
+# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006 Free Software
+# Foundation, Inc.
+
+# 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, 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.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva at dcc.unicamp.br>.
+
+case $1 in
+  '')
+     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
+     exit 1;
+     ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+  depmode     Dependency tracking mode.
+  source      Source file read by `PROGRAMS ARGS'.
+  object      Object file output by `PROGRAMS ARGS'.
+  DEPDIR      directory where to store dependencies.
+  depfile     Dependency file to output.
+  tmpdepfile  Temporary file to use when outputing dependencies.
+  libtool     Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake at gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "depcomp $scriptversion"
+    exit $?
+    ;;
+esac
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+  echo "depcomp: Variables source, object and depmode must be set" 1>&2
+  exit 1
+fi
+
+# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
+depfile=${depfile-`echo "$object" |
+  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Some modes work just like other modes, but use different flags.  We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write.  Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+  # HP compiler uses -M and no extra arg.
+  gccflag=-M
+  depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+   # This is just like dashmstdout with a different argument.
+   dashmflag=-xM
+   depmode=dashmstdout
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff.  Hmm.
+## Unfortunately, FreeBSD c89 acceptance of flags depends upon
+## the command line argument order; so add the flags where they
+## appear in depend2.am.  Note that the slowdown incurred here
+## affects only configure: in makefiles, %FASTDEP% shortcuts this.
+  for arg
+  do
+    case $arg in
+    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
+    *)  set fnord "$@" "$arg" ;;
+    esac
+    shift # fnord
+    shift # $arg
+  done
+  "$@"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  mv "$tmpdepfile" "$depfile"
+  ;;
+
+gcc)
+## There are various ways to get dependency output from gcc.  Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+##   up in a subdir.  Having to rename by hand is ugly.
+##   (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+##   -MM, not -M (despite what the docs say).
+## - Using -M directly means running the compiler twice (even worse
+##   than renaming).
+  if test -z "$gccflag"; then
+    gccflag=-MD,
+  fi
+  "$@" -Wp,"$gccflag$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
+## The second -e expression handles DOS-style file names with drive letters.
+  sed -e 's/^[^:]*: / /' \
+      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the `deleted header file' problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header).  We avoid this by adding
+## dummy dependencies for each header file.  Too bad gcc doesn't do
+## this for us directly.
+  tr ' ' '
+' < "$tmpdepfile" |
+## Some versions of gcc put a space before the `:'.  On the theory
+## that the space means something, we add a space to the output as
+## well.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+sgi)
+  if test "$libtool" = yes; then
+    "$@" "-Wp,-MDupdate,$tmpdepfile"
+  else
+    "$@" -MDupdate "$tmpdepfile"
+  fi
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+
+  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
+    echo "$object : \\" > "$depfile"
+
+    # Clip off the initial element (the dependent).  Don't try to be
+    # clever and replace this with sed code, as IRIX sed won't handle
+    # lines with more than a fixed number of characters (4096 in
+    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
+    # the IRIX cc adds comments like `#:fec' to the end of the
+    # dependency line.
+    tr ' ' '
+' < "$tmpdepfile" \
+    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
+    tr '
+' ' ' >> $depfile
+    echo >> $depfile
+
+    # The second pass generates a dummy entry for each header file.
+    tr ' ' '
+' < "$tmpdepfile" \
+   | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+   >> $depfile
+  else
+    # The sourcefile does not contain any dependencies, so just
+    # store a dummy comment line, to avoid errors with the Makefile
+    # "include basename.Plo" scheme.
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+aix)
+  # The C for AIX Compiler uses -M and outputs the dependencies
+  # in a .u file.  In older versions, this file always lives in the
+  # current directory.  Also, the AIX compiler puts `$object:' at the
+  # start of each line; $object doesn't have directory information.
+  # Version 6 uses the directory in both cases.
+  stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'`
+  tmpdepfile="$stripped.u"
+  if test "$libtool" = yes; then
+    "$@" -Wc,-M
+  else
+    "$@" -M
+  fi
+  stat=$?
+
+  if test -f "$tmpdepfile"; then :
+  else
+    stripped=`echo "$stripped" | sed 's,^.*/,,'`
+    tmpdepfile="$stripped.u"
+  fi
+
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+
+  if test -f "$tmpdepfile"; then
+    outname="$stripped.o"
+    # Each line is of the form `foo.o: dependent.h'.
+    # Do two passes, one to just change these to
+    # `$object: dependent.h' and one to simply `dependent.h:'.
+    sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile"
+    sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
+  else
+    # The sourcefile does not contain any dependencies, so just
+    # store a dummy comment line, to avoid errors with the Makefile
+    # "include basename.Plo" scheme.
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+icc)
+  # Intel's C compiler understands `-MD -MF file'.  However on
+  #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
+  # ICC 7.0 will fill foo.d with something like
+  #    foo.o: sub/foo.c
+  #    foo.o: sub/foo.h
+  # which is wrong.  We want:
+  #    sub/foo.o: sub/foo.c
+  #    sub/foo.o: sub/foo.h
+  #    sub/foo.c:
+  #    sub/foo.h:
+  # ICC 7.1 will output
+  #    foo.o: sub/foo.c sub/foo.h
+  # and will wrap long lines using \ :
+  #    foo.o: sub/foo.c ... \
+  #     sub/foo.h ... \
+  #     ...
+
+  "$@" -MD -MF "$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  # Each line is of the form `foo.o: dependent.h',
+  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+  # Do two passes, one to just change these to
+  # `$object: dependent.h' and one to simply `dependent.h:'.
+  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
+    sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp2)
+  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
+  # compilers, which have integrated preprocessors.  The correct option
+  # to use with these is +Maked; it writes dependencies to a file named
+  # 'foo.d', which lands next to the object file, wherever that
+  # happens to be.
+  # Much of this is similar to the tru64 case; see comments there.
+  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+  test "x$dir" = "x$object" && dir=
+  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir.libs/$base.d
+    "$@" -Wc,+Maked
+  else
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir$base.d
+    "$@" +Maked
+  fi
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+     rm -f "$tmpdepfile1" "$tmpdepfile2"
+     exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  if test -f "$tmpdepfile"; then
+    sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
+    # Add `dependent.h:' lines.
+    sed -ne '2,${; s/^ *//; s/ \\*$//; s/$/:/; p;}' "$tmpdepfile" >> "$depfile"
+  else
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile" "$tmpdepfile2"
+  ;;
+
+tru64)
+   # The Tru64 compiler uses -MD to generate dependencies as a side
+   # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
+   # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+   # dependencies in `foo.d' instead, so we check for that too.
+   # Subdirectories are respected.
+   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+   test "x$dir" = "x$object" && dir=
+   base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+
+   if test "$libtool" = yes; then
+      # With Tru64 cc, shared objects can also be used to make a
+      # static library.  This mechanism is used in libtool 1.4 series to
+      # handle both shared and static libraries in a single compilation.
+      # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
+      #
+      # With libtool 1.5 this exception was removed, and libtool now
+      # generates 2 separate objects for the 2 libraries.  These two
+      # compilations output dependencies in $dir.libs/$base.o.d and
+      # in $dir$base.o.d.  We have to check for both files, because
+      # one of the two compilations can be disabled.  We should prefer
+      # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+      # automatically cleaned when .libs/ is deleted, while ignoring
+      # the former would cause a distcleancheck panic.
+      tmpdepfile1=$dir.libs/$base.lo.d   # libtool 1.4
+      tmpdepfile2=$dir$base.o.d          # libtool 1.5
+      tmpdepfile3=$dir.libs/$base.o.d    # libtool 1.5
+      tmpdepfile4=$dir.libs/$base.d      # Compaq CCC V6.2-504
+      "$@" -Wc,-MD
+   else
+      tmpdepfile1=$dir$base.o.d
+      tmpdepfile2=$dir$base.d
+      tmpdepfile3=$dir$base.d
+      tmpdepfile4=$dir$base.d
+      "$@" -MD
+   fi
+
+   stat=$?
+   if test $stat -eq 0; then :
+   else
+      rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+      exit $stat
+   fi
+
+   for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+   do
+     test -f "$tmpdepfile" && break
+   done
+   if test -f "$tmpdepfile"; then
+      sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+      # That's a tab and a space in the [].
+      sed -e 's,^.*\.[a-z]*:[	 ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+   else
+      echo "#dummy" > "$depfile"
+   fi
+   rm -f "$tmpdepfile"
+   ;;
+
+#nosideeffect)
+  # This comment above is used by automake to tell side-effect
+  # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout, regardless of -o.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test $1 != '--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove `-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  test -z "$dashmflag" && dashmflag=-M
+  # Require at least two characters before searching for `:'
+  # in the target name.  This is to cope with DOS-style filenames:
+  # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
+  "$@" $dashmflag |
+    sed 's:^[  ]*[^: ][^:][^:]*\:[    ]*:'"$object"'\: :' > "$tmpdepfile"
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  tr ' ' '
+' < "$tmpdepfile" | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+dashXmstdout)
+  # This case only exists to satisfy depend.m4.  It is never actually
+  # run, as this mode is specially recognized in the preamble.
+  exit 1
+  ;;
+
+makedepend)
+  "$@" || exit $?
+  # Remove any Libtool call
+  if test "$libtool" = yes; then
+    while test $1 != '--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+  # X makedepend
+  shift
+  cleared=no
+  for arg in "$@"; do
+    case $cleared in
+    no)
+      set ""; shift
+      cleared=yes ;;
+    esac
+    case "$arg" in
+    -D*|-I*)
+      set fnord "$@" "$arg"; shift ;;
+    # Strip any option that makedepend may not understand.  Remove
+    # the object too, otherwise makedepend will parse it as a source file.
+    -*|$object)
+      ;;
+    *)
+      set fnord "$@" "$arg"; shift ;;
+    esac
+  done
+  obj_suffix="`echo $object | sed 's/^.*\././'`"
+  touch "$tmpdepfile"
+  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  sed '1,2d' "$tmpdepfile" | tr ' ' '
+' | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile" "$tmpdepfile".bak
+  ;;
+
+cpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test $1 != '--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove `-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  "$@" -E |
+    sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+       -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
+    sed '$ s: \\$::' > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  cat < "$tmpdepfile" >> "$depfile"
+  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvisualcpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout, regardless of -o,
+  # because we must use -o when running libtool.
+  "$@" || exit $?
+  IFS=" "
+  for arg
+  do
+    case "$arg" in
+    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+	set fnord "$@"
+	shift
+	shift
+	;;
+    *)
+	set fnord "$@" "$arg"
+	shift
+	shift
+	;;
+    esac
+  done
+  "$@" -E |
+  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::	\1 \\:p' >> "$depfile"
+  echo "	" >> "$depfile"
+  . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+none)
+  exec "$@"
+  ;;
+
+*)
+  echo "Unknown depmode $depmode" 1>&2
+  exit 1
+  ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:


Property changes on: trunk/depcomp
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/install-sh
===================================================================
--- trunk/install-sh	                        (rev 0)
+++ trunk/install-sh	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,507 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2006-10-14.15
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+
+nl='
+'
+IFS=" ""	$nl"
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+if test -z "$doit"; then
+  doit_exec=exec
+else
+  doit_exec=$doit
+fi
+
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+posix_glob=
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+chmodcmd=$chmodprog
+chowncmd=
+chgrpcmd=
+stripcmd=
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=
+dst=
+dir_arg=
+dstarg=
+no_target_directory=
+
+usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+   or: $0 [OPTION]... SRCFILES... DIRECTORY
+   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+   or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+-c         (ignored)
+-d         create directories instead of installing files.
+-g GROUP   $chgrpprog installed files to GROUP.
+-m MODE    $chmodprog installed files to MODE.
+-o USER    $chownprog installed files to USER.
+-s         $stripprog installed files.
+-t DIRECTORY  install into DIRECTORY.
+-T         report an error if DSTFILE is a directory.
+--help     display this help and exit.
+--version  display version info and exit.
+
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
+"
+
+while test $# -ne 0; do
+  case $1 in
+    -c) shift
+        continue;;
+
+    -d) dir_arg=true
+        shift
+        continue;;
+
+    -g) chgrpcmd="$chgrpprog $2"
+        shift
+        shift
+        continue;;
+
+    --help) echo "$usage"; exit $?;;
+
+    -m) mode=$2
+        shift
+        shift
+	case $mode in
+	  *' '* | *'	'* | *'
+'*	  | *'*'* | *'?'* | *'['*)
+	    echo "$0: invalid mode: $mode" >&2
+	    exit 1;;
+	esac
+        continue;;
+
+    -o) chowncmd="$chownprog $2"
+        shift
+        shift
+        continue;;
+
+    -s) stripcmd=$stripprog
+        shift
+        continue;;
+
+    -t) dstarg=$2
+	shift
+	shift
+	continue;;
+
+    -T) no_target_directory=true
+	shift
+	continue;;
+
+    --version) echo "$0 $scriptversion"; exit $?;;
+
+    --)	shift
+	break;;
+
+    -*)	echo "$0: invalid option: $1" >&2
+	exit 1;;
+
+    *)  break;;
+  esac
+done
+
+if test $# -ne 0 && test -z "$dir_arg$dstarg"; then
+  # When -d is used, all remaining arguments are directories to create.
+  # When -t is used, the destination is already specified.
+  # Otherwise, the last argument is the destination.  Remove it from $@.
+  for arg
+  do
+    if test -n "$dstarg"; then
+      # $@ is not empty: it contains at least $arg.
+      set fnord "$@" "$dstarg"
+      shift # fnord
+    fi
+    shift # arg
+    dstarg=$arg
+  done
+fi
+
+if test $# -eq 0; then
+  if test -z "$dir_arg"; then
+    echo "$0: no input file specified." >&2
+    exit 1
+  fi
+  # It's OK to call `install-sh -d' without argument.
+  # This can happen when creating conditional directories.
+  exit 0
+fi
+
+if test -z "$dir_arg"; then
+  trap '(exit $?); exit' 1 2 13 15
+
+  # Set umask so as not to create temps with too-generous modes.
+  # However, 'strip' requires both read and write access to temps.
+  case $mode in
+    # Optimize common cases.
+    *644) cp_umask=133;;
+    *755) cp_umask=22;;
+
+    *[0-7])
+      if test -z "$stripcmd"; then
+	u_plus_rw=
+      else
+	u_plus_rw='% 200'
+      fi
+      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+    *)
+      if test -z "$stripcmd"; then
+	u_plus_rw=
+      else
+	u_plus_rw=,u+rw
+      fi
+      cp_umask=$mode$u_plus_rw;;
+  esac
+fi
+
+for src
+do
+  # Protect names starting with `-'.
+  case $src in
+    -*) src=./$src ;;
+  esac
+
+  if test -n "$dir_arg"; then
+    dst=$src
+    dstdir=$dst
+    test -d "$dstdir"
+    dstdir_status=$?
+  else
+
+    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+    # might cause directories to be created, which would be especially bad
+    # if $src (and thus $dsttmp) contains '*'.
+    if test ! -f "$src" && test ! -d "$src"; then
+      echo "$0: $src does not exist." >&2
+      exit 1
+    fi
+
+    if test -z "$dstarg"; then
+      echo "$0: no destination specified." >&2
+      exit 1
+    fi
+
+    dst=$dstarg
+    # Protect names starting with `-'.
+    case $dst in
+      -*) dst=./$dst ;;
+    esac
+
+    # If destination is a directory, append the input filename; won't work
+    # if double slashes aren't ignored.
+    if test -d "$dst"; then
+      if test -n "$no_target_directory"; then
+	echo "$0: $dstarg: Is a directory" >&2
+	exit 1
+      fi
+      dstdir=$dst
+      dst=$dstdir/`basename "$src"`
+      dstdir_status=0
+    else
+      # Prefer dirname, but fall back on a substitute if dirname fails.
+      dstdir=`
+	(dirname "$dst") 2>/dev/null ||
+	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	     X"$dst" : 'X\(//\)[^/]' \| \
+	     X"$dst" : 'X\(//\)$' \| \
+	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
+	echo X"$dst" |
+	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)[^/].*/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\).*/{
+		   s//\1/
+		   q
+		 }
+		 s/.*/./; q'
+      `
+
+      test -d "$dstdir"
+      dstdir_status=$?
+    fi
+  fi
+
+  obsolete_mkdir_used=false
+
+  if test $dstdir_status != 0; then
+    case $posix_mkdir in
+      '')
+	# Create intermediate dirs using mode 755 as modified by the umask.
+	# This is like FreeBSD 'install' as of 1997-10-28.
+	umask=`umask`
+	case $stripcmd.$umask in
+	  # Optimize common cases.
+	  *[2367][2367]) mkdir_umask=$umask;;
+	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+	  *[0-7])
+	    mkdir_umask=`expr $umask + 22 \
+	      - $umask % 100 % 40 + $umask % 20 \
+	      - $umask % 10 % 4 + $umask % 2
+	    `;;
+	  *) mkdir_umask=$umask,go-w;;
+	esac
+
+	# With -d, create the new directory with the user-specified mode.
+	# Otherwise, rely on $mkdir_umask.
+	if test -n "$dir_arg"; then
+	  mkdir_mode=-m$mode
+	else
+	  mkdir_mode=
+	fi
+
+	posix_mkdir=false
+	case $umask in
+	  *[123567][0-7][0-7])
+	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
+	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+	    ;;
+	  *)
+	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+	    if (umask $mkdir_umask &&
+		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
+	    then
+	      if test -z "$dir_arg" || {
+		   # Check for POSIX incompatibilities with -m.
+		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+		   # other-writeable bit of parent directory when it shouldn't.
+		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
+		   case $ls_ld_tmpdir in
+		     d????-?r-*) different_mode=700;;
+		     d????-?--*) different_mode=755;;
+		     *) false;;
+		   esac &&
+		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
+		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
+		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+		   }
+		 }
+	      then posix_mkdir=:
+	      fi
+	      rmdir "$tmpdir/d" "$tmpdir"
+	    else
+	      # Remove any dirs left behind by ancient mkdir implementations.
+	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
+	    fi
+	    trap '' 0;;
+	esac;;
+    esac
+
+    if
+      $posix_mkdir && (
+	umask $mkdir_umask &&
+	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+      )
+    then :
+    else
+
+      # The umask is ridiculous, or mkdir does not conform to POSIX,
+      # or it failed possibly due to a race condition.  Create the
+      # directory the slow way, step by step, checking for races as we go.
+
+      case $dstdir in
+	/*) prefix=/ ;;
+	-*) prefix=./ ;;
+	*)  prefix= ;;
+      esac
+
+      case $posix_glob in
+        '')
+	  if (set -f) 2>/dev/null; then
+	    posix_glob=true
+	  else
+	    posix_glob=false
+	  fi ;;
+      esac
+
+      oIFS=$IFS
+      IFS=/
+      $posix_glob && set -f
+      set fnord $dstdir
+      shift
+      $posix_glob && set +f
+      IFS=$oIFS
+
+      prefixes=
+
+      for d
+      do
+	test -z "$d" && continue
+
+	prefix=$prefix$d
+	if test -d "$prefix"; then
+	  prefixes=
+	else
+	  if $posix_mkdir; then
+	    (umask=$mkdir_umask &&
+	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+	    # Don't fail if two instances are running concurrently.
+	    test -d "$prefix" || exit 1
+	  else
+	    case $prefix in
+	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+	      *) qprefix=$prefix;;
+	    esac
+	    prefixes="$prefixes '$qprefix'"
+	  fi
+	fi
+	prefix=$prefix/
+      done
+
+      if test -n "$prefixes"; then
+	# Don't fail if two instances are running concurrently.
+	(umask $mkdir_umask &&
+	 eval "\$doit_exec \$mkdirprog $prefixes") ||
+	  test -d "$dstdir" || exit 1
+	obsolete_mkdir_used=true
+      fi
+    fi
+  fi
+
+  if test -n "$dir_arg"; then
+    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+  else
+
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=$dstdir/_inst.$$_
+    rmtmp=$dstdir/_rm.$$_
+
+    # Trap to clean up those temp files at exit.
+    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+    # Copy the file name to the temp name.
+    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
+
+    # and set any options; do chmod last to preserve setuid bits.
+    #
+    # If any of these fail, we abort the whole thing.  If we want to
+    # ignore errors from any of these, just make sure not to ignore
+    # errors from the above "$doit $cpprog $src $dsttmp" command.
+    #
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
+      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
+      && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
+      && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+    # Now rename the file to the real destination.
+    { $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null \
+      || {
+	   # The rename failed, perhaps because mv can't rename something else
+	   # to itself, or perhaps because mv is so ancient that it does not
+	   # support -f.
+
+	   # Now remove or move aside any old file at destination location.
+	   # We try this two ways since rm can't unlink itself on some
+	   # systems and the destination file might be busy for other
+	   # reasons.  In this case, the final cleanup might fail but the new
+	   # file should still install successfully.
+	   {
+	     if test -f "$dst"; then
+	       $doit $rmcmd -f "$dst" 2>/dev/null \
+	       || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null \
+		     && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }; }\
+	       || {
+		 echo "$0: cannot unlink or rename $dst" >&2
+		 (exit 1); exit 1
+	       }
+	     else
+	       :
+	     fi
+	   } &&
+
+	   # Now rename the file to the real destination.
+	   $doit $mvcmd "$dsttmp" "$dst"
+	 }
+    } || exit 1
+
+    trap '' 0
+  fi
+done
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:


Property changes on: trunk/install-sh
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/intltool-extract.in
===================================================================
--- trunk/intltool-extract.in	                        (rev 0)
+++ trunk/intltool-extract.in	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,861 @@
+#!@INTLTOOL_PERL@ -w 
+# -*- Mode: perl; indent-tabs-mode: nil; c-basic-offset: 4  -*-
+
+#
+#  The Intltool Message Extractor
+#
+#  Copyright (C) 2000-2001, 2003 Free Software Foundation.
+#
+#  Intltool 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.
+#
+#  Intltool 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+#  As a special exception to the GNU General Public License, if you
+#  distribute this file as part of a program that contains a
+#  configuration script generated by Autoconf, you may include it under
+#  the same distribution terms that you use for the rest of that program.
+#
+#  Authors: Kenneth Christiansen <kenneth at gnu.org>
+#           Darin Adler <darin at bentspoon.com>
+#
+
+## Release information
+my $PROGRAM      = "intltool-extract";
+my $PACKAGE      = "intltool";
+my $VERSION      = "0.36.2";
+
+## Loaded modules
+use strict; 
+use File::Basename;
+use Getopt::Long;
+
+## Scalars used by the option stuff
+my $TYPE_ARG	= "0";
+my $LOCAL_ARG	= "0";
+my $HELP_ARG 	= "0";
+my $VERSION_ARG = "0";
+my $UPDATE_ARG  = "0";
+my $QUIET_ARG   = "0";
+my $SRCDIR_ARG	= ".";
+
+my $FILE;
+my $OUTFILE;
+
+my $gettext_type = "";
+my $input;
+my %messages = ();
+my %loc = ();
+my %count = ();
+my %comments = ();
+my $strcount = 0;
+
+my $XMLCOMMENT = "";
+
+## Use this instead of \w for XML files to handle more possible characters.
+my $w = "[-A-Za-z0-9._:]";
+
+## Always print first
+$| = 1;
+
+## Handle options
+GetOptions (
+	    "type=s"     => \$TYPE_ARG,
+            "local|l"    => \$LOCAL_ARG,
+            "help|h"     => \$HELP_ARG,
+            "version|v"  => \$VERSION_ARG,
+            "update"     => \$UPDATE_ARG,
+	    "quiet|q"    => \$QUIET_ARG,
+	    "srcdir=s"	 => \$SRCDIR_ARG,
+            ) or &error;
+
+&split_on_argument;
+
+
+## Check for options. 
+## This section will check for the different options.
+
+sub split_on_argument {
+
+    if ($VERSION_ARG) {
+        &version;
+
+    } elsif ($HELP_ARG) {
+	&help;
+        
+    } elsif ($LOCAL_ARG) {
+        &place_local;
+        &extract;
+
+    } elsif ($UPDATE_ARG) {
+	&place_normal;
+	&extract;
+
+    } elsif (@ARGV > 0) {
+	&place_normal;
+	&message;
+	&extract;
+
+    } else {
+	&help;
+
+    }  
+}    
+
+sub place_normal {
+    $FILE	 = $ARGV[0];
+    $OUTFILE     = "$FILE.h";
+
+    my $dirname = dirname ($OUTFILE);
+    if (! -d "$dirname" && $dirname ne "") {
+        system ("mkdir -p $dirname");
+    }
+}   
+
+sub place_local {
+    $FILE	 = $ARGV[0];
+    $OUTFILE     = fileparse($FILE, ());
+    if (!-e "tmp/") { 
+        system("mkdir tmp/"); 
+    }
+    $OUTFILE     = "./tmp/$OUTFILE.h"
+}
+
+sub determine_type {
+   if ($TYPE_ARG =~ /^gettext\/(.*)/) {
+	$gettext_type=$1
+   }
+}
+
+## Sub for printing release information
+sub version{
+    print <<_EOF_;
+${PROGRAM} (${PACKAGE}) $VERSION
+Copyright (C) 2000, 2003 Free Software Foundation, Inc.
+Written by Kenneth Christiansen, 2000.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+_EOF_
+    exit;
+}
+
+## Sub for printing usage information
+sub help {
+    print <<_EOF_;
+Usage: ${PROGRAM} [OPTION]... [FILENAME]
+Generates a header file from an XML source file.
+
+It grabs all strings between <_translatable_node> and its end tag in
+XML files. Read manpage (man ${PROGRAM}) for more info.
+
+      --type=TYPE   Specify the file type of FILENAME. Currently supports:
+                    "gettext/glade", "gettext/ini", "gettext/keys"
+                    "gettext/rfc822deb", "gettext/schemas",
+                    "gettext/scheme", "gettext/xml", "gettext/quoted"
+  -l, --local       Writes output into current working directory
+                    (conflicts with --update)
+      --update      Writes output into the same directory the source file 
+                    reside (conflicts with --local)
+      --srcdir      Root of the source tree
+  -v, --version     Output version information and exit
+  -h, --help        Display this help and exit
+  -q, --quiet       Quiet mode
+
+Report bugs to http://bugzilla.gnome.org/ (product name "$PACKAGE")
+or send email to <xml-i18n-tools\@gnome.org>.
+_EOF_
+    exit;
+}
+
+## Sub for printing error messages
+sub error{
+    print STDERR "Try `${PROGRAM} --help' for more information.\n";
+    exit;
+}
+
+sub message {
+    print "Generating C format header file for translation.\n" unless $QUIET_ARG;
+}
+
+sub extract {
+    &determine_type;
+
+    &convert;
+
+    open OUT, ">$OUTFILE";
+    binmode (OUT) if $^O eq 'MSWin32';
+    &msg_write;
+    close OUT;
+
+    print "Wrote $OUTFILE\n" unless $QUIET_ARG;
+}
+
+sub convert {
+
+    ## Reading the file
+    {
+	local (*IN);
+	local $/; #slurp mode
+	open (IN, "<$SRCDIR_ARG/$FILE") || die "can't open $SRCDIR_ARG/$FILE: $!";
+	$input = <IN>;
+    }
+
+    &type_ini if $gettext_type eq "ini";
+    &type_keys if $gettext_type eq "keys";
+    &type_xml if $gettext_type eq "xml";
+    &type_glade if $gettext_type eq "glade";
+    &type_scheme if $gettext_type eq "scheme";
+    &type_schemas  if $gettext_type eq "schemas";
+    &type_rfc822deb  if $gettext_type eq "rfc822deb";
+    &type_quoted if $gettext_type eq "quoted";
+}
+
+sub entity_decode_minimal
+{
+    local ($_) = @_;
+
+    s/&apos;/'/g; # '
+    s/&quot;/"/g; # "
+    s/&amp;/&/g;
+
+    return $_;
+}
+
+sub entity_decode
+{
+    local ($_) = @_;
+
+    s/&apos;/'/g; # '
+    s/&quot;/"/g; # "
+    s/&lt;/</g;
+    s/&gt;/>/g;
+    s/&amp;/&/g;
+
+    return $_;
+}
+
+sub escape_char
+{
+    return '\"' if $_ eq '"';
+    return '\n' if $_ eq "\n";
+    return '\\\\' if $_ eq '\\';
+
+    return $_;
+}
+
+sub escape
+{
+    my ($string) = @_;
+    return join "", map &escape_char, split //, $string;
+}
+
+sub type_ini {
+    ### For generic translatable desktop files ###
+    while ($input =~ /^(#(.+)\n)?^_.*=(.*)$/mg) {
+        if (defined($2))  {
+            $comments{$3} = $2;
+        }
+        $messages{$3} = [];
+    }
+}
+
+sub type_keys {
+    ### For generic translatable mime/keys files ###
+    while ($input =~ /^\s*_\w+=(.*)$/mg) {
+        $messages{$1} = [];
+    }
+}
+
+sub type_xml {
+    ### For generic translatable XML files ###
+    my $tree = readXml($input);
+    parseTree(0, $tree);
+}
+
+sub print_var {
+    my $var = shift;
+    my $vartype = ref $var;
+    
+    if ($vartype =~ /ARRAY/) {
+        my @arr = @{$var};
+        print "[ ";
+        foreach my $el (@arr) {
+            print_var($el);
+            print ", ";
+        }
+        print "] ";
+    } elsif ($vartype =~ /HASH/) {
+        my %hash = %{$var};
+        print "{ ";
+        foreach my $key (keys %hash) {
+            print "$key => ";
+            print_var($hash{$key});
+            print ", ";
+        }
+        print "} ";
+    } else {
+        print $var;
+    }
+}
+
+# Same syntax as getAttributeString in intltool-merge.in.in, similar logic (look for ## differences comment)
+sub getAttributeString
+{
+    my $sub = shift;
+    my $do_translate = shift || 1;
+    my $language = shift || "";
+    my $translate = shift;
+    my $result = "";
+    foreach my $e (reverse(sort(keys %{ $sub }))) {
+	my $key    = $e;
+	my $string = $sub->{$e};
+	my $quote = '"';
+	
+	$string =~ s/^[\s]+//;
+	$string =~ s/[\s]+$//;
+	
+	if ($string =~ /^'.*'$/)
+	{
+	    $quote = "'";
+	}
+	$string =~ s/^['"]//g;
+	$string =~ s/['"]$//g;
+
+        ## differences from intltool-merge.in.in
+	if ($key =~ /^_/) {
+            $comments{entity_decode($string)} = $XMLCOMMENT if $XMLCOMMENT;
+            $messages{entity_decode($string)} = [];
+            $$translate = 2;
+	}
+        ## differences end here from intltool-merge.in.in
+	$result .= " $key=$quote$string$quote";
+    }
+    return $result;
+}
+
+# Verbatim copy from intltool-merge.in.in
+sub getXMLstring
+{
+    my $ref = shift;
+    my $spacepreserve = shift || 0;
+    my @list = @{ $ref };
+    my $result = "";
+
+    my $count = scalar(@list);
+    my $attrs = $list[0];
+    my $index = 1;
+
+    $spacepreserve = 1 if ((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?preserve["']?$/));
+    $spacepreserve = 0 if ((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?default["']?$/));
+
+    while ($index < $count) {
+	my $type = $list[$index];
+	my $content = $list[$index+1];
+        if (! $type ) {
+	    # We've got CDATA
+	    if ($content) {
+		# lets strip the whitespace here, and *ONLY* here
+                $content =~ s/\s+/ /gs if (!$spacepreserve);
+		$result .= $content;
+	    }
+	} elsif ( "$type" ne "1" ) {
+	    # We've got another element
+	    $result .= "<$type";
+	    $result .= getAttributeString(@{$content}[0], 0); # no nested translatable elements
+	    if ($content) {
+		my $subresult = getXMLstring($content, $spacepreserve);
+		if ($subresult) {
+		    $result .= ">".$subresult . "</$type>";
+		} else {
+		    $result .= "/>";
+		}
+	    } else {
+		$result .= "/>";
+	    }
+	}
+	$index += 2;
+    }
+    return $result;
+}
+
+# Verbatim copy from intltool-merge.in.in, except for MULTIPLE_OUTPUT handling removed
+# Translate list of nodes if necessary
+sub translate_subnodes
+{
+    my $fh = shift;
+    my $content = shift;
+    my $language = shift || "";
+    my $singlelang = shift || 0;
+    my $spacepreserve = shift || 0;
+
+    my @nodes = @{ $content };
+
+    my $count = scalar(@nodes);
+    my $index = 0;
+    while ($index < $count) {
+        my $type = $nodes[$index];
+        my $rest = $nodes[$index+1];
+        traverse($fh, $type, $rest, $language, $spacepreserve);
+        $index += 2;
+    }
+}
+
+# Based on traverse() in intltool-merge.in.in
+sub traverse
+{
+    my $fh = shift; # unused, to allow us to sync code between -merge and -extract
+    my $nodename = shift;
+    my $content = shift;
+    my $language = shift || "";
+    my $spacepreserve = shift || 0;
+
+    if ($nodename && "$nodename" eq "1") {
+        $XMLCOMMENT = $content;
+    } elsif ($nodename) {
+	# element
+	my @all = @{ $content };
+	my $attrs = shift @all;
+	my $translate = 0;
+	my $outattr = getAttributeString($attrs, 1, $language, \$translate);
+
+	if ($nodename =~ /^_/) {
+	    $translate = 1;
+	    $nodename =~ s/^_//;
+	}
+	my $lookup = '';
+
+        $spacepreserve = 0 if ((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?default["']?$/));
+        $spacepreserve = 1 if ((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?preserve["']?$/));
+
+	if ($translate) {
+	    $lookup = getXMLstring($content, $spacepreserve);
+            if (!$spacepreserve) {
+                $lookup =~ s/^\s+//s;
+                $lookup =~ s/\s+$//s;
+            }
+
+	    if ($lookup && $translate != 2) {
+                $comments{$lookup} = $XMLCOMMENT if $XMLCOMMENT;
+                $messages{$lookup} = [];
+            } elsif ($translate == 2) {
+                translate_subnodes($fh, \@all, $language, 1, $spacepreserve);
+	    }
+	} else {
+            $XMLCOMMENT = "";
+	    my $count = scalar(@all);
+	    if ($count > 0) {
+                my $index = 0;
+                while ($index < $count) {
+                    my $type = $all[$index];
+                    my $rest = $all[$index+1];
+                    traverse($fh, $type, $rest, $language, $spacepreserve);
+                    $index += 2;
+                }
+	    }
+	}
+        $XMLCOMMENT = "";
+    }
+}
+
+
+# Verbatim copy from intltool-merge.in.in, $fh for compatibility
+sub parseTree
+{
+    my $fh        = shift;
+    my $ref       = shift;
+    my $language  = shift || "";
+
+    my $name = shift @{ $ref };
+    my $cont = shift @{ $ref };
+
+    while (!$name || "$name" eq "1") {
+        $name = shift @{ $ref };
+        $cont = shift @{ $ref };
+    }
+
+    my $spacepreserve = 0;
+    my $attrs = @{$cont}[0];
+    $spacepreserve = 1 if ((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?preserve["']?$/));
+
+    traverse($fh, $name, $cont, $language, $spacepreserve);
+}
+
+# Verbatim copy from intltool-merge.in.in
+sub intltool_tree_comment
+{
+    my $expat = shift;
+    my $data  = $expat->original_string();
+    my $clist = $expat->{Curlist};
+    my $pos   = $#$clist;
+
+    $data =~ s/^<!--//s;
+    $data =~ s/-->$//s;
+    push @$clist, 1 => $data;
+}
+
+# Verbatim copy from intltool-merge.in.in
+sub intltool_tree_cdatastart
+{
+    my $expat    = shift;
+    my $clist = $expat->{Curlist};
+    my $pos   = $#$clist;
+
+    push @$clist, 0 => $expat->original_string();
+}
+
+# Verbatim copy from intltool-merge.in.in
+sub intltool_tree_cdataend
+{
+    my $expat    = shift;
+    my $clist = $expat->{Curlist};
+    my $pos   = $#$clist;
+
+    $clist->[$pos] .= $expat->original_string();
+}
+
+# Verbatim copy from intltool-merge.in.in
+sub intltool_tree_char
+{
+    my $expat = shift;
+    my $text  = shift;
+    my $clist = $expat->{Curlist};
+    my $pos   = $#$clist;
+
+    # Use original_string so that we retain escaped entities
+    # in CDATA sections.
+    #
+    if ($pos > 0 and $clist->[$pos - 1] eq '0') {
+        $clist->[$pos] .= $expat->original_string();
+    } else {
+        push @$clist, 0 => $expat->original_string();
+    }
+}
+
+# Verbatim copy from intltool-merge.in.in
+sub intltool_tree_start
+{
+    my $expat    = shift;
+    my $tag      = shift;
+    my @origlist = ();
+
+    # Use original_string so that we retain escaped entities
+    # in attribute values.  We must convert the string to an
+    # @origlist array to conform to the structure of the Tree
+    # Style.
+    #
+    my @original_array = split /\x/, $expat->original_string();
+    my $source         = $expat->original_string();
+
+    # Remove leading tag.
+    #
+    $source =~ s|^\s*<\s*(\S+)||s;
+
+    # Grab attribute key/value pairs and push onto @origlist array.
+    #
+    while ($source)
+    {
+       if ($source =~ /^\s*([\w:-]+)\s*[=]\s*["]/)
+       {
+           $source =~ s|^\s*([\w:-]+)\s*[=]\s*["]([^"]*)["]||s;
+           push @origlist, $1;
+           push @origlist, '"' . $2 . '"';
+       }
+       elsif ($source =~ /^\s*([\w:-]+)\s*[=]\s*[']/)
+       {
+           $source =~ s|^\s*([\w:-]+)\s*[=]\s*[']([^']*)[']||s;
+           push @origlist, $1;
+           push @origlist, "'" . $2 . "'";
+       }
+       else
+       {
+           last;
+       }
+    }
+
+    my $ol = [ { @origlist } ];
+
+    push @{ $expat->{Lists} }, $expat->{Curlist};
+    push @{ $expat->{Curlist} }, $tag => $ol;
+    $expat->{Curlist} = $ol;
+}
+
+# Copied from intltool-merge.in.in and added comment handler.
+sub readXml
+{
+    my $xmldoc = shift || return;
+    my $ret = eval 'require XML::Parser';
+    if(!$ret) {
+        die "You must have XML::Parser installed to run $0\n\n";
+    }
+    my $xp = new XML::Parser(Style => 'Tree');
+    $xp->setHandlers(Char => \&intltool_tree_char);
+    $xp->setHandlers(Start => \&intltool_tree_start);
+    $xp->setHandlers(CdataStart => \&intltool_tree_cdatastart);
+    $xp->setHandlers(CdataEnd => \&intltool_tree_cdataend);
+
+    ## differences from intltool-merge.in.in
+    $xp->setHandlers(Comment => \&intltool_tree_comment);
+    ## differences end here from intltool-merge.in.in
+
+    my $tree = $xp->parse($xmldoc);
+    #print_var($tree);
+
+# <foo><!-- comment --><head id="a">Hello <em>there</em></head><bar>Howdy<ref/></bar>do</foo>
+# would be:
+# [foo, [{}, 1, "comment", head, [{id => "a"}, 0, "Hello ",  em, [{}, 0, "there"]], bar, 
+# [{}, 0, "Howdy",  ref, [{}]], 0, "do" ] ]
+
+    return $tree;
+}
+
+sub type_schemas {
+    ### For schemas XML files ###
+         
+    # FIXME: We should handle escaped < (less than)
+    while ($input =~ /
+                      <locale\ name="C">\s*
+                          (<default>\s*(?:<!--([^>]*?)-->\s*)?(.*?)\s*<\/default>\s*)?
+                          (<short>\s*(?:<!--([^>]*?)-->\s*)?(.*?)\s*<\/short>\s*)?
+                          (<long>\s*(?:<!--([^>]*?)-->\s*)?(.*?)\s*<\/long>\s*)?
+                      <\/locale>
+                     /sgx) {
+        my @totranslate = ($3,$6,$9);
+        my @eachcomment = ($2,$5,$8);
+        foreach (@totranslate) {
+            my $currentcomment = shift @eachcomment;
+            next if !$_;
+            s/\s+/ /g;
+            $messages{entity_decode_minimal($_)} = [];
+            $comments{entity_decode_minimal($_)} = $currentcomment if (defined($currentcomment));
+        }
+    }
+}
+
+sub type_rfc822deb {
+    ### For rfc822-style Debian configuration files ###
+
+    my $lineno = 1;
+    my $type = '';
+    while ($input =~ /\G(.*?)(^|\n)(_+)([^:]+):[ \t]*(.*?)(?=\n\S|$)/sg)
+    {
+        my ($pre, $newline, $underscore, $tag, $text) = ($1, $2, $3, $4, $5);
+        while ($pre =~ m/\n/g)
+        {
+            $lineno ++;
+        }
+        $lineno += length($newline);
+        my @str_list = rfc822deb_split(length($underscore), $text);
+        for my $str (@str_list)
+        {
+            $strcount++;
+            $messages{$str} = [];
+            $loc{$str} = $lineno;
+            $count{$str} = $strcount;
+            my $usercomment = '';
+            while($pre =~ s/(^|\n)#([^\n]*)$//s)
+            {
+                $usercomment = "\n" . $2 . $usercomment;
+            }
+            $comments{$str} = $tag . $usercomment;
+        }
+        $lineno += ($text =~ s/\n//g);
+    }
+}
+
+sub rfc822deb_split {
+    # Debian defines a special way to deal with rfc822-style files:
+    # when a value contain newlines, it consists of
+    #   1.  a short form (first line)
+    #   2.  a long description, all lines begin with a space,
+    #       and paragraphs are separated by a single dot on a line
+    # This routine returns an array of all paragraphs, and reformat
+    # them.
+    # When first argument is 2, the string is a comma separated list of
+    # values.
+    my $type = shift;
+    my $text = shift;
+    $text =~ s/^[ \t]//mg;
+    return (split(/, */, $text, 0)) if $type ne 1;
+    return ($text) if $text !~ /\n/;
+
+    $text =~ s/([^\n]*)\n//;
+    my @list = ($1);
+    my $str = '';
+    for my $line (split (/\n/, $text))
+    {
+        chomp $line;
+        if ($line =~ /^\.\s*$/)
+        {
+            #  New paragraph
+            $str =~ s/\s*$//;
+            push(@list, $str);
+            $str = '';
+        }
+        elsif ($line =~ /^\s/)
+        {
+            #  Line which must not be reformatted
+            $str .= "\n" if length ($str) && $str !~ /\n$/;
+            $line =~ s/\s+$//;
+            $str .= $line."\n";
+        }
+        else
+        {
+            #  Continuation line, remove newline
+            $str .= " " if length ($str) && $str !~ /\n$/;
+            $str .= $line;
+        }
+    }
+    $str =~ s/\s*$//;
+    push(@list, $str) if length ($str);
+    return @list;
+}
+
+sub type_quoted {
+    while ($input =~ /\"(([^\"]|\\\")*[^\\\"])\"/g) {
+        my $message = $1;
+        my $before = $`;
+        $message =~ s/\\\"/\"/g;
+        $before =~ s/[^\n]//g;
+        $messages{$message} = [];
+        $loc{$message} = length ($before) + 2;
+    }
+}
+
+sub type_glade {
+    ### For translatable Glade XML files ###
+
+    my $tags = "label|title|text|format|copyright|comments|preview_text|tooltip|message";
+
+    while ($input =~ /<($tags)>([^<]+)<\/($tags)>/sg) {
+	# Glade sometimes uses tags that normally mark translatable things for
+        # little bits of non-translatable content. We work around this by not
+        # translating strings that only includes something like label4 or window1.
+	$messages{entity_decode($2)} = [] unless $2 =~ /^(window|label|dialog)[0-9]+$/;
+    }
+    
+    while ($input =~ /<items>(..[^<]*)<\/items>/sg) {
+	for my $item (split (/\n/, $1)) {
+	    $messages{entity_decode($item)} = [];
+	}
+    }
+
+    ## handle new glade files
+    while ($input =~ /<(property|atkproperty)\s+[^>]*translatable\s*=\s*"yes"(?:\s+[^>]*comments\s*=\s*"([^"]*)")?[^>]*>([^<]+)<\/\1>/sg) {
+	$messages{entity_decode($3)} = [] unless $3 =~ /^(window|label)[0-9]+$/;
+        if (defined($2) and !($3 =~ /^(window|label)[0-9]+$/)) {
+	   $comments{entity_decode($3)} = entity_decode($2) ;
+        }
+    }
+    while ($input =~ /<atkaction\s+action_name="([^>]*)"\s+description="([^>]+)"\/>/sg) {
+        $messages{entity_decode_minimal($2)} = [];
+    }
+}
+
+sub type_scheme {
+    my ($line, $i, $state, $str, $trcomment, $char);
+    for $line (split(/\n/, $input)) {
+        $i = 0;
+        $state = 0; # 0 - nothing, 1 - string, 2 - translatable string
+        while ($i < length($line)) {
+            if (substr($line,$i,1) eq "\"") {
+                if ($state == 2) {
+                    $comments{$str} = $trcomment if ($trcomment);
+                    $messages{$str} = [];
+                    $str = '';
+                    $state = 0; $trcomment = "";
+                } elsif ($state == 1) {
+                    $str = '';
+                    $state = 0; $trcomment = "";
+                } else {
+                    $state = 1;
+                    $str = '';
+                    if ($i>0 && substr($line,$i-1,1) eq '_') {
+                        $state = 2;
+                    }
+                }
+            } elsif (!$state) {
+                if (substr($line,$i,1) eq ";") {
+                    $trcomment = substr($line,$i+1);
+                    $trcomment =~ s/^;*\s*//;
+                    $i = length($line);
+                } elsif ($trcomment && substr($line,$i,1) !~ /\s|\(|\)|_/) {
+                    $trcomment = "";
+                }
+            } else {
+                if (substr($line,$i,1) eq "\\") {
+                    $char = substr($line,$i+1,1);
+                    if ($char ne "\"" && $char ne "\\") {
+                       $str = $str . "\\";
+                    }
+                    $i++;
+                }
+                $str = $str . substr($line,$i,1);
+            }
+            $i++;
+        }
+    }
+}
+
+sub msg_write {
+    my @msgids;
+    if (%count)
+    {
+        @msgids = sort { $count{$a} <=> $count{$b} } keys %count;
+    }
+    else
+    {
+        @msgids = sort keys %messages;
+    }
+    for my $message (@msgids)
+    {
+	my $offsetlines = 1;
+	$offsetlines++ if $message =~ /%/;
+	if (defined ($comments{$message}))
+	{
+		while ($comments{$message} =~ m/\n/g)
+		{
+		    $offsetlines++;
+		}
+	}
+	print OUT "# ".($loc{$message} - $offsetlines).  " \"$FILE\"\n"
+	        if defined $loc{$message};
+   	print OUT "/* ".$comments{$message}." */\n"
+                if defined $comments{$message};
+   	print OUT "/* xgettext:no-c-format */\n" if $message =~ /%/;
+        
+    	my @lines = split (/\n/, $message, -1);
+    	for (my $n = 0; $n < @lines; $n++)
+	{
+            if ($n == 0)
+            {
+ 		print OUT "char *s = N_(\""; 
+            }
+            else
+            {  
+                print OUT "             \""; 
+            }
+
+            print OUT escape($lines[$n]);
+
+            if ($n < @lines - 1)
+            {
+                print OUT "\\n\"\n"; 
+            }
+            else
+            {
+                print OUT "\");\n";  
+	    }
+        }
+    }
+}
+

Added: trunk/intltool-merge.in
===================================================================
--- trunk/intltool-merge.in	                        (rev 0)
+++ trunk/intltool-merge.in	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,1451 @@
+#!@INTLTOOL_PERL@ -w
+# -*- Mode: perl; indent-tabs-mode: nil; c-basic-offset: 4  -*-
+
+#
+#  The Intltool Message Merger
+#
+#  Copyright (C) 2000, 2003 Free Software Foundation.
+#  Copyright (C) 2000, 2001 Eazel, Inc
+#
+#  Intltool is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU General Public License 
+#  version 2 published by the Free Software Foundation.
+#
+#  Intltool 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+#  As a special exception to the GNU General Public License, if you
+#  distribute this file as part of a program that contains a
+#  configuration script generated by Autoconf, you may include it under
+#  the same distribution terms that you use for the rest of that program.
+#
+#  Authors:  Maciej Stachowiak <mjs at noisehavoc.org>
+#            Kenneth Christiansen <kenneth at gnu.org>
+#            Darin Adler <darin at bentspoon.com>
+#
+#  Proper XML UTF-8'ification written by Cyrille Chepelov <chepelov at calixo.net>
+#
+
+## Release information
+my $PROGRAM = "intltool-merge";
+my $PACKAGE = "intltool";
+my $VERSION = "0.36.2";
+
+## Loaded modules
+use strict; 
+use Getopt::Long;
+use Text::Wrap;
+use File::Basename;
+
+my $must_end_tag      = -1;
+my $last_depth        = -1;
+my $translation_depth = -1;
+my @tag_stack = ();
+my @entered_tag = ();
+my @translation_strings = ();
+my $leading_space = "";
+
+## Scalars used by the option stuff
+my $HELP_ARG = 0;
+my $VERSION_ARG = 0;
+my $BA_STYLE_ARG = 0;
+my $XML_STYLE_ARG = 0;
+my $KEYS_STYLE_ARG = 0;
+my $DESKTOP_STYLE_ARG = 0;
+my $SCHEMAS_STYLE_ARG = 0;
+my $RFC822DEB_STYLE_ARG = 0;
+my $QUOTED_STYLE_ARG = 0;
+my $QUIET_ARG = 0;
+my $PASS_THROUGH_ARG = 0;
+my $UTF8_ARG = 0;
+my $MULTIPLE_OUTPUT = 0;
+my $cache_file;
+
+## Handle options
+GetOptions 
+(
+ "help" => \$HELP_ARG,
+ "version" => \$VERSION_ARG,
+ "quiet|q" => \$QUIET_ARG,
+ "oaf-style|o" => \$BA_STYLE_ARG, ## for compatibility
+ "ba-style|b" => \$BA_STYLE_ARG,
+ "xml-style|x" => \$XML_STYLE_ARG,
+ "keys-style|k" => \$KEYS_STYLE_ARG,
+ "desktop-style|d" => \$DESKTOP_STYLE_ARG,
+ "schemas-style|s" => \$SCHEMAS_STYLE_ARG,
+ "rfc822deb-style|r" => \$RFC822DEB_STYLE_ARG,
+ "quoted-style" => \$QUOTED_STYLE_ARG,
+ "pass-through|p" => \$PASS_THROUGH_ARG,
+ "utf8|u" => \$UTF8_ARG,
+ "multiple-output|m" => \$MULTIPLE_OUTPUT,
+ "cache|c=s" => \$cache_file
+ ) or &error;
+
+my $PO_DIR;
+my $FILE;
+my $OUTFILE;
+
+my %po_files_by_lang = ();
+my %translations = ();
+my $iconv = $ENV{"ICONV"} || "iconv";
+my $devnull = ($^O eq 'MSWin32' ? 'NUL:' : '/dev/null');
+
+sub isProgramInPath
+{
+    my ($file) = @_;
+    # If either a file exists, or when run it returns 0 exit status
+    return 1 if ((-x $file) or (system("$file -l >$devnull") == 0));
+    return 0;
+}
+
+if (! isProgramInPath ("$iconv"))
+{
+	print STDERR " *** iconv is not found on this system!\n".
+		     " *** Without it, intltool-merge can not convert encodings.\n";
+	exit;
+}
+
+# Use this instead of \w for XML files to handle more possible characters.
+my $w = "[-A-Za-z0-9._:]";
+
+# XML quoted string contents
+my $q = "[^\\\"]*";
+
+## Check for options. 
+
+if ($VERSION_ARG) 
+{
+	&print_version;
+} 
+elsif ($HELP_ARG) 
+{
+	&print_help;
+} 
+elsif ($BA_STYLE_ARG && @ARGV > 2) 
+{
+	&utf8_sanity_check;
+	&preparation;
+	&print_message;
+	&ba_merge_translations;
+	&finalize;
+} 
+elsif ($XML_STYLE_ARG && @ARGV > 2) 
+{
+	&utf8_sanity_check;
+	&preparation;
+	&print_message;
+	&xml_merge_output;
+	&finalize;
+} 
+elsif ($KEYS_STYLE_ARG && @ARGV > 2) 
+{
+	&utf8_sanity_check;
+	&preparation;
+	&print_message;
+	&keys_merge_translations;
+	&finalize;
+} 
+elsif ($DESKTOP_STYLE_ARG && @ARGV > 2) 
+{
+	&utf8_sanity_check;
+	&preparation;
+	&print_message;
+	&desktop_merge_translations;
+	&finalize;
+} 
+elsif ($SCHEMAS_STYLE_ARG && @ARGV > 2) 
+{
+	&utf8_sanity_check;
+	&preparation;
+	&print_message;
+	&schemas_merge_translations;
+	&finalize;
+} 
+elsif ($RFC822DEB_STYLE_ARG && @ARGV > 2) 
+{
+	&preparation;
+	&print_message;
+	&rfc822deb_merge_translations;
+	&finalize;
+} 
+elsif ($QUOTED_STYLE_ARG && @ARGV > 2) 
+{
+	&utf8_sanity_check;
+	&preparation;
+	&print_message;
+	&quoted_merge_translations;
+	&finalize;
+} 
+else 
+{
+	&print_help;
+}
+
+exit;
+
+## Sub for printing release information
+sub print_version
+{
+    print <<_EOF_;
+${PROGRAM} (${PACKAGE}) ${VERSION}
+Written by Maciej Stachowiak, Darin Adler and Kenneth Christiansen.
+
+Copyright (C) 2000-2003 Free Software Foundation, Inc.
+Copyright (C) 2000-2001 Eazel, Inc.
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+_EOF_
+    exit;
+}
+
+## Sub for printing usage information
+sub print_help
+{
+    print <<_EOF_;
+Usage: ${PROGRAM} [OPTION]... PO_DIRECTORY FILENAME OUTPUT_FILE
+Generates an output file that includes some localized attributes from an
+untranslated source file.
+
+Mandatory options: (exactly one must be specified)
+  -b, --ba-style         includes translations in the bonobo-activation style
+  -d, --desktop-style    includes translations in the desktop style
+  -k, --keys-style       includes translations in the keys style
+  -s, --schemas-style    includes translations in the schemas style
+  -r, --rfc822deb-style  includes translations in the RFC822 style
+      --quoted-style     includes translations in the quoted string style
+  -x, --xml-style        includes translations in the standard xml style
+
+Other options:
+  -u, --utf8             convert all strings to UTF-8 before merging 
+                         (default for everything except RFC822 style)
+  -p, --pass-through     deprecated, does nothing and issues a warning
+  -m, --multiple-output  output one localized file per locale, instead of 
+	                 a single file containing all localized elements
+  -c, --cache=FILE       specify cache file name
+                         (usually \$top_builddir/po/.intltool-merge-cache)
+  -q, --quiet            suppress most messages
+      --help             display this help and exit
+      --version          output version information and exit
+
+Report bugs to http://bugzilla.gnome.org/ (product name "$PACKAGE")
+or send email to <xml-i18n-tools\@gnome.org>.
+_EOF_
+    exit;
+}
+
+
+## Sub for printing error messages
+sub print_error
+{
+    print STDERR "Try `${PROGRAM} --help' for more information.\n";
+    exit;
+}
+
+
+sub print_message 
+{
+    print "Merging translations into $OUTFILE.\n" unless $QUIET_ARG;
+}
+
+
+sub preparation 
+{
+    $PO_DIR = $ARGV[0];
+    $FILE = $ARGV[1];
+    $OUTFILE = $ARGV[2];
+
+    &gather_po_files;
+    &get_translation_database;
+}
+
+# General-purpose code for looking up translations in .po files
+
+sub po_file2lang
+{
+    my ($tmp) = @_; 
+    $tmp =~ s/^.*\/(.*)\.po$/$1/; 
+    return $tmp; 
+}
+
+sub gather_po_files
+{
+    if (my $linguas = $ENV{"LINGUAS"})
+    {
+        for my $lang (split / /, $linguas) {
+            my $po_file = $PO_DIR . "/" . $lang . ".po";
+            if (-e $po_file) {
+                $po_files_by_lang{$lang} = $po_file;
+            }
+        }
+    }
+    else
+    {
+        if (open LINGUAS_FILE, "$PO_DIR/LINGUAS")
+        {
+            while (<LINGUAS_FILE>)
+            {
+                next if /^#/;
+
+                if (/([-a-zA-Z_ at .]+)\n/)
+                {
+                    my $lang = $1;
+
+                    my $po_file = $PO_DIR . "/" . $lang . ".po";
+                    if (-e $po_file) {
+                        $po_files_by_lang{$lang} = $po_file;
+                    }
+                }
+            }
+
+            close LINGUAS_FILE;
+        }
+        else
+        {
+            for my $po_file (glob "$PO_DIR/*.po") {
+                $po_files_by_lang{po_file2lang($po_file)} = $po_file;
+            }
+        }
+    }
+}
+
+sub get_local_charset
+{
+    my ($encoding) = @_;
+    my $alias_file = $ENV{"G_CHARSET_ALIAS"} || "@INTLTOOL_LIBDIR@/charset.alias";
+
+    # seek character encoding aliases in charset.alias (glib)
+
+    if (open CHARSET_ALIAS, $alias_file) 
+    {
+	while (<CHARSET_ALIAS>) 
+        {
+            next if /^\#/;
+            return $1 if (/^\s*([-._a-zA-Z0-9]+)\s+$encoding\b/i)
+        }
+
+        close CHARSET_ALIAS;
+    }
+
+    # if not found, return input string
+
+    return $encoding;
+}
+
+sub get_po_encoding
+{
+    my ($in_po_file) = @_;
+    my $encoding = "";
+
+    open IN_PO_FILE, $in_po_file or die;
+    while (<IN_PO_FILE>) 
+    {
+        ## example: "Content-Type: text/plain; charset=ISO-8859-1\n"
+        if (/Content-Type\:.*charset=([-a-zA-Z0-9]+)\\n/) 
+        {
+            $encoding = $1; 
+            last;
+        }
+    }
+    close IN_PO_FILE;
+
+    if (!$encoding) 
+    {
+        print STDERR "Warning: no encoding found in $in_po_file. Assuming ISO-8859-1\n" unless $QUIET_ARG;
+        $encoding = "ISO-8859-1";
+    }
+
+    system ("$iconv -f $encoding -t UTF-8 <$devnull 2>$devnull");
+    if ($?) {
+	$encoding = get_local_charset($encoding);
+    }
+
+    return $encoding
+}
+
+sub utf8_sanity_check 
+{
+    print STDERR "Warning: option --pass-through has been removed.\n" if $PASS_THROUGH_ARG;
+    $UTF8_ARG = 1;
+}
+
+sub get_translation_database
+{
+    if ($cache_file) {
+	&get_cached_translation_database;
+    } else {
+        &create_translation_database;
+    }
+}
+
+sub get_newest_po_age
+{
+    my $newest_age;
+
+    foreach my $file (values %po_files_by_lang) 
+    {
+	my $file_age = -M $file;
+	$newest_age = $file_age if !$newest_age || $file_age < $newest_age;
+    }
+
+    $newest_age = 0 if !$newest_age;
+
+    return $newest_age;
+}
+
+sub create_cache
+{
+    print "Generating and caching the translation database\n" unless $QUIET_ARG;
+
+    &create_translation_database;
+
+    open CACHE, ">$cache_file" || die;
+    print CACHE join "\x01", %translations;
+    close CACHE;
+}
+
+sub load_cache 
+{
+    print "Found cached translation database\n" unless $QUIET_ARG;
+
+    my $contents;
+    open CACHE, "<$cache_file" || die;
+    {
+        local $/;
+        $contents = <CACHE>;
+    }
+    close CACHE;
+    %translations = split "\x01", $contents;
+}
+
+sub get_cached_translation_database
+{
+    my $cache_file_age = -M $cache_file;
+    if (defined $cache_file_age) 
+    {
+        if ($cache_file_age <= &get_newest_po_age) 
+        {
+            &load_cache;
+            return;
+        }
+        print "Found too-old cached translation database\n" unless $QUIET_ARG;
+    }
+
+    &create_cache;
+}
+
+sub create_translation_database
+{
+    for my $lang (keys %po_files_by_lang) 
+    {
+    	my $po_file = $po_files_by_lang{$lang};
+
+        if ($UTF8_ARG) 
+        {
+            my $encoding = get_po_encoding ($po_file);
+
+            if (lc $encoding eq "utf-8") 
+            {
+                open PO_FILE, "<$po_file";	
+            } 
+            else 
+            {
+		print "NOTICE: $po_file is not in UTF-8 but $encoding, converting...\n" unless $QUIET_ARG;;
+
+                open PO_FILE, "$iconv -f $encoding -t UTF-8 $po_file|";	
+            }
+        } 
+        else 
+        {
+            open PO_FILE, "<$po_file";	
+        }
+
+	my $nextfuzzy = 0;
+	my $inmsgid = 0;
+	my $inmsgstr = 0;
+	my $msgid = "";
+	my $msgstr = "";
+
+        while (<PO_FILE>) 
+        {
+	    $nextfuzzy = 1 if /^#, fuzzy/;
+       
+	    if (/^msgid "((\\.|[^\\]+)*)"/ ) 
+            {
+		$translations{$lang, $msgid} = $msgstr if $inmsgstr && $msgid && $msgstr;
+		$msgid = "";
+		$msgstr = "";
+
+		if ($nextfuzzy) {
+		    $inmsgid = 0;
+		} else {
+		    $msgid = unescape_po_string($1);
+		    $inmsgid = 1;
+		}
+		$inmsgstr = 0;
+		$nextfuzzy = 0;
+	    }
+
+	    if (/^msgstr "((\\.|[^\\]+)*)"/) 
+            {
+	        $msgstr = unescape_po_string($1);
+		$inmsgstr = 1;
+		$inmsgid = 0;
+	    }
+
+	    if (/^"((\\.|[^\\]+)*)"/) 
+            {
+	        $msgid .= unescape_po_string($1) if $inmsgid;
+	        $msgstr .= unescape_po_string($1) if $inmsgstr;
+	    }
+	}
+	$translations{$lang, $msgid} = $msgstr if $inmsgstr && $msgid && $msgstr;
+    }
+}
+
+sub finalize
+{
+}
+
+sub unescape_one_sequence
+{
+    my ($sequence) = @_;
+
+    return "\\" if $sequence eq "\\\\";
+    return "\"" if $sequence eq "\\\"";
+    return "\n" if $sequence eq "\\n";
+    return "\r" if $sequence eq "\\r";
+    return "\t" if $sequence eq "\\t";
+    return "\b" if $sequence eq "\\b";
+    return "\f" if $sequence eq "\\f";
+    return "\a" if $sequence eq "\\a";
+    return chr(11) if $sequence eq "\\v"; # vertical tab, see ascii(7)
+
+    return chr(hex($1)) if ($sequence =~ /\\x([0-9a-fA-F]{2})/);
+    return chr(oct($1)) if ($sequence =~ /\\([0-7]{3})/);
+
+    # FIXME: Is \0 supported as well? Kenneth and Rodney don't want it, see bug #48489
+
+    return $sequence;
+}
+
+sub unescape_po_string
+{
+    my ($string) = @_;
+
+    $string =~ s/(\\x[0-9a-fA-F]{2}|\\[0-7]{3}|\\.)/unescape_one_sequence($1)/eg;
+
+    return $string;
+}
+
+sub entity_decode
+{
+    local ($_) = @_;
+
+    s/&apos;/'/g; # '
+    s/&quot;/"/g; # "
+    s/&lt;/</g;
+    s/&gt;/>/g;
+    s/&amp;/&/g;
+
+    return $_;
+}
+ 
+# entity_encode: (string)
+#
+# Encode the given string to XML format (encode '<' etc).
+
+sub entity_encode
+{
+    my ($pre_encoded) = @_;
+
+    my @list_of_chars = unpack ('C*', $pre_encoded);
+
+    # with UTF-8 we only encode minimalistic
+    return join ('', map (&entity_encode_int_minimalist, @list_of_chars));
+}
+
+sub entity_encode_int_minimalist
+{
+    return "&quot;" if $_ == 34;
+    return "&amp;" if $_ == 38;
+    return "&apos;" if $_ == 39;
+    return "&lt;" if $_ == 60;
+    return chr $_;
+}
+
+sub entity_encoded_translation
+{
+    my ($lang, $string) = @_;
+
+    my $translation = $translations{$lang, $string};
+    return $string if !$translation;
+    return entity_encode ($translation);
+}
+
+## XML (bonobo-activation specific) merge code
+
+sub ba_merge_translations
+{
+    my $source;
+
+    {
+       local $/; # slurp mode
+       open INPUT, "<$FILE" or die "can't open $FILE: $!";
+       $source = <INPUT>;
+       close INPUT;
+    }
+
+    open OUTPUT, ">$OUTFILE" or die "can't open $OUTFILE: $!";
+    # Binmode so that selftest works ok if using a native Win32 Perl...
+    binmode (OUTPUT) if $^O eq 'MSWin32';
+
+    while ($source =~ s|^(.*?)([ \t]*<\s*$w+\s+($w+\s*=\s*"$q"\s*)+/?>)([ \t]*\n)?||s) 
+    {
+        print OUTPUT $1;
+
+        my $node = $2 . "\n";
+
+        my @strings = ();
+        $_ = $node;
+	while (s/(\s)_($w+\s*=\s*"($q)")/$1$2/s) {
+             push @strings, entity_decode($3);
+        }
+	print OUTPUT;
+
+	my %langs;
+	for my $string (@strings) 
+        {
+	    for my $lang (keys %po_files_by_lang) 
+            {
+                $langs{$lang} = 1 if $translations{$lang, $string};
+	    }
+	}
+	
+	for my $lang (sort keys %langs) 
+        {
+	    $_ = $node;
+	    s/(\sname\s*=\s*)"($q)"/$1"$2-$lang"/s;
+	    s/(\s)_($w+\s*=\s*")($q)"/$1 . $2 . entity_encoded_translation($lang, $3) . '"'/seg;
+	    print OUTPUT;
+        }
+    }
+
+    print OUTPUT $source;
+
+    close OUTPUT;
+}
+
+
+## XML (non-bonobo-activation) merge code
+
+
+# Process tag attributes
+#   Only parameter is a HASH containing attributes -> values mapping
+sub getAttributeString
+{
+    my $sub = shift;
+    my $do_translate = shift || 0;
+    my $language = shift || "";
+    my $result = "";
+    my $translate = shift;
+    foreach my $e (reverse(sort(keys %{ $sub }))) {
+	my $key    = $e;
+	my $string = $sub->{$e};
+	my $quote = '"';
+	
+	$string =~ s/^[\s]+//;
+	$string =~ s/[\s]+$//;
+	
+	if ($string =~ /^'.*'$/)
+	{
+	    $quote = "'";
+	}
+	$string =~ s/^['"]//g;
+	$string =~ s/['"]$//g;
+
+	if ($do_translate && $key =~ /^_/) {
+	    $key =~ s|^_||g;
+	    if ($language) {
+		# Handle translation
+		my $decode_string = entity_decode($string);
+		my $translation = $translations{$language, $decode_string};
+		if ($translation) {
+		    $translation = entity_encode($translation);
+		    $string = $translation;
+                }
+                $$translate = 2;
+            } else {
+                 $$translate = 2 if ($translate && (!$$translate)); # watch not to "overwrite" $translate
+            }
+	}
+	
+	$result .= " $key=$quote$string$quote";
+    }
+    return $result;
+}
+
+# Returns a translatable string from XML node, it works on contents of every node in XML::Parser tree
+sub getXMLstring
+{
+    my $ref = shift;
+    my $spacepreserve = shift || 0;
+    my @list = @{ $ref };
+    my $result = "";
+
+    my $count = scalar(@list);
+    my $attrs = $list[0];
+    my $index = 1;
+
+    $spacepreserve = 1 if ((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?preserve["']?$/));
+    $spacepreserve = 0 if ((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?default["']?$/));
+
+    while ($index < $count) {
+	my $type = $list[$index];
+	my $content = $list[$index+1];
+        if (! $type ) {
+	    # We've got CDATA
+	    if ($content) {
+		# lets strip the whitespace here, and *ONLY* here
+                $content =~ s/\s+/ /gs if (!$spacepreserve);
+		$result .= $content;
+	    }
+	} elsif ( "$type" ne "1" ) {
+	    # We've got another element
+	    $result .= "<$type";
+	    $result .= getAttributeString(@{$content}[0], 0); # no nested translatable elements
+	    if ($content) {
+		my $subresult = getXMLstring($content, $spacepreserve);
+		if ($subresult) {
+		    $result .= ">".$subresult . "</$type>";
+		} else {
+		    $result .= "/>";
+		}
+	    } else {
+		$result .= "/>";
+	    }
+	}
+	$index += 2;
+    }
+    return $result;
+}
+
+# Translate list of nodes if necessary
+sub translate_subnodes
+{
+    my $fh = shift;
+    my $content = shift;
+    my $language = shift || "";
+    my $singlelang = shift || 0;
+    my $spacepreserve = shift || 0;
+
+    my @nodes = @{ $content };
+
+    my $count = scalar(@nodes);
+    my $index = 0;
+    while ($index < $count) {
+        my $type = $nodes[$index];
+        my $rest = $nodes[$index+1];
+        if ($singlelang) {
+            my $oldMO = $MULTIPLE_OUTPUT;
+            $MULTIPLE_OUTPUT = 1;
+            traverse($fh, $type, $rest, $language, $spacepreserve);
+            $MULTIPLE_OUTPUT = $oldMO;
+        } else {
+            traverse($fh, $type, $rest, $language, $spacepreserve);
+        }
+        $index += 2;
+    }
+}
+
+sub isWellFormedXmlFragment
+{
+    my $ret = eval 'require XML::Parser';
+    if(!$ret) {
+        die "You must have XML::Parser installed to run $0\n\n";
+    } 
+
+    my $fragment = shift;
+    return 0 if (!$fragment);
+
+    $fragment = "<root>$fragment</root>";
+    my $xp = new XML::Parser(Style => 'Tree');
+    my $tree = 0;
+    eval { $tree = $xp->parse($fragment); };
+    return $tree;
+}
+
+sub traverse
+{
+    my $fh = shift; 
+    my $nodename = shift;
+    my $content = shift;
+    my $language = shift || "";
+    my $spacepreserve = shift || 0;
+
+    if (!$nodename) {
+	if ($content =~ /^[\s]*$/) {
+	    $leading_space .= $content;
+	}
+	print $fh $content;
+    } else {
+	# element
+	my @all = @{ $content };
+	my $attrs = shift @all;
+	my $translate = 0;
+	my $outattr = getAttributeString($attrs, 1, $language, \$translate);
+
+	if ($nodename =~ /^_/) {
+	    $translate = 1;
+	    $nodename =~ s/^_//;
+	}
+	my $lookup = '';
+
+        $spacepreserve = 0 if ((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?default["']?$/));
+        $spacepreserve = 1 if ((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?preserve["']?$/));
+
+	print $fh "<$nodename", $outattr;
+	if ($translate) {
+	    $lookup = getXMLstring($content, $spacepreserve);
+            if (!$spacepreserve) {
+                $lookup =~ s/^\s+//s;
+                $lookup =~ s/\s+$//s;
+            }
+
+	    if ($lookup || $translate == 2) {
+                my $translation = $translations{$language, $lookup} if isWellFormedXmlFragment($translations{$language, $lookup});
+                if ($MULTIPLE_OUTPUT && ($translation || $translate == 2)) {
+                    $translation = $lookup if (!$translation);
+                    print $fh " xml:lang=\"", $language, "\"" if $language;
+                    print $fh ">";
+                    if ($translate == 2) {
+                        translate_subnodes($fh, \@all, $language, 1, $spacepreserve);
+                    } else {
+                        print $fh $translation;
+                    }
+                    print $fh "</$nodename>";
+
+                    return; # this means there will be no same translation with xml:lang="$language"...
+                            # if we want them both, just remove this "return"
+                } else {
+                    print $fh ">";
+                    if ($translate == 2) {
+                        translate_subnodes($fh, \@all, $language, 1, $spacepreserve);
+                    } else {
+                        print $fh $lookup;
+                    }
+                    print $fh "</$nodename>";
+                }
+	    } else {
+		print $fh "/>";
+	    }
+
+	    for my $lang (sort keys %po_files_by_lang) {
+                    if ($MULTIPLE_OUTPUT && $lang ne "$language") {
+                        next;
+                    }
+		    if ($lang) {
+                        # Handle translation
+                        #
+                        my $translate = 0;
+                        my $localattrs = getAttributeString($attrs, 1, $lang, \$translate);
+                        my $translation = $translations{$lang, $lookup} if isWellFormedXmlFragment($translations{$lang, $lookup});
+                        if ($translate && !$translation) {
+                            $translation = $lookup;
+                        }
+
+                        if ($translation || $translate) {
+			    print $fh "\n";
+			    $leading_space =~ s/.*\n//g;
+			    print $fh $leading_space;
+ 			    print $fh "<", $nodename, " xml:lang=\"", $lang, "\"", $localattrs, ">";
+                            if ($translate == 2) {
+                               translate_subnodes($fh, \@all, $lang, 1, $spacepreserve);
+                            } else {
+                                print $fh $translation;
+                            }
+                            print $fh "</$nodename>";
+			}
+                    }
+	    }
+
+	} else {
+	    my $count = scalar(@all);
+	    if ($count > 0) {
+		print $fh ">";
+                my $index = 0;
+                while ($index < $count) {
+                    my $type = $all[$index];
+                    my $rest = $all[$index+1];
+                    traverse($fh, $type, $rest, $language, $spacepreserve);
+                    $index += 2;
+                }
+		print $fh "</$nodename>";
+	    } else {
+		print $fh "/>";
+	    }
+	}
+    }
+}
+
+sub intltool_tree_comment
+{
+    my $expat = shift;
+    my $data  = shift;
+    my $clist = $expat->{Curlist};
+    my $pos   = $#$clist;
+
+    push @$clist, 1 => $data;
+}
+
+sub intltool_tree_cdatastart
+{
+    my $expat    = shift;
+    my $clist = $expat->{Curlist};
+    my $pos   = $#$clist;
+
+    push @$clist, 0 => $expat->original_string();
+}
+
+sub intltool_tree_cdataend
+{
+    my $expat    = shift;
+    my $clist = $expat->{Curlist};
+    my $pos   = $#$clist;
+
+    $clist->[$pos] .= $expat->original_string();
+}
+
+sub intltool_tree_char
+{
+    my $expat = shift;
+    my $text  = shift;
+    my $clist = $expat->{Curlist};
+    my $pos   = $#$clist;
+
+    # Use original_string so that we retain escaped entities
+    # in CDATA sections.
+    #
+    if ($pos > 0 and $clist->[$pos - 1] eq '0') {
+        $clist->[$pos] .= $expat->original_string();
+    } else {
+        push @$clist, 0 => $expat->original_string();
+    }
+}
+
+sub intltool_tree_start
+{
+    my $expat    = shift;
+    my $tag      = shift;
+    my @origlist = ();
+
+    # Use original_string so that we retain escaped entities
+    # in attribute values.  We must convert the string to an
+    # @origlist array to conform to the structure of the Tree
+    # Style.
+    #
+    my @original_array = split /\x/, $expat->original_string();
+    my $source         = $expat->original_string();
+
+    # Remove leading tag.
+    #
+    $source =~ s|^\s*<\s*(\S+)||s;
+
+    # Grab attribute key/value pairs and push onto @origlist array.
+    #
+    while ($source)
+    {
+       if ($source =~ /^\s*([\w:-]+)\s*[=]\s*["]/)
+       {
+           $source =~ s|^\s*([\w:-]+)\s*[=]\s*["]([^"]*)["]||s;
+           push @origlist, $1;
+           push @origlist, '"' . $2 . '"';
+       }
+       elsif ($source =~ /^\s*([\w:-]+)\s*[=]\s*[']/)
+       {
+           $source =~ s|^\s*([\w:-]+)\s*[=]\s*[']([^']*)[']||s;
+           push @origlist, $1;
+           push @origlist, "'" . $2 . "'";
+       }
+       else
+       {
+           last;
+       }
+    }
+
+    my $ol = [ { @origlist } ];
+
+    push @{ $expat->{Lists} }, $expat->{Curlist};
+    push @{ $expat->{Curlist} }, $tag => $ol;
+    $expat->{Curlist} = $ol;
+}
+
+sub readXml
+{
+    my $filename = shift || return;
+    if(!-f $filename) {
+        die "ERROR Cannot find filename: $filename\n";
+    }
+
+    my $ret = eval 'require XML::Parser';
+    if(!$ret) {
+        die "You must have XML::Parser installed to run $0\n\n";
+    } 
+    my $xp = new XML::Parser(Style => 'Tree');
+    $xp->setHandlers(Char => \&intltool_tree_char);
+    $xp->setHandlers(Start => \&intltool_tree_start);
+    $xp->setHandlers(CdataStart => \&intltool_tree_cdatastart);
+    $xp->setHandlers(CdataEnd => \&intltool_tree_cdataend);
+    my $tree = $xp->parsefile($filename);
+
+# <foo><head id="a">Hello <em>there</em></head><bar>Howdy<ref/></bar>do</foo>
+# would be:
+# [foo, [{}, head, [{id => "a"}, 0, "Hello ",  em, [{}, 0, "there"]], bar, [{},
+# 0, "Howdy",  ref, [{}]], 0, "do" ] ]
+
+    return $tree;
+}
+
+sub print_header
+{
+    my $infile = shift;
+    my $fh = shift;
+    my $source;
+
+    if(!-f $infile) {
+        die "ERROR Cannot find filename: $infile\n";
+    }
+
+    print $fh qq{<?xml version="1.0" encoding="UTF-8"?>\n};
+    {
+        local $/;
+        open DOCINPUT, "<${FILE}" or die;
+        $source = <DOCINPUT>;
+        close DOCINPUT;
+    }
+    if ($source =~ /(<!DOCTYPE.*\[.*\]\s*>)/s)
+    {
+        print $fh "$1\n";
+    }
+    elsif ($source =~ /(<!DOCTYPE[^>]*>)/s)
+    {
+        print $fh "$1\n";
+    }
+}
+
+sub parseTree
+{
+    my $fh        = shift;
+    my $ref       = shift;
+    my $language  = shift || "";
+
+    my $name = shift @{ $ref };
+    my $cont = shift @{ $ref };
+    
+    while (!$name || "$name" eq "1") {
+        $name = shift @{ $ref };
+        $cont = shift @{ $ref };
+    }
+
+    my $spacepreserve = 0;
+    my $attrs = @{$cont}[0];
+    $spacepreserve = 1 if ((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?preserve["']?$/));
+
+    traverse($fh, $name, $cont, $language, $spacepreserve);
+}
+
+sub xml_merge_output
+{
+    my $source;
+
+    if ($MULTIPLE_OUTPUT) {
+        for my $lang (sort keys %po_files_by_lang) {
+	    if ( ! -d $lang ) {
+	        mkdir $lang or -d $lang or die "Cannot create subdirectory $lang: $!\n";
+            }
+            open OUTPUT, ">$lang/$OUTFILE" or die "Cannot open $lang/$OUTFILE: $!\n";
+            binmode (OUTPUT) if $^O eq 'MSWin32';
+            my $tree = readXml($FILE);
+            print_header($FILE, \*OUTPUT);
+            parseTree(\*OUTPUT, $tree, $lang);
+            close OUTPUT;
+            print "CREATED $lang/$OUTFILE\n" unless $QUIET_ARG;
+        }
+    } 
+    open OUTPUT, ">$OUTFILE" or die "Cannot open $OUTFILE: $!\n";
+    binmode (OUTPUT) if $^O eq 'MSWin32';
+    my $tree = readXml($FILE);
+    print_header($FILE, \*OUTPUT);
+    parseTree(\*OUTPUT, $tree);
+    close OUTPUT;
+    print "CREATED $OUTFILE\n" unless $QUIET_ARG;
+}
+
+sub keys_merge_translations
+{
+    open INPUT, "<${FILE}" or die;
+    open OUTPUT, ">${OUTFILE}" or die;
+    binmode (OUTPUT) if $^O eq 'MSWin32';
+
+    while (<INPUT>) 
+    {
+        if (s/^(\s*)_(\w+=(.*))/$1$2/)  
+        {
+	    my $string = $3;
+
+            print OUTPUT;
+
+	    my $non_translated_line = $_;
+
+            for my $lang (sort keys %po_files_by_lang) 
+            {
+		my $translation = $translations{$lang, $string};
+                next if !$translation;
+
+                $_ = $non_translated_line;
+		s/(\w+)=.*/[$lang]$1=$translation/;
+                print OUTPUT;
+            }
+	} 
+        else 
+        {
+            print OUTPUT;
+        }
+    }
+
+    close OUTPUT;
+    close INPUT;
+}
+
+sub desktop_merge_translations
+{
+    open INPUT, "<${FILE}" or die;
+    open OUTPUT, ">${OUTFILE}" or die;
+    binmode (OUTPUT) if $^O eq 'MSWin32';
+
+    while (<INPUT>) 
+    {
+        if (s/^(\s*)_(\w+=(.*))/$1$2/)  
+        {
+	    my $string = $3;
+
+            print OUTPUT;
+
+	    my $non_translated_line = $_;
+
+            for my $lang (sort keys %po_files_by_lang) 
+            {
+                my $translation = $translations{$lang, $string};
+                next if !$translation;
+
+                $_ = $non_translated_line;
+                s/(\w+)=.*/${1}[$lang]=$translation/;
+                print OUTPUT;
+            }
+	} 
+        else 
+        {
+            print OUTPUT;
+        }
+    }
+
+    close OUTPUT;
+    close INPUT;
+}
+
+sub schemas_merge_translations
+{
+    my $source;
+
+    {
+       local $/; # slurp mode
+       open INPUT, "<$FILE" or die "can't open $FILE: $!";
+       $source = <INPUT>;
+       close INPUT;
+    }
+
+    open OUTPUT, ">$OUTFILE" or die;
+    binmode (OUTPUT) if $^O eq 'MSWin32';
+
+    # FIXME: support attribute translations
+
+    # Empty nodes never need translation, so unmark all of them.
+    # For example, <_foo/> is just replaced by <foo/>.
+    $source =~ s|<\s*_($w+)\s*/>|<$1/>|g;
+
+    while ($source =~ s/
+                        (.*?)
+                        (\s+)(<locale\ name="C">(\s*)
+                            (<default>\s*(?:<!--[^>]*?-->\s*)?(.*?)\s*<\/default>)?(\s*)
+                            (<short>\s*(?:<!--[^>]*?-->\s*)?(.*?)\s*<\/short>)?(\s*)
+                            (<long>\s*(?:<!--[^>]*?-->\s*)?(.*?)\s*<\/long>)?(\s*)
+                        <\/locale>)
+                       //sx) 
+    {
+        print OUTPUT $1;
+
+	my $locale_start_spaces = $2 ? $2 : '';
+	my $default_spaces = $4 ? $4 : '';
+	my $short_spaces = $7 ? $7 : '';
+	my $long_spaces = $10 ? $10 : '';
+	my $locale_end_spaces = $13 ? $13 : '';
+	my $c_default_block = $3 ? $3 : '';
+	my $default_string = $6 ? $6 : '';
+	my $short_string = $9 ? $9 : '';
+	my $long_string = $12 ? $12 : '';
+
+	print OUTPUT "$locale_start_spaces$c_default_block";
+
+        $default_string =~ s/\s+/ /g;
+        $default_string = entity_decode($default_string);
+	$short_string =~ s/\s+/ /g;
+	$short_string = entity_decode($short_string);
+	$long_string =~ s/\s+/ /g;
+	$long_string = entity_decode($long_string);
+
+	for my $lang (sort keys %po_files_by_lang) 
+        {
+	    my $default_translation = $translations{$lang, $default_string};
+	    my $short_translation = $translations{$lang, $short_string};
+	    my $long_translation  = $translations{$lang, $long_string};
+
+	    next if (!$default_translation && !$short_translation && 
+                     !$long_translation);
+
+	    print OUTPUT "\n$locale_start_spaces<locale name=\"$lang\">";
+
+        print OUTPUT "$default_spaces";    
+
+        if ($default_translation)
+        {
+            $default_translation = entity_encode($default_translation);
+            print OUTPUT "<default>$default_translation</default>";
+        }
+
+	    print OUTPUT "$short_spaces";
+
+	    if ($short_translation)
+	    {
+			$short_translation = entity_encode($short_translation);
+			print OUTPUT "<short>$short_translation</short>";
+	    }
+
+	    print OUTPUT "$long_spaces";
+
+	    if ($long_translation)
+	    {
+			$long_translation = entity_encode($long_translation);
+			print OUTPUT "<long>$long_translation</long>";
+	    }	    
+
+	    print OUTPUT "$locale_end_spaces</locale>";
+        }
+    }
+
+    print OUTPUT $source;
+
+    close OUTPUT;
+}
+
+sub rfc822deb_merge_translations
+{
+    my %encodings = ();
+    for my $lang (keys %po_files_by_lang) {
+        $encodings{$lang} = ($UTF8_ARG ? 'UTF-8' : get_po_encoding($po_files_by_lang{$lang}));
+    }
+
+    my $source;
+
+    $Text::Wrap::huge = 'overflow';
+    $Text::Wrap::break = qr/\n|\s(?=\S)/;
+
+    {
+       local $/; # slurp mode
+       open INPUT, "<$FILE" or die "can't open $FILE: $!";
+       $source = <INPUT>;
+       close INPUT;
+    }
+
+    open OUTPUT, ">${OUTFILE}" or die;
+    binmode (OUTPUT) if $^O eq 'MSWin32';
+
+    while ($source =~ /(^|\n+)(_*)([^:\s]+)(:[ \t]*)(.*?)(?=\n[\S\n]|$)/sg)
+    {
+	    my $sep = $1;
+	    my $non_translated_line = $3.$4;
+	    my $string = $5;
+	    my $underscore = length($2);
+	    next if $underscore eq 0 && $non_translated_line =~ /^#/;
+	    #  Remove [] dummy strings
+	    my $stripped = $string;
+	    $stripped =~ s/\[\s[^\[\]]*\],/,/g if $underscore eq 2;
+	    $stripped =~ s/\[\s[^\[\]]*\]$//;
+	    $non_translated_line .= $stripped;
+
+	    print OUTPUT $sep.$non_translated_line;
+    
+	    if ($underscore) 
+	    {
+	        my @str_list = rfc822deb_split($underscore, $string);
+
+	        for my $lang (sort keys %po_files_by_lang) 
+                {
+                    my $is_translated = 1;
+                    my $str_translated = '';
+                    my $first = 1;
+                
+                    for my $str (@str_list) 
+                    {
+                        my $translation = $translations{$lang, $str};
+                    
+                        if (!$translation) 
+                        {
+                            $is_translated = 0;
+                            last;
+                        }
+
+	                #  $translation may also contain [] dummy
+                        #  strings, mostly to indicate an empty string
+	                $translation =~ s/\[\s[^\[\]]*\]$//;
+                        
+                        if ($first) 
+                        {
+                            if ($underscore eq 2)
+                            {
+                                $str_translated .= $translation;
+                            }
+                            else
+                            {
+                                $str_translated .=
+                                    Text::Tabs::expand($translation) .
+                                    "\n";
+                            }
+                        } 
+                        else 
+                        {
+                            if ($underscore eq 2)
+                            {
+                                $str_translated .= ', ' . $translation;
+                            }
+                            else
+                            {
+                                $str_translated .= Text::Tabs::expand(
+                                    Text::Wrap::wrap(' ', ' ', $translation)) .
+                                    "\n .\n";
+                            }
+                        }
+                        $first = 0;
+
+                        #  To fix some problems with Text::Wrap::wrap
+                        $str_translated =~ s/(\n )+\n/\n .\n/g;
+                    }
+                    next unless $is_translated;
+
+                    $str_translated =~ s/\n \.\n$//;
+                    $str_translated =~ s/\s+$//;
+
+                    $_ = $non_translated_line;
+                    s/^(\w+):\s*.*/$sep${1}-$lang.$encodings{$lang}: $str_translated/s;
+                    print OUTPUT;
+                }
+	    }
+    }
+    print OUTPUT "\n";
+
+    close OUTPUT;
+    close INPUT;
+}
+
+sub rfc822deb_split 
+{
+    # Debian defines a special way to deal with rfc822-style files:
+    # when a value contain newlines, it consists of
+    #   1.  a short form (first line)
+    #   2.  a long description, all lines begin with a space,
+    #       and paragraphs are separated by a single dot on a line
+    # This routine returns an array of all paragraphs, and reformat
+    # them.
+    # When first argument is 2, the string is a comma separated list of
+    # values.
+    my $type = shift;
+    my $text = shift;
+    $text =~ s/^[ \t]//mg;
+    return (split(/, */, $text, 0)) if $type ne 1;
+    return ($text) if $text !~ /\n/;
+
+    $text =~ s/([^\n]*)\n//;
+    my @list = ($1);
+    my $str = '';
+
+    for my $line (split (/\n/, $text)) 
+    {
+        chomp $line;
+        if ($line =~ /^\.\s*$/)
+        {
+            #  New paragraph
+            $str =~ s/\s*$//;
+            push(@list, $str);
+            $str = '';
+        } 
+        elsif ($line =~ /^\s/) 
+        {
+            #  Line which must not be reformatted
+            $str .= "\n" if length ($str) && $str !~ /\n$/;
+            $line =~ s/\s+$//;
+            $str .= $line."\n";
+        } 
+        else 
+        {
+            #  Continuation line, remove newline
+            $str .= " " if length ($str) && $str !~ /\n$/;
+            $str .= $line;
+        }
+    }
+
+    $str =~ s/\s*$//;
+    push(@list, $str) if length ($str);
+
+    return @list;
+}
+
+sub quoted_translation
+{
+    my ($lang, $string) = @_;
+
+    $string =~ s/\\\"/\"/g;
+
+    my $translation = $translations{$lang, $string};
+    $translation = $string if !$translation;
+
+    $translation =~ s/\"/\\\"/g;
+    return $translation
+}
+
+sub quoted_merge_translations
+{
+    if (!$MULTIPLE_OUTPUT) {
+        print "Quoted only supports Multiple Output.\n";
+        exit(1);
+    }
+
+    for my $lang (sort keys %po_files_by_lang) {
+        if ( ! -d $lang ) {
+            mkdir $lang or -d $lang or die "Cannot create subdirectory $lang: $!\n";
+        }
+        open INPUT, "<${FILE}" or die;
+        open OUTPUT, ">$lang/$OUTFILE" or die "Cannot open $lang/$OUTFILE: $!\n";
+        binmode (OUTPUT) if $^O eq 'MSWin32';
+        while (<INPUT>) 
+        {
+            s/\"(([^\"]|\\\")*[^\\\"])\"/"\"" . &quoted_translation($lang, $1) . "\""/ge;
+            print OUTPUT;
+        }
+        close OUTPUT;
+        close INPUT;
+    }
+}

Added: trunk/intltool-update.in
===================================================================
--- trunk/intltool-update.in	                        (rev 0)
+++ trunk/intltool-update.in	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,1164 @@
+#!@INTLTOOL_PERL@ -w
+# -*- Mode: perl; indent-tabs-mode: nil; c-basic-offset: 4  -*-
+
+#
+#  The Intltool Message Updater
+#
+#  Copyright (C) 2000-2003 Free Software Foundation.
+#
+#  Intltool is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU General Public License 
+#  version 2 published by the Free Software Foundation.
+#
+#  Intltool 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+#  As a special exception to the GNU General Public License, if you
+#  distribute this file as part of a program that contains a
+#  configuration script generated by Autoconf, you may include it under
+#  the same distribution terms that you use for the rest of that program.
+#
+#  Authors: Kenneth Christiansen <kenneth at gnu.org>
+#           Maciej Stachowiak
+#           Darin Adler <darin at bentspoon.com>
+
+## Release information
+my $PROGRAM = "intltool-update";
+my $VERSION = "0.36.2";
+my $PACKAGE = "intltool";
+
+## Loaded modules
+use strict;
+use Getopt::Long;
+use Cwd;
+use File::Copy;
+use File::Find;
+
+## Scalars used by the option stuff
+my $HELP_ARG 	   = 0;
+my $VERSION_ARG    = 0;
+my $DIST_ARG	   = 0;
+my $POT_ARG	   = 0;
+my $HEADERS_ARG    = 0;
+my $MAINTAIN_ARG   = 0;
+my $REPORT_ARG     = 0;
+my $VERBOSE	   = 0;
+my $GETTEXT_PACKAGE = "";
+my $OUTPUT_FILE    = "";
+
+my @languages;
+my %varhash = ();
+my %po_files_by_lang = ();
+
+# Regular expressions to categorize file types.
+# FIXME: Please check if the following is correct
+
+my $xml_support =
+"xml(?:\\.in)*|".	# http://www.w3.org/XML/ (Note: .in is not required)
+"ui|".			# Bonobo specific - User Interface desc. files
+"lang|".		# ?
+"glade2?(?:\\.in)*|".	# Glade specific - User Interface desc. files (Note: .in is not required)
+"scm(?:\\.in)*|".	# ? (Note: .in is not required)
+"oaf(?:\\.in)+|".	# DEPRECATED: Replaces by Bonobo .server files 
+"etspec|".		# ?
+"server(?:\\.in)+|".	# Bonobo specific
+"sheet(?:\\.in)+|".	# ?
+"schemas(?:\\.in)+|".	# GConf specific
+"pong(?:\\.in)+|".	# DEPRECATED: PONG is not used [by GNOME] any longer.
+"kbd(?:\\.in)+|".	# GOK specific. 
+"policy(?:\\.in)+";	# PolicyKit files
+
+my $ini_support =
+"icon(?:\\.in)+|".	# http://www.freedesktop.org/Standards/icon-theme-spec
+"desktop(?:\\.in)+|".	# http://www.freedesktop.org/Standards/menu-spec
+"caves(?:\\.in)+|".	# GNOME Games specific
+"directory(?:\\.in)+|".	# http://www.freedesktop.org/Standards/menu-spec
+"soundlist(?:\\.in)+|".	# GNOME specific
+"keys(?:\\.in)+|".	# GNOME Mime database specific
+"theme(?:\\.in)+|".	# http://www.freedesktop.org/Standards/icon-theme-spec
+"service(?:\\.in)+";    # DBus specific
+
+my $buildin_gettext_support = 
+"c|y|cs|cc|cpp|c\\+\\+|h|hh|gob|py";
+
+## Always flush buffer when printing
+$| = 1;
+
+## Sometimes the source tree will be rooted somewhere else.
+my $SRCDIR = $ENV{"srcdir"} || ".";
+my $POTFILES_in;
+
+$POTFILES_in = "<$SRCDIR/POTFILES.in";
+
+my $devnull = ($^O eq 'MSWin32' ? 'NUL:' : '/dev/null');
+
+## Handle options
+GetOptions 
+(
+ "help" 	       => \$HELP_ARG,
+ "version" 	       => \$VERSION_ARG,
+ "dist|d"	       => \$DIST_ARG,
+ "pot|p"	       => \$POT_ARG,
+ "headers|s"	       => \$HEADERS_ARG,
+ "maintain|m"	       => \$MAINTAIN_ARG,
+ "report|r"	       => \$REPORT_ARG,
+ "verbose|x"	       => \$VERBOSE,
+ "gettext-package|g=s" => \$GETTEXT_PACKAGE,
+ "output-file|o=s"     => \$OUTPUT_FILE,
+ ) or &Console_WriteError_InvalidOption;
+
+&Console_Write_IntltoolHelp if $HELP_ARG;
+&Console_Write_IntltoolVersion if $VERSION_ARG;
+
+my $arg_count = ($DIST_ARG > 0)
+    + ($POT_ARG > 0)
+    + ($HEADERS_ARG > 0)
+    + ($MAINTAIN_ARG > 0)
+    + ($REPORT_ARG > 0);
+
+&Console_Write_IntltoolHelp if $arg_count > 1;
+
+my $PKGNAME = FindPackageName ();
+
+# --version and --help don't require a module name
+my $MODULE = $GETTEXT_PACKAGE || $PKGNAME || "unknown";
+
+if ($POT_ARG)
+{
+    &GenerateHeaders;
+    &GeneratePOTemplate;
+}
+elsif ($HEADERS_ARG)
+{
+    &GenerateHeaders;
+}
+elsif ($MAINTAIN_ARG)
+{
+    &FindLeftoutFiles;
+}
+elsif ($REPORT_ARG)
+{
+    &GenerateHeaders;
+    &GeneratePOTemplate;
+    &Console_Write_CoverageReport;
+}
+elsif ((defined $ARGV[0]) && $ARGV[0] =~ /^[a-z]/)
+{
+    my $lang = $ARGV[0];
+
+    ## Report error if the language file supplied
+    ## to the command line is non-existent
+    &Console_WriteError_NotExisting("$SRCDIR/$lang.po")
+        if ! -s "$SRCDIR/$lang.po";
+
+    if (!$DIST_ARG)
+    {
+	print "Working, please wait..." if $VERBOSE;
+	&GenerateHeaders;
+	&GeneratePOTemplate;
+    }
+    &POFile_Update ($lang, $OUTPUT_FILE);
+    &Console_Write_TranslationStatus ($lang, $OUTPUT_FILE);
+} 
+else 
+{
+    &Console_Write_IntltoolHelp;
+}
+
+exit;
+
+#########
+
+sub Console_Write_IntltoolVersion
+{
+    print <<_EOF_;
+${PROGRAM} (${PACKAGE}) $VERSION
+Written by Kenneth Christiansen, Maciej Stachowiak, and Darin Adler.
+
+Copyright (C) 2000-2003 Free Software Foundation, Inc.
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+_EOF_
+    exit;
+}
+
+sub Console_Write_IntltoolHelp
+{
+    print <<_EOF_;
+Usage: ${PROGRAM} [OPTION]... LANGCODE
+Updates PO template files and merge them with the translations.
+
+Mode of operation (only one is allowed):
+  -p, --pot                   generate the PO template only
+  -s, --headers               generate the header files in POTFILES.in
+  -m, --maintain              search for left out files from POTFILES.in
+  -r, --report                display a status report for the module
+  -d, --dist                  merge LANGCODE.po with existing PO template
+
+Extra options:
+  -g, --gettext-package=NAME  override PO template name, useful with --pot
+  -o, --output-file=FILE      write merged translation to FILE
+  -x, --verbose               display lots of feedback
+      --help                  display this help and exit
+      --version               output version information and exit
+
+Examples of use:
+${PROGRAM} --pot    just create a new PO template
+${PROGRAM} xy       create new PO template and merge xy.po with it
+
+Report bugs to http://bugzilla.gnome.org/ (product name "$PACKAGE")
+or send email to <xml-i18n-tools\@gnome.org>.
+_EOF_
+    exit;
+}
+
+sub echo_n
+{
+    my $str = shift;
+    my $ret = `echo "$str"`;
+
+    $ret =~ s/\n$//; # do we need the "s" flag?
+
+    return $ret;
+}
+
+sub POFile_DetermineType ($) 
+{
+   my $type = $_;
+   my $gettext_type;
+
+   my $xml_regex     = "(?:" . $xml_support . ")";
+   my $ini_regex     = "(?:" . $ini_support . ")";
+   my $buildin_regex = "(?:" . $buildin_gettext_support . ")";
+
+   if ($type =~ /\[type: gettext\/([^\]].*)]/) 
+   {
+	$gettext_type=$1;
+   }
+   elsif ($type =~ /schemas(\.in)+$/) 
+   {
+	$gettext_type="schemas";
+   }
+   elsif ($type =~ /glade2?(\.in)*$/) 
+   {
+       $gettext_type="glade";
+   }
+   elsif ($type =~ /scm(\.in)*$/) 
+   {
+       $gettext_type="scheme";
+   }
+   elsif ($type =~ /keys(\.in)+$/) 
+   {
+       $gettext_type="keys";
+   }
+
+   # bucket types
+
+   elsif ($type =~ /$xml_regex$/) 
+   {
+       $gettext_type="xml";
+   }
+   elsif ($type =~ /$ini_regex$/) 
+   { 
+       $gettext_type="ini";
+   }
+   elsif ($type =~ /$buildin_regex$/) 
+   {
+       $gettext_type="buildin";
+   }
+   else
+   { 
+       $gettext_type="unknown"; 
+   }
+
+   return "gettext\/$gettext_type";
+}
+
+sub TextFile_DetermineEncoding ($) 
+{
+    my $gettext_code="ASCII"; # All files are ASCII by default
+    my $filetype=`file $_ | cut -d ' ' -f 2`;
+
+    if ($? eq "0")
+    {
+	if ($filetype =~ /^(ISO|UTF)/)
+	{
+	    chomp ($gettext_code = $filetype);
+	}
+	elsif ($filetype =~ /^XML/)
+	{
+	    $gettext_code="UTF-8"; # We asume that .glade and other .xml files are UTF-8
+	}
+    }
+
+    return $gettext_code;
+}
+
+sub isNotValidMissing
+{
+    my ($file) = @_;
+
+    return if $file =~ /^\{arch\}\/.*$/;
+    return if $file =~ /^$varhash{"PACKAGE"}-$varhash{"VERSION"}\/.*$/;
+}
+
+sub FindLeftoutFiles
+{
+    my (@buf_i18n_plain,
+	@buf_i18n_xml,
+	@buf_i18n_xml_unmarked,
+	@buf_i18n_ini,
+	@buf_potfiles,
+	@buf_potfiles_ignore,
+	@buf_allfiles,
+	@buf_allfiles_sorted,
+	@buf_potfiles_sorted,
+        @buf_potfiles_ignore_sorted
+    );
+
+    ## Search and find all translatable files
+    find sub { 
+	push @buf_i18n_plain,        "$File::Find::name" if /\.($buildin_gettext_support)$/;
+	push @buf_i18n_xml,          "$File::Find::name" if /\.($xml_support)$/;
+	push @buf_i18n_ini,          "$File::Find::name" if /\.($ini_support)$/;
+	push @buf_i18n_xml_unmarked, "$File::Find::name" if /\.(schemas(\.in)+)$/;
+	}, "..";
+    find sub { 
+	push @buf_i18n_plain,        "$File::Find::name" if /\.($buildin_gettext_support)$/;
+	push @buf_i18n_xml,          "$File::Find::name" if /\.($xml_support)$/;
+	push @buf_i18n_ini,          "$File::Find::name" if /\.($ini_support)$/;
+	push @buf_i18n_xml_unmarked, "$File::Find::name" if /\.(schemas(\.in)+)$/;
+	}, "$SRCDIR/..";
+
+    open POTFILES, $POTFILES_in or die "$PROGRAM:  there's no POTFILES.in!\n";
+    @buf_potfiles = grep !/^(#|\s*$)/, <POTFILES>;
+    close POTFILES;
+
+    foreach (@buf_potfiles) {
+	s/^\[.*]\s*//;
+    }
+
+    print "Searching for missing translatable files...\n" if $VERBOSE;
+
+    ## Check if we should ignore some found files, when
+    ## comparing with POTFILES.in
+    foreach my $ignore ("POTFILES.skip", "POTFILES.ignore")
+    {
+	(-s "$SRCDIR/$ignore") or next;
+
+	if ("$ignore" eq "POTFILES.ignore")
+	{
+	    print "The usage of POTFILES.ignore is deprecated. Please consider moving the\n".
+		  "content of this file to POTFILES.skip.\n";
+	}
+
+	print "Found $ignore: Ignoring files...\n" if $VERBOSE;
+	open FILE, "<$SRCDIR/$ignore" or die "ERROR: Failed to open $SRCDIR/$ignore!\n";
+	    
+	while (<FILE>)
+	{
+	    push @buf_potfiles_ignore, $_ unless /^(#|\s*$)/;
+	}
+	close FILE;
+
+	@buf_potfiles_ignore_sorted = sort (@buf_potfiles_ignore);
+    }
+
+    foreach my $file (@buf_i18n_plain)
+    {
+	my $in_comment = 0;
+	my $in_macro = 0;
+
+	open FILE, "<$file";
+	while (<FILE>)
+	{
+	    # Handle continued multi-line comment.
+	    if ($in_comment)
+	    {
+		next unless s-.*\*/--;
+		$in_comment = 0;
+	    }
+
+	    # Handle continued macro.
+	    if ($in_macro)
+	    {
+		$in_macro = 0 unless /\\$/;
+		next;
+	    }
+
+	    # Handle start of macro (or any preprocessor directive).
+	    if (/^\s*\#/)
+	    {
+		$in_macro = 1 if /^([^\\]|\\.)*\\$/;
+		next;
+	    }
+
+	    # Handle comments and quoted text.
+	    while (m-(/\*|//|\'|\")-) # \' and \" keep emacs perl mode happy
+	    {
+		my $match = $1;
+		if ($match eq "/*")
+		{
+		    if (!s-/\*.*?\*/--)
+		    {
+			s-/\*.*--;
+			$in_comment = 1;
+		    }
+		}
+		elsif ($match eq "//")
+		{
+		    s-//.*--;
+		}
+		else # ' or "
+		{
+		    if (!s-$match([^\\]|\\.)*?$match-QUOTEDTEXT-)
+		    {
+			warn "mismatched quotes at line $. in $file\n";
+			s-$match.*--;
+		    }
+		}
+	    }	    
+
+	    if (/\w\.GetString *\(QUOTEDTEXT/)
+	    {
+                if (defined isNotValidMissing (unpack("x3 A*", $file))) {
+                    ## Remove the first 3 chars and add newline
+                    push @buf_allfiles, unpack("x3 A*", $file) . "\n";
+                }
+		last;
+	    }
+
+            ## N_ Q_ and _ are the three macros defined in gi8n.h
+	    if (/[NQ]?_ *\(QUOTEDTEXT/)
+	    {
+                if (defined isNotValidMissing (unpack("x3 A*", $file))) {
+                    ## Remove the first 3 chars and add newline
+                    push @buf_allfiles, unpack("x3 A*", $file) . "\n";
+                }
+		last;
+	    }
+	}
+	close FILE;
+    }
+
+    foreach my $file (@buf_i18n_xml) 
+    {
+	open FILE, "<$file";
+	
+	while (<FILE>) 
+	{
+	    # FIXME: share the pattern matching code with intltool-extract
+	    if (/\s_[-A-Za-z0-9._:]+\s*=\s*\"([^"]+)\"/ || /<_[^>]+>/ || /translatable=\"yes\"/)
+	    {
+                if (defined isNotValidMissing (unpack("x3 A*", $file))) {
+                    push @buf_allfiles, unpack("x3 A*", $file) . "\n";
+                }
+		last;
+	    }
+	}
+	close FILE;
+    }
+
+    foreach my $file (@buf_i18n_ini)
+    {
+	open FILE, "<$file";
+	while (<FILE>) 
+	{
+	    if (/_(.*)=/)
+	    {
+                if (defined isNotValidMissing (unpack("x3 A*", $file))) {
+                    push @buf_allfiles, unpack("x3 A*", $file) . "\n";
+                }
+		last;
+	    }
+	}
+	close FILE;
+    }
+
+    foreach my $file (@buf_i18n_xml_unmarked)
+    {
+        if (defined isNotValidMissing (unpack("x3 A*", $file))) {
+            push @buf_allfiles, unpack("x3 A*", $file) . "\n";
+        }
+    }
+
+
+    @buf_allfiles_sorted = sort (@buf_allfiles);
+    @buf_potfiles_sorted = sort (@buf_potfiles);
+
+    my %in2;
+    foreach (@buf_potfiles_sorted) 
+    {
+        s#^$SRCDIR/../##;
+        s#^$SRCDIR/##;
+	$in2{$_} = 1;
+    }
+
+    foreach (@buf_potfiles_ignore_sorted) 
+    {
+        s#^$SRCDIR/../##;
+        s#^$SRCDIR/##;
+	$in2{$_} = 1;
+    }
+
+    my @result;
+
+    foreach (@buf_allfiles_sorted)
+    {
+        my $dummy = $_;
+        my $srcdir = $SRCDIR;
+
+        $srcdir =~ s#^../##;
+        $dummy =~ s#^$srcdir/../##;
+        $dummy =~ s#^$srcdir/##;
+        $dummy =~ s#_build/##;
+	if (!exists($in2{$dummy}))
+	{
+	    push @result, $dummy
+	}
+    }
+
+    my @buf_potfiles_notexist;
+
+    foreach (@buf_potfiles_sorted)
+    {
+	chomp (my $dummy = $_);
+	if ("$dummy" ne "" and !(-f "$SRCDIR/../$dummy" or -f "../$dummy"))
+	{
+	    push @buf_potfiles_notexist, $_;
+	}
+    }
+
+    ## Save file with information about the files missing
+    ## if any, and give information about this procedure.
+    if (@result + @buf_potfiles_notexist > 0)
+    {
+	if (@result) 
+	{
+	    print "\n" if $VERBOSE;
+	    unlink "missing";
+	    open OUT, ">missing";
+	    print OUT @result;
+	    close OUT;
+	    warn "\e[1mThe following files contain translations and are currently not in use. Please\e[0m\n".
+	         "\e[1mconsider adding these to the POTFILES.in file, located in the po/ directory.\e[0m\n\n";
+	    print STDERR @result, "\n";
+	    warn "If some of these files are left out on purpose then please add them to\n".
+		 "POTFILES.skip instead of POTFILES.in. A file \e[1m'missing'\e[0m containing this list\n".
+		 "of left out files has been written in the current directory.\n";
+	}
+	if (@buf_potfiles_notexist)
+	{
+	    unlink "notexist";
+	    open OUT, ">notexist";
+	    print OUT @buf_potfiles_notexist;
+	    close OUT;
+	    warn "\n" if ($VERBOSE or @result);
+	    warn "\e[1mThe following files do not exist anymore:\e[0m\n\n";
+	    warn @buf_potfiles_notexist, "\n";
+	    warn "Please remove them from POTFILES.in. A file \e[1m'notexist'\e[0m\n".
+		 "containing this list of absent files has been written in the current directory.\n";
+	}
+    }
+
+    ## If there is nothing to complain about, notify the user
+    else {
+	print "\nAll files containing translations are present in POTFILES.in.\n" if $VERBOSE;
+    }
+}
+
+sub Console_WriteError_InvalidOption
+{
+    ## Handle invalid arguments
+    print STDERR "Try `${PROGRAM} --help' for more information.\n";
+    exit 1;
+}
+
+sub isProgramInPath
+{
+    my ($file) = @_;
+    # If either a file exists, or when run it returns 0 exit status
+    return 1 if ((-x $file) or (system("$file --version >$devnull") == 0));
+    return 0;
+}
+
+sub isGNUGettextTool
+{
+    my ($file) = @_;
+    # Check that we are using GNU gettext tools
+    if (isProgramInPath ($file))
+    {
+        my $version = `$file --version`;
+        return 1 if ($version =~ m/.*\(GNU .*\).*/);
+    }
+    return 0;
+}
+
+sub GenerateHeaders
+{
+    my $EXTRACT = $ENV{"INTLTOOL_EXTRACT"} || "intltool-extract";
+
+    ## Generate the .h header files, so we can allow glade and
+    ## xml translation support
+    if (! isProgramInPath ("$EXTRACT"))
+    {
+	print STDERR "\n *** The intltool-extract script wasn't found!"
+	     ."\n *** Without it, intltool-update can not generate files.\n";
+	exit;
+    }
+    else
+    {
+	open (FILE, $POTFILES_in) or die "$PROGRAM: POTFILES.in not found.\n";
+	
+	while (<FILE>) 
+	{
+	   chomp;
+	   next if /^\[\s*encoding/;
+
+	   ## Find xml files in POTFILES.in and generate the
+	   ## files with help from the extract script
+
+	   my $gettext_type= &POFile_DetermineType ($1);
+
+	   if (/\.($xml_support|$ini_support)$/ || /^\[/)
+	   {
+	       s/^\[[^\[].*]\s*//;
+
+	       my $filename = "../$_";
+
+	       if ($VERBOSE)
+	       {
+		   system ($EXTRACT, "--update", "--srcdir=$SRCDIR",
+			   "--type=$gettext_type", $filename);
+	       } 
+	       else 
+	       {
+	 	   system ($EXTRACT, "--update", "--type=$gettext_type", 
+			   "--srcdir=$SRCDIR", "--quiet", $filename);
+	       }
+	   }
+       }
+       close FILE;
+   }
+}
+
+#
+# Generate .pot file from POTFILES.in
+#
+sub GeneratePOTemplate
+{
+    my $XGETTEXT = $ENV{"XGETTEXT"} || "xgettext";
+    my $XGETTEXT_ARGS = $ENV{"XGETTEXT_ARGS"} || '';
+    chomp $XGETTEXT;
+
+    if (! isGNUGettextTool ("$XGETTEXT"))
+    {
+	print STDERR " *** GNU xgettext is not found on this system!\n".
+		     " *** Without it, intltool-update can not extract strings.\n";
+	exit;
+    }
+
+    print "Building $MODULE.pot...\n" if $VERBOSE;
+
+    open INFILE, $POTFILES_in;
+    unlink "POTFILES.in.temp";
+    open OUTFILE, ">POTFILES.in.temp" or die("Cannot open POTFILES.in.temp for writing");
+
+    my $gettext_support_nonascii = 0;
+
+    # checks for GNU gettext >= 0.12
+    my $dummy = `$XGETTEXT --version --from-code=UTF-8 >$devnull 2>$devnull`;
+    if ($? == 0)
+    {
+	$gettext_support_nonascii = 1;
+    }
+    else
+    {
+	# urge everybody to upgrade gettext
+	print STDERR "WARNING: This version of gettext does not support extracting non-ASCII\n".
+		     "         strings. That means you should install a version of gettext\n".
+		     "         that supports non-ASCII strings (such as GNU gettext >= 0.12),\n".
+		     "         or have to let non-ASCII strings untranslated. (If there is any)\n";
+    }
+
+    my $encoding = "ASCII";
+    my $forced_gettext_code;
+    my @temp_headers;
+    my $encoding_problem_is_reported = 0;
+
+    while (<INFILE>) 
+    {
+	next if (/^#/ or /^\s*$/);
+
+	chomp;
+
+	my $gettext_code;
+
+	if (/^\[\s*encoding:\s*(.*)\s*\]/)
+	{
+	    $forced_gettext_code=$1;
+	}
+	elsif (/\.($xml_support|$ini_support)$/ || /^\[/)
+	{
+	    s/^\[.*]\s*//;
+            print OUTFILE "../$_.h\n";
+	    push @temp_headers, "../$_.h";
+	    $gettext_code = &TextFile_DetermineEncoding ("../$_.h") if ($gettext_support_nonascii and not defined $forced_gettext_code);
+	} 
+	else 
+	{
+            print OUTFILE "$SRCDIR/../$_\n";
+	    $gettext_code = &TextFile_DetermineEncoding ("$SRCDIR/../$_") if ($gettext_support_nonascii and not defined $forced_gettext_code);
+	}
+
+	next if (! $gettext_support_nonascii);
+
+	if (defined $forced_gettext_code)
+	{
+	    $encoding=$forced_gettext_code;
+	}
+	elsif (defined $gettext_code and "$encoding" ne "$gettext_code")
+	{
+	    if ($encoding eq "ASCII")
+	    {
+		$encoding=$gettext_code;
+	    }
+	    elsif ($gettext_code ne "ASCII")
+	    {
+		# Only report once because the message is quite long
+		if (! $encoding_problem_is_reported)
+		{
+		    print STDERR "WARNING: You should use the same file encoding for all your project files,\n".
+				 "         but $PROGRAM thinks that most of the source files are in\n".
+				 "         $encoding encoding, while \"$_\" is (likely) in\n".
+		       		 "         $gettext_code encoding. If you are sure that all translatable strings\n".
+				 "         are in same encoding (say UTF-8), please \e[1m*prepend*\e[0m the following\n".
+				 "         line to POTFILES.in:\n\n".
+				 "                 [encoding: UTF-8]\n\n".
+				 "         and make sure that configure.in/ac checks for $PACKAGE >= 0.27 .\n".
+				 "(such warning message will only be reported once.)\n";
+		    $encoding_problem_is_reported = 1;
+		}
+	    }
+	}
+    }
+
+    close OUTFILE;
+    close INFILE;
+
+    unlink "$MODULE.pot";
+    my @xgettext_argument=("$XGETTEXT",
+			   "--add-comments",
+			   "--directory\=.",
+                           "--default-domain\=$MODULE",
+                           "--flag\=g_strdup_printf:1:c-format",
+                           "--flag\=g_string_printf:2:c-format",
+                           "--flag\=g_string_append_printf:2:c-format",
+                           "--flag\=g_error_new:3:c-format",
+                           "--flag\=g_set_error:4:c-format",
+                           "--flag\=g_markup_printf_escaped:1:c-format",
+                           "--flag\=g_log:3:c-format",
+                           "--flag\=g_print:1:c-format",
+                           "--flag\=g_printerr:1:c-format",
+                           "--flag\=g_printf:1:c-format",
+                           "--flag\=g_fprintf:2:c-format",
+                           "--flag\=g_sprintf:2:c-format",
+                           "--flag\=g_snprintf:3:c-format",
+                           "--flag\=g_scanner_error:2:c-format",
+                           "--flag\=g_scanner_warn:2:c-format",
+			   "--output\=$MODULE\.pot",
+			   "--files-from\=\.\/POTFILES\.in\.temp");
+    my $XGETTEXT_KEYWORDS = &FindPOTKeywords;
+    push @xgettext_argument, $XGETTEXT_KEYWORDS;
+    my $MSGID_BUGS_ADDRESS = &FindMakevarsBugAddress;
+    push @xgettext_argument, "--msgid-bugs-address\=$MSGID_BUGS_ADDRESS" if $MSGID_BUGS_ADDRESS;
+    push @xgettext_argument, "--from-code\=$encoding" if ($gettext_support_nonascii);
+    push @xgettext_argument, $XGETTEXT_ARGS if $XGETTEXT_ARGS;
+    my $xgettext_command = join ' ', @xgettext_argument;
+
+    # intercept xgettext error message
+    print "Running $xgettext_command\n" if $VERBOSE;
+    my $xgettext_error_msg = `$xgettext_command 2>\&1`;
+    my $command_failed = $?;
+
+    unlink "POTFILES.in.temp";
+
+    print "Removing generated header (.h) files..." if $VERBOSE;
+    unlink foreach (@temp_headers);
+    print "done.\n" if $VERBOSE;
+
+    if (! $command_failed)
+    {
+	if (! -e "$MODULE.pot")
+	{
+	    print "None of the files in POTFILES.in contain strings marked for translation.\n" if $VERBOSE;
+	}
+	else
+	{
+	    print "Wrote $MODULE.pot\n" if $VERBOSE;
+	}
+    }
+    else
+    {
+	if ($xgettext_error_msg =~ /--from-code/)
+	{
+	    # replace non-ASCII error message with a more useful one.
+	    print STDERR "ERROR: xgettext failed to generate PO template file because there is non-ASCII\n".
+			 "       string marked for translation. Please make sure that all strings marked\n".
+			 "       for translation are in uniform encoding (say UTF-8), then \e[1m*prepend*\e[0m the\n".
+			 "       following line to POTFILES.in and rerun $PROGRAM:\n\n".
+			 "           [encoding: UTF-8]\n\n";
+	}
+	else
+	{
+	    print STDERR "$xgettext_error_msg";
+	    if (-e "$MODULE.pot")
+	    {
+		# is this possible?
+		print STDERR "ERROR: xgettext failed but still managed to generate PO template file.\n".
+			     "       Please consult error message above if there is any.\n";
+	    }
+	    else
+	    {
+		print STDERR "ERROR: xgettext failed to generate PO template file. Please consult\n".
+			     "       error message above if there is any.\n";
+	    }
+	}
+	exit (1);
+    }
+}
+
+sub POFile_Update
+{
+    -f "$MODULE.pot" or die "$PROGRAM: $MODULE.pot does not exist.\n";
+
+    my $MSGMERGE = $ENV{"MSGMERGE"} || "msgmerge";
+    my ($lang, $outfile) = @_;
+
+    if (! isGNUGettextTool ("$MSGMERGE"))
+    {
+	print STDERR " *** GNU msgmerge is not found on this system!\n".
+		     " *** Without it, intltool-update can not extract strings.\n";
+	exit;
+    }
+
+    print "Merging $SRCDIR/$lang.po with $MODULE.pot..." if $VERBOSE;
+
+    my $infile = "$SRCDIR/$lang.po";
+    $outfile = "$SRCDIR/$lang.po" if ($outfile eq "");
+
+    # I think msgmerge won't overwrite old file if merge is not successful
+    system ("$MSGMERGE", "-o", $outfile, $infile, "$MODULE.pot");
+}
+
+sub Console_WriteError_NotExisting
+{
+    my ($file) = @_;
+
+    ## Report error if supplied language file is non-existing
+    print STDERR "$PROGRAM: $file does not exist!\n";
+    print STDERR "Try '$PROGRAM --help' for more information.\n";
+    exit;
+}
+
+sub GatherPOFiles
+{
+    my @po_files = glob ("./*.po");
+
+    @languages = map (&POFile_GetLanguage, @po_files);
+
+    foreach my $lang (@languages) 
+    {
+	$po_files_by_lang{$lang} = shift (@po_files);
+    }
+}
+
+sub POFile_GetLanguage ($)
+{
+    s/^(.*\/)?(.+)\.po$/$2/;
+    return $_;
+}
+
+sub Console_Write_TranslationStatus
+{
+    my ($lang, $output_file) = @_;
+    my $MSGFMT = $ENV{"MSGFMT"} || "msgfmt";
+
+    if (! isGNUGettextTool ("$MSGFMT"))
+    {
+	print STDERR " *** GNU msgfmt is not found on this system!\n".
+		     " *** Without it, intltool-update can not extract strings.\n";
+	exit;
+    }
+
+    $output_file = "$SRCDIR/$lang.po" if ($output_file eq "");
+
+    system ("$MSGFMT", "-o", "$devnull", "--verbose", $output_file);
+}
+
+sub Console_Write_CoverageReport
+{
+    my $MSGFMT = $ENV{"MSGFMT"} || "msgfmt";
+
+    if (! isGNUGettextTool ("$MSGFMT"))
+    {
+	print STDERR " *** GNU msgfmt is not found on this system!\n".
+		     " *** Without it, intltool-update can not extract strings.\n";
+	exit;
+    }
+
+    &GatherPOFiles;
+
+    foreach my $lang (@languages) 
+    {
+	print STDERR "$lang: ";
+	&POFile_Update ($lang, "");
+    }
+
+    print STDERR "\n\n * Current translation support in $MODULE \n\n";
+
+    foreach my $lang (@languages)
+    {
+	print STDERR "$lang: ";
+	system ("$MSGFMT", "-o", "$devnull", "--verbose", "$SRCDIR/$lang.po");
+    }
+}
+
+sub SubstituteVariable
+{
+    my ($str) = @_;
+    
+    # always need to rewind file whenever it has been accessed
+    seek (CONF, 0, 0);
+
+    # cache each variable. varhash is global to we can add
+    # variables elsewhere.
+    while (<CONF>)
+    {
+	if (/^(\w+)=(.*)$/)
+	{
+	    ($varhash{$1} = $2) =~  s/^["'](.*)["']$/$1/;
+	}
+    }
+    
+    if ($str =~ /^(.*)\${?([A-Z_]+)}?(.*)$/)
+    {
+	my $rest = $3;
+	my $untouched = $1;
+	my $sub = "";
+        # Ignore recursive definitions of variables
+        $sub = $varhash{$2} if defined $varhash{$2} and $varhash{$2} !~ /\${?$2}?/;
+
+	return SubstituteVariable ("$untouched$sub$rest");
+    }
+    
+    # We're using Perl backticks ` and "echo -n" here in order to 
+    # expand any shell escapes (such as backticks themselves) in every variable
+    return echo_n ($str);
+}
+
+sub CONF_Handle_Open
+{
+    my $base_dirname = getcwd();
+    $base_dirname =~ s at .*/@@;
+
+    my ($conf_in, $src_dir);
+
+    if ($base_dirname =~ /^po(-.+)?$/) 
+    {
+	if (-f "Makevars") 
+	{
+	    my $makefile_source;
+
+	    local (*IN);
+	    open (IN, "<Makevars") || die "can't open Makevars: $!";
+
+	    while (<IN>) 
+	    {
+		if (/^top_builddir[ \t]*=/) 
+		{
+		    $src_dir = $_;
+		    $src_dir =~ s/^top_builddir[ \t]*=[ \t]*([^ \t\n\r]*)/$1/;
+
+		    chomp $src_dir;
+                    if (-f "$src_dir" . "/configure.ac") {
+                        $conf_in = "$src_dir" . "/configure.ac" . "\n";
+                    } else {
+                        $conf_in = "$src_dir" . "/configure.in" . "\n";
+                    }
+		    last;
+		}
+	    }
+	    close IN;
+
+	    $conf_in || die "Cannot find top_builddir in Makevars.";
+	}
+	elsif (-f "$SRCDIR/../configure.ac") 
+	{
+	    $conf_in = "$SRCDIR/../configure.ac";
+	} 
+	elsif (-f "$SRCDIR/../configure.in") 
+	{
+	    $conf_in = "$SRCDIR/../configure.in";
+	} 
+	else 
+	{
+	    my $makefile_source;
+
+	    local (*IN);
+	    open (IN, "<Makefile") || return;
+
+	    while (<IN>) 
+	    {
+		if (/^top_srcdir[ \t]*=/) 
+		{
+		    $src_dir = $_;		    
+		    $src_dir =~ s/^top_srcdir[ \t]*=[ \t]*([^ \t\n\r]*)/$1/;
+
+		    chomp $src_dir;
+		    $conf_in = "$src_dir" . "/configure.in" . "\n";
+
+		    last;
+		}
+	    }
+	    close IN;
+
+	    $conf_in || die "Cannot find top_srcdir in Makefile.";
+	}
+
+	open (CONF, "<$conf_in");
+    }
+    else
+    {
+	print STDERR "$PROGRAM: Unable to proceed.\n" .
+		     "Make sure to run this script inside the po directory.\n";
+	exit;
+    }
+}
+
+sub FindPackageName
+{
+    my $version;
+    my $domain = &FindMakevarsDomain;
+    my $name = $domain || "untitled";
+
+    &CONF_Handle_Open;
+
+    my $conf_source; {
+	local (*IN);
+	open (IN, "<&CONF") || return $name;
+	seek (IN, 0, 0);
+	local $/; # slurp mode
+	$conf_source = <IN>;
+	close IN;
+    }
+
+    # priority for getting package name:
+    # 1. GETTEXT_PACKAGE
+    # 2. first argument of AC_INIT (with >= 2 arguments)
+    # 3. first argument of AM_INIT_AUTOMAKE (with >= 2 argument)
+
+    # /^AM_INIT_AUTOMAKE\([\s\[]*([^,\)\s\]]+)/m 
+    # the \s makes this not work, why?
+    if ($conf_source =~ /^AM_INIT_AUTOMAKE\(([^,\)]+),([^,\)]+)/m)
+    {
+	($name, $version) = ($1, $2);
+	$name    =~ s/[\[\]\s]//g;
+	$version =~ s/[\[\]\s]//g;
+	$varhash{"PACKAGE_NAME"} = $name if (not $name =~ /\${?AC_PACKAGE_NAME}?/);
+	$varhash{"PACKAGE"} = $name if (not $name =~ /\${?PACKAGE}?/);
+	$varhash{"PACKAGE_VERSION"} = $version if (not $name =~ /\${?AC_PACKAGE_VERSION}?/);
+	$varhash{"VERSION"} = $version if (not $name =~ /\${?VERSION}?/);
+    }
+    
+    if ($conf_source =~ /^AC_INIT\(([^,\)]+),([^,\)]+)/m) 
+    {
+	($name, $version) = ($1, $2);
+	$name    =~ s/[\[\]\s]//g;
+	$version =~ s/[\[\]\s]//g;
+	$varhash{"PACKAGE_NAME"} = $name if (not $name =~ /\${?AC_PACKAGE_NAME}?/);
+	$varhash{"PACKAGE"} = $name if (not $name =~ /\${?PACKAGE}?/);
+	$varhash{"PACKAGE_VERSION"} = $version if (not $name =~ /\${?AC_PACKAGE_VERSION}?/);
+	$varhash{"VERSION"} = $version if (not $name =~ /\${?VERSION}?/);
+    }
+
+    # \s makes this not work, why?
+    $name = $1 if $conf_source =~ /^GETTEXT_PACKAGE=\[?([^\n\]]+)/m;
+    
+    # m4 macros AC_PACKAGE_NAME, AC_PACKAGE_VERSION etc. have same value
+    # as corresponding $PACKAGE_NAME, $PACKAGE_VERSION etc. shell variables.
+    $name =~ s/\bAC_PACKAGE_/\$PACKAGE_/g;
+
+    $name = $domain if $domain;
+
+    $name = SubstituteVariable ($name);
+    $name =~ s/^["'](.*)["']$/$1/;
+
+    return $name if $name;
+}
+
+
+sub FindPOTKeywords
+{
+
+    my $keywords = "--keyword\=\_ --keyword\=N\_ --keyword\=U\_ --keyword\=Q\_";
+    my $varname = "XGETTEXT_OPTIONS";
+    my $make_source; {
+	local (*IN);
+	open (IN, "<Makevars") || (open(IN, "<Makefile.in.in") && ($varname = "XGETTEXT_KEYWORDS")) || return $keywords;
+	seek (IN, 0, 0);
+	local $/; # slurp mode
+	$make_source = <IN>;
+	close IN;
+    }
+
+    $keywords = $1 if $make_source =~ /^$varname[ ]*=\[?([^\n\]]+)/m;
+    
+    return $keywords;
+}
+
+sub FindMakevarsDomain
+{
+
+    my $domain = "";
+    my $makevars_source; { 
+	local (*IN);
+	open (IN, "<Makevars") || return $domain;
+	seek (IN, 0, 0);
+	local $/; # slurp mode
+	$makevars_source = <IN>;
+	close IN;
+    }
+
+    $domain = $1 if $makevars_source =~ /^DOMAIN[ ]*=\[?([^\n\]\$]+)/m;
+    $domain =~ s/^\s+//;
+    $domain =~ s/\s+$//;
+    
+    return $domain;
+}
+
+sub FindMakevarsBugAddress
+{
+
+    my $address = "";
+    my $makevars_source; { 
+	local (*IN);
+	open (IN, "<Makevars") || return undef;
+	seek (IN, 0, 0);
+	local $/; # slurp mode
+	$makevars_source = <IN>;
+	close IN;
+    }
+
+    $address = $1 if $makevars_source =~ /^MSGID_BUGS_ADDRESS[ ]*=\[?([^\n\]\$]+)/m;
+    $address =~ s/^\s+//;
+    $address =~ s/\s+$//;
+    
+    return $address;
+}

Added: trunk/missing
===================================================================
--- trunk/missing	                        (rev 0)
+++ trunk/missing	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,367 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+
+scriptversion=2006-05-10.23
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006
+#   Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard at iro.umontreal.ca>, 1996.
+
+# 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, 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.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+  echo 1>&2 "Try \`$0 --help' for more information"
+  exit 1
+fi
+
+run=:
+sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
+sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+  configure_ac=configure.ac
+else
+  configure_ac=configure.in
+fi
+
+msg="missing on your system"
+
+case $1 in
+--run)
+  # Try to run requested program, and just exit if it succeeds.
+  run=
+  shift
+  "$@" && exit 0
+  # Exit code 63 means version mismatch.  This often happens
+  # when the user try to use an ancient version of a tool on
+  # a file that requires a minimum version.  In this case we
+  # we should proceed has if the program had been absent, or
+  # if --run hadn't been passed.
+  if test $? = 63; then
+    run=:
+    msg="probably too old"
+  fi
+  ;;
+
+  -h|--h|--he|--hel|--help)
+    echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+  -h, --help      display this help and exit
+  -v, --version   output version information and exit
+  --run           try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+  aclocal      touch file \`aclocal.m4'
+  autoconf     touch file \`configure'
+  autoheader   touch file \`config.h.in'
+  autom4te     touch the output file, or create a stub one
+  automake     touch all \`Makefile.in' files
+  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
+  flex         create \`lex.yy.c', if possible, from existing .c
+  help2man     touch the output file
+  lex          create \`lex.yy.c', if possible, from existing .c
+  makeinfo     touch the output file
+  tar          try tar, gnutar, gtar, then tar without non-portable flags
+  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]
+
+Send bug reports to <bug-automake at gnu.org>."
+    exit $?
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing $scriptversion (GNU Automake)"
+    exit $?
+    ;;
+
+  -*)
+    echo 1>&2 "$0: Unknown \`$1' option"
+    echo 1>&2 "Try \`$0 --help' for more information"
+    exit 1
+    ;;
+
+esac
+
+# Now exit if we have it, but it failed.  Also exit now if we
+# don't have it and --version was passed (most likely to detect
+# the program).
+case $1 in
+  lex|yacc)
+    # Not GNU programs, they don't have --version.
+    ;;
+
+  tar)
+    if test -n "$run"; then
+       echo 1>&2 "ERROR: \`tar' requires --run"
+       exit 1
+    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+       exit 1
+    fi
+    ;;
+
+  *)
+    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+       # We have it, but it failed.
+       exit 1
+    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+       # Could not run --version or --help.  This is probably someone
+       # running `$TOOL --version' or `$TOOL --help' to check whether
+       # $TOOL exists and not knowing $TOOL uses missing.
+       exit 1
+    fi
+    ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case $1 in
+  aclocal*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acinclude.m4' or \`${configure_ac}'.  You might want
+         to install the \`Automake' and \`Perl' packages.  Grab them from
+         any GNU archive site."
+    touch aclocal.m4
+    ;;
+
+  autoconf)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`${configure_ac}'.  You might want to install the
+         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
+         archive site."
+    touch configure
+    ;;
+
+  autoheader)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acconfig.h' or \`${configure_ac}'.  You might want
+         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
+         from any GNU archive site."
+    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+    test -z "$files" && files="config.h"
+    touch_files=
+    for f in $files; do
+      case $f in
+      *:*) touch_files="$touch_files "`echo "$f" |
+				       sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+      *) touch_files="$touch_files $f.in";;
+      esac
+    done
+    touch $touch_files
+    ;;
+
+  automake*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+         You might want to install the \`Automake' and \`Perl' packages.
+         Grab them from any GNU archive site."
+    find . -type f -name Makefile.am -print |
+	   sed 's/\.am$/.in/' |
+	   while read f; do touch "$f"; done
+    ;;
+
+  autom4te)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, but is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.
+         You can get \`$1' as part of \`Autoconf' from any GNU
+         archive site."
+
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -f "$file"; then
+	touch $file
+    else
+	test -z "$file" || exec >$file
+	echo "#! /bin/sh"
+	echo "# Created by GNU Automake missing as a replacement of"
+	echo "#  $ $@"
+	echo "exit 0"
+	chmod +x $file
+	exit 1
+    fi
+    ;;
+
+  bison|yacc)
+    echo 1>&2 "\
+WARNING: \`$1' $msg.  You should only need it if
+         you modified a \`.y' file.  You may need the \`Bison' package
+         in order for those modifications to take effect.  You can get
+         \`Bison' from any GNU archive site."
+    rm -f y.tab.c y.tab.h
+    if test $# -ne 1; then
+        eval LASTARG="\${$#}"
+	case $LASTARG in
+	*.y)
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+	    if test -f "$SRCFILE"; then
+	         cp "$SRCFILE" y.tab.c
+	    fi
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+	    if test -f "$SRCFILE"; then
+	         cp "$SRCFILE" y.tab.h
+	    fi
+	  ;;
+	esac
+    fi
+    if test ! -f y.tab.h; then
+	echo >y.tab.h
+    fi
+    if test ! -f y.tab.c; then
+	echo 'main() { return 0; }' >y.tab.c
+    fi
+    ;;
+
+  lex|flex)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.l' file.  You may need the \`Flex' package
+         in order for those modifications to take effect.  You can get
+         \`Flex' from any GNU archive site."
+    rm -f lex.yy.c
+    if test $# -ne 1; then
+        eval LASTARG="\${$#}"
+	case $LASTARG in
+	*.l)
+	    SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+	    if test -f "$SRCFILE"; then
+	         cp "$SRCFILE" lex.yy.c
+	    fi
+	  ;;
+	esac
+    fi
+    if test ! -f lex.yy.c; then
+	echo 'main() { return 0; }' >lex.yy.c
+    fi
+    ;;
+
+  help2man)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+	 you modified a dependency of a manual page.  You may need the
+	 \`Help2man' package in order for those modifications to take
+	 effect.  You can get \`Help2man' from any GNU archive site."
+
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -f "$file"; then
+	touch $file
+    else
+	test -z "$file" || exec >$file
+	echo ".ab help2man is required to generate this page"
+	exit 1
+    fi
+    ;;
+
+  makeinfo)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.texi' or \`.texinfo' file, or any other file
+         indirectly affecting the aspect of the manual.  The spurious
+         call might also be the consequence of using a buggy \`make' (AIX,
+         DU, IRIX).  You might want to install the \`Texinfo' package or
+         the \`GNU make' package.  Grab either from any GNU archive site."
+    # The file to touch is that specified with -o ...
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -z "$file"; then
+      # ... or it is the one specified with @setfilename ...
+      infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+      file=`sed -n '
+	/^@setfilename/{
+	  s/.* \([^ ]*\) *$/\1/
+	  p
+	  q
+	}' $infile`
+      # ... or it is derived from the source name (dir/f.texi becomes f.info)
+      test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
+    fi
+    # If the file does not exist, the user really needs makeinfo;
+    # let's fail without touching anything.
+    test -f $file || exit 1
+    touch $file
+    ;;
+
+  tar)
+    shift
+
+    # We have already tried tar in the generic part.
+    # Look for gnutar/gtar before invocation to avoid ugly error
+    # messages.
+    if (gnutar --version > /dev/null 2>&1); then
+       gnutar "$@" && exit 0
+    fi
+    if (gtar --version > /dev/null 2>&1); then
+       gtar "$@" && exit 0
+    fi
+    firstarg="$1"
+    if shift; then
+	case $firstarg in
+	*o*)
+	    firstarg=`echo "$firstarg" | sed s/o//`
+	    tar "$firstarg" "$@" && exit 0
+	    ;;
+	esac
+	case $firstarg in
+	*h*)
+	    firstarg=`echo "$firstarg" | sed s/h//`
+	    tar "$firstarg" "$@" && exit 0
+	    ;;
+	esac
+    fi
+
+    echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+         You may want to install GNU tar or Free paxutils, or check the
+         command line arguments."
+    exit 1
+    ;;
+
+  *)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, and is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.  Check the \`README' file,
+         it often tells you about the needed prerequisites for installing
+         this package.  You may also peek at any GNU archive site, in case
+         some other package would contain this missing \`$1' program."
+    exit 1
+    ;;
+esac
+
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:


Property changes on: trunk/missing
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/mkinstalldirs
===================================================================
--- trunk/mkinstalldirs	                        (rev 0)
+++ trunk/mkinstalldirs	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,111 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman at prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain
+
+errstatus=0
+dirmode=""
+
+usage="\
+Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..."
+
+# process command line arguments
+while test $# -gt 0 ; do
+  case $1 in
+    -h | --help | --h*)         # -h for help
+      echo "$usage" 1>&2
+      exit 0
+      ;;
+    -m)                         # -m PERM arg
+      shift
+      test $# -eq 0 && { echo "$usage" 1>&2; exit 1; }
+      dirmode=$1
+      shift
+      ;;
+    --)                         # stop option processing
+      shift
+      break
+      ;;
+    -*)                         # unknown option
+      echo "$usage" 1>&2
+      exit 1
+      ;;
+    *)                          # first non-opt arg
+      break
+      ;;
+  esac
+done
+
+for file
+do
+  if test -d "$file"; then
+    shift
+  else
+    break
+  fi
+done
+
+case $# in
+  0) exit 0 ;;
+esac
+
+case $dirmode in
+  '')
+    if mkdir -p -- . 2>/dev/null; then
+      echo "mkdir -p -- $*"
+      exec mkdir -p -- "$@"
+    fi
+    ;;
+  *)
+    if mkdir -m "$dirmode" -p -- . 2>/dev/null; then
+      echo "mkdir -m $dirmode -p -- $*"
+      exec mkdir -m "$dirmode" -p -- "$@"
+    fi
+    ;;
+esac
+
+for file
+do
+  set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+  shift
+
+  pathcomp=
+  for d
+  do
+    pathcomp="$pathcomp$d"
+    case $pathcomp in
+      -*) pathcomp=./$pathcomp ;;
+    esac
+
+    if test ! -d "$pathcomp"; then
+      echo "mkdir $pathcomp"
+
+      mkdir "$pathcomp" || lasterr=$?
+
+      if test ! -d "$pathcomp"; then
+  	errstatus=$lasterr
+      else
+  	if test ! -z "$dirmode"; then
+	  echo "chmod $dirmode $pathcomp"
+    	  lasterr=""
+  	  chmod "$dirmode" "$pathcomp" || lasterr=$?
+
+  	  if test ! -z "$lasterr"; then
+  	    errstatus=$lasterr
+  	  fi
+  	fi
+      fi
+    fi
+
+    pathcomp="$pathcomp/"
+  done
+done
+
+exit $errstatus
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# End:
+# mkinstalldirs ends here


Property changes on: trunk/mkinstalldirs
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/po/ChangeLog
===================================================================

Added: trunk/po/Makefile.in.in
===================================================================
--- trunk/po/Makefile.in.in	                        (rev 0)
+++ trunk/po/Makefile.in.in	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,218 @@
+# Makefile for program source directory in GNU NLS utilities package.
+# Copyright (C) 1995, 1996, 1997 by Ulrich Drepper <drepper at gnu.ai.mit.edu>
+#
+# This file file be copied and used freely without restrictions.  It can
+# be used in projects which are not available under the GNU Public License
+# but which still want to provide support for the GNU gettext functionality.
+# Please note that the actual code is *not* freely available.
+#
+# - Modified by Owen Taylor <otaylor at redhat.com> to use GETTEXT_PACKAGE
+#   instead of PACKAGE and to look for po2tbl in ./ not in intl/
+#
+# - Modified by jacob berkman <jacob at ximian.com> to install
+#   Makefile.in.in and po2tbl.sed.in for use with glib-gettextize
+#
+# - Modified by Rodney Dawes <dobey at novell.com> for use with intltool
+#
+# We have the following line for use by intltoolize:
+# INTLTOOL_MAKEFILE
+
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+
+SHELL = /bin/sh
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+top_builddir = @top_builddir@
+VPATH = @srcdir@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+datadir = @datadir@
+datarootdir = @datarootdir@
+libdir = @libdir@
+DATADIRNAME = @DATADIRNAME@
+itlocaledir = $(prefix)/$(DATADIRNAME)/locale
+subdir = po
+install_sh = @install_sh@
+# Automake >= 1.8 provides @mkdir_p at .
+# Until it can be supposed, use the safe fallback:
+mkdir_p = $(install_sh) -d
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+
+GMSGFMT = @GMSGFMT@
+MSGFMT = @MSGFMT@
+XGETTEXT = @XGETTEXT@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+MSGMERGE = INTLTOOL_EXTRACT=$(INTLTOOL_EXTRACT) srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --dist
+GENPOT   = INTLTOOL_EXTRACT=$(INTLTOOL_EXTRACT) srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --pot
+
+ALL_LINGUAS = @ALL_LINGUAS@
+
+PO_LINGUAS=$(shell if test -r $(srcdir)/LINGUAS; then grep -v "^\#" $(srcdir)/LINGUAS; fi)
+
+USER_LINGUAS=$(shell if test -n "$(LINGUAS)"; then LLINGUAS="$(LINGUAS)"; ALINGUAS="$(ALL_LINGUAS)"; for lang in $$LLINGUAS; do if test -n "`grep ^$$lang$$ $(srcdir)/LINGUAS`" -o -n "`echo $$ALINGUAS|grep ' ?$$lang ?'`"; then printf "$$lang "; fi; done; fi)
+
+USE_LINGUAS=$(shell if test -n "$(USER_LINGUAS)"; then LLINGUAS="$(USER_LINGUAS)"; else if test -n "$(PO_LINGUAS)"; then LLINGUAS="$(PO_LINGUAS)"; else LLINGUAS="$(ALL_LINGUAS)"; fi; fi; for lang in $$LLINGUAS; do printf "$$lang "; done)
+
+POFILES=$(shell LINGUAS="$(USE_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.po "; done)
+
+DISTFILES = ChangeLog Makefile.in.in POTFILES.in $(POFILES)
+EXTRA_DISTFILES = POTFILES.skip Makevars LINGUAS
+
+POTFILES = \
+# This comment gets stripped out
+
+CATALOGS=$(shell LINGUAS="$(USE_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.gmo "; done)
+
+.SUFFIXES:
+.SUFFIXES: .po .pox .gmo .mo .msg .cat
+
+.po.pox:
+	$(MAKE) $(GETTEXT_PACKAGE).pot
+	$(MSGMERGE) $< $(GETTEXT_PACKAGE).pot -o $*.pox
+
+.po.mo:
+	$(MSGFMT) -o $@ $<
+
+.po.gmo:
+	file=`echo $* | sed 's,.*/,,'`.gmo \
+	  && rm -f $$file && $(GMSGFMT) -o $$file $<
+
+.po.cat:
+	sed -f ../intl/po2msg.sed < $< > $*.msg \
+	  && rm -f $@ && gencat $@ $*.msg
+
+
+all: all- at USE_NLS@
+
+all-yes: $(CATALOGS)
+all-no:
+
+$(GETTEXT_PACKAGE).pot: $(POTFILES)
+	$(GENPOT)
+
+install: install-data
+install-data: install-data- at USE_NLS@
+install-data-no: all
+install-data-yes: all
+	$(mkdir_p) $(DESTDIR)$(itlocaledir)
+	linguas="$(USE_LINGUAS)"; \
+	for lang in $$linguas; do \
+	  dir=$(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES; \
+	  $(mkdir_p) $$dir; \
+	  if test -r $$lang.gmo; then \
+	    $(INSTALL_DATA) $$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \
+	    echo "installing $$lang.gmo as $$dir/$(GETTEXT_PACKAGE).mo"; \
+	  else \
+	    $(INSTALL_DATA) $(srcdir)/$$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \
+	    echo "installing $(srcdir)/$$lang.gmo as" \
+		 "$$dir/$(GETTEXT_PACKAGE).mo"; \
+	  fi; \
+	  if test -r $$lang.gmo.m; then \
+	    $(INSTALL_DATA) $$lang.gmo.m $$dir/$(GETTEXT_PACKAGE).mo.m; \
+	    echo "installing $$lang.gmo.m as $$dir/$(GETTEXT_PACKAGE).mo.m"; \
+	  else \
+	    if test -r $(srcdir)/$$lang.gmo.m ; then \
+	      $(INSTALL_DATA) $(srcdir)/$$lang.gmo.m \
+		$$dir/$(GETTEXT_PACKAGE).mo.m; \
+	      echo "installing $(srcdir)/$$lang.gmo.m as" \
+		   "$$dir/$(GETTEXT_PACKAGE).mo.m"; \
+	    else \
+	      true; \
+	    fi; \
+	  fi; \
+	done
+
+# Empty stubs to satisfy archaic automake needs
+dvi info tags TAGS ID:
+
+# Define this as empty until I found a useful application.
+install-exec installcheck:
+
+uninstall:
+	linguas="$(USE_LINGUAS)"; \
+	for lang in $$linguas; do \
+	  rm -f $(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo; \
+	  rm -f $(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \
+	done
+
+check: all $(GETTEXT_PACKAGE).pot
+	rm -f missing notexist
+	srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m
+	if [ -r missing -o -r notexist ]; then \
+	  exit 1; \
+	fi
+
+mostlyclean:
+	rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp
+	rm -f .intltool-merge-cache
+
+clean: mostlyclean
+
+distclean: clean
+	rm -f Makefile Makefile.in POTFILES stamp-it
+	rm -f *.mo *.msg *.cat *.cat.m *.gmo
+
+maintainer-clean: distclean
+	@echo "This command is intended for maintainers to use;"
+	@echo "it deletes files that may require special tools to rebuild."
+	rm -f Makefile.in.in
+
+distdir = ../$(PACKAGE)-$(VERSION)/$(subdir)
+dist distdir: $(DISTFILES)
+	dists="$(DISTFILES)"; \
+	extra_dists="$(EXTRA_DISTFILES)"; \
+	for file in $$extra_dists; do \
+	  test -f $(srcdir)/$$file && dists="$$dists $(srcdir)/$$file"; \
+	done; \
+	for file in $$dists; do \
+	  test -f $$file || file="$(srcdir)/$$file"; \
+	  ln $$file $(distdir) 2> /dev/null \
+	    || cp -p $$file $(distdir); \
+	done
+
+update-po: Makefile
+	$(MAKE) $(GETTEXT_PACKAGE).pot
+	tmpdir=`pwd`; \
+	linguas="$(USE_LINGUAS)"; \
+	for lang in $$linguas; do \
+	  echo "$$lang:"; \
+	  result="`$(MSGMERGE) -o $$tmpdir/$$lang.new.po $$lang`"; \
+	  if $$result; then \
+	    if cmp $(srcdir)/$$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
+	      rm -f $$tmpdir/$$lang.new.po; \
+            else \
+	      if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \
+	        :; \
+	      else \
+	        echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \
+	        rm -f $$tmpdir/$$lang.new.po; \
+	        exit 1; \
+	      fi; \
+	    fi; \
+	  else \
+	    echo "msgmerge for $$lang.gmo failed!"; \
+	    rm -f $$tmpdir/$$lang.new.po; \
+	  fi; \
+	done
+
+Makefile POTFILES: stamp-it
+	@if test ! -f $@; then \
+	  rm -f stamp-it; \
+	  $(MAKE) stamp-it; \
+	fi
+
+stamp-it: Makefile.in.in $(top_builddir)/config.status POTFILES.in
+	cd $(top_builddir) \
+	  && CONFIG_FILES=$(subdir)/Makefile.in CONFIG_HEADERS= CONFIG_LINKS= \
+	       $(SHELL) ./config.status
+
+# Tell versions [3.59,3.63) of GNU make not to export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:

Added: trunk/po/POTFILES.in
===================================================================
--- trunk/po/POTFILES.in	                        (rev 0)
+++ trunk/po/POTFILES.in	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,48 @@
+[encoding: UTF-8]
+
+data/gtkpod.desktop.in
+data/gtkpod.glade
+src/autodetection.c
+src/charset.c
+src/clientserver.c
+src/confirmation.c
+src/context_menus.c
+src/date_parser2.l
+src/date_parser.l
+src/details.c
+src/display.c
+src/display_coverart.c
+src/display_itdb.c
+src/display_photo.c
+src/display_playlists.c
+src/display_sorttabs.c
+src/display_spl.c
+src/display_tracks.c
+src/fetchcover.c
+src/file.c
+src/file_convert.c
+src/file_export.c
+src/file_itunesdb.c
+src/fileselection.c
+src/flacfile.c
+src/getopt1.c
+src/getopt.c
+src/info.c
+src/ipod_init.c
+src/main.c
+src/misc.c
+src/misc_confirm.c
+src/misc_conversion.c
+src/misc_input.c
+src/misc_playlist.c
+src/misc_track.c
+src/mp3file.c
+src/mp4file.c
+src/oggfile.c
+src/prefs.c
+src/prefs_window.c
+src/repository.c
+src/sha1.c
+src/syncdir.c
+src/tools.c
+src/wavfile.c

Added: trunk/po/POTFILES.skip
===================================================================
--- trunk/po/POTFILES.skip	                        (rev 0)
+++ trunk/po/POTFILES.skip	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,4 @@
+src/date_parser.c
+src/md5.c
+src/podcast.c
+src/support.c

Added: trunk/po/de.po
===================================================================
--- trunk/po/de.po	                        (rev 0)
+++ trunk/po/de.po	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,6053 @@
+# German language translation for gtkpod
+# Copyright (C) 2003-2005 Jörg Schuler
+# Jörg Schuler <jcsjcs at users.sourceforge.net>
+# Kai-Ove, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: de\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-12-13 18:36-0500\n"
+"PO-Revision-Date: 2007-03-15 22:33+0100\n"
+"Last-Translator: Kai-Ove\n"
+"Language-Team:  <de at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: KBabel 1.9.1\n"
+
+#: ../data/gtkpod.desktop.in.h:1
+#, fuzzy
+msgid "GtkPod"
+msgstr "gtkpod"
+
+#: ../data/gtkpod.desktop.in.h:2
+msgid "Manage music and video on an Apple iPod"
+msgstr ""
+
+#: ../data/gtkpod.desktop.in.h:3
+msgid "iPod Manager"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:1
+msgid " "
+msgstr " "
+
+#: ../data/gtkpod.glade.h:2
+msgid "    "
+msgstr "    "
+
+#: ../data/gtkpod.glade.h:3
+msgid "     "
+msgstr "     "
+
+#: ../data/gtkpod.glade.h:4
+msgid "      "
+msgstr "     "
+
+#: ../data/gtkpod.glade.h:5
+msgid "   Sort by:"
+msgstr "   Sortieren nach:"
+
+#: ../data/gtkpod.glade.h:6
+msgid " <= cts <= "
+msgstr " <= num <= "
+
+#: ../data/gtkpod.glade.h:7
+msgid " Logic: "
+msgstr " Logik:"
+
+#: ../data/gtkpod.glade.h:9
+#, no-c-format
+msgid "%A"
+msgstr "%A"
+
+#: ../data/gtkpod.glade.h:10
+msgid ""
+"'DD/MM/YYYY HH:MM < d < DD/MM/YYYY HH:MM' or similar. Press 'enter' when "
+"finished."
+msgstr ""
+"z.B. 'TT/MM/JJJJ SS:MM < d < TT/MM/JJJJ SS:MM' oder ähnliches. Nach der "
+"Eingabe bitte 'Return' drücken."
+
+#: ../data/gtkpod.glade.h:11
+msgid "'aacgain' executable:"
+msgstr "'aacgain'-Programm:"
+
+#: ../data/gtkpod.glade.h:12
+msgid "'mp3gain' executable:"
+msgstr "'mp3gain'-Programm:"
+
+#: ../data/gtkpod.glade.h:13
+msgid "(Checked)"
+msgstr "(Gewählt)"
+
+#: ../data/gtkpod.glade.h:14
+msgid "...as icons"
+msgstr "...als Symbol"
+
+#: ../data/gtkpod.glade.h:15
+msgid "...as text"
+msgstr "...als Text"
+
+#: ../data/gtkpod.glade.h:16
+msgid "...both as icons and text"
+msgstr "...als Text und Symbol"
+
+#: ../data/gtkpod.glade.h:17
+msgid "...entry 'All' in sort tab..."
+msgstr " ...Begriff 'Alle' im Sortierungseintrag..."
+
+#: ../data/gtkpod.glade.h:18
+msgid "...master playlist"
+msgstr "...Hauptwiedergabeliste"
+
+#: ../data/gtkpod.glade.h:20
+#, no-c-format
+msgid "../%A.jpg"
+msgstr "../%A.jpg"
+
+#: ../data/gtkpod.glade.h:21
+msgid "0"
+msgstr "0"
+
+#: ../data/gtkpod.glade.h:22
+msgid "1"
+msgstr "1"
+
+#: ../data/gtkpod.glade.h:23
+msgid "2"
+msgstr "2"
+
+#: ../data/gtkpod.glade.h:24
+msgid "3"
+msgstr "3"
+
+#: ../data/gtkpod.glade.h:25
+msgid "4"
+msgstr "4"
+
+#: ../data/gtkpod.glade.h:26
+msgid "5"
+msgstr "5"
+
+#: ../data/gtkpod.glade.h:27
+msgid ":"
+msgstr ":"
+
+#: ../data/gtkpod.glade.h:28
+msgid "<"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:29
+#, fuzzy
+msgid "<b>Account Information</b>"
+msgstr "<b>Sicherheitsabfrage beim Löschen</b>"
+
+#: ../data/gtkpod.glade.h:30
+msgid "<b>Adding/Updating/Syncing</b>"
+msgstr "<b>Hinzufügen/Aktualisieren/Abgleichen</b>"
+
+#: ../data/gtkpod.glade.h:31
+#, fuzzy
+msgid "<b>Audioscrobbler</b>"
+msgstr "<b>Werkzeugleiste</b>"
+
+#: ../data/gtkpod.glade.h:32
+msgid "<b>Auto-Generated Playlists</b>"
+msgstr "<b>Automatisch generierte Wiedergabelisten</b>"
+
+#: ../data/gtkpod.glade.h:33
+msgid "<b>Automatically select...</b>"
+msgstr "<b>Wähle automatisch...</b>"
+
+#: ../data/gtkpod.glade.h:34
+msgid "<b>Calendar/Contacts/Notes</b>"
+msgstr "<b>Kalender/Kontakte/Notizen</b>"
+
+#: ../data/gtkpod.glade.h:35
+msgid "<b>Coverart</b>"
+msgstr "<b>Cover-Bild</b>"
+
+#: ../data/gtkpod.glade.h:36
+msgid "<b>Delete Confirmation</b>"
+msgstr "<b>Sicherheitsabfrage beim Löschen</b>"
+
+#: ../data/gtkpod.glade.h:37
+msgid "<b>Examples</b>"
+msgstr "<b>Beispiele</b>"
+
+#: ../data/gtkpod.glade.h:38
+msgid "<b>Ignore Frequent Words</b>"
+msgstr "<b>Ignoriere oft verwendete Wörter</b>"
+
+#: ../data/gtkpod.glade.h:39
+msgid "<b>Misc</b>"
+msgstr "<b>Verschiedenes</b>"
+
+#: ../data/gtkpod.glade.h:40
+msgid "<b>Mountpoint and individual repository/playlist options</b>"
+msgstr ""
+"<b>Einhängepunkt u. individuelle Datenbank/Wiedergabeliste Optionen</b>"
+
+#: ../data/gtkpod.glade.h:41
+#, fuzzy
+msgid "<b>On-the-fly Conversion</b>"
+msgstr "<b>Sicherheitsabfrage beim Löschen</b>"
+
+#: ../data/gtkpod.glade.h:42
+msgid "<b>Play</b>"
+msgstr "<b>Wiedergabe</b>"
+
+#: ../data/gtkpod.glade.h:43
+msgid "<b>Playlists</b>"
+msgstr "<b>Wiedergabeliste(n)</b>"
+
+#: ../data/gtkpod.glade.h:44
+msgid "<b>Please select mountpoint and your iPod model</b>"
+msgstr "<b>Bitte Einhängepunkt und iPod Modell wählen</b>"
+
+#: ../data/gtkpod.glade.h:45
+msgid "<b>Repositories</b>"
+msgstr "<b>Datenbanken</b>"
+
+#: ../data/gtkpod.glade.h:46
+msgid "<b>Sort Order</b>"
+msgstr "<b>Sortier-Reihenfolge</b>"
+
+#: ../data/gtkpod.glade.h:47
+msgid "<b>Sort Tabs</b>"
+msgstr "<b>Sortierungseinträge</b>"
+
+#: ../data/gtkpod.glade.h:48
+msgid "<b>Sync</b>"
+msgstr "<b>Abgleichen</b>"
+
+#: ../data/gtkpod.glade.h:49
+msgid "<b>Synchronization</b>"
+msgstr "<b>Abgleich</b>"
+
+#: ../data/gtkpod.glade.h:50
+msgid "<b>Tag Reading</b>"
+msgstr "<b>Lesen von Tags</b>"
+
+#: ../data/gtkpod.glade.h:51
+msgid "<b>Toolbar</b>"
+msgstr "<b>Werkzeugleiste</b>"
+
+#: ../data/gtkpod.glade.h:52
+msgid "<b>Tooltips</b>"
+msgstr "<b>Werkzeugtipps</b>"
+
+#: ../data/gtkpod.glade.h:53
+#, fuzzy
+msgid "<b>Track Attributes</b>"
+msgstr "<b>Angezeigte Informationen</b>"
+
+#: ../data/gtkpod.glade.h:54
+msgid "<b>Track Editing</b>"
+msgstr "<b>Bearbeiten von Stücken</b>"
+
+#: ../data/gtkpod.glade.h:55
+msgid "<b>Volume Normalization</b>"
+msgstr "<b>Lautstärkenormalisierung</b>"
+
+#: ../data/gtkpod.glade.h:56
+msgid "<b>mserv</b>"
+msgstr "<b>mserv</b>"
+
+#: ../data/gtkpod.glade.h:57
+msgid ">"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:58
+msgid "About gtkpod"
+msgstr "Über gtkpod"
+
+#: ../data/gtkpod.glade.h:59
+msgid "Add Directories Recursively"
+msgstr "Verzeichnisse rekursiv hinzufügen"
+
+#: ../data/gtkpod.glade.h:60
+#, fuzzy
+msgid "Add Files"
+msgstr "_Dateien hinzufügen"
+
+#: ../data/gtkpod.glade.h:61
+msgid "Add Files or Directories"
+msgstr "Dateien oder Verzeichnisse hinzufügen."
+
+#: ../data/gtkpod.glade.h:62
+#, fuzzy
+msgid "Add Fol_der"
+msgstr "_Dateien hinzufügen"
+
+#: ../data/gtkpod.glade.h:63
+#, fuzzy
+msgid "Add Folder"
+msgstr "_Dateien hinzufügen"
+
+#: ../data/gtkpod.glade.h:64
+msgid "Add Image_s"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:65
+#, fuzzy
+msgid "Add Images from a Directory"
+msgstr "Dateien oder Verzeichnisse hinzufügen."
+
+#: ../data/gtkpod.glade.h:66
+#, fuzzy
+msgid "Add Playlist"
+msgstr "_Wiedergabeliste hinzufügen"
+
+#: ../data/gtkpod.glade.h:67
+msgid "Add _Files"
+msgstr "_Dateien hinzufügen"
+
+#: ../data/gtkpod.glade.h:68
+msgid "Add _Playlist"
+msgstr "_Wiedergabeliste hinzufügen"
+
+#: ../data/gtkpod.glade.h:69
+msgid "Add coverart from file using the following template"
+msgstr "Cover-Bild nach folgender Schablone aus Datei einlesen"
+
+#: ../data/gtkpod.glade.h:70
+msgid "Add directories recursively"
+msgstr "Verzeichnisse rekursiv hinzufügen"
+
+#: ../data/gtkpod.glade.h:71
+msgid "Add new repository/iPod"
+msgstr "Füge Verzeichnis/iPod hinzu"
+
+#: ../data/gtkpod.glade.h:72
+msgid "Add playlist from file"
+msgstr "Wiedergabeliste aus Datei hinzufügen"
+
+#: ../data/gtkpod.glade.h:73 ../src/display_sorttabs.c:3247
+#: ../src/display_tracks.c:2103
+msgid "Added"
+msgstr "Hinzugefügt"
+
+#: ../data/gtkpod.glade.h:74
+msgid "Advanced Sorting Options"
+msgstr "Weitere Sortieroptionen"
+
+#. 0
+#: ../data/gtkpod.glade.h:75 ../src/display_sorttabs.c:2982
+#: ../src/display_spl.c:84 ../src/misc_conversion.c:60
+msgid "Album"
+msgstr "Album"
+
+#: ../data/gtkpod.glade.h:76
+#, fuzzy
+msgid "Album Art"
+msgstr "Album"
+
+#: ../data/gtkpod.glade.h:77
+msgid "All (AND)"
+msgstr "Alle (UND)"
+
+#: ../data/gtkpod.glade.h:78
+msgid "All Tracks Never Listened To"
+msgstr "Nie gehörte Stücke"
+
+#: ../data/gtkpod.glade.h:79
+msgid "All Tracks Played Since Last Time"
+msgstr "Seit dem letzten Mal gespielte Stücke"
+
+#: ../data/gtkpod.glade.h:80
+msgid "All Tracks not Listed in any Playlist"
+msgstr "In keiner Wiedergabeliste aufgeführte Stücke"
+
+#: ../data/gtkpod.glade.h:81
+msgid "Also include tracks never played in \"Best Rated\" playlist"
+msgstr ""
+"Auch Stücke in die 'am besten' bewertete' Wiedergabeliste aufnehmen, die nie "
+"gespielt wurden"
+
+#: ../data/gtkpod.glade.h:82
+msgid "Always write ID3v2.4 tags (only applies to MP3)"
+msgstr "Immer ID3v2.4 Tags schreiben (trifft nur auf MP3 zu)"
+
+#: ../data/gtkpod.glade.h:83
+msgid "Any (OR)"
+msgstr "Eines (ODER)"
+
+#: ../data/gtkpod.glade.h:84 ../src/display_sorttabs.c:2979
+#: ../src/display_spl.c:85 ../src/misc_conversion.c:61
+msgid "Artist"
+msgstr "Künstler"
+
+#: ../data/gtkpod.glade.h:85
+#, fuzzy
+msgid "Artwork Preview"
+msgstr "Pfad zu Bilddateien"
+
+#: ../data/gtkpod.glade.h:86
+msgid ""
+"As a last resort set the following tags to the\n"
+"filename if they are (still) empty:"
+msgstr ""
+"Falls Tags (immer noch) nicht gesetzt sind, die folgenden Tags mit dem "
+"Dateinamen initialisieren:"
+
+#: ../data/gtkpod.glade.h:88
+msgid "Ascending"
+msgstr "Aufsteigend"
+
+#: ../data/gtkpod.glade.h:89
+msgid "Auto Store"
+msgstr "Autom. speichern"
+
+#: ../data/gtkpod.glade.h:90
+msgid ""
+"Automatically start displaying tracks that match the criteria entered above. "
+"If not selected, you must press 'Display' to start displaying."
+msgstr ""
+"Die Anzeige der Stücke, welche die oben genannten Kriterien erfüllen, "
+"automatisch starten. Wenn diese Option nicht aktiviert ist, müssen Sie "
+"'Anzeige' drücken."
+
+#: ../data/gtkpod.glade.h:91
+msgid "Available:"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:92
+msgid "Before removing playlists or tracks from a playlist"
+msgstr ""
+"Vor dem Entfernen von Wiedergabelisten oder Stücken aus einer Wiedergabeliste"
+
+#: ../data/gtkpod.glade.h:93
+msgid "Before removing tracks from the harddisk"
+msgstr "Vor dem vollständigen Löschen auf der Festplatte"
+
+#: ../data/gtkpod.glade.h:94
+msgid "Before removing tracks from the iPod"
+msgstr "Vor dem vollständigen Löschen vom iPod"
+
+#: ../data/gtkpod.glade.h:95
+msgid "Before removing tracks from the local database"
+msgstr "Vor dem Entfernen aus der lokalen Datenbank"
+
+#: ../data/gtkpod.glade.h:96
+msgid "Best Rated Tracks"
+msgstr "Am besten bewertete Stücke"
+
+#: ../data/gtkpod.glade.h:97
+msgid "Browse"
+msgstr "Durchsuchen"
+
+#: ../data/gtkpod.glade.h:98
+#, fuzzy
+msgid "Cache directory:"
+msgstr "_Verzeichnisse hinzufügen"
+
+#: ../data/gtkpod.glade.h:99
+msgid "Calendar"
+msgstr "Kalender"
+
+#: ../data/gtkpod.glade.h:100
+msgid "Calendar sync command:"
+msgstr "Befehl zum Abgleich des Kalenders:"
+
+#: ../data/gtkpod.glade.h:101
+msgid "Call automatically when synchronizing iTunesDB"
+msgstr "Automatisch aufrufen, wenn die iTunesDB abgeglichen wird"
+
+#: ../data/gtkpod.glade.h:102
+msgid "Category: "
+msgstr "Kategorie: "
+
+#: ../data/gtkpod.glade.h:103
+msgid ""
+"Change all tracks\n"
+"simultaneously"
+msgstr ""
+"Alle Stücke simultan \n"
+"modifizieren"
+
+#: ../data/gtkpod.glade.h:105
+msgid ""
+"Check before removing photos from a photo album whether\n"
+"they should be deleted from the Photo Database."
+msgstr ""
+
+#: ../data/gtkpod.glade.h:107
+msgid "Check for existing files when copying from iPod."
+msgstr "Bei Kopieren vom iPod Überprüfen, ob Datei bereits existiert."
+
+#: ../data/gtkpod.glade.h:108
+msgid "Command for 'Enqueue':"
+msgstr "Befehl für 'Zum Abspielen Vormerken':"
+
+#: ../data/gtkpod.glade.h:109
+msgid "Command for 'Play now':"
+msgstr "Befehl für 'Jetzt abspielen':"
+
+#. 5
+#: ../data/gtkpod.glade.h:110 ../src/display_spl.c:97
+#: ../src/misc_conversion.c:65
+msgid "Composer"
+msgstr "Komponist"
+
+#: ../data/gtkpod.glade.h:111
+msgid "Confirm before removing tracks from the iPod or repository"
+msgstr ""
+"Bestätigung vor dem vollständigen Löschen vom iPod oder aus der Datenbank"
+
+#: ../data/gtkpod.glade.h:112
+msgid ""
+"Confirm before removing tracks from the iPod or repository\n"
+"when syncing playlists"
+msgstr ""
+"Bestätigung vor dem Löschen vom iPod oder Musikverzeichnis beim Abgleichen "
+"der Wiedergabelisten."
+
+#: ../data/gtkpod.glade.h:114
+msgid "Confirm lists of directories"
+msgstr "Liste der Verzeichnisse bestätigen"
+
+#: ../data/gtkpod.glade.h:115
+msgid "Contacts sync command:"
+msgstr "Befehl zum Abgleich der Kontakte:"
+
+#: ../data/gtkpod.glade.h:116
+msgid "Containing Displayed Tracks"
+msgstr "Aus den angezeigten Stücken"
+
+#: ../data/gtkpod.glade.h:117
+msgid "Containing Selected Tracks"
+msgstr "Aus den ausgewählten Stücken"
+
+#: ../data/gtkpod.glade.h:118
+msgid "Conversion Progress Display"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:119
+msgid "Cover"
+msgstr "Cover"
+
+#: ../data/gtkpod.glade.h:120
+msgid "Create New Playlist"
+msgstr "Neue Wiedergabeliste erstellen"
+
+#: ../data/gtkpod.glade.h:121
+msgid "Create Repository"
+msgstr "Erstelle Datenbank "
+
+#: ../data/gtkpod.glade.h:122
+msgid "Create _Playlist File"
+msgstr "_Erstelle Datei der Wiedergabeliste"
+
+#: ../data/gtkpod.glade.h:123
+msgid "Credits"
+msgstr "Danksagung"
+
+#: ../data/gtkpod.glade.h:124
+msgid "Currently only rating is supported."
+msgstr "Gegenwärtig wird nur 'Bewertung' unterstützt."
+
+#: ../data/gtkpod.glade.h:125
+msgid "Delete repository"
+msgstr "Datenbank löschen"
+
+#: ../data/gtkpod.glade.h:126
+#, fuzzy
+msgid ""
+"Delete tracks that are no longer present from the\n"
+"iPod or repository"
+msgstr ""
+"Lösche Stücke, die nicht mehr auf dem iPod oder in der Datenbank vorhanden "
+"sind."
+
+#: ../data/gtkpod.glade.h:128
+msgid "Deleted tracks"
+msgstr "Gelöschte Stücke"
+
+#: ../data/gtkpod.glade.h:129
+msgid "Descending"
+msgstr "Absteigend"
+
+#: ../data/gtkpod.glade.h:130
+msgid "Details"
+msgstr "Details"
+
+#: ../data/gtkpod.glade.h:132
+#, no-c-format
+msgid ""
+"Determines how the string for the info field should be constructed, e.g '%a/%"
+"A/%T - %t.mp3' or '%o'.  You can separate several templates by semicolons -- "
+"gtkpod will determine which one to use by the filename extension given. "
+"Artist: %a, album: %A, composer: %c, title: %t, genre: %G, track nr: %T, CD "
+"nr: %C, year: %Y, original filename (requires extended information file): %"
+"o, the character '%': %%."
+msgstr ""
+"Bestimmt, wie der Text des Info-Feldes erstellt werden soll, z.B. '%a/%A/%T "
+"- %t.mp3' oder '%o'. Mehrere Schablonen können durch Semikolons getrennt "
+"werden -- gtkpod ermittelt die passende Schablone anhand des "
+"Dateinamensuffix. Künstler: %a, Album: %A, Komponist: %c, Titel: %t, "
+"Musikrichtung: %G, Stück-Nr.: %T, CD-Nr.: %C, Jahr: %Y,  ursprünglicher "
+"Dateiname (benötigt 'Erweiterte Informationen'): %o, das Zeichen '%': %%."
+
+#: ../data/gtkpod.glade.h:134
+#, no-c-format
+msgid ""
+"Determines the filename of tracks you copy from the iPod, e.g '%a/%A/%T - %t."
+"mp3' or '%o'.  You can separate several patterns by semicolons -- gtkpod "
+"will determine which one to use by the filename extension given. Artist: %a, "
+"album: %A, composer: %c, title: %t, genre: %G, track nr: %T, CD nr: %C, "
+"year: %Y, original filename (requires extended information file): %o, "
+"current playlist: %p, the character '%': %%."
+msgstr ""
+"Bestimmt, wie der Dateiname von Stücken gewählt wird, die vom iPod kopiert "
+"werden. Bsp.: '%a/%A/%T - %t.mp3' oder '%o'. Mehrere Schablonen können durch "
+"Semikolons getrennt werden -- gtkpod ermittelt die passende Schablone anhand "
+"des Dateinamensuffix. Künstler: %a, Album: %A, Komponist: %c, Titel: %t, "
+"Musikrichtung: %G, Stück-Nr.: %T, CD-Nr.: %C, Jahr: %Y,  ursprünglicher "
+"Dateiname (benötigt 'Erweiterte Informationen'): %o, die aktuelle "
+"Wiedergabeliste: %p, das Zeichen '%': %%."
+
+#: ../data/gtkpod.glade.h:136
+#, no-c-format
+msgid ""
+"Determines the name of the file with the cover art. You can separate several "
+"patterns by semicolons which will be tried in order. Artist: %a, album: %A, "
+"composer: %c, title: %t, genre: %G, track nr: %T, CD nr: %C, year: %Y, "
+"original filename (requires extended information file): %o, original "
+"filename without file extension: %O, current playlist: %p, the character "
+"'%': %%."
+msgstr ""
+"Bestimmt, wie der Dateiname von Stücken gewählt wird, die vom iPod kopiert "
+"werden. Bsp.: '%a/%A/%T - %t.mp3' oder '%o'. Mehrere Schablonen können durch "
+"Semikolons getrennt werden -- gtkpod ermittelt die passende Schablone anhand "
+"des Dateinamensuffix. Künstler: %a, Album: %A, Komponist: %c, Titel: %t, "
+"Musikrichtung: %G, Stück-Nr.: %T, CD-Nr.: %C, Jahr: %Y,  ursprünglicher "
+"Dateiname (benötigt 'Erweiterte Informationen'): %o, ursprünglicher "
+"Dateiname ohne Erweiterung: %O, die aktuelle Wiedergabelist: %p, das Zeichen "
+"'%': %%."
+
+#: ../data/gtkpod.glade.h:137
+msgid ""
+"Directories to sync with are determined from the filenames of the tracks in "
+"the playlist."
+msgstr ""
+"Abzugleichende Verzeichnisse werden aus den Dateinamen der Wiedergabeliste "
+"ermittelt."
+
+#: ../data/gtkpod.glade.h:138
+msgid "Display a list of tracks that could actually be updated."
+msgstr ""
+"Nach dem Aktualisieren eine Liste der Stücke anzeigen,\n"
+"die tatsächlich aktualisiert werden könnten."
+
+#: ../data/gtkpod.glade.h:139
+msgid "Display a list of tracks that could not be updated."
+msgstr ""
+"Liste der Stücke anzeigen, bei denen die Aktualisierung\n"
+"nicht vorgenommen werden konnte."
+
+#: ../data/gtkpod.glade.h:140
+msgid "Display conversion log"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:141
+msgid "Display info about detected duplicates"
+msgstr "Information über erkannte Duplikate anzeigen"
+
+#: ../data/gtkpod.glade.h:142
+msgid "Display info about non-updated tracks"
+msgstr "Informationen über nicht aktualisierte Stücke anzeigen"
+
+#: ../data/gtkpod.glade.h:143
+msgid "Display info about updated tracks"
+msgstr "Informationen über aktualisierte Stücke anzeigen"
+
+#: ../data/gtkpod.glade.h:144
+msgid "Display messages and warnings at startup"
+msgstr "Nachrichten und Warnungen beim Start des Programms anzeigen"
+
+#: ../data/gtkpod.glade.h:145
+msgid ""
+"Display the list of duplicates that have been detected after adding files."
+msgstr ""
+"Eine Liste der Duplikate anzeigen, die während des Hinzufügens von Stücken "
+"erkannt wurden."
+
+#: ../data/gtkpod.glade.h:146
+msgid "Display toolbar..."
+msgstr "Werkzeugleiste anzeigen..."
+
+#: ../data/gtkpod.glade.h:147
+msgid "Display tooltips in main window"
+msgstr "Werkzeugtipps im Hauptfenster anzeigen"
+
+#: ../data/gtkpod.glade.h:148
+msgid "Display tooltips in prefs window"
+msgstr "Werkzeugtipps im Fenster 'Einstellungen' anzeigen"
+
+#: ../data/gtkpod.glade.h:149
+msgid "Display tracks that match the criteria entered above."
+msgstr "Stücke anzeigen, welche die oben genannten Kriterien erfüllen."
+
+#: ../data/gtkpod.glade.h:150
+msgid ""
+"Displayed\n"
+"Tracks"
+msgstr ""
+"Angezeigte\n"
+"Stücke"
+
+#: ../data/gtkpod.glade.h:152
+#, fuzzy
+msgid "Displayed:"
+msgstr "_Anzeige"
+
+#: ../data/gtkpod.glade.h:153
+msgid "Don't allow file duplication"
+msgstr "Mehrfaches Einlesen von Stücken verhindern"
+
+#: ../data/gtkpod.glade.h:154
+msgid "Don't automatically sync on startup"
+msgstr "Beim Start nicht automatisch abgleichen"
+
+#: ../data/gtkpod.glade.h:155
+#, fuzzy
+msgid "Duplicate Recognition is based on a (modified) sha1 hash over the file."
+msgstr ""
+"Die Duplikat-Erkennung basiert auf einem (modifizierten) md5-Hash über die "
+"Dateien."
+
+#: ../data/gtkpod.glade.h:156
+msgid "Edit Repository/iPod Options"
+msgstr "_Ändere Verzeichnis / iPod Optionen"
+
+#: ../data/gtkpod.glade.h:157 ../src/context_menus.c:662
+msgid "Edit Smart Playlist"
+msgstr "Intelligente Wiedergabeliste editieren"
+
+#: ../data/gtkpod.glade.h:158 ../src/context_menus.c:749
+msgid "Edit Track Details"
+msgstr "_Bearbeite Stücke"
+
+#: ../data/gtkpod.glade.h:159
+msgid "Edit _Preferences"
+msgstr "_Einstellungen ändern"
+
+#: ../data/gtkpod.glade.h:160
+msgid "Effective free space"
+msgstr "Effektiv freier Platz"
+
+#: ../data/gtkpod.glade.h:161
+msgid "Empty Playlist"
+msgstr "Wiedergabeliste leeren"
+
+#: ../data/gtkpod.glade.h:162
+msgid "Exclude file mask(s)"
+msgstr "Schließe Dateimaske(n) aus"
+
+#: ../data/gtkpod.glade.h:163
+#, fuzzy
+msgid "Export can be continued at a later time if canceled."
+msgstr ""
+"Zum Abbrechen bitte anklicken.\n"
+"Der Export kann zu einem späteren Zeitpunkt fortgesetzt werden."
+
+#: ../data/gtkpod.glade.h:164
+msgid "File size"
+msgstr "Dateigröße"
+
+#: ../data/gtkpod.glade.h:165
+msgid "File size (deleted)"
+msgstr "Dateigröße (gelöscht)"
+
+#: ../data/gtkpod.glade.h:166
+msgid "File size (non-transferred)"
+msgstr "Dateigröße (nicht übertragen)"
+
+#: ../data/gtkpod.glade.h:167
+msgid "Filename Format: "
+msgstr "Format für Dateinamen: "
+
+#: ../data/gtkpod.glade.h:168
+#, fuzzy
+msgid ""
+"Find orphan files (files with no track info in DB) and dangling tracks "
+"(tracks with no corresponding files on iPod)"
+msgstr ""
+"Verwaiste Stücke (Stücke, für die kein Eintrag in der iTunesDB erscheint) "
+"und verlorene Stücke (Stücke ohne Datei auf dem iPod) finden"
+
+#: ../data/gtkpod.glade.h:169
+#, fuzzy
+msgid "First try <i>folder.jpg</i>, then <i>&lt;artist&gt;.jpg</i>"
+msgstr "Versuche zuerst <i>folder.jpg</i>, dann <i>&lt;Künstler&gt;.jpg</i>"
+
+#: ../data/gtkpod.glade.h:170
+msgid "Flac with :"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:172
+#, no-c-format
+msgid ""
+"For example, 'xmms %s' will clear xmms' current playlist, add the selected "
+"tracks and start playing."
+msgstr ""
+"'xmms %s', z.B., löscht die aktuelle Wiedergabeliste von xmms, fügt die "
+"ausgewählten Stücke hinzu und beginnt mit der Wiedergabe."
+
+#: ../data/gtkpod.glade.h:174
+#, no-c-format
+msgid ""
+"For example, 'xmms -e %s' will append (enqueue) the selected tracks to xmms' "
+"current playlist."
+msgstr ""
+"'xmms -e %s', z.B., fügt die ausgewählten Stücke zur aktuellen "
+"Wiedergabeliste von xmms hinzu."
+
+#: ../data/gtkpod.glade.h:175 ../src/display_sorttabs.c:2985
+#: ../src/display_spl.c:89 ../src/misc_conversion.c:63
+msgid "Genre"
+msgstr "Genre"
+
+#: ../data/gtkpod.glade.h:176
+msgid "Group artists on compilation CDs"
+msgstr "Künstler auf Sampler-CDs gruppieren"
+
+#: ../data/gtkpod.glade.h:177
+#, fuzzy
+msgid ""
+"Highly recommended for faster import when taking advantage of the "
+"duplication recognition. Also, having the PC filenames allows writing "
+"changed ID3 tags to disk, and even to reconstruct your iPod's contents in "
+"case of file system corruption (change the \"transferred=\" entries in your "
+"backuped database)."
+msgstr ""
+"Diese Option wird dringend empfohlen, um einen schnelleren Import der "
+"iTunesDB bei eingeschalteter Duplikatenerkennung zu erreichen. Da außerdem "
+"die Originaldateinamen gespeichert werden, können Tag-Änderungen in die "
+"Originaldatei übernommen werden und es ist sogar möglich, den Inhalt Ihres "
+"iPods im Falle eines Dateisystemschadens (Neuformatierung des iPods) zu "
+"rekonstruieren (dazu müssen die 'transferred=' Einträge in der gesicherten "
+"Datenbank auf '0' gesetzt und 'offline' eingelesen werden)."
+
+#: ../data/gtkpod.glade.h:178 ../src/context_menus.c:685
+#: ../src/context_menus.c:703 ../src/context_menus.c:820
+msgid "I'm sure"
+msgstr "Ich bin sicher"
+
+#: ../data/gtkpod.glade.h:179
+msgid ""
+"If available, the local copy of the track is referenced in the playlist. "
+"Otherwise the file on the iPod is used."
+msgstr ""
+"Falls verfügbar, wird die lokale Kopie des Stückes in die Wiedergabeliste "
+"eingetragen. Andernfalls wird die Datei auf dem iPod verwendet."
+
+#: ../data/gtkpod.glade.h:180
+msgid "If both options are selected, embedded APIC data takes precedence."
+msgstr "Falls beide Optionen angewählt sind, werden die APIC-Daten verwendet."
+
+#: ../data/gtkpod.glade.h:181
+msgid ""
+"If checked, sorting will be case sensitive. Please note that case sensitive "
+"sorting will not work well with most charsets."
+msgstr ""
+"Wenn diese Option aktiviert ist, wird beim Sortieren die Groß-/"
+"Kleinschreibung beachtet. Mit den meisten Zeichensätzen funktioniert diese "
+"Funktion jedoch nicht wie gewünscht."
+
+#: ../data/gtkpod.glade.h:182
+msgid ""
+"If the filename (full path) of an existing track matches that of a track to "
+"be added, this option allows you to update the information about the "
+"existing track rather than just skipping the track altogether. No update "
+"will take place if the file hasn't changed and you have selected the 'Don't "
+"allow file duplication' option above."
+msgstr ""
+"Wenn der Dateiname (inkl. Pfad) eines bereits eingelesenen Stückes identisch "
+"ist mit dem Namen eines neu einzulesenden Stückes, dann erlaubt diese Option "
+"Ihnen, das alte Stück zu überschreiben. Normalerweise wird das Einlesen des "
+"Stückes einfach übersprungen. Wenn sich die Datei nicht geändert hat und Sie "
+"die Option 'Mehrfaches Einlesen von Stücken verhindern' aktiviert haben, "
+"wird das Einlesen ebenfalls übersprungen."
+
+#: ../data/gtkpod.glade.h:183
+msgid "If you check this, gtkpod will descend into subdirectories recursively."
+msgstr ""
+"Wenn Sie diese Option wählen, werden Verzeichnisse rekursiv eingelesen."
+
+#: ../data/gtkpod.glade.h:184
+msgid ""
+"If you check this, information (cover art and meta information) changed for "
+"this track will be copied to all other selected tracks as well. Use with "
+"care."
+msgstr ""
+"Falls diese Option gewählt wird, werden alle Änderungen für das dargestellte "
+"Stück (Cover und sonstige Angaben) automatisch in alle ausgewählten Stücke "
+"kopiert. Bitte mit Vorsicht verwenden."
+
+#: ../data/gtkpod.glade.h:185
+msgid ""
+"If you don't select the master playlist automatically, the initial database "
+"import is much faster because the display dosn't have to be updated."
+msgstr ""
+"Wenn die Hauptwiedergabeliste nicht automatisch ausgewählt wird, verläuft "
+"der Import der iTunes Datenbank zu Beginn deutlich schneller, da die Anzeige "
+"nicht aktualisiert werden muss."
+
+#: ../data/gtkpod.glade.h:186
+msgid ""
+"If you select several tracks in the track list and edit a tag of the first "
+"track, the tags in the other tracks are updated as well."
+msgstr ""
+"Falls mehrere Stücke in der Stücke-Anzeige ausgewählt sind und ein Tag des "
+"ersten Stückes geändert wird, werden die entsprechenden Tags auch in den "
+"anderen Stücken aktualisiert."
+
+#: ../data/gtkpod.glade.h:187
+msgid "Ignore these words when at the beginning of the following fields:"
+msgstr "Ignoriere folgende Wörter, wenn Sie am Anfang von Feldern stehen:"
+
+#: ../data/gtkpod.glade.h:188
+msgid ""
+"In order to save the displayed track order to the iPod choose 'Save "
+"Displayed Track Order' from the 'Edit' menu or select 'Auto Store' below."
+msgstr ""
+"Um die angezeigte Reihenfolge der Stücke zu speichern, benutzen Sie "
+"'Dargestellte Reihenfolge speichern' im 'Bearbeiten' Menü oder wählen die "
+"Option \"Autom. speichern\" unten aus."
+
+#: ../data/gtkpod.glade.h:189
+msgid "Initialize iPod"
+msgstr "Initialisiere iPod"
+
+#: ../data/gtkpod.glade.h:190
+msgid ""
+"Insert before\n"
+"Insert after"
+msgstr ""
+"Davor einfügen\n"
+"Danach einfügen"
+
+#: ../data/gtkpod.glade.h:192
+msgid "Keeps all compilation CDs grouped together in the artists sort tab."
+msgstr ""
+"Alle Sampler-CDs im Filter-Eintrag 'Künstler' als 'Sampler' gruppieren."
+
+#: ../data/gtkpod.glade.h:193
+msgid "Live _updating"
+msgstr "Live Akt_ualisierung"
+
+#: ../data/gtkpod.glade.h:194
+msgid "Load iPod(s)"
+msgstr "iPod(s) einlesen"
+
+#: ../data/gtkpod.glade.h:195
+msgid "Lower Margin"
+msgstr "Untere Grenze"
+
+#: ../data/gtkpod.glade.h:196
+msgid "M4A with :"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:197
+msgid "MP3 with :"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:198
+msgid "Match al_l of the following"
+msgstr "Al_le der folgenden Regeln"
+
+#: ../data/gtkpod.glade.h:199
+msgid "Match an_y of the following"
+msgstr "Mindestens _eine der folgenden Regeln"
+
+#: ../data/gtkpod.glade.h:200
+msgid "Match only _checked tracks"
+msgstr "Nur ausgewählte Stü_cke einbeziehen"
+
+#: ../data/gtkpod.glade.h:201
+msgid "Maximum number of background threads:"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:202
+msgid "Maximum size of cache directory (in GB):"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:203
+msgid "Model:"
+msgstr "Modell:"
+
+#: ../data/gtkpod.glade.h:204 ../src/display_tracks.c:2100
+msgid "Modified"
+msgstr "Modifiziert"
+
+#: ../data/gtkpod.glade.h:205
+msgid "Most Recently Played Tracks"
+msgstr "Zuletzt gespielte Stücke"
+
+#: ../data/gtkpod.glade.h:206
+msgid "Move selected attributes to the displayed list"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:207
+msgid "Music Root:"
+msgstr "Stammverzeichnis für Musik:"
+
+#: ../data/gtkpod.glade.h:208
+msgid ""
+"Music files can have images embedded in the APIC tag. Currently this is only "
+"supported for MP3 files."
+msgstr ""
+"Musikdateien können Bilder im 'APIC Tag' enthalten. Dies wird derzeit nur "
+"bei MP3-Dateien unterstützt."
+
+#: ../data/gtkpod.glade.h:209
+msgid "Never show this dialogue again"
+msgstr "Diesen Dialog nie wieder zeigen"
+
+#: ../data/gtkpod.glade.h:210 ../src/display_spl.c:1719
+#: ../src/misc_playlist.c:66 ../src/misc_playlist.c:68
+#: ../src/misc_playlist.c:93 ../src/misc_playlist.c:95
+#: ../src/misc_playlist.c:428 ../src/misc_playlist.c:430
+msgid "New Playlist"
+msgstr "Neue Wiedergabeliste"
+
+#: ../data/gtkpod.glade.h:211
+msgid "No lower margin"
+msgstr "Keine untere Grenze"
+
+#: ../data/gtkpod.glade.h:212
+msgid "No upper margin"
+msgstr "Keine obere Grenze"
+
+#: ../data/gtkpod.glade.h:213
+msgid "Non-transferred tracks"
+msgstr "Nicht übertragene Stücke"
+
+#: ../data/gtkpod.glade.h:214
+msgid "None"
+msgstr "Keine"
+
+#: ../data/gtkpod.glade.h:215
+msgid ""
+"Normally the charset specified when first importing the track will be used "
+"for the filename. If you set this option you can set a different charset "
+"with the charset selector (Preferences/'Adding/Updating/Syncing'). Note: the "
+"charset info is stored in the extended information file (see "
+"Preferences/'Writing of the iTunesDB'). Tracks imported before V0.51 will "
+"have no charset stored. Instead the charset specified will be used."
+msgstr ""
+"Normalerweise wird der Zeichensatz, der beim ersten Einlesen spezifiziert "
+"wurde, auch für den Dateinamen verwendet. Wenn Sie diese Option aktivieren, "
+"können Sie einen anderen Zeichensatz auswählen (Einstellungen/'Hinzufügen/"
+"Aktualisieren/Abgleichen'). Bitte beachten Sie: die Information über den "
+"verwendeten Zeichensatz wird mit den erweiterten Informationen gespeichert "
+"(siehe Einstellungen/'Schreiben der iTunesDB'). Stücke, die vor Version 0.51 "
+"eingelesen wurden, haben keine Informationen über den Zeichensatz "
+"gespeichert und der oben spezifizierte Zeichensatz wird verwendet."
+
+#: ../data/gtkpod.glade.h:216
+msgid ""
+"Normally the charset specified when first importing the track will be used "
+"to update the track information. If you have chosen a wrong charset when "
+"first importing a track and want to correct it using the 'Update Track' "
+"function, you must check this option. Note: the charset info is stored in "
+"the extended information file (see 'Writing of iTunesDB' below) and tracks "
+"imported before V0.51 will have no charset stored. Instead the charset "
+"specified above will be used then."
+msgstr ""
+"Normalerweise wird der Zeichensatz, der beim ersten Einlesen spezifiziert "
+"wurde, auch verwendet, um ein Stück zu aktualisieren. Wenn Sie beim ersten "
+"Einlesen einen falschen Zeichensatz angegeben haben und dies nun mittels "
+"'Stücke aktualisieren' korrigieren wollen, müssen Sie diese Option "
+"auswählen. Bitte beachten Sie: die Information über den verwendeten "
+"Zeichensatz wird mit den erweiterten Informationen gespeichert (siehe "
+"'Schreiben der iTunesDB' weiter unten). Stücke, die vor Version 0.51 "
+"eingelesen wurden, haben keine Informationen über den Zeichensatz "
+"gespeichert und der oben spezifizierte Zeichensatz wird verwendet."
+
+#: ../data/gtkpod.glade.h:217
+msgid ""
+"Normally the charset specified when first importing the track will be used "
+"to write the tags. If you have chosen a wrong charset when first importing a "
+"track, you should select this option along with the correct charset.  Note: "
+"uses the extended information file to store the charset information (see "
+"'Writing of the iTunesDB' on the 'Input/Output' page) and tracks imported "
+"before V0.51 will have no charset stored -- the charset specified on the "
+"'Input/Output' page will be used."
+msgstr ""
+"Normalerweise wird der Zeichensatz, der beim ersten Einlesen des Stückes "
+"angegeben wurde, auch beim Schreiben der ID3-Tags verwendet. Wenn Sie beim "
+"ersten Einlesen einen falschen Zeichensatz angegeben haben, müssen Sie diese "
+"Option zusammen mit dem richtigen Zeichensatz auswählen. Bitte beachten Sie: "
+"Die Information über den verwendeten Zeichensatz wird mit den erweiterten "
+"Informationen gespeichert (siehe 'Schreiben der iTunesDB' auf der 'Eingabe-"
+"Ausgabe' Seite). Stücke, die vor Version 0.51 eingelesen wurden, haben keine "
+"Informationen über den Zeichensatz gespeichert und der auf der 'Eingabe/"
+"Ausgabe'-Seite eingestellte Zeichensatz wird verwendet."
+
+#: ../data/gtkpod.glade.h:218
+msgid ""
+"Normally, if a track is no longer present in the sync directory, it will be "
+"removed from the playlist, but not from the iPod or local repository.\n"
+"If this option is checked, tracks will be completely removed from the iPod "
+"or local repository, unless the track is a member of other playlists as "
+"well.\n"
+"NOTE: if you sync with the master playlist, you must check this option if "
+"you want tracks to be removed, because removing from the master playlist "
+"means removing from the iPod."
+msgstr ""
+"Normalerweise wird ein Stück, das nicht im Synchronisationsverzeichnis "
+"existiert, aus der Wiedergabeliste gelöscht, nicht aber auf dem iPod oder "
+"dem lokalen Verzeichnis. Wird diese Option gewählt, werden die Stücke "
+"vollständig gelöscht, falls ein Stück nicht in einer anderen Wiedergabeliste "
+"erscheint. Hinweis: Bei Synchronisierung mit der 'Hauptwiedergabeliste' muss "
+"diese Option gewählt sein, wenn Stücke gelöscht werden sollen, da Löschen "
+"aus der Wiedergabeliste auch Löschen auf dem iPod bedeutet."
+
+#: ../data/gtkpod.glade.h:221
+msgid "Notes sync command:"
+msgstr "Befehl zum Abgleich der Notizen:"
+
+#: ../data/gtkpod.glade.h:222
+msgid "Number of playlists"
+msgstr "Anzahl der Wiedergabelisten"
+
+#: ../data/gtkpod.glade.h:223
+msgid "Number of tracks"
+msgstr "Anzahl der Stücke"
+
+#: ../data/gtkpod.glade.h:224
+msgid "Number of tracks in generated playlists:"
+msgstr "Anzahl der Stücke in generierten Wiedergabelisten:"
+
+#: ../data/gtkpod.glade.h:225
+msgid ""
+"Number of tracks in the generated playlists 'Most Often Listened', 'Best "
+"Rated' and 'Most Recently Played'. Choose '0' for 'no limit'."
+msgstr ""
+"Anzahl der Stücke in den generierten Wiedergabelisten 'Am häufigsten gehörte "
+"Stücke', 'Höchstbewertete Stücke' und 'Zuletzt gespielte Stücke'. Wählen Sie "
+"'0', wenn Sie die Anzahl nicht begrenzen wollen."
+
+#: ../data/gtkpod.glade.h:226
+msgid "Ogg with :"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:227
+msgid "On startup automatically sync with playlist directories"
+msgstr "Beim Start automatisch mit den Wiedergabelisten abgleichen"
+
+#: ../data/gtkpod.glade.h:228
+msgid "On startup automatically sync with the following directory"
+msgstr "Beim Start automatisch mit folgendem Verzeichnis abgleichen"
+
+#: ../data/gtkpod.glade.h:229
+msgid "On startup automatically update (Live Playlist)"
+msgstr "Automatische Aktualisierung beim Start"
+
+#: ../data/gtkpod.glade.h:230
+msgid "One for each Album"
+msgstr "Eine für jedes Album"
+
+#: ../data/gtkpod.glade.h:231
+msgid "One for each Artist"
+msgstr "Eine für jeden Künstler"
+
+#: ../data/gtkpod.glade.h:232
+msgid "One for each Composer"
+msgstr "Eine für jeden Komponisten"
+
+#: ../data/gtkpod.glade.h:233
+msgid "One for each Genre"
+msgstr "Eine für jedes Genre"
+
+#: ../data/gtkpod.glade.h:234
+msgid "One for each Rating"
+msgstr "Eine für jede Bewertung"
+
+#: ../data/gtkpod.glade.h:235
+msgid "One for each Year"
+msgstr "Eine für jedes Jahr"
+
+#: ../data/gtkpod.glade.h:236
+msgid "Overwrite tags that are already set"
+msgstr "Tags, die bereits gesetzt sind, überschreiben."
+
+#: ../data/gtkpod.glade.h:237
+msgid "Password:"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:238
+msgid "Path:"
+msgstr "Pfad:"
+
+#: ../data/gtkpod.glade.h:239
+#, fuzzy
+msgid "Photo Window"
+msgstr "Info _Fenster"
+
+#: ../data/gtkpod.glade.h:240 ../src/display_spl.c:94
+msgid "Play time"
+msgstr "Spielzeit"
+
+#: ../data/gtkpod.glade.h:241 ../src/display_spl.c:98
+#: ../src/misc_conversion.c:77
+msgid "Playcount"
+msgstr "Wiedergabezähler"
+
+#: ../data/gtkpod.glade.h:242 ../src/display_tracks.c:2097
+msgid "Played"
+msgstr "Gespielt"
+
+#: ../data/gtkpod.glade.h:243
+msgid "Playlist name:"
+msgstr "Name der Wiedergabeliste:"
+
+#: ../data/gtkpod.glade.h:244
+msgid "Playlist type:"
+msgstr "Art der Wiedergabeliste:"
+
+#: ../data/gtkpod.glade.h:245 ../src/display_playlists.c:2258
+msgid "Playlists"
+msgstr "Wiedergabelisten"
+
+#: ../data/gtkpod.glade.h:246
+msgid "Please refer to the notice below."
+msgstr "Bitte beachten Sie den Hinweis weiter unten."
+
+#: ../data/gtkpod.glade.h:247
+msgid "Please specify a time interval"
+msgstr "Bitte Zeitintervall angeben"
+
+#: ../data/gtkpod.glade.h:248
+msgid "Preferences"
+msgstr "Einstellungen"
+
+#: ../data/gtkpod.glade.h:249
+#, fuzzy
+msgid "Progress Information"
+msgstr "Information"
+
+#: ../data/gtkpod.glade.h:250
+msgid "R_ename Album"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:251
+msgid "Random Playlist from Displayed Tracks"
+msgstr "Zufällige aus den angezeigten Stücken"
+
+#: ../data/gtkpod.glade.h:252
+msgid "Randomize Current Playlist"
+msgstr "_Aktuelle Wiedergabeliste zufällig sortieren"
+
+#: ../data/gtkpod.glade.h:253 ../src/display_spl.c:101
+#: ../src/misc_conversion.c:78
+msgid "Rating"
+msgstr "Bewertung"
+
+#: ../data/gtkpod.glade.h:254
+msgid "Read coverart from embedded APIC data"
+msgstr "Lese Cover-Bild aus den APIC Daten"
+
+#: ../data/gtkpod.glade.h:255
+msgid "Read tags from file contents (e.g. ID3 tags in MP3 files)"
+msgstr "Tags aus der Datei lesen (z.B. ID3 Tags bei MP3 Dateien)"
+
+#: ../data/gtkpod.glade.h:256
+#, fuzzy
+msgid "Remove selected attributes from the displayed list"
+msgstr "Ausgewählte Stücke aus der Wiedergabeliste"
+
+#: ../data/gtkpod.glade.h:257
+msgid "Repository Options"
+msgstr "Datenbank-Optionen"
+
+#: ../data/gtkpod.glade.h:258
+msgid "Repository name:"
+msgstr "Datenbankname:"
+
+#: ../data/gtkpod.glade.h:259
+msgid "Repository type:"
+msgstr "Datenbanktyp:"
+
+#: ../data/gtkpod.glade.h:260
+msgid "Root directory of mserv database (trackinfo root)."
+msgstr "Stammverzeichnis für die mserv Datenbank (trackinfo root)."
+
+#: ../data/gtkpod.glade.h:261
+msgid "Rules"
+msgstr "Regeln"
+
+#: ../data/gtkpod.glade.h:262 ../src/context_menus.c:804
+msgid "Save Changes"
+msgstr "Änderungen sichern"
+
+#: ../data/gtkpod.glade.h:263
+#, fuzzy
+msgid "Scrobble Tracks?"
+msgstr "Ausgewählte _Stücke"
+
+#: ../data/gtkpod.glade.h:264
+msgid "Select '-1' for no upper limit."
+msgstr "'-1' wählen für 'keine obere Schranke'."
+
+#: ../data/gtkpod.glade.h:265
+msgid "Select '0' for no lower limit."
+msgstr "'0' wählen für 'keine untere Schranke'."
+
+#: ../data/gtkpod.glade.h:266
+msgid ""
+"Selected\n"
+"Playlist"
+msgstr ""
+"Ausgewählte\n"
+"Wiedergabeliste"
+
+#: ../data/gtkpod.glade.h:268
+msgid ""
+"Selected\n"
+"Tracks"
+msgstr ""
+"Ausgewählte\n"
+"Stücke"
+
+#: ../data/gtkpod.glade.h:270
+#, fuzzy
+msgid "Selected Filter Tab Entry from Database"
+msgstr "Ausgewählter Filter-Eintrag der lokalen Datenbank"
+
+#: ../data/gtkpod.glade.h:271
+#, fuzzy
+msgid "Selected Filter Tab Entry from Hard Disk"
+msgstr "Ausgewählter Filter-Eintrag der Festplatte"
+
+#: ../data/gtkpod.glade.h:272
+#, fuzzy
+msgid "Selected Filter Tab Entry from Playlist"
+msgstr "Ausgewählter Filter-Eintrag der Wiedergabeliste"
+
+#: ../data/gtkpod.glade.h:273
+#, fuzzy
+msgid "Selected Filter Tab Entry from iPod"
+msgstr "Ausgewählter Filter-Eintrag vom iPod"
+
+#: ../data/gtkpod.glade.h:274
+#, fuzzy
+msgid "Selected Playlist Including Tracks from Database"
+msgstr ""
+"Ausgewählte Wiedergabeliste einschließlich der Stücke aus der Datenbank"
+
+#: ../data/gtkpod.glade.h:275
+#, fuzzy
+msgid "Selected Playlist Including Tracks from Hard Disk"
+msgstr ""
+"Ausgewählte Wiedergabeliste einschließlich der Stücke von der Festplatte"
+
+#: ../data/gtkpod.glade.h:276
+#, fuzzy
+msgid "Selected Playlist Including Tracks from iPod"
+msgstr "Ausgewählte Wiedergabeliste einschließlich der Stücke vom iPod"
+
+#: ../data/gtkpod.glade.h:277
+msgid "Selected Tab _Entry"
+msgstr "Ausgewählter _Eintrag"
+
+#: ../data/gtkpod.glade.h:278
+#, fuzzy
+msgid "Selected Tracks from Database"
+msgstr "Ausgewählte Stücke aus der Datenbank"
+
+#: ../data/gtkpod.glade.h:279
+#, fuzzy
+msgid "Selected Tracks from Hard Disk"
+msgstr "Ausgewählte Stücke von der Festplatte"
+
+#: ../data/gtkpod.glade.h:280
+#, fuzzy
+msgid "Selected Tracks from Playlist"
+msgstr "Ausgewählte Stücke aus der Wiedergabeliste"
+
+#: ../data/gtkpod.glade.h:281
+#, fuzzy
+msgid "Selected Tracks from iPod"
+msgstr "Ausgewählte Stücke vom iPod"
+
+#: ../data/gtkpod.glade.h:282
+msgid "Selected _Playlist"
+msgstr "Ausgewählte _Wiedergabeliste"
+
+#: ../data/gtkpod.glade.h:283
+msgid "Selected _Tracks"
+msgstr "Ausgewählte _Stücke"
+
+#: ../data/gtkpod.glade.h:284
+msgid "Selected playlist"
+msgstr "Ausgewählte Wiedergabeliste"
+
+#: ../data/gtkpod.glade.h:285
+#, fuzzy
+msgid "Semicolon separated list of file exclusion masks, e.g. '*.mp3'"
+msgstr ""
+"Per Semikolon getrennte Liste der durch Maske ausgeschlossenen Stücke, z.B. "
+"'*.mp3'"
+
+#: ../data/gtkpod.glade.h:286
+#, fuzzy
+msgid "Set Cover Art from _File"
+msgstr "Lege Cover-Bild fest"
+
+#: ../data/gtkpod.glade.h:287
+msgid "Set mountpoint or edit repository options"
+msgstr "Einhängepunkt festlegen oder Datenbank-Optionen editieren"
+
+#: ../data/gtkpod.glade.h:288
+msgid "Set options for Calendar/Contacts/Notes"
+msgstr "Setze Optionen für Kalender/Kontakte/Notizen"
+
+#: ../data/gtkpod.glade.h:289
+msgid ""
+"Set this to 'aacgain -q -k' to use the 'Normalize volume' functionality in "
+"the Tools Menu. If this is set, missing normalization data for .m4a and .m4b "
+"files will be calculated and written to your music file using this command."
+msgstr ""
+"Benutze 'aacgain -q -k' zur Normalisierung der Lautstärke im Werkzeug-Menü. "
+"Falls gewählt, werden Normalisierungsdaten für m4a und m4b Dateien errechnet "
+"und zu den Musikinformationen hinzugefügt."
+
+#: ../data/gtkpod.glade.h:290
+msgid ""
+"Set this to 'mp3gain -q -k' to use the 'Normalize volume' functionality in "
+"the Tools Menu. If this is set, missing normalization data for mp3 files "
+"will be calculated and written to your mp3 file using this command."
+msgstr ""
+"Benutze 'mp3gain -q -k' zur Normalisierung der Lautstärke im Werkzeug-Menü. "
+"Falls gewählt, werden Normalisierungsdaten für mp3 Dateien errechnet und zu "
+"den Musikinformationen hinzugefügt."
+
+#: ../data/gtkpod.glade.h:291
+msgid "Set this to your last.fm password"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:292
+msgid "Set this to your last.fm username"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:293
+msgid ""
+"Set to 0 to effectively disable caching (a maximum of one track will be "
+"cached at a time)."
+msgstr ""
+
+#: ../data/gtkpod.glade.h:294
+msgid ""
+"Set to 0 to use as many background threads as CPUs are available on your "
+"system."
+msgstr ""
+
+#: ../data/gtkpod.glade.h:295
+msgid "Show information about problems when accessing mserv"
+msgstr ""
+"Informationen über Probleme während des Zugriffs auf die mserv Datenbank "
+"anzeigen."
+
+#: ../data/gtkpod.glade.h:296
+msgid "Show summary of sync result"
+msgstr "Zeige Zusammenfassung nach Abgleich."
+
+#: ../data/gtkpod.glade.h:297 ../src/misc_playlist.c:96
+#: ../src/repository.c:1356
+msgid "Smart Playlist"
+msgstr "Intelligente Wiedergabeliste"
+
+#: ../data/gtkpod.glade.h:298
+msgid "Sort tracks according to: "
+msgstr "Sortiere Stücke nach: "
+
+#: ../data/gtkpod.glade.h:299
+msgid "Sorting Options"
+msgstr "Sortieroptionen"
+
+#: ../data/gtkpod.glade.h:300
+msgid "Sorting case sensitive"
+msgstr "Beim Sortieren Groß-/Kleinschreibung beachten"
+
+#: ../data/gtkpod.glade.h:301
+msgid "Sorttab: "
+msgstr "Sortierungseintrag: "
+
+#: ../data/gtkpod.glade.h:302
+msgid "Sorttabs"
+msgstr "Sortierungseinträge"
+
+#: ../data/gtkpod.glade.h:303
+msgid "Source:"
+msgstr "Quelle:"
+
+#: ../data/gtkpod.glade.h:305
+#, no-c-format
+msgid ""
+"Specify exact path including command line options. '%i' will be replaced "
+"with the mount point of the iPod."
+msgstr ""
+"Geben sie den genauen Pfad einschließlich Kommandozeilenoptionen an. '%i' "
+"wird durch den Einhängepunkt des iPods ersetzt."
+
+#: ../data/gtkpod.glade.h:306
+msgid "Specify interval"
+msgstr "Intervall angeben"
+
+#: ../data/gtkpod.glade.h:307
+msgid "Start display automatically"
+msgstr "Anzeige automatisch starten"
+
+#: ../data/gtkpod.glade.h:308
+msgid "Synchronise Contacts, Calendar and Notes"
+msgstr "Kontakte, Kalender und Notizen abgleichen"
+
+#: ../data/gtkpod.glade.h:309
+msgid "Synchronize All"
+msgstr "Alles abgleichen"
+
+#: ../data/gtkpod.glade.h:310
+msgid "Synchronize Calendar"
+msgstr "Kalender abgleichen"
+
+#: ../data/gtkpod.glade.h:311
+msgid "Synchronize Contacts"
+msgstr "Kontakte abgleichen"
+
+#: ../data/gtkpod.glade.h:312
+msgid "Synchronize Notes"
+msgstr "Notizen abgleichen"
+
+#: ../data/gtkpod.glade.h:313
+msgid "Template for info field: "
+msgstr "Schablone für dieses Feld: "
+
+#: ../data/gtkpod.glade.h:314
+msgid ""
+"The local copy of the track is referenced in the playlist. If the track is "
+"not available locally, an error message is displayed."
+msgstr ""
+"Die lokale Kopie des Stückes wird in der Wiedergabeliste eingetragen.\n"
+"Falls das Stück lokal nicht verfügbar ist, wird eine Fehlermeldung "
+"ausgegeben."
+
+#: ../data/gtkpod.glade.h:315
+msgid ""
+"The output of the background conversion scripts is copied below. Each page "
+"of the notebook corresponds to one background thread."
+msgstr ""
+
+#: ../data/gtkpod.glade.h:316
+#, fuzzy
+msgid ""
+"The tags are written to the files on your harddrive and on the iPod (if "
+"available)."
+msgstr ""
+"Die Tags werden in die Originaldateien auf der Festplatte und auch auf dem "
+"iPod (falls angeschlossen) geschrieben."
+
+#: ../data/gtkpod.glade.h:317
+msgid "The track on the iPod is referenced in the playlist file."
+msgstr "Die Datei auf dem iPod wird in die Wiedergabeliste eingetragen."
+
+#: ../data/gtkpod.glade.h:318
+msgid "This is the same option as in 'Edit/Delete Confirmation'"
+msgstr ""
+"Diese Option ist identisch mit der Sicherheitsabfrage \n"
+"beim 'Bearbeiten/Löschen'"
+
+#: ../data/gtkpod.glade.h:319
+msgid ""
+"This is the way to go, but maybe not all programs support it yet. ID3v2.4 "
+"uses unicode to store the tags, so you won't have to worry about charsets "
+"any more. gtkpod will use UTF8 encoding as this will not increase the size "
+"of pure ASCII tags. ID3v2.2/4 tags will also be written if they are already "
+"present in the file to write to."
+msgstr ""
+"Es wird empfohlen, Tags als V2.4 Tags zu schreiben. Allerdings unterstützen "
+"eventuell einige Programme diesen Standard noch nicht. ID3v2.4 verwendet "
+"Unicode, um die Tags zu speichern. Dies bedeutet, dass Sie sich keine "
+"Gedanken mehr über den verwendeten Zeichensatz machen zu brauchen. gtkpod "
+"verwendet UTF8, da dies die Tag-Länge reiner ASCII-Tags nicht verlängert. "
+"ID3v2.4 wird ebenfalls beim Schreiben verwendet, falls die Tags in der Datei "
+"bereits als V2.4 vorliegen."
+
+#: ../data/gtkpod.glade.h:320
+msgid "This option will be re-activated when you upgrade gtkpod."
+msgstr ""
+"Diese Option wird automatisch aktiviert, wenn eine neue Version von gtkpod "
+"installiert wird."
+
+#: ../data/gtkpod.glade.h:321
+msgid "Time:"
+msgstr "Zeit:"
+
+#: ../data/gtkpod.glade.h:322 ../src/display_sorttabs.c:2991
+#: ../src/display_spl.c:83 ../src/misc_conversion.c:62
+msgid "Title"
+msgstr "Titel"
+
+#: ../data/gtkpod.glade.h:323
+msgid ""
+"Total\n"
+"(iPod)"
+msgstr ""
+"Insgesamt\n"
+"(iPod)"
+
+#: ../data/gtkpod.glade.h:325
+msgid ""
+"Total\n"
+"(local)"
+msgstr ""
+"Insgesamt\n"
+"(lokal)"
+
+#: ../data/gtkpod.glade.h:327
+msgid "Tracks"
+msgstr "Stücke"
+
+#: ../data/gtkpod.glade.h:328
+msgid "Tracks Most Often Listened To"
+msgstr "Am häufigsten gehörte Stücke"
+
+#: ../data/gtkpod.glade.h:329
+msgid ""
+"Tracks can be transferred in the background as soon as they are added to an "
+"iPod repository. Otherwise they will be transferred when ejecting the "
+"contents of the iPod completely unchanged until then."
+msgstr ""
+
+#: ../data/gtkpod.glade.h:330
+msgid "Tracks in Selected Tab _Entry"
+msgstr "Stücke im ausgewählten _Sortierungseintrag"
+
+#: ../data/gtkpod.glade.h:331
+msgid "Tracks in Selected _Playlist"
+msgstr "Stücke in ausgewählter _Wiedergabeliste"
+
+#: ../data/gtkpod.glade.h:332
+msgid "Transfer tracks to the iPod in the background"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:333
+msgid "Translators"
+msgstr "Übersetzer"
+
+#: ../data/gtkpod.glade.h:334
+msgid ""
+"Try to load contents of all connected iPods. For each iPod a separate "
+"repository must be set up."
+msgstr ""
+"Versuche den Inhalt aller angeschlossenen iPods zu laden. Für jeden iPod "
+"muss ein separates Verzeichnis existieren."
+
+#: ../data/gtkpod.glade.h:335
+#, fuzzy
+msgid "Undo _Track"
+msgstr "_Stück rückgängig"
+
+#: ../data/gtkpod.glade.h:336
+msgid "Update _mserv Data from File"
+msgstr "_mserv-Daten aktualisieren"
+
+#: ../data/gtkpod.glade.h:337
+msgid "Update/Sync all playlists now"
+msgstr "Aktualisierung/Abgleich aller Wiedergabelisten jetzt"
+
+#: ../data/gtkpod.glade.h:338
+msgid "Update/Sync playlist now"
+msgstr "Aktualisierung/Abgleich der Wiedergabeliste jetzt"
+
+#: ../data/gtkpod.glade.h:339
+msgid "Upper margin"
+msgstr "Obere Grenze"
+
+#: ../data/gtkpod.glade.h:340
+msgid "Use 'Multi-Edit' also for title field"
+msgstr "'Multi-Edit' auch für das Titel-Feld verwenden"
+
+#: ../data/gtkpod.glade.h:341
+msgid "Use 'Multi-Edit' for tracks selections"
+msgstr "'Multi-Edit' bei markierten Stücken verwenden"
+
+#: ../data/gtkpod.glade.h:342
+#, fuzzy
+msgid "Use <i>&lt;Album&gt;.jpg</i> in the parent directory"
+msgstr "Benutze <i>&lt;Album&gt;.jpg</i> im übergeordneten Verzeichnis"
+
+#: ../data/gtkpod.glade.h:343
+#, fuzzy
+msgid "Use <i>&lt;Album&gt;.jpg</i>, <i>&lt;Album&gt;.png</i>..."
+msgstr "Benutze <i>&lt;Album&gt;.jpg</i>, <i>&lt;Album&gt;.png</i>..."
+
+#: ../data/gtkpod.glade.h:344
+msgid "Use <i>folder.jpg</i> as cover art."
+msgstr "Benutze <i>folder.jpg</i> als Cover-Bild"
+
+#: ../data/gtkpod.glade.h:345
+msgid "Use <i>folder.jpg</i>, <i>folder.png</i>..."
+msgstr "Benutze <i>folder.jpg</i>, <i>folder.png</i>..."
+
+#: ../data/gtkpod.glade.h:346
+msgid "Use mserv database to fill additional information"
+msgstr "Benutze die mserv Datenbank für zusätzliche Informationen"
+
+#: ../data/gtkpod.glade.h:347
+msgid ""
+"Use selected charset (Preferences/'Adding/Updating/ Syncing')\n"
+"for this filename."
+msgstr ""
+"Gewählten Zeichensatz (Einstellungen/'Hinzufügen/Aktualisieren/Abgleichen')\n"
+"für diesen Dateinamen verwenden."
+
+#: ../data/gtkpod.glade.h:349
+msgid ""
+"Use selected encoding (on the 'General' page)\n"
+"when writing tags"
+msgstr ""
+"Ausgewählte Kodierung (auf der Allgemein-Seite)\n"
+"beim Schreiben von ID3-Tags verwenden"
+
+#: ../data/gtkpod.glade.h:351
+#, fuzzy
+msgid "Use selected encoding also when updating or syncing tracks"
+msgstr ""
+"Gewählte Kodierung auch verwenden, wenn Stücke aktualisiert oder abgeglichen "
+"werden"
+
+#: ../data/gtkpod.glade.h:352
+msgid "Use this template to parse filename for tag information:"
+msgstr ""
+"Diese Schablone verwenden, um aus dem Dateinamen die Tags zu bestimmen:"
+
+#: ../data/gtkpod.glade.h:353
+msgid "Username to be used for mserv database lookup."
+msgstr ""
+"Benutzername, der zum Nachschlagen in der mserv Datenbank verwendet wird."
+
+#: ../data/gtkpod.glade.h:354
+msgid "Username:"
+msgstr "Benutzername:"
+
+#: ../data/gtkpod.glade.h:355
+msgid ""
+"Usually you don't want to set the title of several tracks to the same text. "
+"This option might avoid unwanted results (especially since there is no "
+"'undo' yet)."
+msgstr ""
+"Es kommt selten vor, dass die Titel mehrerer Stücke auf den selben Text "
+"gesetzt werden sollen. Diese Option verhindert möglicherweise unerwünschte "
+"Resultate, insbesondere da noch keine 'Rückgängig'-Funktion existiert."
+
+#: ../data/gtkpod.glade.h:356
+#, fuzzy
+msgid "View Full Size"
+msgstr "Dateigröße"
+
+#: ../data/gtkpod.glade.h:357
+msgid "WAV with :"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:358
+msgid ""
+"When adding dirs/files, update information of\n"
+"existing tracks with identical filenames"
+msgstr ""
+"Beim Hinzufügen von Stücken bereits eingeleseneStücke mit demselben "
+"Dateinamen aktualisieren."
+
+#: ../data/gtkpod.glade.h:360
+msgid ""
+"When copying from iPod no check is performed on whether the destination file "
+"exists. Enabling this option will make gtkpod check whether the length of "
+"the destination file is the same as the file in the iPod. If so the file is "
+"skipped, allowing a quick sync of the iPod's contents."
+msgstr ""
+"Wird ein Stück vom iPod kopiert, wird normalerweise nicht überprüft, ob die "
+"Datei im Zielverzeichnis bereits vorhanden ist. Wenn Sie diese Option "
+"aktivieren, wird gtkpod anhand der Dateigröße überprüfen, ob die Datei "
+"bereits existiert. Falls ja, wird das Kopieren übersprungen. Dies erlaubt "
+"es, einen schnellen Abgleich der Daten auf Ihrer Festplatte mit denen des "
+"iPods vorzunehmen."
+
+#: ../data/gtkpod.glade.h:361
+msgid "When syncing playlists"
+msgstr "Beim Abgleich von Wiedergabelisten"
+
+#: ../data/gtkpod.glade.h:362
+msgid ""
+"Will show a list of tracks removed and a list of tracks newly added or "
+"updated."
+msgstr ""
+"Zeigt eine Liste von gelöschten, neu hinzugefügten oder aktualisierten "
+"Stücken."
+
+#: ../data/gtkpod.glade.h:363
+msgid "Write ID3 tags to disk when modified in gtkpod"
+msgstr ""
+"ID3 Tags bei Änderungen in gtkpod ebenfalls auf\n"
+"der Festplatte und auf dem iPod ändern"
+
+#: ../data/gtkpod.glade.h:364
+msgid "Write all changes made to the disk and the iPod(s)."
+msgstr "Alle Änderungen auf Festplatte und iPod(s) sichern."
+
+#: ../data/gtkpod.glade.h:365
+#, fuzzy
+msgid ""
+"Write extended information (PC filenames, SHA1 hashes,\n"
+"encoding...). Recommended."
+msgstr ""
+"Erweiterte Informationen schreiben (PC Dateinamen, MD5-Prüfsummen, "
+"Kodierung). Empfohlen."
+
+#: ../data/gtkpod.glade.h:367
+msgid ""
+"You can also use the table headers, but this allows you to sort according to "
+"a column that is not displayed."
+msgstr ""
+"Sie können auch die Spaltenköpfe anklicken, aber diese Option ermöglicht es "
+"auch nach Spalten zu sortieren, die nicht angezeigt werden."
+
+#: ../data/gtkpod.glade.h:368
+#, fuzzy
+msgid "_About gtkpod"
+msgstr "Über gtkpod"
+
+#: ../data/gtkpod.glade.h:369
+#, fuzzy
+msgid "_Add Album"
+msgstr "Album"
+
+#: ../data/gtkpod.glade.h:370
+msgid "_Add Image"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:371
+#, fuzzy
+msgid "_Album"
+msgstr "Album"
+
+#: ../data/gtkpod.glade.h:372
+msgid "_All Tracks"
+msgstr "_Alle Stücke"
+
+#: ../data/gtkpod.glade.h:373
+msgid "_Arrange Sort Tabs"
+msgstr "_Ordne Sortierungseinträge"
+
+#: ../data/gtkpod.glade.h:374
+msgid "_Check iPod's Files"
+msgstr "_Überprüfe iPod Dateien"
+
+#: ../data/gtkpod.glade.h:375
+msgid "_Conversion Log"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:376
+msgid "_Create Playlists"
+msgstr "_Erstelle Wiedergabelisten"
+
+#: ../data/gtkpod.glade.h:377
+msgid "_Create iPod's Directories"
+msgstr "_iPod-Verzeichnis(se) erstellen"
+
+#: ../data/gtkpod.glade.h:378
+msgid "_Delete"
+msgstr "_Löschen"
+
+#: ../data/gtkpod.glade.h:379
+msgid "_Display"
+msgstr "_Anzeige"
+
+#: ../data/gtkpod.glade.h:380
+msgid "_Displayed Tracks"
+msgstr "_Angezeigte Stücke"
+
+#: ../data/gtkpod.glade.h:381
+msgid "_Edit"
+msgstr "_Bearbeiten"
+
+#: ../data/gtkpod.glade.h:382
+msgid "_Encoding (ID3, files):"
+msgstr "Kodi_erung (ID3, Dateien):"
+
+#: ../data/gtkpod.glade.h:383
+msgid "_Enqueue"
+msgstr "_Vormerken zum Abspielen"
+
+#: ../data/gtkpod.glade.h:384
+msgid "_Export Tracks from Database"
+msgstr "E_xport aus der Datenbank"
+
+#: ../data/gtkpod.glade.h:385
+msgid "_File"
+msgstr "_Datei"
+
+#: ../data/gtkpod.glade.h:386
+msgid "_General"
+msgstr "All_gemein"
+
+#: ../data/gtkpod.glade.h:387
+msgid "_Help"
+msgstr "_Hilfe"
+
+#: ../data/gtkpod.glade.h:388
+msgid "_Ignore rules"
+msgstr "_Ignoriere die Regeln"
+
+#: ../data/gtkpod.glade.h:389
+msgid "_Image"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:390
+msgid "_Info Window"
+msgstr "Info _Fenster"
+
+#: ../data/gtkpod.glade.h:391
+msgid "_Last.FM"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:392
+msgid "_Less Sort Tabs"
+msgstr "_Weniger Sortierungseinträge"
+
+#: ../data/gtkpod.glade.h:393
+msgid "_Limit to"
+msgstr "_Begrenzen auf"
+
+#: ../data/gtkpod.glade.h:394
+msgid "_Load iPod(s)"
+msgstr "i_Pod(s) einlesen"
+
+#: ../data/gtkpod.glade.h:395
+msgid "_Local"
+msgstr "_Lokal"
+
+#: ../data/gtkpod.glade.h:396
+msgid "_M3U"
+msgstr "_M3U"
+
+#: ../data/gtkpod.glade.h:397
+msgid "_Misc."
+msgstr ""
+
+#: ../data/gtkpod.glade.h:398
+msgid "_More Sort Tabs"
+msgstr "_Mehr Sortierungseinträge"
+
+#: ../data/gtkpod.glade.h:399
+msgid "_Newly Added Tracks"
+msgstr "_Neu hinzugefügte Stücke"
+
+#: ../data/gtkpod.glade.h:400
+msgid "_Normalize Volume"
+msgstr "_Lautstärke normalisieren"
+
+#: ../data/gtkpod.glade.h:401
+msgid "_Number of sort tabs:"
+msgstr "A_nzahl der Sortierungseinträge:"
+
+#: ../data/gtkpod.glade.h:402
+msgid "_PLS"
+msgstr "_PLS"
+
+#: ../data/gtkpod.glade.h:403
+msgid "_Play Now"
+msgstr "_Jetzt abspielen"
+
+#: ../data/gtkpod.glade.h:404
+msgid "_Podcasts"
+msgstr "_Podcasts"
+
+#: ../data/gtkpod.glade.h:405
+msgid "_Prefer Local"
+msgstr "_Bevorzuge lokal"
+
+#: ../data/gtkpod.glade.h:406
+#, fuzzy
+msgid "_Remove Album"
+msgstr "Album"
+
+#: ../data/gtkpod.glade.h:407
+#, fuzzy
+msgid "_Remove Cover Art"
+msgstr "Cover-Bild entfernen"
+
+#: ../data/gtkpod.glade.h:408
+msgid "_Remove Images"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:409
+msgid "_Save Changes"
+msgstr "_Änderungen sichern"
+
+#: ../data/gtkpod.glade.h:410
+msgid "_Save Displayed Track Order"
+msgstr "_Reihenfolge der angezeigten Stücke speichern"
+
+#: ../data/gtkpod.glade.h:411
+msgid "_Sorting"
+msgstr "_Sortierung"
+
+#: ../data/gtkpod.glade.h:412
+#, fuzzy
+msgid "_Synchronize Playlist with Dir(s)"
+msgstr "Wiedergabeliste mit Verzeichnis(sen) abgleichen"
+
+#: ../data/gtkpod.glade.h:413
+msgid "_Toolbar"
+msgstr "Werkzeug_leiste"
+
+#: ../data/gtkpod.glade.h:414
+msgid "_Tools"
+msgstr "_Werkzeuge"
+
+#: ../data/gtkpod.glade.h:415
+msgid "_Tooltips"
+msgstr "Werkzeug_tipps"
+
+#: ../data/gtkpod.glade.h:416
+msgid "_Track Info"
+msgstr "_Meta-Infos"
+
+#: ../data/gtkpod.glade.h:417
+msgid "_Undo All"
+msgstr "_Alles rückgängig"
+
+#: ../data/gtkpod.glade.h:418
+msgid "_Update Tracks from File"
+msgstr "_Stücke aus Datei aktualisieren"
+
+#: ../data/gtkpod.glade.h:419
+#, fuzzy
+msgid "_Video"
+msgstr "_Ansicht"
+
+#: ../data/gtkpod.glade.h:420
+msgid "_View"
+msgstr "_Ansicht"
+
+#: ../data/gtkpod.glade.h:421
+msgid "_iPod"
+msgstr "_iPod"
+
+#: ../data/gtkpod.glade.h:423
+#, no-c-format
+msgid ""
+"artist: %a, album: %A, composer: %c, title: %t, genre: %G, track nr: %T, CD "
+"nr: %C, year: %Y, skip data: %*, the character '%': %%. You can separate "
+"several templates by a ';'. The first one matching the filename will be "
+"used. Example: '%a - %A/%T %t.mp3;%t.wav'."
+msgstr ""
+"Künstler: %a, Album: %A, Komponist: %c, Titel: %t, Musikrichtung: %G, Stück-"
+"Nr.: %T, CD-Nr.: %C, Jahr: %Y, Platzhalter: %*, das Zeichen '%': %%. Mehrere "
+"Schablonen können durch ein Semikolon (';') getrennt werden -- die erste, "
+"die auf den Filenamen passt, wird verwendet. Beispiel: '%a - %A/%T %t.mp3;%t."
+"wav'."
+
+#: ../data/gtkpod.glade.h:424
+msgid "folder"
+msgstr "Mappe"
+
+#: ../data/gtkpod.glade.h:425
+msgid "folder.jpg"
+msgstr "folder.jpg"
+
+#: ../data/gtkpod.glade.h:427
+#, no-c-format
+msgid "folder.jpg;%a.jpg"
+msgstr "folder.jpg;%a.jpg"
+
+#: ../data/gtkpod.glade.h:428
+msgid "gtkpod"
+msgstr "gtkpod"
+
+#: ../data/gtkpod.glade.h:429
+msgid "gtkpod Info"
+msgstr "gtkpod Info"
+
+#: ../data/gtkpod.glade.h:430
+msgid ""
+"gtkpod expects the ID3 tags and the filenames to be in the encoding "
+"specified here. You can change it for consecutive 'Add Files' and 'Add Dirs' "
+"operation. 'System Charset' is the charset used by your current locale."
+msgstr ""
+"gtkpod erwartet, dass die Dateinamen und ID3 tags in der Kodierung "
+"vorliegen, die hier angegeben wird. Diese kann natürlich zwischen zwei "
+"Aufrufen von 'Dateien hinzufügen' oder 'Verzeichnisse hinzufügen' geändert "
+"werden. 'Systemzeichensatz' bezeichnet die Standardkodierung der benutzten "
+"Sprache."
+
+#: ../data/gtkpod.glade.h:431
+msgid "gtkpod options"
+msgstr "gtkpod Optionen"
+
+#. These are the items for the 'Repository type' combo in the 'Create Repository' dialog. Keep the three items in order!
+#: ../data/gtkpod.glade.h:433
+msgid ""
+"iPod\n"
+"Local Repository (Standard)\n"
+"Local Repository (Podcasts)\n"
+msgstr ""
+"iPod\n"
+"Lokale Datenbank (Standard)\n"
+"Lokale Datenbank (Podcasts)\n"
+
+#: ../data/gtkpod.glade.h:437
+msgid "iPod mountpoint:"
+msgstr "iPod Einhängepunkt:"
+
+#: ../data/gtkpod.glade.h:438
+msgid "iTunesDB backup:"
+msgstr "Sicherung iTunes DB:"
+
+#: ../data/gtkpod.glade.h:439
+msgid "mserv Root:"
+msgstr "mserv Stammverzeichnis:"
+
+#: ../data/gtkpod.glade.h:440
+msgid "mserv database lookup will be done for music in this directory."
+msgstr "Die mserv Datenbank wird für Stücke in diesem Verzeichnis verwendet."
+
+#: ../data/gtkpod.glade.h:441 ../src/details.c:1347
+msgid "n/a"
+msgstr "---"
+
+#: ../data/gtkpod.glade.h:442
+msgid "special_sorttab -- Don't translate!"
+msgstr "special_sorttab -- Don't translate!\""
+
+#: ../src/autodetection.c:310
+msgid "Could not initialize GnomeVFS\n"
+msgstr ""
+
+#: ../src/autodetection.c:397
+#, c-format
+msgid ""
+"Newly mounted iPod at '%s' could not be loaded into gtkpod.\n"
+"\n"
+msgstr ""
+
+#: ../src/autodetection.c:403
+#, c-format
+msgid ""
+"Newly mounted iPod at '%s' appears to be already loaded!\n"
+"\n"
+msgstr ""
+
+#: ../src/autodetection.c:416
+#, fuzzy
+msgid "New iPod"
+msgstr "Neue Wiedergabeliste"
+
+#: ../src/charset.c:53
+msgid "Arabic (IBM-864)"
+msgstr "Arabisch (IBM-864)"
+
+#: ../src/charset.c:54
+msgid "Arabic (ISO-8859-6)"
+msgstr "Arabisch (ISO-8859-6)"
+
+#: ../src/charset.c:55
+msgid "Arabic (Windows-1256)"
+msgstr "Arabisch (Windows-1256)"
+
+#: ../src/charset.c:56
+msgid "Baltic (ISO-8859-13)"
+msgstr "Baltisch (ISO-8859-13)"
+
+#: ../src/charset.c:57
+msgid "Baltic (ISO-8859-4)"
+msgstr "Baltisch (ISO-8859-4)"
+
+#: ../src/charset.c:58
+msgid "Baltic (Windows-1257)"
+msgstr "Baltisch (Windows-1257)"
+
+#: ../src/charset.c:59
+msgid "Celtic (ISO-8859-14)"
+msgstr "Keltisch (ISO-8859-14)"
+
+#: ../src/charset.c:60
+msgid "Central European (IBM-852)"
+msgstr "Mitteleuropäisch (IBM-852)"
+
+#: ../src/charset.c:61
+msgid "Central European (ISO-8859-2)"
+msgstr "Mitteleuropäisch (ISO-8859-2)"
+
+#: ../src/charset.c:62
+msgid "Central European (Windows-1250)"
+msgstr "Mitteleuropäisch (Windows-1250)"
+
+#: ../src/charset.c:63
+msgid "Chinese Simplified (GB18030)"
+msgstr "Vereinfachtes Chinesisch (GB18030)"
+
+#: ../src/charset.c:64
+msgid "Chinese Simplified (GB2312)"
+msgstr "Vereinfachtes Chinesisch (GB2312)"
+
+#: ../src/charset.c:65
+msgid "Chinese Traditional (Big5)"
+msgstr "Traditionelles Chinesisch (Big5)"
+
+#: ../src/charset.c:66
+msgid "Chinese Traditional (Big5-HKSCS)"
+msgstr "Traditionelles Chinesisch (Big5-HKSCS)"
+
+#: ../src/charset.c:67
+msgid "Cyrillic (IBM-855)"
+msgstr "Kyrillisch (IBM-855)"
+
+#: ../src/charset.c:68
+msgid "Cyrillic (ISO-8859-5)"
+msgstr "Kyrillisch (ISO-8859-5)"
+
+#: ../src/charset.c:69
+msgid "Cyrillic (ISO-IR-111)"
+msgstr "Kyrillisch (ISO-IR-111)"
+
+#: ../src/charset.c:70
+msgid "Cyrillic (KOI8-R)"
+msgstr "Kyrillisch (KOI8-R)"
+
+#: ../src/charset.c:71
+msgid "Cyrillic (Windows-1251)"
+msgstr "Kyrillisch (Windows-1251)"
+
+#: ../src/charset.c:72
+msgid "Cyrillic/Russian (CP-866)"
+msgstr "Kyrillisch/Russisch (CP-866)"
+
+#: ../src/charset.c:73
+msgid "Cyrillic/Ukrainian (KOI8-U)"
+msgstr "Kyrillisch/Ukrainisch (KOI8-U)"
+
+#: ../src/charset.c:74
+msgid "English (US-ASCII)"
+msgstr "Englisch (US-ASCII)"
+
+#: ../src/charset.c:75
+msgid "Greek (ISO-8859-7)"
+msgstr "Griechisch (ISO-8859-7)"
+
+#: ../src/charset.c:76
+msgid "Greek (Windows-1253)"
+msgstr "Griechisch (Windows-1253)"
+
+#: ../src/charset.c:77
+msgid "Hebrew (IBM-862)"
+msgstr "Hebräisch (IBM-862)"
+
+#: ../src/charset.c:78
+msgid "Hebrew (Windows-1255)"
+msgstr "Hebräisch (Windows-1255)"
+
+#: ../src/charset.c:79
+msgid "Japanese (automatic detection)"
+msgstr "Japanisch (automatische Detektion)"
+
+#: ../src/charset.c:80
+msgid "Japanese (EUC-JP)"
+msgstr "Japanisch (EUC-JP)"
+
+#: ../src/charset.c:81
+msgid "Japanese (ISO-2022-JP)"
+msgstr "Japanisch (ISO-2022-JP)"
+
+#: ../src/charset.c:82
+msgid "Japanese (Shift_JIS)"
+msgstr "Japanisch (Shift_JIS)"
+
+#: ../src/charset.c:83
+msgid "Korean (EUC-KR)"
+msgstr "Koreanisch (EUC-KR)"
+
+#: ../src/charset.c:84
+msgid "Nordic (ISO-8859-10)"
+msgstr "Nordisch (ISO-8859-10)"
+
+#: ../src/charset.c:85
+msgid "South European (ISO-8859-3)"
+msgstr "Südeuropäisch (ISO-8859-3)"
+
+#: ../src/charset.c:86
+msgid "Thai (TIS-620)"
+msgstr "Thai (TIS-620)"
+
+#: ../src/charset.c:87
+msgid "Turkish (IBM-857)"
+msgstr "Türkisch (IBM-857)"
+
+#: ../src/charset.c:88
+msgid "Turkish (ISO-8859-9)"
+msgstr "Türkisch (ISO-8859-9)"
+
+#: ../src/charset.c:89
+msgid "Turkish (Windows-1254)"
+msgstr "Türkisch (Windows-1254)"
+
+#: ../src/charset.c:90
+msgid "Unicode (UTF-7)"
+msgstr "Unicode (UTF-7)"
+
+#: ../src/charset.c:91
+msgid "Unicode (UTF-8)"
+msgstr "Unicode (UTF-8)"
+
+#: ../src/charset.c:92
+msgid "Unicode (UTF-16BE)"
+msgstr "Unicode (UTF-16BE)"
+
+#: ../src/charset.c:93
+msgid "Unicode (UTF-16LE)"
+msgstr "Unicode (UTF-16LE)"
+
+#: ../src/charset.c:94
+msgid "Unicode (UTF-32BE)"
+msgstr "Unicode (UTF-32BE)"
+
+#: ../src/charset.c:95
+msgid "Unicode (UTF-32LE)"
+msgstr "Unicode (UTF-32LE)"
+
+#: ../src/charset.c:96
+msgid "Vietnamese (VISCII)"
+msgstr "Vietnamesisch (VISCII)"
+
+#: ../src/charset.c:97
+msgid "Vietnamese (Windows-1258)"
+msgstr "Vietnamesisch (Windows-1258)"
+
+#: ../src/charset.c:98
+msgid "Visual Hebrew (ISO-8859-8)"
+msgstr "Visuelles Hebräisch (ISO-8859-8)"
+
+#: ../src/charset.c:99
+msgid "Western (IBM-850)"
+msgstr "Westlich (IBM-850)"
+
+#: ../src/charset.c:100
+msgid "Western (ISO-8859-1)"
+msgstr "Westlich (ISO-8859-1)"
+
+#: ../src/charset.c:101
+msgid "Western (ISO-8859-15)"
+msgstr "Westlich (ISO-8859-15)"
+
+#: ../src/charset.c:102
+msgid "Western (Windows-1252)"
+msgstr "Westlich (Windows-1252)"
+
+#. sanity!
+#. check for "System Charset" and return NULL
+#: ../src/charset.c:160 ../src/charset.c:170 ../src/charset.c:223
+msgid "System Charset"
+msgstr "System-Zeichensatz"
+
+#. we are not the first instance of gtkpod -- the socket is
+#. already being used, so we pass
+#: ../src/clientserver.c:214
+msgid ""
+"Another instance of gtkpod was detected. Playcount server not started.\n"
+msgstr ""
+"Eine Instanz von gtkpod läuft bereits. Der Playcount-Server wird nicht "
+"gestartet.\n"
+
+#: ../src/confirmation.c:377
+msgid "Confirmation Dialogue"
+msgstr "Sicherheitsabfrage"
+
+#: ../src/context_menus.c:362
+#, c-format
+msgid "Copied \"%s\" playlist to %s"
+msgstr ""
+
+#: ../src/context_menus.c:401
+#, fuzzy, c-format
+msgid "Copied %d track to '%s'"
+msgid_plural "Copied %d tracks to '%s'"
+msgstr[0] "%d von insgesamt %d Stück kopiert."
+msgstr[1] "%d von insgesamt %d Stücken kopiert."
+
+#: ../src/context_menus.c:429
+#, c-format
+msgid "Copied '%s' playlist to '%s' in '%s'"
+msgstr ""
+
+#: ../src/context_menus.c:462
+#, fuzzy, c-format
+msgid "Copied %d track to '%s' in '%s'"
+msgid_plural "Copied %d tracks to %s in '%s'"
+msgstr[0] "%d Stück wurde aus der Wiedergabeliste '%s' entfernt."
+msgstr[1] "%d Stücke wurden aus der Wiedergabeliste '%s' entfernt."
+
+#: ../src/context_menus.c:622 ../src/tools.c:854
+msgid "Play Now"
+msgstr "Jetzt abpielen"
+
+#: ../src/context_menus.c:628 ../src/tools.c:867
+msgid "Enqueue"
+msgstr "Zum Abspielen vormerken"
+
+#: ../src/context_menus.c:634
+msgid "Copy Tracks to Filesystem"
+msgstr "Kopiere Stücke zum Verzeichnis"
+
+#: ../src/context_menus.c:641 ../src/file_export.c:1085
+msgid "Create Playlist File"
+msgstr "_Datei der Wiedergabeliste erstellen"
+
+#: ../src/context_menus.c:648
+msgid "Create new Playlist"
+msgstr "Neue Wiedergabeliste erstellen"
+
+#: ../src/context_menus.c:655
+msgid "Update Tracks from File"
+msgstr "_Aktualisiere Stücke aus der Datei"
+
+#: ../src/context_menus.c:669
+msgid "Sync Playlist with Dir(s)"
+msgstr "Wiedergabeliste mit Verzeichnis(sen) abgleichen"
+
+#: ../src/context_menus.c:679
+msgid "Remove All Tracks from iPod"
+msgstr "Alle Stücke vom iPod entfernen"
+
+#: ../src/context_menus.c:697
+msgid "Remove All Podcasts from iPod"
+msgstr "Alle Podcasts vom iPod entfernen"
+
+#: ../src/context_menus.c:712
+msgid "Delete Including Tracks"
+msgstr "Löschen inklusive der Stücke"
+
+#: ../src/context_menus.c:720
+msgid "Delete But Keep Tracks"
+msgstr "Löschen, aber Stücke behalten"
+
+#: ../src/context_menus.c:728
+msgid "Edit iPod Properties"
+msgstr "iPod Verzeichnisstruktur bearbeiten"
+
+#: ../src/context_menus.c:735
+#, fuzzy
+msgid "Edit Repository Properties"
+msgstr "iPod Verzeichnisstruktur bearbeiten"
+
+#: ../src/context_menus.c:742
+msgid "Edit Playlist Properties"
+msgstr "Editiere Eigenschaften der Wiedergabeliste"
+
+#: ../src/context_menus.c:770
+msgid "View Full Size Artwork"
+msgstr ""
+
+#: ../src/context_menus.c:777
+#, fuzzy
+msgid "Select Cover From File"
+msgstr "Vom iPod entfernen "
+
+#: ../src/context_menus.c:790
+msgid "Load iPod"
+msgstr "iPod einlesen"
+
+#: ../src/context_menus.c:797
+msgid "Eject iPod"
+msgstr "iPod trennen"
+
+#: ../src/context_menus.c:814
+msgid "Remove All Tracks from Database"
+msgstr "Alle Stücke aus der Datenbank entfernen"
+
+#: ../src/context_menus.c:829
+msgid "Delete Including Tracks (Harddisk)"
+msgstr "Löschen inklusive der Stücke (Festplatte)"
+
+#: ../src/context_menus.c:837
+msgid "Delete Including Tracks (Database)"
+msgstr "Löschen inklusive der Stücke (Datenbank)"
+
+#: ../src/context_menus.c:845
+msgid "Delete From iPod"
+msgstr "Vom iPod entfernen "
+
+#: ../src/context_menus.c:853
+msgid "Delete From Playlist"
+msgstr "Aus der Wiedergabeliste entfernen"
+
+#: ../src/context_menus.c:861
+msgid "Delete From Harddisk"
+msgstr "Von der Festplatte löschen"
+
+#: ../src/context_menus.c:869
+msgid "Delete From Database"
+msgstr "Aus der Datenbank entfernen"
+
+#: ../src/context_menus.c:877
+msgid "Alphabetize"
+msgstr "Alphabetisch sortieren"
+
+#: ../src/context_menus.c:895
+#, fuzzy
+msgid "Remove Album"
+msgstr "Album"
+
+#: ../src/context_menus.c:905
+#, fuzzy
+msgid "Remove Photo"
+msgstr "Cover-Bild entfernen"
+
+#: ../src/context_menus.c:922
+msgid "Rename Album"
+msgstr ""
+
+#: ../src/context_menus.c:981 ../src/context_menus.c:1030
+#, fuzzy
+msgid "Copy selected playlist to..."
+msgstr "Ausgewählte Wiedergabeliste"
+
+#: ../src/context_menus.c:1083
+#, fuzzy
+msgid "Copy selected track(s) to..."
+msgstr "Gelöschte Stücke"
+
+#: ../src/date_parser.l:269
+#, c-format
+msgid "Date format error: unrecognized character: '%s'\n"
+msgstr "Formatfehler Datum: unbekanntes Zeichen: '%s'\n"
+
+#: ../src/details.c:82
+#, fuzzy
+msgid "Audio/Video"
+msgstr "Stammverzeichnis für Musik:"
+
+#: ../src/details.c:83
+msgid "Audio"
+msgstr ""
+
+#: ../src/details.c:84
+#, fuzzy
+msgid "Video"
+msgstr "_Ansicht"
+
+#: ../src/details.c:85
+#, fuzzy
+msgid "Podcast"
+msgstr "Podcasts"
+
+#: ../src/details.c:86
+#, fuzzy
+msgid "Video Podcast"
+msgstr "Podcasts"
+
+#: ../src/details.c:87
+msgid "Audiobook"
+msgstr ""
+
+#: ../src/details.c:88 ../src/display_spl.c:209 ../src/display_spl.c:218
+#, fuzzy
+msgid "Music Video"
+msgstr "Stammverzeichnis für Musik:"
+
+#: ../src/details.c:89 ../src/display_spl.c:107 ../src/display_spl.c:210
+#: ../src/display_spl.c:219 ../src/misc_conversion.c:101
+msgid "TV Show"
+msgstr ""
+
+#: ../src/details.c:90
+#, fuzzy
+msgid "TV Show & Music Video"
+msgstr "Stammverzeichnis für Musik:"
+
+#: ../src/details.c:836
+#, c-format
+msgid "%s (image data corrupted or unreadable)"
+msgstr ""
+
+#: ../src/details.c:973
+#, c-format
+msgid "Please report unknown mediatype %x\n"
+msgstr ""
+
+#: ../src/details.c:1418
+msgid "<b>n/a</b>"
+msgstr "<b>---</b>"
+
+#: ../src/details.c:1906
+#, c-format
+msgid "Error occurred dropping an image onto the details window: %s\n"
+msgstr ""
+
+#: ../src/details.c:1952 ../src/display_coverart.c:2128
+msgid "Successfully set new coverart for selected tracks"
+msgstr ""
+
+#: ../src/display.c:490
+#, c-format
+msgid "<b>Image Dimensions: %s</b>"
+msgstr ""
+
+#: ../src/display.c:744
+msgid "Edit selected entry of which sort tab?"
+msgstr "Markierten Begriff aus welchem Sortierungseintrag editieren?"
+
+#. no entry selected
+#: ../src/display.c:751 ../src/misc_confirm.c:435 ../src/misc_track.c:2138
+msgid "No entry selected."
+msgstr "Kein Eintrag ausgewählt."
+
+#: ../src/display.c:910 ../src/display.c:1230 ../src/display.c:1286
+#: ../src/display.c:1340 ../src/display.c:1395 ../src/display.c:1656
+#, c-format
+msgid "No entry selected in Sort Tab %d"
+msgstr "Kein Begriff im Sortierungseintrag %d ausgewählt"
+
+#: ../src/display.c:949
+msgid "Remove entry of which sort tab from database?"
+msgstr "Markierten Begriff aus welchem Sortierungseintrag entfernen?"
+
+#: ../src/display.c:957
+msgid "Remove tracks in selected entry of which filter tab from the iPod?"
+msgstr ""
+"Stücke im ausgewählten Eintrag aus welchem Filter-Eintrag vom iPod löschen?"
+
+#: ../src/display.c:979
+msgid "Remove tracks in selected entry of which filter tab from the harddisk?"
+msgstr ""
+"Stücke im ausgewählten Eintrag aus welchem Filter-Eintrag von der Festplatte "
+"löschen?"
+
+#: ../src/display.c:1009
+msgid "Remove tracks in selected entry of which filter tab from playlist?"
+msgstr ""
+"Stücke im ausgewählten Eintrag aus welchem Filter-Eintrag der "
+"Wiedergabeliste löschen?"
+
+#: ../src/display.c:1036 ../src/display.c:1074
+#, c-format
+msgid ""
+"iPod at '%s' is not loaded.\n"
+"Please load it first."
+msgstr ""
+"iPod unter '%s' wurde nicht eingelesen.\n"
+"Bitte zuerst einlesen."
+
+#: ../src/display.c:1111 ../src/display.c:1138
+msgid "Update selected entry of which sort tab?"
+msgstr "Markierten Begriff aus welchem Sortierungseintrag aktualisieren?"
+
+#: ../src/display.c:1224
+msgid "Export selected entry of which sort tab?"
+msgstr "Markierten Begriff aus welchem Sortierungseintrag exportieren?"
+
+#: ../src/display.c:1280
+msgid "Create playlist file from selected entry of which sort tab?"
+msgstr "Datei der Wiedergabeliste für welchen Sortierungseintrag erstellen?"
+
+#: ../src/display.c:1334
+msgid "Play tracks in selected entry of which sort tab?"
+msgstr "Stücke aus welchem Sortierungseintrag abspielen?"
+
+#: ../src/display.c:1389
+msgid "Enqueue tracks in selected entry of which sort tab?"
+msgstr "Stücke aus welchem Sortierungseintrag zum Abspielen vormerken?"
+
+#: ../src/display.c:1646
+msgid "Normalize tracks in selected entry of which sort tab?"
+msgstr "Stücke aus welchem Sortierungseintrag normalisieren?"
+
+#: ../src/display_coverart.c:1713
+msgid "Failed to remove the album from the album hash store."
+msgstr ""
+
+#: ../src/display_coverart.c:2098
+#, c-format
+msgid "Error occurred dropping an image onto the coverart display: %s\n"
+msgstr ""
+
+#: ../src/display_itdb.c:376
+#, c-format
+msgid "Failed to set cover art: '%s'\n"
+msgstr "Konnte Cover-Bild nicht einfügen: '%s'\n"
+
+#: ../src/display_itdb.c:858 ../src/display_itdb.c:991
+msgid "Local"
+msgstr "Lokal"
+
+#. add podcast playlist
+#: ../src/display_itdb.c:866 ../src/display_itdb.c:989
+#: ../src/display_itdb.c:1025
+msgid "Podcasts"
+msgstr "Podcasts"
+
+#: ../src/display_itdb.c:875 ../src/display_itdb.c:993
+#: ../src/repository.c:1186
+msgid "iPod"
+msgstr "iPod"
+
+#: ../src/display_itdb.c:1084
+#, c-format
+msgid "Increased playcount for '%s'"
+msgstr "Wiedergabezähler für '%s' wurde erhöht"
+
+#: ../src/display_photo.c:163
+#, c-format
+msgid "Error reading iPod photo database (%s).\n"
+msgstr ""
+
+#: ../src/display_photo.c:168
+msgid "Error reading iPod photo database.\n"
+msgstr ""
+
+#: ../src/display_photo.c:238
+msgid "Could not access the iPod's photo database."
+msgstr ""
+
+#: ../src/display_photo.c:441
+#, fuzzy
+msgid "Photo Albums"
+msgstr "Album"
+
+#: ../src/display_photo.c:451 ../src/display_photo.c:1685
+msgid "<Unnamed>"
+msgstr ""
+
+#: ../src/display_photo.c:939
+msgid "The Photo Library album cannot be removed"
+msgstr ""
+
+#: ../src/display_photo.c:961
+#, fuzzy
+msgid "Do you want to remove the album's photos too?"
+msgstr "Sind Sie sicher, dass sie alle Podcasts vom iPod entfernen wollen?"
+
+#: ../src/display_photo.c:967
+msgid "Yes. Do Not Display Again"
+msgstr ""
+
+#: ../src/display_photo.c:1038
+msgid ""
+"This will remove the photo selection from the selected album.\n"
+" Do you want to delete them from the database as well?"
+msgstr ""
+
+#: ../src/display_photo.c:1053
+msgid ""
+"This will delete the photo selection from the Photo Library and all albums. "
+"Are you sure?"
+msgstr ""
+
+#: ../src/display_photo.c:1128
+msgid "New Photo Album Name"
+msgstr ""
+
+#: ../src/display_photo.c:1129
+#, fuzzy
+msgid "Please enter a new name for the photo album"
+msgstr "Bitte geben Sie einen Namen für die neue Wiedergabeliste ein"
+
+#: ../src/display_photo.c:1141 ../src/display_photo.c:1223
+msgid "An album with that name already exists."
+msgstr ""
+
+#: ../src/display_photo.c:1210
+#, fuzzy
+msgid "New Photo Album"
+msgstr "Album"
+
+#: ../src/display_photo.c:1211
+#, fuzzy
+msgid "Please enter a name for the new photo album"
+msgstr "Bitte geben Sie einen Namen für die neue Wiedergabeliste ein"
+
+#: ../src/display_photo.c:1232
+msgid "The new album failed to be created."
+msgstr ""
+
+#: ../src/display_photo.c:1256
+#, fuzzy
+msgid "Add Image to iPod"
+msgstr "Füge Verzeichnis/iPod hinzu"
+
+#. Open a dialog directory chooser window
+#: ../src/display_photo.c:1311
+msgid "Add a Directory of Images to the iPod. Select the Directory."
+msgstr ""
+
+#: ../src/display_photo.c:1699
+#, c-format
+msgid "<No members>\n"
+msgstr ""
+
+#. give a notice on the statusbar -- otherwise the user
+#. * will never know why the drag is not possible
+#: ../src/display_playlists.c:516 ../src/display_playlists.c:558
+msgid "Error: drag from iPod not possible in offline mode."
+msgstr "Fehler: Verschieben vom iPod ist im Offline-Modus nicht möglich."
+
+#: ../src/display_playlists.c:585 ../src/display_tracks.c:286
+#, c-format
+msgid "Copied one track"
+msgid_plural "Copied %d tracks"
+msgstr[0] "Ein Stück kopiert"
+msgstr[1] "%d Stücke kopiert"
+
+#: ../src/display_playlists.c:865 ../src/display_playlists.c:877
+msgid "Can't reorder sorted treeview."
+msgstr "Die Anzeige kann nicht neu geordnet werden."
+
+#: ../src/display_playlists.c:954
+#, c-format
+msgid ""
+"This DND type (%d) is not (yet) supported. If you feel implementing this "
+"would be useful, please contact the author.\n"
+"\n"
+msgstr ""
+"Diese Art von 'Verschieben/Einfügen' (%d) wird (noch) nicht unterstützt. "
+"Wenn Sie denken eine Unterstützung wäre sinnvoll, kontaktieren Sie bitten "
+"den Autor.\n"
+"\n"
+
+#. no existing photo playlist found so add one
+#. * either itdb had no children or none of them
+#. * were of the photo type.
+#.
+#: ../src/display_playlists.c:1569
+msgid "Photos"
+msgstr ""
+
+#: ../src/display_sorttabs.c:473
+msgid "'Played' condition ignored because of error."
+msgstr ""
+"Die Bedingung 'Zuletzt abgespielt' wurde aufgrund eines Fehlers ignoriert."
+
+#: ../src/display_sorttabs.c:476
+msgid "'Modified' condition ignored because of error."
+msgstr ""
+"Die Bedingung 'Zuletzt modifiziert' wurde aufgrund eines Fehlers ignoriert."
+
+#: ../src/display_sorttabs.c:479
+msgid "'Added' condition ignored because of error."
+msgstr "Die Bedingung 'Hinzugefügt' wurde aufgrund eines Fehlers ignoriert."
+
+#: ../src/display_sorttabs.c:1562 ../src/misc_conversion.c:59
+msgid "All"
+msgstr "Alle"
+
+#: ../src/display_sorttabs.c:1588
+msgid "Compilations"
+msgstr "Sampler"
+
+#: ../src/display_sorttabs.c:2988
+msgid "Comp."
+msgstr "Komp."
+
+#: ../src/display_sorttabs.c:2994 ../src/display_spl.c:88
+#: ../src/display_tracks.c:2109 ../src/misc_conversion.c:84
+msgid "Year"
+msgstr "Jahr"
+
+#: ../src/display_sorttabs.c:2997
+msgid "Special"
+msgstr "Spezial"
+
+#: ../src/display_sorttabs.c:3245
+msgid "Last Played"
+msgstr "Zuletzt gespielt"
+
+#: ../src/display_sorttabs.c:3246
+msgid "Last Modified"
+msgstr "Zuletzt modifiziert"
+
+#: ../src/display_spl.c:64
+msgid "days"
+msgstr "Tage"
+
+#: ../src/display_spl.c:65
+msgid "weeks"
+msgstr "Wochen"
+
+#: ../src/display_spl.c:66
+msgid "months"
+msgstr "Monate"
+
+#: ../src/display_spl.c:73
+msgid "kbps"
+msgstr "kbit/s"
+
+#: ../src/display_spl.c:74
+msgid "Hz"
+msgstr "Hz"
+
+#: ../src/display_spl.c:75 ../src/display_spl.c:179 ../src/info.c:780
+msgid "MB"
+msgstr "MB"
+
+#: ../src/display_spl.c:76
+msgid "secs"
+msgstr "Sek."
+
+#: ../src/display_spl.c:86 ../src/misc_conversion.c:74
+msgid "Bitrate"
+msgstr "Bitrate"
+
+#. 15
+#: ../src/display_spl.c:87 ../src/misc_conversion.c:75
+msgid "Samplerate"
+msgstr "Samplerate"
+
+#: ../src/display_spl.c:90
+msgid "Kind"
+msgstr "Art"
+
+#: ../src/display_spl.c:91 ../src/misc_conversion.c:81
+msgid "Date modified"
+msgstr "Modifiziert"
+
+#: ../src/display_spl.c:92
+msgid "Track number"
+msgstr "Stücknummer"
+
+#: ../src/display_spl.c:93
+msgid "Size"
+msgstr "Dateigröße"
+
+#: ../src/display_spl.c:95 ../src/misc_conversion.c:64
+msgid "Comment"
+msgstr "Kommentar"
+
+#: ../src/display_spl.c:96 ../src/misc_conversion.c:79
+msgid "Date added"
+msgstr "Hinzugefügt"
+
+#: ../src/display_spl.c:99
+msgid "Last played"
+msgstr "Zuletzt gespielt"
+
+#: ../src/display_spl.c:100
+msgid "Disc number"
+msgstr "CD-Nummer"
+
+#: ../src/display_spl.c:102 ../src/misc_conversion.c:87
+msgid "Compilation"
+msgstr "Sampler"
+
+#: ../src/display_spl.c:103 ../src/misc_conversion.c:76
+msgid "BPM"
+msgstr "BPM"
+
+#: ../src/display_spl.c:104 ../src/misc_conversion.c:86
+msgid "Grouping"
+msgstr "Gruppierung"
+
+#: ../src/display_spl.c:105
+msgid "Playlist"
+msgstr "Wiedergabeliste"
+
+#: ../src/display_spl.c:106
+msgid "Video Kind"
+msgstr ""
+
+#: ../src/display_spl.c:108
+#, fuzzy
+msgid "Season number"
+msgstr "CD-Nummer"
+
+#: ../src/display_spl.c:109
+msgid "Skip count"
+msgstr ""
+
+#: ../src/display_spl.c:110
+#, fuzzy
+msgid "Last skipped"
+msgstr "Zuletzt gespielt"
+
+#: ../src/display_spl.c:111
+#, fuzzy
+msgid "Album artist"
+msgstr "Künstler"
+
+#: ../src/display_spl.c:117
+msgid "contains"
+msgstr "enthält"
+
+#: ../src/display_spl.c:118
+msgid "does not contain"
+msgstr "enthält nicht"
+
+#: ../src/display_spl.c:119 ../src/display_spl.c:128 ../src/display_spl.c:138
+#: ../src/display_spl.c:157 ../src/display_spl.c:164
+msgid "is"
+msgstr "ist"
+
+#: ../src/display_spl.c:120 ../src/display_spl.c:129 ../src/display_spl.c:139
+#: ../src/display_spl.c:158 ../src/display_spl.c:165
+msgid "is not"
+msgstr "ist nicht"
+
+#: ../src/display_spl.c:121
+msgid "starts with"
+msgstr "beginnt mit"
+
+#: ../src/display_spl.c:122
+msgid "ends with"
+msgstr "endet mit"
+
+#: ../src/display_spl.c:130
+msgid "is greater than"
+msgstr "ist größer als"
+
+#: ../src/display_spl.c:131
+msgid "is less than"
+msgstr "ist kleiner als"
+
+#: ../src/display_spl.c:132 ../src/display_spl.c:144
+msgid "is in the range"
+msgstr "ist innerhalb"
+
+#: ../src/display_spl.c:140
+msgid "is after"
+msgstr "ist nach dem"
+
+#: ../src/display_spl.c:141
+msgid "is before"
+msgstr "ist vor dem"
+
+#: ../src/display_spl.c:142
+msgid "in the last"
+msgstr "in den letzten"
+
+#: ../src/display_spl.c:143
+msgid "not in the last"
+msgstr "nicht in den letzten"
+
+#: ../src/display_spl.c:150
+msgid "is set"
+msgstr "ist gesetzt"
+
+#: ../src/display_spl.c:151
+msgid "is not set"
+msgstr "ist nicht gesetzt"
+
+#: ../src/display_spl.c:171
+#, fuzzy
+msgid "Not supported"
+msgstr "Nicht eingetragen"
+
+#: ../src/display_spl.c:178
+msgid "minutes"
+msgstr "Minuten"
+
+#: ../src/display_spl.c:180
+msgid "tracks"
+msgstr "Stücke"
+
+#: ../src/display_spl.c:181
+msgid "hours"
+msgstr "Stunden"
+
+#: ../src/display_spl.c:182 ../src/info.c:780
+msgid "GB"
+msgstr "GB"
+
+#: ../src/display_spl.c:189
+msgid "random order"
+msgstr "zufällige Reihenfolge"
+
+#: ../src/display_spl.c:190
+msgid "title"
+msgstr "Titel"
+
+#: ../src/display_spl.c:191
+msgid "album"
+msgstr "Album"
+
+#: ../src/display_spl.c:192
+msgid "artist"
+msgstr "Künstler"
+
+#: ../src/display_spl.c:193
+msgid "genre"
+msgstr "Genre"
+
+#: ../src/display_spl.c:194
+msgid "most recently added"
+msgstr "zuletzt hinzugefügt"
+
+#: ../src/display_spl.c:195
+msgid "least recently added"
+msgstr "zuerst hinzugefügt"
+
+#: ../src/display_spl.c:196
+msgid "most often played"
+msgstr "am häufigsten gespielt"
+
+#: ../src/display_spl.c:197
+msgid "least often played"
+msgstr "am wenigsten gespielt"
+
+#: ../src/display_spl.c:198
+msgid "most recently played"
+msgstr "zuletzt gespielt"
+
+#: ../src/display_spl.c:199
+msgid "least recently played"
+msgstr "am längsten nicht mehr gespielt"
+
+#: ../src/display_spl.c:200
+msgid "highest rating"
+msgstr "höchste Bewertung"
+
+#: ../src/display_spl.c:201
+msgid "lowest rating"
+msgstr "niedrigste Bewertung"
+
+#: ../src/display_spl.c:208 ../src/display_spl.c:217
+#, fuzzy
+msgid "Movie"
+msgstr "Modifiziert"
+
+#: ../src/display_spl.c:1192 ../src/display_spl.c:1207
+msgid "to"
+msgstr "bis"
+
+#: ../src/display_spl.c:1485
+msgid "-"
+msgstr "-"
+
+#: ../src/display_spl.c:1500
+msgid "+"
+msgstr "+"
+
+#: ../src/display_tracks.c:281
+#, c-format
+msgid "Moved one track"
+msgid_plural "Moved %d tracks"
+msgstr[0] "Ein Stück verschoben"
+msgstr[1] "%d Stücke verschoben"
+
+#: ../src/display_tracks.c:1810
+#, c-format
+msgid ""
+"Cannot unsort track view because of a bug in the GTK lib you are using (%d.%"
+"d.%d < 2.5.4). Once you sort the track view, you cannot go back to the "
+"unsorted state.\n"
+"\n"
+msgstr ""
+"Aufgrund eines Fehlers in der GTK-Bibliothek (%d.%d.%d < 2.5.4) ist es nicht "
+"möglich, die Stück-Ansicht in den unsortierten Zustand zurückzusetzen.\n"
+"\n"
+
+#: ../src/display_tracks.c:2069
+msgid "Rtng"
+msgstr "Bwrtng"
+
+#: ../src/display_tracks.c:2072
+msgid "#"
+msgstr "#"
+
+#: ../src/display_tracks.c:2075
+msgid "CD"
+msgstr "CD"
+
+#: ../src/display_tracks.c:2078
+msgid "ID"
+msgstr "ID"
+
+#: ../src/display_tracks.c:2081
+msgid "Trnsfrd"
+msgstr "Übertragen"
+
+#: ../src/display_tracks.c:2085
+msgid "Cmpl"
+msgstr "Sampl"
+
+#: ../src/display_tracks.c:2091
+msgid "Time"
+msgstr "Zeit"
+
+#: ../src/display_tracks.c:2094
+msgid "Plycnt"
+msgstr "Zähler"
+
+#: ../src/display_tracks.c:2106
+msgid "Released"
+msgstr "Veröffentlicht"
+
+#: ../src/display_tracks.c:2112
+msgid "Vol."
+msgstr "Ltst."
+
+#: ../src/display_tracks.c:2115
+msgid "Sndchk."
+msgstr "Sndchk."
+
+#: ../src/fetchcover.c:358
+msgid "Coverart file already exists"
+msgstr ""
+
+#: ../src/fetchcover.c:371
+#, c-format
+msgid ""
+"The picture file %s already exists.\n"
+"This may be associated with other music files in the directory.\n"
+"\n"
+"-  Clicking Yes will overwrite the existing file, possibly associating\n"
+"   other music files in the same directory with this coverart file.\n"
+"-  Clicking No will save the file with a unique file name.\n"
+"-  Clicking Cancel will abort the fetchcover operation."
+msgstr ""
+
+#: ../src/file.c:236
+#, c-format
+msgid ""
+"'%s' is a directory, not a playlist file.\n"
+"\n"
+msgstr ""
+"'%s' ist ein Verzeichnis und keine Wiedergabeliste.\n"
+"\n"
+
+#: ../src/file.c:266
+#, c-format
+msgid ""
+"'%s' is a not a known playlist file.\n"
+"\n"
+msgstr "'%s' ist keine bekannte Wiedergabeliste.\n"
+
+#: ../src/file.c:283 ../src/file_export.c:217 ../src/oggfile.c:62
+#: ../src/wavfile.c:107
+#, c-format
+msgid "Could not open '%s' for reading.\n"
+msgstr "Datei '%s' konnte nicht zum Lesen geöffnet werden.\n"
+
+#: ../src/file.c:369
+#, c-format
+msgid "Skipping '%s' because it is a directory.\n"
+msgstr "Überspringe '%s', da es sich um ein Verzeichnis handelt.\n"
+
+#: ../src/file.c:374
+#, c-format
+msgid "Skipping '%s' to avoid adding playlist file recursively\n"
+msgstr ""
+"Überspringe '%s', um eine Endlosschleife zu vermeiden (Wiedergabeliste kann "
+"sich nicht selbst indizieren).\n"
+
+#: ../src/file.c:629
+#, c-format
+msgid "Unknown token '%s' in template '%s'\n"
+msgstr "Unbekanntes Symbol '%s' in der Schablone '%s'\n"
+
+#: ../src/file.c:923
+#, c-format
+msgid "Local filename not valid (%s)"
+msgstr "Lokaler Dateiname ist nicht gültig (%s)"
+
+#: ../src/file.c:982
+#, c-format
+msgid "No information found for user '%s' in '%s'"
+msgstr "Keine Informationen für den Benutzer '%s' gefunden in '%s'"
+
+#: ../src/file.c:991
+#, c-format
+msgid "mserv data file (%s) not available for track (%s)"
+msgstr "mserv Datei (%s) nicht verfügbar für Stück (%s)"
+
+#: ../src/file.c:999
+#, c-format
+msgid "Track (%s) not in mserv music root directory (%s)"
+msgstr "Stück (%s) ist nicht im mserv Stammverzeichnis (%s)"
+
+#: ../src/file.c:1123
+#, c-format
+msgid ""
+"The following track could not be processed (file does not exist): '%s'\n"
+msgstr ""
+"Das folgende Stück konnte nicht bearbeitet werden (Datei existiert nicht): '%"
+"s'\n"
+
+#: ../src/file.c:1209
+#, c-format
+msgid "The following track could not be processed (filetype unknown): '%s'\n"
+msgstr ""
+"Das folgende Stück konnte nicht bearbeitet werden (Dateityp unbekannt): '%"
+"s'\n"
+
+#: ../src/file.c:1307
+#, c-format
+msgid ""
+"The following track could not be processed (filetype is known but analysis "
+"failed): '%s'\n"
+msgstr ""
+"Das folgende Stück konnte nicht bearbeitet werden (Dateityp ist bekannt, "
+"aber die Analyse schlug fehl): '%s'\n"
+
+#: ../src/file.c:1337 ../src/file.c:1391
+msgid "Nothing to update"
+msgstr "Nichts zum Aktualisieren"
+
+#: ../src/file.c:1358
+#, c-format
+msgid "Updating %s"
+msgstr "Aktualisiere '%s'"
+
+#: ../src/file.c:1372
+msgid "Updated selected tracks with info from file."
+msgstr ""
+"Ausgewählte Stücke wurden mit Informationen aus der Datei aktualisiert."
+
+#: ../src/file.c:1406
+#, c-format
+msgid "Retrieving mserv data %s"
+msgstr "Hole mserv Daten %s"
+
+#: ../src/file.c:1411
+msgid "no filename available"
+msgstr "Es steht kein Dateiname zur Verfügung"
+
+#: ../src/file.c:1416
+msgid "Updated selected tracks with data from mserv."
+msgstr ""
+"Die ausgewählten Stücke wurden mit Informationen aus der mserv Datenbank "
+"aktualisiert."
+
+#: ../src/file.c:1437
+#, c-format
+msgid "The following track could not be updated"
+msgid_plural "The following %d tracks could not be updated"
+msgstr[0] "Das folgende Stück konnte nicht aktualisiert werden"
+msgstr[1] "Die folgenden %d Stücke konnten nicht aktualisiert werden"
+
+#. gint id,
+#. gboolean modal,
+#: ../src/file.c:1443
+msgid "Failed Track Update"
+msgstr "Aktualisierung fehlgeschlagen"
+
+#: ../src/file.c:1501
+#, c-format
+msgid "The following track has been updated"
+msgid_plural "The following %d tracks have been updated"
+msgstr[0] "Das folgende Stück wurde aktualisiert"
+msgstr[1] "Die folgenden %d Stücke wurden aktualisiert"
+
+#. gint id,
+#. gboolean modal,
+#: ../src/file.c:1507
+msgid "Successful Track Update"
+msgstr "Aktualisierung erfolgreich"
+
+#: ../src/file.c:1566
+#, c-format
+msgid "No mserv information could be retrieved for the following track"
+msgid_plural ""
+"No mserv information could be retrieved for the following %d tracks"
+msgstr[0] ""
+"Für das folgende Stück konnten keine mserv Informationen gefunden werden"
+msgstr[1] ""
+"Für die folgenden %d Stücke konnten keine mserv Informationen gefunden werden"
+
+#. gint id,
+#. gboolean modal,
+#: ../src/file.c:1572
+msgid "mserv data retrieval problem"
+msgstr "Problem beim Nachschlagen der mserv Daten"
+
+#: ../src/file.c:1661
+msgid "no local filename available, file on the iPod will be used instead"
+msgstr ""
+"Kein lokaler Dateiname verfügbar, Datei auf dem iPod wird stattdessen "
+"verwendet"
+
+#: ../src/file.c:1667
+msgid "no local filename available and copy on iPod cannot be found"
+msgstr "Kein lokaler Dateiname verfügbar, Kopie auf dem iPod nicht auffindbar"
+
+#: ../src/file.c:1671 ../src/file.c:1689
+#, fuzzy
+msgid "no local filename available"
+msgstr "Es steht kein Dateiname zur Verfügung"
+
+#: ../src/file.c:1679
+msgid "local file could not be found, file on the iPod will be used instead"
+msgstr ""
+"Keine lokale Datei auffindbar, Datei auf dem iPod wird stattdessen verwendet"
+
+#: ../src/file.c:1685
+msgid "local file as well as copy on the iPod cannot be found"
+msgstr "Lokale Datei und Kopie auf dem iPod nicht auffindbar"
+
+#. update not successful -- log this track for later display
+#: ../src/file.c:1788
+#, fuzzy
+msgid "update failed (format not supported?)"
+msgstr "Aktualisierung fehlgeschlagen (Format nicht unterstützt?)"
+
+#: ../src/file.c:1873 ../src/misc_playlist.c:916
+#, c-format
+msgid "Processing '%s'..."
+msgstr "Bearbeite '%s'..."
+
+#: ../src/file.c:1879
+#, fuzzy, c-format
+msgid "Skipping '%s' because it matches exclude masks.\n"
+msgstr "Überspringe '%s', da es sich um ein Verzeichnis handelt.\n"
+
+#: ../src/file.c:1999 ../src/misc_track.c:1773 ../src/misc_track.c:1878
+#, c-format
+msgid ""
+"Podcast already present: '%s'\n"
+"\n"
+msgstr "Podcast ist bereits vorhanden: '%s'\n"
+
+#: ../src/file.c:2064
+#, c-format
+msgid ""
+"Writing to video files not yet supported (%s).\n"
+"\n"
+msgstr "Schreiben in Videodateien wird noch nicht unterstützt (%s).\n"
+
+#: ../src/file.c:2116 ../src/file.c:2130
+#, c-format
+msgid "Couldn't change tags of file: %s\n"
+msgstr "Konnte Tags der Datei '%s' nicht ändern\n"
+
+#: ../src/file.c:2232
+#, c-format
+msgid "Could not open '%s' for reading and writing.\n"
+msgstr "Datei '%s' konnte nicht zum Lesen und Schreiben geöffnet werden.\n"
+
+#: ../src/file.c:2239
+#, c-format
+msgid "Could not obtain lock on '%s'.\n"
+msgstr "Lock auf '%s' konnte nicht erstellt werden.\n"
+
+#. error!
+#: ../src/file.c:2256 ../src/file.c:2265 ../src/file.c:2276 ../src/file.c:2286
+#, c-format
+msgid "Malformed line in '%s': %s\n"
+msgstr "Ungültige Zeile in '%s': %s\n"
+
+#. gint id,
+#. gboolean modal,
+#: ../src/file.c:2315
+msgid "Remove offline playcounts?"
+msgstr "Sollen Offline-Wiedergabe Zähler gelöscht werden?"
+
+#. title
+#: ../src/file.c:2316
+msgid ""
+"Some tracks played offline could not be found in the iTunesDB. Press 'OK' to "
+"remove them from the offline playcount file, 'Cancel' to keep them."
+msgstr ""
+"Einige offline gespielte Stücke konnten nicht in der iTunesDB gefunden "
+"werden. Wählen Sie 'OK', um diese aus der Wiedergabezähler-Datei zu "
+"entfernen, 'Abbrechen' um sie beizubehalten."
+
+#: ../src/file.c:2333
+#, c-format
+msgid "Error writing to '%s'.\n"
+msgstr "Fehler beim Schreiben in die Datei '%s'.\n"
+
+#: ../src/file.c:2390 ../src/tools.c:270
+#, c-format
+msgid ""
+"Normalization failed: file type not supported (%s).\n"
+"\n"
+msgstr "Normalisierung fehlgeschlagen: Dateityp nicht unterstützt (%s).\n"
+
+#: ../src/file.c:2406 ../src/tools.c:287
+#, c-format
+msgid ""
+"Normalization failed: file not available (%s).\n"
+"\n"
+msgstr "Normalisierung fehlgeschlagen: Datei ist nicht verfügbar (%s).\n"
+
+#: ../src/file_convert.c:316
+msgid "Summary status of conversion processes"
+msgstr ""
+
+#: ../src/file_convert.c:564
+msgid "active"
+msgstr ""
+
+#: ../src/file_convert.c:569
+msgid "inactive"
+msgstr ""
+
+#: ../src/file_convert.c:580
+#, c-format
+msgid "Active threads: %d. Scheduled tracks: %d."
+msgstr ""
+
+#: ../src/file_convert.c:1071
+#, fuzzy, c-format
+msgid "Original filename not available for '%s.'\n"
+msgstr "Normalisierung fehlgeschlagen: Datei ist nicht verfügbar (%s).\n"
+
+#: ../src/file_convert.c:1086
+#, c-format
+msgid "Filename '%s' is no longer valid for '%s'.\n"
+msgstr ""
+
+#: ../src/file_convert.c:1137
+msgid "Ogg Vorbis"
+msgstr ""
+
+#: ../src/file_convert.c:1143
+msgid "FLAC"
+msgstr ""
+
+#: ../src/file_convert.c:1198
+#, c-format
+msgid ""
+"Files of type '%s' are not supported by the iPod. Please go to the "
+"Preferences to set up and turn on a suitable conversion script for '%s'.\n"
+"\n"
+msgstr ""
+
+#: ../src/file_convert.c:1284
+#, fuzzy
+msgid "No information available"
+msgstr "Es steht kein Dateiname zur Verfügung"
+
+#: ../src/file_convert.c:1323
+#, c-format
+msgid "Could not create '%s'. Filetype conversion will not work.\n"
+msgstr ""
+
+#: ../src/file_convert.c:1641 ../src/file_convert.c:3049
+#, fuzzy, c-format
+msgid ""
+"Transfer of '%s' failed. %s\n"
+"\n"
+msgstr ""
+"Die Ausführung von '%s' schlug fehl.\n"
+"\n"
+
+#: ../src/file_convert.c:2047 ../src/file_convert.c:2325
+#, fuzzy, c-format
+msgid ""
+"Conversion of '%s' failed: '%s'.\n"
+"\n"
+msgstr ""
+"Die Ausführung von '%s' schlug fehl.\n"
+"\n"
+
+#: ../src/file_convert.c:2062
+#, c-format
+msgid ""
+"Conversion of '%s' failed: '%s %s' returned exit status %d.\n"
+"\n"
+msgstr ""
+
+#: ../src/file_convert.c:2091
+#, fuzzy, c-format
+msgid ""
+"Conversion of '%s' failed: '\"%s\" %s' did not return filename extension as "
+"expected.\n"
+"\n"
+msgstr ""
+"Die Ausführung von '%s' schlug fehl.\n"
+"\n"
+
+#: ../src/file_convert.c:2167
+#, fuzzy, c-format
+msgid ""
+"Conversion of '%s' failed: Could not access original file '%s' (%s).\n"
+"\n"
+msgstr ""
+"Die Ausführung von '%s' schlug fehl.\n"
+"\n"
+
+#: ../src/file_convert.c:2222
+#, c-format
+msgid ""
+"Conversion of '%s' failed: Could not create directory '%s'.\n"
+"\n"
+msgstr ""
+
+#: ../src/file_convert.c:2356
+#, c-format
+msgid ""
+"Conversion of '%s' failed: '%s' returned exit status %d.\n"
+"\n"
+msgstr ""
+
+#: ../src/file_convert.c:2395
+#, c-format
+msgid ""
+"Conversion of '%s' failed: could not stat the converted file '%s'.\n"
+"\n"
+msgstr ""
+
+#: ../src/file_export.c:182
+#, c-format
+msgid "Skipping existing file with same length: '%s'\n"
+msgstr "Überspringe existierende Datei mit gleicher Dateilänge: '%s'\n"
+
+#: ../src/file_export.c:190
+#, c-format
+msgid "Overwriting existing file: '%s'\n"
+msgstr "Überschreibe die vorhandene Datei: '%s'\n"
+
+#: ../src/file_export.c:207
+#, c-format
+msgid "Error copying '%s' to '%s': Permission Error (%s)\n"
+msgstr "Fehler beim Kopieren von '%s' nach '%s': Zugriff verweigert (%s)\n"
+
+#: ../src/file_export.c:209
+#, c-format
+msgid "Error copying '%s' to '%s' (%s)\n"
+msgstr "Fehler beim Kopieren von '%s' nach '%s' (%s)\n"
+
+#: ../src/file_export.c:327
+#, c-format
+msgid "Could find file for '%s' on the iPod\n"
+msgstr "Konnte Datei für '%s' auf dem iPod nicht finden\n"
+
+#. create the dialog window
+#: ../src/file_export.c:395 ../src/tools.c:360
+msgid "Information"
+msgstr "Information"
+
+#: ../src/file_export.c:406 ../src/tools.c:372
+msgid "Press button to abort."
+msgstr "Zum Abbrechen bitte anklicken."
+
+#: ../src/file_export.c:419
+msgid "copying..."
+msgstr "kopiere..."
+
+#: ../src/file_export.c:476
+#, c-format
+msgid "Failed to write '%s-%s'\n"
+msgstr "Konnte '%s-%s' nicht schreiben\n"
+
+#: ../src/file_export.c:489
+#, c-format
+msgid "Copied %d of %d track."
+msgid_plural "Copied %d of %d tracks."
+msgstr[0] "%d von insgesamt %d Stück kopiert."
+msgstr[1] "%d von insgesamt %d Stücken kopiert."
+
+#: ../src/file_export.c:505 ../src/tools.c:518
+#, c-format
+msgid "%d%% (%d:%02d:%02d left)"
+msgstr "%d%% (noch %d:%02d:%02d)"
+
+#: ../src/file_export.c:514
+msgid "Some tracks were not copied."
+msgstr "Einige Stücke wurden nicht kopiert."
+
+#: ../src/file_export.c:579
+msgid "Export from iPod database not possible in offline mode."
+msgstr "Ein Export vom iPod ist im Offline-Modus nicht möglich."
+
+#: ../src/file_export.c:587
+msgid "Select Export Destination Directory"
+msgstr "Wählen Sie das Zielverzeichnis für den Export aus"
+
+#: ../src/file_export.c:736
+msgid "Drag from iPod database not possible in offline mode."
+msgstr "Ein Verschieben vom iPod ist im Offline-Modus nicht möglich."
+
+#: ../src/file_export.c:770
+msgid "The following tracks have to be copied to your harddisk"
+msgstr "Die folgende Stücke müssen auf Ihre Festplatte kopiert werden"
+
+#: ../src/file_export.c:815
+msgid ""
+"Some tracks were not copied to your harddisk. Only the copied tracks will be "
+"included in the current drag and drop operation.\n"
+"\n"
+msgstr ""
+"Einige Stücke wurden nicht auf Ihre Festplatte kopiert. Nur die kopierten "
+"Einträge können beim Verschieben/Einfügen bearbeitet werden.\n"
+"\n"
+
+#: ../src/file_export.c:1010
+#, c-format
+msgid ""
+"No valid filename for: %s\n"
+"\n"
+msgstr ""
+"Kein gültiger Dateiname für %s\n"
+"\n"
+
+#: ../src/file_export.c:1026
+#, c-format
+msgid "Created playlist with one track."
+msgid_plural "Created playlist with %d tracks."
+msgstr[0] "Wiedergabeliste mit einem Stück erstellt."
+msgstr[1] "Wiedergabeliste mit %d Stücken erstellt."
+
+#: ../src/file_export.c:1031
+#, c-format
+msgid ""
+"Could not open '%s' for writing (%s).\n"
+"\n"
+msgstr ""
+"Datei '%s' konnte nicht zum Schreiben geöffnet werden. (%s)\n"
+"\n"
+
+#: ../src/file_itunesdb.c:129
+#, fuzzy, c-format
+msgid "Matching SHA1 checksum for file %d/%d"
+msgstr "Suche passende MD5 Prüfsumme für Datei %d/%d"
+
+#: ../src/file_itunesdb.c:236
+#, fuzzy, c-format
+msgid "Could not open \"%s\" for reading extended info.\n"
+msgstr ""
+"Datei \"%s\" konnte nicht zum Schreiben der erweiterten Infos geöffnet "
+"werden.\n"
+
+#: ../src/file_itunesdb.c:243
+msgid "Could not create hash value from itunesdb\n"
+msgstr "Konnte keine Prüfsumme für die iTunesDB bilden\n"
+
+#: ../src/file_itunesdb.c:259
+#, c-format
+msgid "Error while reading extended info: %s\n"
+msgstr "Fehler beim Lesen der erweiterten Informationen: '%s'\n"
+
+#: ../src/file_itunesdb.c:276
+#, fuzzy, c-format
+msgid ""
+"iTunesDB '%s' does not match checksum in extended information file '%s'\n"
+"gtkpod will try to match the information using SHA1 checksums. This may take "
+"a long time.\n"
+"\n"
+msgstr ""
+"Die Prüfsumme der iTunesDB '%s' entspricht nicht der Prüfsumme, die in den "
+"erweiterten Informationen '%s' abgelegt ist. gtkpod wird versuchen, die "
+"Informationen mittels der MD5 Prüfsummen zuzuordnen. Dies kann eine lange "
+"Zeit in Anspruch nehmen.\n"
+"\n"
+
+#: ../src/file_itunesdb.c:288
+#, c-format
+msgid ""
+"%s:\n"
+"Expected \"itunesdb_hash=\" but got:\"%s\"\n"
+msgstr ""
+"%s:\n"
+"Erwartete \"itunesdb_hash=\", aber \"%s\" gefunden\n"
+
+#: ../src/file_itunesdb.c:348
+#, c-format
+msgid ""
+"%s:\n"
+"Format error: %s\n"
+msgstr ""
+"%s:\n"
+"Formatfehler: %s\n"
+
+#: ../src/file_itunesdb.c:393
+#, fuzzy
+msgid ""
+"No SHA1 checksums on individual tracks are available.\n"
+"\n"
+"To avoid this situation in the future either switch on duplicate detection "
+"(will provide SHA1 checksums) or avoid using the iPod with programs other "
+"than gtkpod.\n"
+"\n"
+msgstr ""
+"Es stehen keine MD5 Prüfsummen für die einzelnen Stücke zur Verfügung.\n"
+"\n"
+"Um dieses Problem in Zukunft zu vermeiden, schalten Sie bitte die "
+"Duplikaterkennung ein (dies erzeugt MD5 Prüfsummen), oder vermeiden Sie, den "
+"iPod außer mit gtkpod noch mit anderen Programmen zu verwenden.\n"
+"\n"
+
+#: ../src/file_itunesdb.c:457
+msgid ""
+"Extended info will not be used. If you have non-transferred tracks,\n"
+"these will be lost.\n"
+msgstr ""
+"Die erweiterten Informationen werden nicht verwendet. Nicht auf den iPod "
+"übertragene Stücke gehen verloren.\n"
+
+#: ../src/file_itunesdb.c:465
+msgid "Offline iPod database successfully imported"
+msgstr "Die Offline iPod Datenbank wurde erfolgreich eingelesen"
+
+#: ../src/file_itunesdb.c:468
+msgid "Local database successfully imported"
+msgstr "Lokale Datenbank wurde erfolgreich eingelesen"
+
+#: ../src/file_itunesdb.c:476
+#, c-format
+msgid ""
+"Offline iPod database import failed: '%s'\n"
+"\n"
+msgstr ""
+"Das Einlesen der Offline iPod Datenbank schlug fehl: '%s'\n"
+"\n"
+
+#: ../src/file_itunesdb.c:480
+#, c-format
+msgid ""
+"Local database import failed: '%s'\n"
+"\n"
+msgstr ""
+"Das Einlesen der lokalen Datenbank schlug fehl: '%s'\n"
+"\n"
+
+#: ../src/file_itunesdb.c:487
+msgid ""
+"Offline iPod database import failed: \n"
+"\n"
+msgstr ""
+"Das Einlesen der Offline iPod Datenbank schlug fehl:\n"
+"\n"
+
+#: ../src/file_itunesdb.c:490
+msgid ""
+"Local database import failed: \n"
+"\n"
+msgstr ""
+"Das Einlesen der lokalen Datenbank schlug fehl:\n"
+"\n"
+
+#: ../src/file_itunesdb.c:497
+#, c-format
+msgid ""
+"'%s' does not exist. Import aborted.\n"
+"\n"
+msgstr ""
+"'%s' existiert nicht. Einlesen abgebrochen.\n"
+"\n"
+
+#: ../src/file_itunesdb.c:520
+msgid "Extended info will not be used.\n"
+msgstr "Erweiterte Informationen werden nicht verwendet.\n"
+
+#: ../src/file_itunesdb.c:527
+msgid "iPod Database Successfully Imported"
+msgstr "iPod Datenbank wurde erfolgreich eingelesen"
+
+#: ../src/file_itunesdb.c:534
+#, c-format
+msgid ""
+"iPod Database Import Failed: '%s'\n"
+"\n"
+msgstr ""
+"Das Einlesen der iPod Datenbank schlug fehl: '%s'\n"
+"\n"
+
+#: ../src/file_itunesdb.c:540
+msgid ""
+"iPod Database Import Failed.\n"
+"\n"
+msgstr ""
+"Das Einlesen der iPod Datenbank schlug fehl\n"
+"\n"
+
+#: ../src/file_itunesdb.c:549
+#, c-format
+msgid ""
+"'%s' (or similar) does not exist. Import aborted.\n"
+"\n"
+msgstr ""
+"'%s' (o.ä.) existiert nicht. Einlesen abgebrochen.\n"
+"\n"
+
+#: ../src/file_itunesdb.c:865
+#, c-format
+msgid ""
+"Could not find iPod directory structure at '%s'.\n"
+"If you are sure that the iPod is properly mounted at '%s', gtkpod can create "
+"the directory structure for you.\n"
+"\n"
+"Do you want to create the directory structure now?\n"
+msgstr ""
+"Konnte iPod Verzeichnis unter '%s'.\n"
+"nicht finden. Falls der iPod unter '%s', korrekt eingehängt ist, kann gtkpod "
+"die Verzeichnisstruktur für Sie erstellen.\n"
+"\n"
+"Möchten Sie die Verzeichnisstruktur jetzt erstellen?\n"
+
+#: ../src/file_itunesdb.c:1180
+#, c-format
+msgid "Could not open \"%s\" for writing extended info.\n"
+msgstr ""
+"Datei \"%s\" konnte nicht zum Schreiben der erweiterten Infos geöffnet "
+"werden.\n"
+
+#: ../src/file_itunesdb.c:1195
+msgid "Aborted writing of extended info.\n"
+msgstr "Schreiben der erweiterten Infos abgebrochen.\n"
+
+#: ../src/file_itunesdb.c:1397
+#, c-format
+msgid "%d%%"
+msgstr ""
+
+#: ../src/file_itunesdb.c:1411
+#, fuzzy, c-format
+msgid "%d%% (%d/%d  %d:%02d:%02d left)"
+msgstr "%d%% (noch %d:%02d:%02d)"
+
+#: ../src/file_itunesdb.c:1463
+msgid "Status: Deleting File"
+msgstr ""
+
+#: ../src/file_itunesdb.c:1524
+#, fuzzy, c-format
+msgid ""
+"Could not remove the following file: '%s'\n"
+"\n"
+msgstr ""
+"Datei '%s' konnte nicht zum Schreiben geöffnet werden. (%s)\n"
+"\n"
+
+#: ../src/file_itunesdb.c:1632
+#, fuzzy
+msgid ""
+"The following track could not be converted successfully:\n"
+"\n"
+msgid_plural ""
+"The following tracks could not be converted successfully:\n"
+"\n"
+msgstr[0] "Das folgende Stück konnte nicht aktualisiert werden"
+msgstr[1] "Die folgenden %d Stücke konnten nicht aktualisiert werden"
+
+#: ../src/file_itunesdb.c:1642
+#, fuzzy
+msgid ""
+"The following track could not be transferred successfully:\n"
+"\n"
+msgid_plural ""
+"The following tracks could not be transferred successfully:\n"
+"\n"
+msgstr[0] "Das folgende Stück konnte nicht aktualisiert werden"
+msgstr[1] "Die folgenden %d Stücke konnten nicht aktualisiert werden"
+
+#. ID
+#. modal,
+#. gint id,
+#. gboolean modal,
+#: ../src/file_itunesdb.c:1651 ../src/misc_confirm.c:70
+msgid "Warning"
+msgstr "Warnung"
+
+#. title
+#: ../src/file_itunesdb.c:1652
+msgid ""
+"The iPod could not be ejected. Please fix the problems mentioned below and "
+"then eject the iPod again. Pressing 'OK' will re-schedule the failed tracks "
+"for conversion and transfer."
+msgstr ""
+
+#: ../src/file_itunesdb.c:1715
+#, c-format
+msgid "Status: Copying track"
+msgstr ""
+
+#: ../src/file_itunesdb.c:1721
+#, c-format
+msgid "Status: Waiting for conversion to complete"
+msgstr ""
+
+#: ../src/file_itunesdb.c:1725
+#, c-format
+msgid "Status: Finished transfer"
+msgstr ""
+
+#: ../src/file_itunesdb.c:1770
+#, c-format
+msgid ""
+"One track could not be transferred because your iPod is full. Either delete "
+"some tracks or otherwise create space on the iPod before ejecting the iPod "
+"again."
+msgid_plural ""
+"%d tracks could not be transferred because your iPod is full. Either delete "
+"some tracks or otherwise create space on the iPod before ejecting the iPod "
+"again."
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../src/file_itunesdb.c:1852
+#, c-format
+msgid ""
+"You did not import the existing iTunesDB ('%s'). This is most likely "
+"incorrect and will result in the loss of the existing database.\n"
+"\n"
+"Press 'OK' if you want to proceed anyhow or 'Cancel' to skip storing. If you "
+"cancel, you can import the existing database before calling this function "
+"again.\n"
+msgstr ""
+"Sie haben die bereits bestehende iTunesDB ('%s') nicht eingelesen. Dies ist "
+"wahrscheinlich nicht was Sie beabsichtigen, da auf diese Weise die "
+"existierende Datenbank überschrieben wird.\n"
+"\n"
+"Klicken Sie auf 'OK', wenn Sie trotzdem fortfahren wollen, oder auf "
+"'Abbrechen', um jetzt nicht zu speichern. Wenn Sie den Vorgang abbrechen, "
+"können Sie die existierende Datenbank einlesen und dann erneut abgleichen.\n"
+
+#: ../src/file_itunesdb.c:1887
+msgid ""
+"iPod directory structure must be present before synching to the iPod can be "
+"performed.\n"
+msgstr ""
+"Die iPod Verzeichnisstruktur muss vorhanden sein bevor Daten auf den iPod "
+"kopiert werden können.\n"
+
+#: ../src/file_itunesdb.c:1896
+msgid "Some tracks could not be deleted from the iPod. Export aborted!"
+msgstr ""
+"Einige Dateien konnten nicht vom iPod gelöscht werden. Export abgebrochen!"
+
+#: ../src/file_itunesdb.c:1914
+#, fuzzy, c-format
+msgid "Now writing database '%s'. Please wait..."
+msgstr "Schreibe iTunesDB. Bitte warten..."
+
+#: ../src/file_itunesdb.c:1963
+#, c-format
+msgid "Extended information file not deleted: '%s'"
+msgstr "Die Datei mit den erweiterten Informationen wurde nicht gelöscht: '%s'"
+
+#: ../src/file_itunesdb.c:2070
+#, c-format
+msgid "%s: Database saved"
+msgstr "%s: Datenbank gespeichert"
+
+#: ../src/file_itunesdb.c:2074
+#, c-format
+msgid "%s: Changes saved"
+msgstr "%s: Änderungen gespeichert"
+
+#: ../src/fileselection.c:129
+msgid "Successfully added files"
+msgstr "Dateien wurden erfolgreich hinzugefügt"
+
+#: ../src/fileselection.c:131
+msgid "Some files were not added successfully"
+msgstr "Einige Dateien konnten nicht hinzugefügt werden"
+
+#: ../src/fileselection.c:164 ../src/fileselection.c:305
+#: ../src/fileselection.c:792
+msgid "Please select a playlist or repository before adding tracks."
+msgstr ""
+
+#: ../src/fileselection.c:175 ../src/fileselection.c:314
+#: ../src/fileselection.c:803
+msgid "Please load the iPod before adding tracks."
+msgstr ""
+
+#: ../src/fileselection.c:185
+#, fuzzy, c-format
+msgid "Add files to '%s'"
+msgstr "Dateien hinzufügen"
+
+#: ../src/fileselection.c:189
+#, c-format
+msgid "Add files to '%s/%s'"
+msgstr ""
+
+#. Create window title
+#: ../src/fileselection.c:322
+#, fuzzy, c-format
+msgid "Add playlist files to '%s'"
+msgstr "Wiedergabeliste aus Datei hinzufügen"
+
+#. Create the file chooser, and handle the response
+#: ../src/fileselection.c:378
+msgid "Set Cover"
+msgstr "Cover auswählen"
+
+#: ../src/fileselection.c:816
+#, fuzzy, c-format
+msgid "Add directories to '%s'"
+msgstr "Verzeichnisse rekursiv hinzufügen"
+
+#: ../src/fileselection.c:820
+#, fuzzy, c-format
+msgid "Add directories to '%s/%s'"
+msgstr "Verzeichnisse rekursiv hinzufügen"
+
+#: ../src/fileselection.c:1097
+msgid "Ok"
+msgstr "OK"
+
+#: ../src/fileselection.c:1106
+msgid "Cancel"
+msgstr "Abbrechen"
+
+#: ../src/flacfile.c:62
+#, fuzzy, c-format
+msgid "'%s' does not appear to be an FLAC audio file.\n"
+msgstr "'%s' scheint keine mp4-Audio-Datei zu sein.\n"
+
+#: ../src/flacfile.c:78
+#, fuzzy, c-format
+msgid "Error retrieving tags for '%s'.\n"
+msgstr "Fehler beim Schreiben in die Datei '%s'.\n"
+
+#: ../src/flacfile.c:165
+#, fuzzy, c-format
+msgid ""
+"Import of '%s' failed: FLAC not supported without the FLAC library. You must "
+"compile the gtkpod source together with the FLAC library.\n"
+msgstr ""
+"Einlesen des Stücks '%s' fehlgeschlagen: m4a/m4p/m4b-Dateien werden ohne die "
+"mp4v2 Bibliothek nicht unterstützt. Sie müssen gtkpod zusammen mit der mp4v2 "
+"Bibliothek kompilieren.\n"
+
+#: ../src/flacfile.c:171
+#, fuzzy, c-format
+msgid ""
+"FLAC metadata update for '%s' failed: FLAC not supported without the FLAC "
+"library. You must compile the gtkpod source together with the FLAC library.\n"
+msgstr ""
+"Schreiben von m4a/m4p Metadaten für '%s' fehlgeschlagen: m4a/m4p/m4b-Dateien "
+"werden ohne die mp4v2 Bibliothek nicht unterstützt. Sie müssen gtkpod "
+"zusammen mit der mp4v2 Bibliothek kompilieren.\n"
+
+#: ../src/getopt.c:681
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: die Option '%s' ist mehrdeutig\n"
+
+#: ../src/getopt.c:706
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: die Option '--%s' lässt kein Argument zu\n"
+
+#: ../src/getopt.c:711
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: die Option '%c%s' lässt kein Argument zu\n"
+
+#: ../src/getopt.c:729 ../src/getopt.c:902
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: die Option '%s' benötigt ein Argument\n"
+
+#. --option
+#: ../src/getopt.c:758
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: die Option '--%s' ist unbekannt\n"
+
+#. +option or -option
+#: ../src/getopt.c:762
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: die Option '%c%s' ist unbekannt\n"
+
+#. 1003.2 specifies the format of this message.
+#: ../src/getopt.c:788
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: die Option '%c' ist nicht erlaubt\n"
+
+#: ../src/getopt.c:791
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: die Option '%c' ist ungültig\n"
+
+#. 1003.2 specifies the format of this message.
+#: ../src/getopt.c:821 ../src/getopt.c:951
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: die Option '%c' benötigt ein Argument\n"
+
+#: ../src/getopt.c:868
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: die Option '-W %s' ist mehrdeutig\n"
+
+#: ../src/getopt.c:886
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: die Option '-W %s' lässt keine Argumente zu\n"
+
+#: ../src/info.c:383
+msgid "n/c"
+msgstr "---"
+
+#: ../src/info.c:388 ../src/info.c:838
+msgid "offline"
+msgstr "offline"
+
+#: ../src/info.c:486
+#, c-format
+msgid " P:%d T:%d/%d"
+msgstr " P:%d S:%d/%d"
+
+#: ../src/info.c:780
+msgid "B"
+msgstr "B"
+
+#: ../src/info.c:780
+msgid "kB"
+msgstr "kB"
+
+#: ../src/info.c:780
+msgid "TB"
+msgstr "TB"
+
+#: ../src/info.c:823
+#, c-format
+msgid " %s Free"
+msgstr " %s frei"
+
+#: ../src/info.c:828
+#, c-format
+msgid " %s Pending"
+msgstr " %s voll"
+
+#: ../src/info.c:833
+msgid " disconnected"
+msgstr " getrennt"
+
+#: ../src/info.c:884
+msgid "No database or playlist selected"
+msgstr "Keine Datenbank oder Wiedergabeliste gewählt"
+
+#: ../src/info.c:889
+msgid "No tracks selected"
+msgstr "Keine Stücke ausgewählt"
+
+#: ../src/info.c:894
+msgid "No playlist selected"
+msgstr "Keine Wiedergabeliste ausgewählt"
+
+#: ../src/info.c:899
+msgid "No iPod or iPod playlist selected"
+msgstr "Kein iPod oder keine Wiedergabeliste gewählt"
+
+#. Strings used several times
+#: ../src/ipod_init.c:48
+msgid "Select or enter your model"
+msgstr ""
+
+#: ../src/ipod_init.c:79 ../src/repository.c:546 ../src/repository.c:2369
+msgid "Select mountpoint"
+msgstr "iPod Einhängepunkt"
+
+#: ../src/ipod_init.c:359
+#, fuzzy, c-format
+msgid "Error initialising iPod: %s\n"
+msgstr "Fehler beim Schreiben in die Datei '%s'.\n"
+
+#: ../src/ipod_init.c:366
+msgid "Error initialising iPod, unknown error\n"
+msgstr ""
+
+#: ../src/ipod_init.c:422
+#, fuzzy, c-format
+msgid "<b>Please select your iPod model at </b><i>%s</i>"
+msgstr "<b>Bitte Einhängepunkt und iPod Modell wählen</b>"
+
+#: ../src/ipod_init.c:463
+msgid ""
+"Could not determine the model you selected -- this could be a bug or "
+"incompatibilty in the GTK+ or glade library.\n"
+"\n"
+msgstr ""
+
+#: ../src/misc.c:70
+#, fuzzy
+msgid ""
+"© 2002 - 2007\n"
+"Jorg Schuler (jcsjcs at users dot sourceforge dot net)\n"
+"Corey Donohoe (atmos at atmos dot org)\n"
+msgstr ""
+"(C) 2002 - 2005\n"
+"Jörg Schuler (jcsjcs at users dot sourceforge dot net)\n"
+"Corey Donohoe (atmos at atmos dot org)\n"
+"\n"
+"\n"
+
+#: ../src/misc.c:74
+#, fuzzy
+msgid ""
+"Patches were supplied by the following people (list may be incomplete -- "
+"please contact me)\n"
+msgstr ""
+"Berichtigungen und Ergänzungen wurden von folgenden Personen zur Verfügung "
+"gestellt (falls die Liste unvollständig ist, schreiben Sie mir bitte)\n"
+"\n"
+
+#: ../src/misc.c:75
+#, fuzzy
+msgid "Ramesh Dharan: Multi-Edit (edit tags of several tracks in one run)"
+msgstr "Ramesh Dharan: 'Multi-Edit' (Tags mehrerer Stücke auf einmal ändern)\n"
+
+#: ../src/misc.c:76
+#, fuzzy
+msgid "Hiroshi Kawashima: Japanese charset autodetection feature"
+msgstr "Hiroshi Kawashima: Automatische Erkennung japanischer Zeichensätze\n"
+
+#: ../src/misc.c:77
+#, fuzzy
+msgid "Adrian Ulrich: porting of playlist code from mktunes.pl to itunesdb.c"
+msgstr ""
+"Adrian Ulrich: Portierung des Wiedergabelisten-Codes von mktunes.pl nach "
+"itunesdb.c\n"
+
+#: ../src/misc.c:78
+#, fuzzy
+msgid ""
+"Walter Bell: correct handling of DND URIs with escaped characters and/or cr/"
+"newlines at the end"
+msgstr "Walter Bell: Korrekte Handhabung der kodierten DND URIs\n"
+
+#: ../src/misc.c:79
+#, fuzzy
+msgid "Sam Clegg: user defined filenames when exporting tracks from the iPod"
+msgstr ""
+"Sam Clegg: benutzerdefinierte Dateinamen beim Kopieren von Stücken vom iPod\n"
+
+#: ../src/misc.c:80
+#, fuzzy
+msgid "Chris Cutler: automatic creation of various playlist types"
+msgstr "Chris Cutler: automatische Erstellung diverser Wiedergabelisten\n"
+
+#: ../src/misc.c:81
+#, fuzzy
+msgid ""
+"Graeme Wilford: reading and writing of the 'Composer' ID3 tags, progress "
+"dialogue during sync"
+msgstr ""
+"Graeme Wilford: Lesen und Schreiben der 'Komponisten' ID3-Tags, "
+"Fortschrittsbalken während iTunesDB-Abgleich.\n"
+
+#: ../src/misc.c:82
+#, fuzzy
+msgid ""
+"Edward Matteucci: debugging, special playlist creation, most of the volume "
+"normalizing code"
+msgstr ""
+"Edward Matteucci: Debugging, diverse Wiedergabelistengenerierung, Hauptteil "
+"des Codes für Lautstärkenormalisierung\n"
+
+#: ../src/misc.c:83
+#, fuzzy
+msgid "Jens Lautenbach: some optical improvements"
+msgstr "Jens Lautenbach: optische Verbesserungen\n"
+
+#: ../src/misc.c:84
+#, fuzzy
+msgid "Alex Tribble: iPod eject patch"
+msgstr "Alex Tribble: Patch zum Auswurf des iPods\n"
+
+#: ../src/misc.c:85
+#, fuzzy
+msgid "Yaroslav Halchenko: Orphaned and dangling tracks handling"
+msgstr ""
+"Yaroslav Halchenko: Bearbeitung von verwaisten und verlorenen Stücken\n"
+
+#: ../src/misc.c:86
+#, fuzzy
+msgid ""
+"Andrew Huntwork: Filename case sensitivity fix and various other bugfixes"
+msgstr ""
+"Andrew Huntwork: Fix zur Groß-/Kleinschreibung von Dateinamen und "
+"verschiedene andere Korrekturen\n"
+
+#: ../src/misc.c:87
+#, fuzzy
+msgid ""
+"Ero Carrera: Filename validation and quick sync when copying tracks from the "
+"iPod"
+msgstr ""
+"Ero Carrera: Dateinamenverifizierung und Schnellabgleich beim Kopieren von "
+"Stücken vom iPod\n"
+
+#: ../src/misc.c:88
+#, fuzzy
+msgid "Jens Taprogge: Support for LAME's replay gain tag to normalize volume"
+msgstr ""
+"Jens Taprogge: Unterstützung für LAMEs Replay-Gain-Tag zur "
+"Lautstärkenormalisierung.\n"
+
+#: ../src/misc.c:89
+#, fuzzy
+msgid "Armando Atienza: Support with external playcounts"
+msgstr "Armando Atienza: Unterstützung bezüglich externer Playcounts\n"
+
+#: ../src/misc.c:90
+#, fuzzy
+msgid "D.L. Sharp: Support for m4b files (bookmarkable AAC files)"
+msgstr ""
+"D.L. Sharp: Unterstützung von m4b Dateien (AAC Dateien mit Bookmark-"
+"Funktion)\n"
+
+#: ../src/misc.c:91
+#, fuzzy
+msgid "Jim Hall: Decent INSTALL file"
+msgstr "Jim Hall: Ausführliche INSTALL Anleitung\n"
+
+#: ../src/misc.c:92
+#, fuzzy
+msgid ""
+"Juergen Helmers, Markus Gaugusch: Conversion scripts to sync calendar/"
+"contacts to the iPod"
+msgstr ""
+"Jürgen Helmers, Markus Gaugusch: Skripte zum Export des Terminkalenders und "
+"der Kontakte auf den iPod\n"
+
+#. J"urgen!
+#: ../src/misc.c:93
+#, fuzzy
+msgid "Flavio Stanchina: bugfixes"
+msgstr "Flavio Stanchina: Bugfixes\n"
+
+#: ../src/misc.c:94
+#, fuzzy
+msgid ""
+"Chris Micacchi: when sorting ignore 'the' and similar at the beginning of "
+"the title"
+msgstr ""
+"Chris Micacchi: beim Sortieren wird \"the\" und ähnliches am Beginn des "
+"Titels ignoriert\n"
+
+#: ../src/misc.c:95
+#, fuzzy
+msgid "Steve Jay: use statvfs() instead of df (better portability, faster)"
+msgstr ""
+"Steve Jay: Verwendung von statvfs() anstelle von df (bessere Portierung, "
+"schneller)\n"
+
+#: ../src/misc.c:97
+#, fuzzy
+msgid ""
+"Christoph Kunz: address compatibility issues when writing id3v2.4 type mp3 "
+"tags"
+msgstr ""
+"Christoph Kunz: Beiträge zur Kompatibilität wenn MP3-Tags als id3v2.4 "
+"geschrieben werden.\n"
+
+#: ../src/misc.c:99
+#, fuzzy
+msgid ""
+"James Liggett:\n"
+"replacement of old GTK file selection dialogs with new GTK filechooser "
+"dialogs\n"
+"refactored user preferences system."
+msgstr ""
+"James Ligget:\n"
+"     Ersetzen der alten GTK Dateidialoge durch die neuen GTK Filechooser-"
+"Dialoge.\n"
+
+#: ../src/misc.c:103
+#, fuzzy
+msgid "Daniel Kercher: sync scripts for abook and webcalendar"
+msgstr ""
+"Daniel Kercher: Synchronisationsskripte für 'abook' und 'webcalendar'\n"
+
+#: ../src/misc.c:105
+#, fuzzy
+msgid "Clinton Gormley: sync scripts for thunderbird"
+msgstr "Clinton Gormley: Snychronisationsskripte für 'tunderbird'\n"
+
+#: ../src/misc.c:107
+#, fuzzy
+msgid "Sebastien Beridot: sync script for ldif addressbook format"
+msgstr ""
+"Sebastien Beridot: Snychronisationsskripte für das ldif Adressbuchformat\n"
+
+#: ../src/misc.c:109
+#, fuzzy
+msgid "Sebastian Scherer: sync script for kNotes"
+msgstr "Sebastian Scherer: Synchronisationsskripte für 'kNotes'\n"
+
+#: ../src/misc.c:111
+#, fuzzy
+msgid "Nick Piper: sync script for Palm, type-ahead search"
+msgstr "Nick Piper: Synchronisationsskript für Palm, 'type-ahead' Suche\n"
+
+#: ../src/misc.c:113
+#, fuzzy
+msgid "Uwe Hermann: help with support for iPod Video"
+msgstr "Uwe Hermann: Hilfe bei der iPod Video Unterstützung\n"
+
+#: ../src/misc.c:115
+#, fuzzy
+msgid ""
+"Iain Benson: support for compilation tag in mp3 files and separate display "
+"of compilations in the sort tab."
+msgstr ""
+"Iain Benson: Unterstützung für Sampler-Tags in mp3 Dateien und Darstellung "
+"der Sampler in den Filter-Tabs.\n"
+
+#: ../src/misc.c:116
+#, fuzzy
+msgid ""
+"Nicolas Chariot: icons of buttons\n"
+"\n"
+msgstr ""
+"Nicolas Chariot: Icons für Knöpfe\n"
+"\n"
+"\n"
+
+#: ../src/misc.c:118
+#, fuzzy
+msgid "This program borrows code from the following projects:"
+msgstr "Dieses Programm verwendet Code der folgenden Projekte:\n"
+
+#: ../src/misc.c:119
+#, fuzzy
+msgid ""
+"gnutools: (mktunes.pl, ported to C) reading and writing of iTunesDB  (http://"
+"www.gnu.org/software/gnupod/)"
+msgstr ""
+"    gnutools: (mktunes.pl, nach C portiert) Schreiben und Lesen der iTunesDB "
+"(http://www.gnu.org/software/gnupod/)\n"
+
+#: ../src/misc.c:120
+#, fuzzy
+msgid ""
+"iPod.cpp, iPod.h by Samuel Wood (sam dot wood at gmail dot com): some code "
+"for smart playlists is based on his C++-classes."
+msgstr ""
+"    iPod.cpp, iPod.h von Samuel Wood (sam dot wood at gmail dot com): "
+"einiger Code für intelligente Wiedergabelisten basiert auf seinen C++-"
+"Klassen.\n"
+
+#: ../src/misc.c:121
+#, fuzzy
+msgid "mp3info: mp3 playlength detection (http://ibiblio.org/mp3info/)"
+msgstr "    mp3info:  MP3-Spielzeit-Ermittlung (http://ibiblio.org/mp3info/)\n"
+
+#: ../src/misc.c:122
+#, fuzzy
+msgid "xmms: dirbrowser, mp3 playlength detection (http://www.xmms.org)"
+msgstr ""
+"xmms:     Verzeichnisbaum-Anzeige, MP3-Spielzeit-Ermittlung (http://www.xmms."
+"org)\n"
+
+#: ../src/misc.c:124
+#, fuzzy
+msgid "The GUI was created with the help of glade-2 (http://glade.gnome.org/)."
+msgstr ""
+"Die graphische Benutzeroberfläche wurde mit Hilfe von glade-2 (http://glade."
+"gnome.org/) erstellt.\n"
+
+#: ../src/misc.c:128
+#, fuzzy
+msgid "French: David Le Brun (david at dyn-ns dot net)"
+msgstr "Französisch: David Le Brun (david at dyn-ns dot net)\n"
+
+#: ../src/misc.c:129
+msgid "French: Éric Lassauge (rpmfarm at free dot fr)"
+msgstr ""
+
+#: ../src/misc.c:130
+#, fuzzy
+msgid "German: Jorg Schuler (jcsjcs at users dot sourceforge dot net)"
+msgstr "Deutsch:     Jörg Schuler (jcsjcs at users dot sourceforge dot net)\n"
+
+#: ../src/misc.c:131
+msgid "German: Kai-Ove"
+msgstr ""
+
+#: ../src/misc.c:132
+#, fuzzy
+msgid "Hebrew: Assaf Gillat (gillata at gmail dot com)"
+msgstr "Hebräisch: Assaf Gillat (gillata at gmail dot com)\n"
+
+#: ../src/misc.c:133
+#, fuzzy
+msgid ""
+"Italian: Edward Matteucci (edward_matteucc at users dot sourceforge dot net)"
+msgstr ""
+"Italienisch: Edward Matteucci (edward_matteucc at users dot sourceforge dot "
+"net\n"
+
+#: ../src/misc.c:134
+msgid "Italian: Daniele Forsi (dforsi at gmail dot com)"
+msgstr ""
+
+#: ../src/misc.c:135
+#, fuzzy
+msgid "Japanese: Ayako Sano"
+msgstr "Japanisch:   Ayako Sano\n"
+
+#: ../src/misc.c:136
+#, fuzzy
+msgid "Japanese: Kentaro Fukuchi (fukuchi at users dot sourceforge dot net)"
+msgstr ""
+"Japanisch:   Kentaro Fukuchi (fukuchi at users dot sourceforge dot net)\n"
+
+#: ../src/misc.c:137
+msgid "Romanian: Alex Eftimie (alexeftimie at gmail dot com)"
+msgstr ""
+
+#: ../src/misc.c:138
+msgid "Spanish: Alejandro Lamas Daviña (alejandro.lamas at ific dot uv dot es)"
+msgstr ""
+
+#: ../src/misc.c:139
+#, fuzzy
+msgid "Swedish: Stefan Asserhall (stefan.asserhall at comhem dot se)"
+msgstr "Schwedisch: Stefan Asserhall (stefan asserhall at comhem dot se)\n"
+
+#: ../src/misc.c:144
+#, fuzzy
+msgid ""
+"This program is free software; you can redistribute it and/or\n"
+"modify it under the terms of the GNU General Public License as\n"
+"published by the Free Software Foundation; either version 2 of the\n"
+"License, or (at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful, but\n"
+"WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See\n"
+"the GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public\n"
+"License along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA\n"
+"02111-1307, USA."
+msgstr ""
+"Dieses Programm ist freie Software. Sie können es unter den Bedingungen der "
+"GNU General Public License, wie von der Free Software Foundation "
+"veröffentlicht, weitergeben und/oder modifizieren, entweder gemäß Version 2 "
+"der Lizenz oder (nach Ihrer Option) jeder späteren Version.\n"
+"\n"
+"Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, dass es Ihnen "
+"von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, sogar ohne die "
+"implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN "
+"BESTIMMTEN ZWECK. Details finden Sie in der GNU General Public License.\n"
+"\n"
+"Sie sollten eine Kopie der GNU General Public License zusammen mit diesem "
+"Programm erhalten haben. Falls nicht, schreiben Sie an die Free Software "
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"\n"
+
+#: ../src/misc.c:159
+#, fuzzy
+msgid ""
+"© 2002-2007\n"
+"Jorg Schuler <jcsjcs at users.sourceforge.net>\n"
+"Corey Donohoe <atmos at atmos.org>"
+msgstr ""
+"(C) 2002 - 2005\n"
+"Jörg Schuler (jcsjcs at users dot sourceforge dot net)\n"
+"Corey Donohoe (atmos at atmos dot org)\n"
+"\n"
+"\n"
+
+#: ../src/misc.c:167
+#, fuzzy
+msgid "Cross-platform multilingual interface to Apple's iPod™"
+msgstr ""
+"gtkpod Version %s: Plattformübergreifendes internationalisiertes Programm "
+"für Apples iPod(TM)."
+
+#: ../src/misc.c:934
+#, c-format
+msgid "Could not process '%s' (no filename available)"
+msgstr "Kann nicht fortfahren '%s' (kein Dateiname verfügbar)"
+
+#: ../src/misc.c:1088
+#, c-format
+msgid "Unknown token '%%%c' in template '%s'"
+msgstr "Unbekanntes Merkmal '%%%c' in der Schablone '%s'"
+
+#: ../src/misc.c:1171
+#, c-format
+msgid "Template ('%s') does not match file type '%s'\n"
+msgstr "Schablone ('%s') passt nicht auf den Dateinamen '%s'\n"
+
+#: ../src/misc.c:1257
+#, c-format
+msgid "Error creating %s: %s\n"
+msgstr "Fehler beim Erstellen von '%s': %s\n"
+
+#: ../src/misc.c:1691
+#, fuzzy, c-format
+msgid ""
+"Writing preferences file '%s' failed (%s).\n"
+"\n"
+msgstr ""
+"Die Ausführung von '%s' schlug fehl.\n"
+"\n"
+
+#: ../src/misc.c:1693
+msgid "unspecified error"
+msgstr ""
+
+#: ../src/misc.c:1701
+#, c-format
+msgid ""
+"Writing preferences to the iPod (%s) failed: could not get path to Control "
+"Directory.\n"
+"\n"
+msgstr ""
+
+#. title
+#: ../src/misc_confirm.c:71
+#, fuzzy
+msgid "The following has occurred:"
+msgstr "Folgendes ist passiert:"
+
+#: ../src/misc_confirm.c:122
+msgid ""
+"Are you sure you want to delete the following track completely from your "
+"iPod? The number of playlists this track is a member of is indicated in "
+"parentheses."
+msgid_plural ""
+"Are you sure you want to delete the following tracks completely from your "
+"iPod? The number of playlists the tracks are member of is indicated in "
+"parentheses."
+msgstr[0] ""
+"Sind Sie sicher, dass Sie das folgende Stück vollständig vom iPod entfernen "
+"wollen? Die Anzahl der Wiedergabelisten, in denen das Stück geführt wird, "
+"ist in Klammern angegeben."
+msgstr[1] ""
+"Sind Sie sicher, dass Sie die folgenden Stücke vollständig vom iPod "
+"entfernen wollen? Die Anzahl der Wiedergabelisten, in denen die Stücke "
+"jeweils geführt werden, ist in Klammern angegeben."
+
+#: ../src/misc_confirm.c:126
+msgid "Delete Track Completely from iPod?"
+msgid_plural "Delete Tracks Completely from iPod?"
+msgstr[0] "Soll das Stück vollständig vom iPod entfernt werden?"
+msgstr[1] "Sollen die Stücke vollständig vom iPod entfernt werden?"
+
+#: ../src/misc_confirm.c:137 ../src/misc_confirm.c:178
+#, c-format
+msgid ""
+"Are you sure you want to remove the following track from the playlist \"%s\"?"
+msgid_plural ""
+"Are you sure you want to remove the following tracks from the playlist \"%s"
+"\"?"
+msgstr[0] ""
+"Sind Sie sicher, dass Sie das folgende Stück aus der Wiedergabeliste \"%s\" "
+"entfernen wollen?"
+msgstr[1] ""
+"Sind Sie sicher, dass Sie die folgenden Stücke aus der Wiedergabeliste \"%s"
+"\" entfernen wollen?"
+
+#: ../src/misc_confirm.c:141 ../src/misc_confirm.c:182
+msgid "Remove Track From Playlist?"
+msgid_plural "Remove Tracks From Playlist?"
+msgstr[0] "Stück aus der Wiedergabeliste entfernen?"
+msgstr[1] "Stücke aus der Wiedergabeliste entfernen?"
+
+#: ../src/misc_confirm.c:163
+msgid ""
+"Are you sure you want to delete the following track completely from your "
+"harddisk? The number of playlists this track is a member of is indicated in "
+"parentheses."
+msgid_plural ""
+"Are you sure you want to delete the following tracks completely from your "
+"harddisk? The number of playlists the tracks are member of is indicated in "
+"parentheses."
+msgstr[0] ""
+"Sind Sie sicher, dass Sie das folgende Stück vollständig von Ihrer "
+"Festplatte entfernen wollen? Die Anzahl der Wiedergabelisten, in denen das "
+"Stück geführt wird, ist in Klammern angegeben."
+msgstr[1] ""
+"Sind Sie sicher, dass Sie die folgenden Stücke vollständig von Ihrer "
+"Festplatte entfernen wollen? Die Anzahl der Wiedergabelisten, in denen die "
+"Stücke jeweils geführt werden, ist in Klammern angegeben."
+
+#: ../src/misc_confirm.c:167
+msgid "Delete Track from Harddisk?"
+msgid_plural "Delete Tracks from Harddisk?"
+msgstr[0] "Stück von der Festplatte löschen?"
+msgstr[1] "Stücke von der Festplatte löschen?"
+
+#: ../src/misc_confirm.c:192
+msgid ""
+"Are you sure you want to remove the following track completely from your "
+"local database? The number of playlists this track is a member of is "
+"indicated in parentheses."
+msgid_plural ""
+"Are you sure you want to remove the following tracks completely from your "
+"local database? The number of playlists the tracks are member of is "
+"indicated in parentheses."
+msgstr[0] ""
+"Sind Sie sicher, dass Sie das folgende Stück vollständig aus der lokalen "
+"Datenbank entfernen wollen? Die Anzahl der Wiedergabelisten, in denen das "
+"Stück geführt wird, ist in Klammern angegeben."
+msgstr[1] ""
+"Sind Sie sicher, dass Sie die folgenden Stücke vollständig aus Ihrer lokalen "
+"Datenbank entfernen wollen? Die Anzahl der Wiedergabelisten, in denen die "
+"Stücke jeweils geführt werden, ist in Klammern angegeben."
+
+#: ../src/misc_confirm.c:196
+msgid "Remove Track from Local Database?"
+msgid_plural "Remove Tracks from Local Database?"
+msgstr[0] "Stück aus der lokalen Datenbank löschen?"
+msgstr[1] "Stücke aus der lokalen Datenbank löschen?"
+
+#: ../src/misc_confirm.c:261
+#, c-format
+msgid "Deleted one track completely from iPod"
+msgid_plural "Deleted %d tracks completely from iPod"
+msgstr[0] "Ein Stück wurde komplett vom iPod entfernt."
+msgstr[1] "%d Stücke wurden komplett vom iPod entfernt."
+
+#: ../src/misc_confirm.c:267 ../src/misc_confirm.c:291
+#, c-format
+msgid "Deleted %d track from playlist '%s'"
+msgid_plural "Deleted %d tracks from playlist '%s'"
+msgstr[0] "%d Stück wurde aus der Wiedergabeliste '%s' entfernt."
+msgstr[1] "%d Stücke wurden aus der Wiedergabeliste '%s' entfernt."
+
+#: ../src/misc_confirm.c:285
+#, c-format
+msgid "Deleted one track from harddisk"
+msgid_plural "Deleted %d tracks from harddisk"
+msgstr[0] "Ein Stück wurde von Ihrer Festplatte gelöscht."
+msgstr[1] "%d Stücke wurden von Ihrer Festplatte gelöscht."
+
+#: ../src/misc_confirm.c:297
+#, c-format
+msgid "Deleted track from local database"
+msgid_plural "Deleted %d tracks from local database"
+msgstr[0] "Ein Stück wurde aus der lokalen Datenbank entfernt"
+msgstr[1] "%d Stücke wurden aus der lokalen Datenbank entfernt"
+
+#: ../src/misc_confirm.c:442
+msgid "Cannot remove entry 'All'"
+msgstr "Der Eintrag 'Alle' kann nicht entfernt werden"
+
+#: ../src/misc_confirm.c:536
+#, c-format
+msgid "Removed all %d tracks from the iPod"
+msgstr "Alle %d Stücke wurden vom iPod entfernt"
+
+#: ../src/misc_confirm.c:541
+#, c-format
+msgid "Removed all podcasts from the iPod"
+msgstr "Alle Podcasts wurden vom iPod entfernt"
+
+#: ../src/misc_confirm.c:550 ../src/misc_confirm.c:624
+#, c-format
+msgid "Deleted playlist '%s' including %d member track"
+msgid_plural "Deleted playlist '%s' including %d member tracks"
+msgstr[0] "Wiedergabeliste '%s' einschließlich eines Stückes gelöscht"
+msgstr[1] "Wiedergabeliste '%s' einschließlich %d Stücken entfernt"
+
+#. first use playlist name
+#: ../src/misc_confirm.c:566 ../src/misc_confirm.c:640
+#, c-format
+msgid "Deleted playlist '%s'"
+msgstr "Wiedergabeliste '%s' gelöscht."
+
+#: ../src/misc_confirm.c:600
+#, c-format
+msgid "Deleted playlist '%s' including %d member track on harddisk"
+msgid_plural "Deleted playlist '%s' including %d member tracks on harddisk"
+msgstr[0] ""
+"Wiedergabeliste '%s' wurde einschließlich eines Stückes von der Festplatte "
+"gelöscht"
+msgstr[1] ""
+"Wiedergabeliste '%s' wurde einschließlich %d Stücken von der Festplatte "
+"gelöscht"
+
+#: ../src/misc_confirm.c:617
+#, c-format
+msgid "Removed all %d tracks from the database"
+msgstr "Alle %d Stücke wurden aus der Datenbank entfernt"
+
+#: ../src/misc_confirm.c:695
+#, c-format
+msgid "Are you sure you want to remove all tracks from your iPod?"
+msgstr "Sind Sie sicher, dass Sie alle Stücke vom iPod entfernen wollen?"
+
+#: ../src/misc_confirm.c:700
+#, c-format
+msgid "Are you sure you want to remove all podcasts from your iPod?"
+msgstr "Sind Sie sicher, dass sie alle Podcasts vom iPod entfernen wollen?"
+
+#: ../src/misc_confirm.c:708
+#, fuzzy, c-format
+msgid ""
+"Are you sure you want to delete playlist '%s' and the following track "
+"completely from your iPod? The number of playlists this track is a member of "
+"is indicated in parentheses."
+msgid_plural ""
+"Are you sure you want to delete playlist '%s' and the following tracks "
+"completely from your iPod? The number of playlists the tracks are member of "
+"is indicated in parentheses."
+msgstr[0] ""
+"Sind Sie sicher, dass Sie die Wiedergabeliste '%s' und das folgende Stück "
+"vollständig vom iPod entfernen wollen? Die Anzahl der Wiedergabelisten, in "
+"denen das Stück geführt wird, ist in Klammern angegeben."
+msgstr[1] ""
+"Sind Sie sicher, dass Sie die die Wiedergabeliste '%s' und die folgenden "
+"Stücke vollständig vom iPod entfernen wollen? Die Anzahl der "
+"Wiedergabelisten, in denen die Stücke jeweils geführt werden, ist in "
+"Klammern angegeben."
+
+#: ../src/misc_confirm.c:719 ../src/misc_confirm.c:774
+#, c-format
+msgid "Are you sure you want to delete the playlist '%s'?"
+msgstr "Sind Sie sicher, dass Sie die Wiedergabeliste \"%s\" entfernen wollen?"
+
+#: ../src/misc_confirm.c:745
+#, c-format
+msgid ""
+"Are you sure you want to delete playlist '%s' and remove the following track "
+"from your harddisk? The number of playlists this track is a member of is "
+"indicated in parentheses."
+msgid_plural ""
+"Are you sure you want to delete playlist '%s' and remove the following "
+"tracks from your harddisk? The number of playlists the tracks are member of "
+"is indicated in parentheses."
+msgstr[0] ""
+"Sind Sie sicher, dass Sie die Wiedergabeliste '%s' und das folgende Stück "
+"von Ihrer Festplatte entfernen wollen? Die Anzahl der Wiedergabelisten, in "
+"denen das Stück geführt wird, ist in Klammern angegeben."
+msgstr[1] ""
+"Sind Sie sicher, dass Sie die die Wiedergabeliste '%s' und die folgenden "
+"Stücke vollständig von Ihrer Festplatte entfernen wollen? Die Anzahl der "
+"Wiedergabelisten, in denen die Stücke jeweils geführt werden, ist in "
+"Klammern angegeben."
+
+#: ../src/misc_confirm.c:753
+#, c-format
+msgid "Are you sure you want to remove all tracks from the database?"
+msgstr ""
+"Sind Sie sicher, dass Sie alle Stücke von der Datenbank entfernen wollen?"
+
+#: ../src/misc_confirm.c:762
+#, c-format
+msgid ""
+"Are you sure you want to delete playlist '%s' and remove the following track "
+"from the database? The number of playlists this track is a member of is "
+"indicated in parentheses."
+msgid_plural ""
+"Are you sure you want to delete playlist '%s' and remove the following "
+"tracks from the database? The number of playlists the tracks are member of "
+"is indicated in parentheses."
+msgstr[0] ""
+"Sind Sie sicher, dass Sie die Wiedergabeliste '%s' und das folgende Stück "
+"aus der Datenbank entfernen wollen? Die Anzahl der Wiedergabelisten, in "
+"denen das Stück geführt wird, ist in Klammern angegeben."
+msgstr[1] ""
+"Sind Sie sicher, dass Sie die die Wiedergabeliste '%s' und die folgenden "
+"Stücke aus der Datenbank entfernen wollen? Die Anzahl der Wiedergabelisten, "
+"in denen die Stücke jeweils geführt werden, ist in Klammern angegeben."
+
+#: ../src/misc_confirm.c:841
+msgid ""
+"Data has been changed and not been saved.\n"
+"OK to exit gtkpod?"
+msgstr ""
+"Änderungen wurden noch nicht gespeichert.\n"
+"Wollen Sie gtkpod trotzdem beenden?"
+
+#: ../src/misc_conversion.c:66
+msgid "File type"
+msgstr "Dateityp"
+
+#: ../src/misc_conversion.c:67
+msgid "PC File"
+msgstr "PC Datei"
+
+#: ../src/misc_conversion.c:68
+msgid "iPod File"
+msgstr "iPod Datei"
+
+#: ../src/misc_conversion.c:69
+msgid "iPod ID"
+msgstr "iPod ID"
+
+#. 10
+#: ../src/misc_conversion.c:70
+msgid "Track Nr (#)"
+msgstr "Stück Nr (#)"
+
+#: ../src/misc_conversion.c:71
+msgid "Transferred"
+msgstr "Übertragen"
+
+#: ../src/misc_conversion.c:72
+msgid "File Size"
+msgstr "Dateigröße"
+
+#: ../src/misc_conversion.c:73
+msgid "Play Time"
+msgstr "Spielzeit"
+
+#. 20
+#: ../src/misc_conversion.c:80
+msgid "Date played"
+msgstr "Zuletzt gespielt"
+
+#: ../src/misc_conversion.c:82
+msgid "Volume"
+msgstr "Lautstärke"
+
+#: ../src/misc_conversion.c:83
+msgid "Soundcheck"
+msgstr "Soundcheck"
+
+#. 25
+#: ../src/misc_conversion.c:85
+msgid "CD Nr"
+msgstr "CD Nr."
+
+#: ../src/misc_conversion.c:88
+msgid "Category"
+msgstr "Kategorie"
+
+#: ../src/misc_conversion.c:89
+msgid "Description"
+msgstr "Beschreibung"
+
+#. 30
+#: ../src/misc_conversion.c:90
+msgid "Podcast URL"
+msgstr "Podcast-URL"
+
+#: ../src/misc_conversion.c:91
+msgid "Podcast RSS"
+msgstr "Podcast RSS"
+
+#: ../src/misc_conversion.c:92
+msgid "Subtitle"
+msgstr "Untertitel"
+
+#: ../src/misc_conversion.c:93
+msgid "Date released"
+msgstr "Veröffentlichungsdatum"
+
+#: ../src/misc_conversion.c:94
+msgid "Checked"
+msgstr "Ausgewählt"
+
+#. 35
+#: ../src/misc_conversion.c:95
+msgid "Start time"
+msgstr "Start"
+
+#: ../src/misc_conversion.c:96
+#, fuzzy
+msgid "Stop time"
+msgstr "Stopp"
+
+#: ../src/misc_conversion.c:97
+msgid "Remember Playback Position"
+msgstr "Wiedergabe-Position merken"
+
+#: ../src/misc_conversion.c:98
+msgid "Skip when Shuffling"
+msgstr "Beim Shuffling überspringen"
+
+#: ../src/misc_conversion.c:99
+msgid "Artwork Path"
+msgstr "Pfad zu Bilddateien"
+
+#. 40
+#: ../src/misc_conversion.c:100
+msgid "Media Type"
+msgstr ""
+
+#: ../src/misc_conversion.c:102
+msgid "TV Episode"
+msgstr ""
+
+#: ../src/misc_conversion.c:103
+msgid "TV Network"
+msgstr ""
+
+#: ../src/misc_conversion.c:104
+msgid "Season Nr"
+msgstr ""
+
+#. 45
+#: ../src/misc_conversion.c:105
+msgid "Episode Nr"
+msgstr ""
+
+#: ../src/misc_conversion.c:106
+#, fuzzy
+msgid "Album Artist"
+msgstr "Künstler"
+
+#: ../src/misc_conversion.c:107
+#, fuzzy
+msgid "Sort Artist"
+msgstr "Künstler"
+
+#: ../src/misc_conversion.c:108
+#, fuzzy
+msgid "Sort Title"
+msgstr "Untertitel"
+
+#: ../src/misc_conversion.c:109
+#, fuzzy
+msgid "Sort Album"
+msgstr "Album"
+
+#. 50
+#: ../src/misc_conversion.c:110
+#, fuzzy
+msgid "Sort Album Artist"
+msgstr "Künstler"
+
+#: ../src/misc_conversion.c:111
+#, fuzzy
+msgid "Sort Composer"
+msgstr "Komponist"
+
+#: ../src/misc_conversion.c:112
+msgid "Sort TV Show"
+msgstr ""
+
+#: ../src/misc_conversion.c:113
+msgid "Gapless Track Flag"
+msgstr ""
+
+#: ../src/misc_conversion.c:126
+msgid "Name of file on PC, if available"
+msgstr "Dateiname auf dem PC, falls verfügbar"
+
+#: ../src/misc_conversion.c:127
+msgid "Name of file on the iPod"
+msgstr "Name der Datei auf dem iPod"
+
+#. 10
+#: ../src/misc_conversion.c:129
+msgid "Track Nr. and total number of tracks on CD"
+msgstr "Stück-Nr. und Gesamtzahl der Stücke auf der CD"
+
+#: ../src/misc_conversion.c:130
+msgid "Whether the file has already been transferred to the iPod or not"
+msgstr "Ungeachtet, ob die Datei bereits zum iPod übertragen wurde oder nicht."
+
+#: ../src/misc_conversion.c:136
+msgid "Beats per minute"
+msgstr ""
+
+#: ../src/misc_conversion.c:137
+msgid "Number of times the track has been played"
+msgstr "Wie oft dieses Stück bereits gespielt wurde"
+
+#: ../src/misc_conversion.c:138
+msgid "Star rating from 0 to 5"
+msgstr "Bewertung mit 0 bis 5 Sternen"
+
+#: ../src/misc_conversion.c:139
+msgid "Date and time track has been added"
+msgstr "Zeitpunkt zu dem das Stück hinzugefügt wurde"
+
+#. 20
+#: ../src/misc_conversion.c:140
+msgid "Date and time track has last been played"
+msgstr "Zeitpunkt des letzten Abspielens des Stücks"
+
+#: ../src/misc_conversion.c:141
+msgid "Date and time track has last been modified"
+msgstr "Zeitpunkt der letzten Modifikation des Stücks"
+
+#: ../src/misc_conversion.c:142
+msgid "Manual volume adjust"
+msgstr "Manuelle Lautstärkeanpassung"
+
+#: ../src/misc_conversion.c:143
+msgid ""
+"Volume adjust in dB (replay gain) -- you need to activate 'soundcheck' on "
+"the iPod"
+msgstr ""
+"Lautstärkeanpassung in dB (replay gain) -- 'Soundcheck' muss auf dem iPod "
+"aktiviert sein"
+
+#. 25
+#: ../src/misc_conversion.c:146
+msgid "CD Nr. and total number of CDS in set"
+msgstr "CD-Nummer und Gesamtzahl der CDs im Set"
+
+#: ../src/misc_conversion.c:149
+msgid ""
+"The category (e.g. 'Technology' or 'Music') where the podcast was located."
+msgstr ""
+"Die Kategorie (z.B. 'Technologie' oder 'Musik') in die das Podcast "
+"eingeordnet war."
+
+#: ../src/misc_conversion.c:150
+msgid "Accessible by selecting the center button on the iPod."
+msgstr "Wird angezeigt, wenn der mittlere Knopf auf dem iPod gedrückt wird."
+
+#: ../src/misc_conversion.c:154
+msgid "Release date (for podcasts displayed next to the title on the iPod)"
+msgstr ""
+"Veröffentlichungsdatum (wird bei Podcasts auf dem iPod neben dem Titel "
+"angezeigt)"
+
+#. 50
+#: ../src/misc_conversion.c:168 ../src/misc_conversion.c:169
+#: ../src/misc_conversion.c:170 ../src/misc_conversion.c:171
+#: ../src/misc_conversion.c:172 ../src/misc_conversion.c:173
+#, fuzzy
+msgid "Used for sorting on the iPod"
+msgstr "Name der Datei auf dem iPod"
+
+#: ../src/misc_conversion.c:735
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the file scheme"
+msgstr "Der URI »%s« ist kein absoluter URI, der das Dateischema verwendet"
+
+#: ../src/misc_conversion.c:745
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "Die lokale URI Datei »%s« darf kein »#« enthalten"
+
+#: ../src/misc_conversion.c:762
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "Der URI »%s« ist ungültig"
+
+#: ../src/misc_conversion.c:774
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Der Rechnername der URI »%s« ist ungültig"
+
+#: ../src/misc_conversion.c:790
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "Der URI »%s« enthält ungültige Escape-Zeichen"
+
+#: ../src/misc_playlist.c:67 ../src/misc_playlist.c:94
+#: ../src/misc_playlist.c:429
+msgid "Please enter a name for the new playlist"
+msgstr "Bitte geben Sie einen Namen für die neue Wiedergabeliste ein"
+
+#: ../src/misc_playlist.c:154
+msgid "AR:"
+msgstr "Kü:"
+
+#: ../src/misc_playlist.c:157
+msgid "AL:"
+msgstr "Al:"
+
+#: ../src/misc_playlist.c:160
+msgid "GE:"
+msgstr "Ge:"
+
+#: ../src/misc_playlist.c:163
+msgid "CO:"
+msgstr "Ko:"
+
+#: ../src/misc_playlist.c:166
+msgid "YE:"
+msgstr "Ja:"
+
+#: ../src/misc_playlist.c:194
+msgid "Unknown"
+msgstr "Unbekannt"
+
+#: ../src/misc_playlist.c:272
+#, c-format
+msgid "Random (%d)"
+msgstr "Zufällig (%d)"
+
+#: ../src/misc_playlist.c:297
+msgid ""
+"Auto Store of track view disabled.\n"
+"\n"
+msgstr ""
+"Autom. Speichern der angezeigten Stücke ausgeschaltet.\n"
+"\n"
+
+#: ../src/misc_playlist.c:356
+msgid "Not Listed"
+msgstr "Nicht eingetragen"
+
+#: ../src/misc_playlist.c:406
+#, c-format
+msgid "Created playlist '%s' with %d track."
+msgid_plural "Created playlist '%s' with %d tracks."
+msgstr[0] "Wiedergabeliste '%s' mit einem Stück erstellt."
+msgstr[1] "Wiedergabeliste '%s' mit %d Stücken erstellt."
+
+#. n==0
+#: ../src/misc_playlist.c:417
+msgid "No tracks available, playlist not created"
+msgstr ""
+"Keine passenden Stücke vorhanden -- Wiedergabeliste wurde nicht erstellt."
+
+#: ../src/misc_playlist.c:543
+#, c-format
+msgid "Most Listened (%d)"
+msgstr "Häufig (%d)"
+
+#: ../src/misc_playlist.c:584
+#, c-format
+msgid "Never Listened"
+msgstr "Nie gehört"
+
+#: ../src/misc_playlist.c:624
+#, c-format
+msgid "Best Rated (%d)"
+msgstr "Am besten bewertet (%d)"
+
+#: ../src/misc_playlist.c:666
+msgid "Unrated tracks"
+msgstr "Unbewertet"
+
+#: ../src/misc_playlist.c:671
+#, c-format
+msgid "Rated %d"
+msgstr "Bewertet (%d)"
+
+#: ../src/misc_playlist.c:714
+#, c-format
+msgid "Recent (%d)"
+msgstr "Kürzlich (%d)"
+
+#: ../src/misc_playlist.c:753
+msgid "Last Time"
+msgstr "Zuletzt"
+
+#: ../src/misc_playlist.c:844
+msgid "Removal of dangling tracks with no files on PC was canceled."
+msgstr ""
+"Das Entfernen von verlorenen Stücken ohne entsprechende Datei auf dem "
+"Computer wurde abgebrochen."
+
+#: ../src/misc_playlist.c:854
+msgid "Handling of dangling tracks with files on PC was canceled."
+msgstr ""
+"Das Bearbeiten von verlorenen Stücken, deren zugehörige Datei auf dem "
+"Computer vorhanden ist, wurde abgebrochen."
+
+#: ../src/misc_playlist.c:882
+msgid "Dangling tracks with no files on PC were removed."
+msgstr ""
+"Verlorene Stücke ohne entsprechende Datei auf dem Computer wurden entfernt."
+
+#: ../src/misc_playlist.c:943
+msgid "Dangling tracks with files on PC were handled."
+msgstr ""
+"Verlorene Stücke mit zugehöriger Datei auf dem Computer wurden korrigiert."
+
+#: ../src/misc_playlist.c:976
+msgid "Track"
+msgstr "Stück"
+
+#: ../src/misc_playlist.c:1019
+msgid ""
+"You did not import the existing iTunesDB. This is most likely incorrect and "
+"will result in the loss of the existing database.\n"
+"\n"
+"Press 'OK' if you want to proceed anyhow or 'Cancel' to abort. If you "
+"cancel, you can import the existing database before calling this function "
+"again.\n"
+msgstr ""
+"Sie haben die bereits bestehende iTunesDB nicht eingelesen. Dies ist "
+"wahrscheinlich nicht was Sie beabsichtigen, da auf diese Weise die "
+"existierende Datenbank verloren geht.\n"
+"\n"
+"Klicken Sie auf 'OK', wenn Sie trotzdem fortfahren wollen, oder auf "
+"'Abbrechen', um abzubrechen. Wenn Sie den Vorgang abbrechen, können Sie die "
+"existierende Datenbank einlesen, bevor Sie erneut abgleichen.\n"
+
+#: ../src/misc_playlist.c:1033
+msgid "Creating a tree of known files"
+msgstr "Erstelle eine Liste der vorhandenen Dateien"
+
+#: ../src/misc_playlist.c:1077
+msgid "Checking iPOD files against known files in DB"
+msgstr "Vergleiche Dateien auf dem iPod mit der iTunesDB"
+
+#: ../src/misc_playlist.c:1120
+msgid "Orphaned"
+msgstr "Verwaist"
+
+#: ../src/misc_playlist.c:1147
+#, c-format
+msgid ""
+"The following orphaned file had already been added to the iPod again. It "
+"will be removed with the next sync:\n"
+"%s\n"
+"\n"
+msgstr ""
+"Die folgende verwaiste Datei wurde bereits wieder zum iPod hinzugefügt. Sie "
+"wird beim nächsten Abgleich gelöscht:\n"
+"%s\n"
+"\n"
+
+#: ../src/misc_playlist.c:1175
+#, c-format
+msgid "Found %d orphaned and %d dangling files. Processing..."
+msgstr "'%d' verwaiste und '%d' verlorene Dateien gefunden. Bearbeite..."
+
+#: ../src/misc_playlist.c:1199
+#, c-format
+msgid ""
+"The following dangling track has a file on PC.\n"
+"Press OK to have them transfered from the file on next Sync, CANCEL to leave "
+"it as is."
+msgid_plural ""
+"The following %d dangling tracks have files on PC.\n"
+"Press OK to have them transfered from the files on next Sync, CANCEL to "
+"leave them as is."
+msgstr[0] ""
+"Das folgende verlorene Stück ist noch auf dem PC vorhanden.\n"
+"Klicken Sie auf OK, um es beim nächsten Abgleich zu übertragen oder auf "
+"'Abbrechen' um nichts zu tun."
+msgstr[1] ""
+"Die folgenden %d verlorenen Stücke sind noch auf dem PC vorhanden.\n"
+"Klicken Sie auf OK, um sie beim nächsten Abgleich zu übertragen oder auf "
+"'Abbrechen' um nichts zu tun."
+
+#: ../src/misc_playlist.c:1204
+#, c-format
+msgid ""
+"The following dangling track doesn't have file on PC. \n"
+"Press OK to remove it, CANCEL to leave it as is."
+msgid_plural ""
+"The following %d dangling tracks do not have files on PC. \n"
+"Press OK to remove them, CANCEL to leave them. as is"
+msgstr[0] ""
+"Das folgende verlorene Stück ist auch auf dem PC nicht mehr vorhanden.\n"
+"Klicken Sie auf OK, um das Stück zu löschen oder auf 'Abbrechen' um nichts "
+"zu tun."
+msgstr[1] ""
+"Die folgenden %d Stücke sind auch auf dem PC nicht mehr vorhanden.\n"
+"Klicken Sie auf OK, um die Stücke zu löschen, oder auf 'Abbrechen' um nichts "
+"zu tun."
+
+#. we want unique window for each
+#. gboolean modal,
+#: ../src/misc_playlist.c:1211
+msgid "Dangling Tracks"
+msgstr "Verlorene Stücke"
+
+#: ../src/misc_playlist.c:1234
+#, c-format
+msgid "Found %d orphaned and %d dangling files. Done."
+msgstr "'%d' verwaiste und '%d' verlorene Dateien gefunden. Fertig."
+
+#. update for count == 1, 21, 41 ... and for count == n
+#: ../src/misc_track.c:89
+#, c-format
+msgid "Hashed %d of %d track."
+msgid_plural "Hashed %d of %d tracks."
+msgstr[0] "%d von insgesamt %d Stück indiziert."
+msgstr[1] "%d von insgesamt %d Stücken indiziert."
+
+#: ../src/misc_track.c:198
+#, c-format
+msgid "The following duplicate track has been removed."
+msgid_plural "The following %d duplicate tracks have been removed."
+msgstr[0] "Das folgende doppelt eingelesene Stück wurde entfernt."
+msgstr[1] "Die folgenden %d doppelt eingelesenen Stücke wurden entfernt."
+
+#: ../src/misc_track.c:205
+#, c-format
+msgid ""
+"The following duplicate track has not been added to the master play list."
+msgid_plural ""
+"The following %d duplicate tracks have not been added to the master play "
+"list."
+msgstr[0] ""
+"Das folgende doppelt eingelesene Stück wurde nicht erneut zur "
+"Hauptwiedergabeliste hinzugefügt."
+msgstr[1] ""
+"Die folgenden %d doppelt eingelesenen Stücke wurden nicht erneut zur "
+"Hauptwiedergabeliste hinzugefügt."
+
+#. gint id,
+#. gboolean modal,
+#: ../src/misc_track.c:212
+msgid "Duplicate detection"
+msgstr "Duplikaterkennung"
+
+#: ../src/misc_track.c:1339
+msgid "Local Database"
+msgstr "Lokale Datenbank"
+
+#. artwork is set
+#: ../src/misc_track.c:1350
+msgid "Embedded or filename was lost"
+msgstr "Eingefügt oder Dateiname war unauffindbar"
+
+#: ../src/misc_track.c:1354
+msgid "Artwork not set"
+msgstr "Bilddatei nicht gesetzt"
+
+#: ../src/misc_track.c:1816
+#, fuzzy, c-format
+msgid "Could not find source file for '%s'. Track not copied."
+msgstr "Konnte Datei für '%s' auf dem iPod nicht finden\n"
+
+#: ../src/misc_track.c:2052
+#, c-format
+msgid "drag and drop: ignored '%s'\n"
+msgstr "Verschieben: '%s' ignoriert\n"
+
+#: ../src/mp3file.c:1336
+#, c-format
+msgid "Error setting ID3 field: %s\n"
+msgstr "Fehler beim Setzen des ID3 Feldes: '%s'\n"
+
+#: ../src/mp3file.c:1360 ../src/mp3file.c:1453 ../src/mp3file.c:1608
+#: ../src/mp3file.c:2733
+#, c-format
+msgid "ERROR while opening file: '%s' (%s).\n"
+msgstr "FEHLER beim Öffnen der Datei: '%s' (%s).\n"
+
+#: ../src/mp3file.c:1688
+#, c-format
+msgid "ERROR while writing tag to file: '%s' (%s).\n"
+msgstr "FEHLER beim Schreiben eines Tags: '%s' (%s).\n"
+
+#. Tracks with zero play length are ignored by iPod...
+#: ../src/mp3file.c:2770
+#, c-format
+msgid "File \"%s\" has zero play length. Ignoring.\n"
+msgstr "Die Datei '%s' hat Null Spielzeit und wird ignoriert.\n"
+
+#: ../src/mp4file.c:243 ../src/mp4file.c:404
+#, fuzzy, c-format
+msgid "'%s' does not appear to be a mp4 audio or video file.\n"
+msgstr "'%s' scheint keine mp4-Audio-Datei zu sein.\n"
+
+#: ../src/mp4file.c:253 ../src/mp4file.c:414
+#, c-format
+msgid "Could not open '%s' for reading, or file is not an mp4 file.\n"
+msgstr ""
+"'%s' konnte nicht gelesen werden, oder die Datei ist keine gültige mp4-"
+"Datei.\n"
+
+#: ../src/mp4file.c:529
+#, c-format
+msgid "'%s' does not appear to be a mp4 audio file.\n"
+msgstr "'%s' scheint keine mp4-Audio-Datei zu sein.\n"
+
+#: ../src/mp4file.c:540
+#, c-format
+msgid "Could not open '%s' for writing, or file is not an mp4 file.\n"
+msgstr ""
+"'%s' konnte nicht zum Schreiben geöffnet werden, oder die Datei ist keine "
+"gültige mp4-Datei.\n"
+
+#: ../src/mp4file.c:553
+#, c-format
+msgid ""
+"Import of '%s' failed: m4a/m4p/m4b not supported without the mp4v2 library. "
+"You must compile the gtkpod source together with the mp4v2 library.\n"
+msgstr ""
+"Einlesen des Stücks '%s' fehlgeschlagen: m4a/m4p/m4b-Dateien werden ohne die "
+"mp4v2 Bibliothek nicht unterstützt. Sie müssen gtkpod zusammen mit der mp4v2 "
+"Bibliothek kompilieren.\n"
+
+#: ../src/mp4file.c:559
+#, c-format
+msgid ""
+"m4a/m4p/m4b metadata update for '%s' failed: m4a/m4p/m4b not supported "
+"without the mp4v2 library. You must compile the gtkpod source together with "
+"the mp4v2 library.\n"
+msgstr ""
+"Schreiben von m4a/m4p Metadaten für '%s' fehlgeschlagen: m4a/m4p/m4b-Dateien "
+"werden ohne die mp4v2 Bibliothek nicht unterstützt. Sie müssen gtkpod "
+"zusammen mit der mp4v2 Bibliothek kompilieren.\n"
+
+#: ../src/mp4file.c:565
+#, c-format
+msgid ""
+"m4a/m4p/m4b soundcheck update for '%s' failed: m4a/m4p/m4b not supported "
+"without the mp4v2 library. You must compile the gtkpod source together with "
+"the mp4v2 library.\n"
+msgstr ""
+"Schreiben von m4a/m4p Metadaten für '%s' fehlgeschlagen: m4a/m4p/m4b-Dateien "
+"werden ohne die mp4v2 Bibliothek nicht unterstützt. Sie müssen gtkpod "
+"zusammen mit der mp4v2 Bibliothek kompilieren.\n"
+
+#: ../src/oggfile.c:73
+#, fuzzy, c-format
+msgid "'%s' does not appear to be an ogg audio file.\n"
+msgstr "'%s' scheint keine mp4-Audio-Datei zu sein.\n"
+
+#: ../src/oggfile.c:154
+#, fuzzy, c-format
+msgid ""
+"Import of '%s' failed: ogg not supported without the ogg library. You must "
+"compile the gtkpod source together with the ogg library.\n"
+msgstr ""
+"Einlesen des Stücks '%s' fehlgeschlagen: m4a/m4p/m4b-Dateien werden ohne die "
+"mp4v2 Bibliothek nicht unterstützt. Sie müssen gtkpod zusammen mit der mp4v2 "
+"Bibliothek kompilieren.\n"
+
+#: ../src/oggfile.c:160
+#, fuzzy, c-format
+msgid ""
+"ogg metadata update for '%s' failed: ogg not supported without the ogg "
+"library. You must compile the gtkpod source together with the ogg library.\n"
+msgstr ""
+"Schreiben von m4a/m4p Metadaten für '%s' fehlgeschlagen: m4a/m4p/m4b-Dateien "
+"werden ohne die mp4v2 Bibliothek nicht unterstützt. Sie müssen gtkpod "
+"zusammen mit der mp4v2 Bibliothek kompilieren.\n"
+
+#: ../src/prefs.c:357
+#, c-format
+msgid "gtkpod version %s usage:\n"
+msgstr "gtkpod Version %s:\n"
+
+#: ../src/prefs.c:358
+msgid "  -h, --help:   display this message\n"
+msgstr "  -h, --help:   diesen Text anzeigen\n"
+
+#: ../src/prefs.c:359
+#, fuzzy
+msgid "  -p <file>:    increment playcount for file by one\n"
+msgstr "  -p <Dateiname>:Wiedergabezähler für 'Dateiname' um eins erhöhen\n"
+
+#: ../src/prefs.c:360
+msgid "  --hash <file>:print gtkpod hash for file\n"
+msgstr ""
+
+#: ../src/prefs.c:361
+msgid "  -m path:      define the mountpoint of your iPod\n"
+msgstr "  -m <Pfad>:    Einhängepunkt für iPod angeben\n"
+
+#: ../src/prefs.c:362
+msgid "  --mountpoint: same as '-m'.\n"
+msgstr "  --Einhängepunkt: wie '-m'.\n"
+
+#: ../src/prefs.c:363
+msgid "  -a:           import database automatically after start.\n"
+msgstr "  -a:           iTunesDB automatisch importieren\n"
+
+#: ../src/prefs.c:364
+msgid "  --auto:       same as '-a'.\n"
+msgstr "  --auto:       wie '-a'.\n"
+
+#: ../src/prefs.c:561
+#, c-format
+msgid "Couldn't create ~/.gtkpod\n"
+msgstr ""
+
+#: ../src/prefs_window.c:133
+msgid "Please select command for 'Play Now'"
+msgstr "Programm für 'Jetzt abspielen' wählen"
+
+#: ../src/prefs_window.c:134
+msgid "Please select command for 'Enqueue'"
+msgstr "Programm für 'Zum Abspielen vormerken':"
+
+#: ../src/prefs_window.c:135
+msgid "Please select the mp3gain executable"
+msgstr "Genauer Pfad des mp3gain-Programms"
+
+#: ../src/prefs_window.c:136
+msgid "Please select the aacgain executable"
+msgstr "Genauer Pfad des aacgain-Programms"
+
+#: ../src/prefs_window.c:137
+msgid "Select the mserv music root directory"
+msgstr "Wählen Sie das mserv Stammverzeichnis für Musik"
+
+#: ../src/prefs_window.c:138
+msgid "Select the mserv trackinfo root directory"
+msgstr "Wählen Sie das mserv Stammverzeichnis (Stückinfo)"
+
+#: ../src/prefs_window.c:139
+msgid "Select the ogg/vorbis converter command"
+msgstr ""
+
+#: ../src/prefs_window.c:140
+msgid "Select the flac converter command"
+msgstr ""
+
+#: ../src/prefs_window.c:141
+msgid "Select the m4a converter command."
+msgstr ""
+
+#: ../src/prefs_window.c:142
+msgid "Select the mp3 converter command."
+msgstr ""
+
+#: ../src/prefs_window.c:143
+msgid "Select the wav converter command."
+msgstr ""
+
+#: ../src/prefs_window.c:201 ../src/repository.c:662
+#, fuzzy, c-format
+msgid ""
+"<i>Have a look at the scripts provided in '%s'. If you write a new script or "
+"improve an existing one, please send it to jcsjcs at users.sourceforge.net "
+"for inclusion into the next release.</i>"
+msgstr ""
+"<i>Schauen Sie sich die Skripte an, die in '%s' zur Verfügung gestellt "
+"wurden. Wenn Sie ein neues Script schreiben, schicken Sie es bitte an jcsjcs "
+"at users.sourceforge.net, damit es in die nächste Version aufgenommen werden "
+"kann.</i>"
+
+#: ../src/prefs_window.c:1205 ../src/prefs_window.c:1223
+msgid "Preferences not updated"
+msgstr "Die Einstellungen wurden nicht übernommen"
+
+#: ../src/prefs_window.c:1232
+msgid "Preferences applied"
+msgstr "Die Einstellungen wurden übernommen"
+
+#: ../src/repository.c:573 ../src/repository.c:2395
+msgid "Set backup file"
+msgstr "Bestimme Sicherungsdatei"
+
+#: ../src/repository.c:612
+msgid "Select directory for synchronization"
+msgstr "Wählen Sie ein Verzeichnis zum Abgleich"
+
+#: ../src/repository.c:638
+msgid "Please select command to sync contacts"
+msgstr "Skript zum Abgleichen der Kontakte"
+
+#: ../src/repository.c:644
+msgid "Please select command to sync calendar"
+msgstr "Skript zum Abgleichen des Terminkalenders"
+
+#: ../src/repository.c:650
+msgid "Please select command to sync notes"
+msgstr "Skript zum Abgleichen der Notizen"
+
+#: ../src/repository.c:729
+msgid "Smart playlist updated."
+msgstr "Intelligente Wiedergabeliste aktualisiert."
+
+#: ../src/repository.c:1190
+msgid "Podcasts Repository"
+msgstr "Podcast Datenbank"
+
+#: ../src/repository.c:1194
+msgid "Local Repository"
+msgstr "Lokale Datenbank"
+
+#: ../src/repository.c:1348
+msgid "Master Playlist"
+msgstr "Hauptwiedergabeliste"
+
+#: ../src/repository.c:1352
+msgid "Podcasts Playlist"
+msgstr "Podcast Wiedergabeliste"
+
+#: ../src/repository.c:1360
+msgid "Regular Playlist"
+msgstr "Normale Wiedergabeliste"
+
+#: ../src/repository.c:2423
+msgid "Set local repository file"
+msgstr "Wähle Datei für die lokale Datenbank"
+
+#: ../src/repository.c:2522
+msgid "New Repository"
+msgstr "Neue Datenbank "
+
+#: ../src/sha1.c:186
+msgid "Hashed file is 0 bytes long\n"
+msgstr "Die Datei, für die eine Prüfsumme berechnet werden soll, ist leer.\n"
+
+#: ../src/sha1.c:239
+#, fuzzy, c-format
+msgid "Could not open '%s' to calculate SHA1 checksum: %s\n"
+msgstr "Konnte '%s' zum Berechnen der MD5-Prüfsumme nicht öffnen: %s\n"
+
+#: ../src/syncdir.c:237
+#, c-format
+msgid "Sync summary for %s/%s\n"
+msgstr "Zusammenfassung des Abgleichs für %s/%s\n"
+
+#: ../src/syncdir.c:246
+msgid "The following track has been added or updated:\n"
+msgid_plural "The following tracks have been added or updated:\n"
+msgstr[0] "Das folgende Stück wurde hinzugefügt oder aktualisiert:\n"
+msgstr[1] "Die folgenden Stücke wurden hinzugefügt oder aktualisiert:\n"
+
+#: ../src/syncdir.c:255
+msgid "The following track has been completely removed from the iPod:\n"
+msgid_plural ""
+"The following tracks have been completely removed from the iPod:\n"
+msgstr[0] "Das folgende Stück wurde vom iPod entfernt:\n"
+msgstr[1] "Die folgenden Stücke wurden vom iPod entfernt:\n"
+
+#: ../src/syncdir.c:264
+msgid "The following track has been removed from the repository:\n"
+msgid_plural "The following tracks have been removed from the repository:\n"
+msgstr[0] "Das folgende Stück wurde aus der Datenbank entfernt:\n"
+msgstr[1] "Die folgenden Stücke wurden aus der Datenbank entfernt:\n"
+
+#: ../src/syncdir.c:271
+msgid "The following track has been removed from the playlist:\n"
+msgid_plural "The following tracks have been removed from the playlist:\n"
+msgstr[0] "Das folgende Stück wurde aus der Wiedergabeliste entfernt:\n"
+msgstr[1] "Die folgenden Stücke wurden aus der Wiedergabeliste entfernt:\n"
+
+#: ../src/syncdir.c:277
+msgid "Nothing was changed.\n"
+msgstr "Nichts geändert.\n"
+
+#: ../src/syncdir.c:282
+msgid "Sync summary"
+msgstr "Zusammenfassung des Abgleichs"
+
+#: ../src/tools.c:118
+#, fuzzy, c-format
+msgid ""
+"Could not find '%s'.\n"
+"Please specifiy the exact path in the Tools section of the preference dialog "
+"or install the program if it is not installed on your system.\n"
+"\n"
+msgstr ""
+"Das Kommando '%s' konnte nicht gefunden werden.\n"
+". Bitte überprüfen Sie die Pfadangabe im Einstellungsdialog unter "
+"'Werkzeuge' oder installieren Sie das entsprechende Programm.\n"
+"\n"
+
+#: ../src/tools.c:203
+#, c-format
+msgid ""
+"Execution of '%s' failed.\n"
+"\n"
+msgstr ""
+"Die Ausführung von '%s' schlug fehl.\n"
+"\n"
+
+#: ../src/tools.c:248
+#, c-format
+msgid ""
+"Did not normalize '%s'. Set mp3gain path in the Tools section of the "
+"preferences.\n"
+msgstr ""
+"'%s' konnte nicht normalisiert werden. Bitte prüfen Sie die Pfadangabe "
+"(mp3gain) im Einstellungsdialog unter 'Werkzeuge'\n"
+
+#: ../src/tools.c:258
+#, c-format
+msgid ""
+"Did not normalize '%s'. Set aacgain path in the Tools section of the "
+"preferences.\n"
+msgstr ""
+"'%s' konnte nicht normalisiert werden. Bitte prüfen Sie die Pfadangabe "
+"(aacgain) im Einstellungsdialog unter 'Werkzeuge'\n"
+
+#: ../src/tools.c:385
+msgid "Normalizing..."
+msgstr "Lautstärke wird normalisiert..."
+
+#: ../src/tools.c:435
+#, c-format
+msgid "%s - %s"
+msgstr "%s - %s"
+
+#: ../src/tools.c:461
+msgid "Aborting..."
+msgstr "Breche ab..."
+
+#: ../src/tools.c:465
+msgid "Will abort after current mp3gain process ends."
+msgstr "Abbruch erfolgt, nachdem der mp3gain-Prozess beendet ist."
+
+#: ../src/tools.c:491
+#, c-format
+msgid ""
+"'%s-%s' (%s) could not be normalized.\n"
+"\n"
+msgstr "'%s-%s (%s) konnte nicht normalisiert werden.\n"
+
+#: ../src/tools.c:530
+#, c-format
+msgid "Normalized %d of %d tracks."
+msgid_plural "Normalized %d of %d tracks."
+msgstr[0] "%d von insgesamt %d Stück normalisiert."
+msgstr[1] "%d von insgesamt %d Stücken normalisiert."
+
+#: ../src/tools.c:633
+msgid ""
+"Please specify the command to be called on the 'Tools' section of the "
+"preferences dialog.\n"
+msgstr ""
+"Bitte geben Sie das aufzurufende Programm im Einstellungsdialog unter "
+"'Werkzeuge' an.\n"
+
+#: ../src/tools.c:645
+#, c-format
+msgid ""
+"Could not find the command '%s'.\n"
+"\n"
+"Please verify the setting in the 'Tools' section of the preferences dialog.\n"
+"\n"
+msgstr ""
+"Das Kommando '%s' konnte nicht gefunden werden.\n"
+"\n"
+"Bitte überprüfen Sie die Angabe im Einstellungsdialog unter 'Werkzeuge'\n"
+"\n"
+
+#: ../src/tools.c:687
+#, c-format
+msgid ""
+"'%s' returned the following output:\n"
+"%s\n"
+msgstr ""
+"'%s' lieferte folgende Ausgabe:\n"
+"%s\n"
+
+#: ../src/tools.c:754
+#, c-format
+msgid "No command set for '%s'"
+msgstr "Keine Befehlszeile spezifiziert für '%s'"
+
+#: ../src/tools.c:774
+#, c-format
+msgid "Could not find command '%s' specified for '%s'"
+msgstr "Konnte das spezifizierte Kommando '%s' für '%s' nicht finden."
+
+#: ../src/wavfile.c:181
+#, c-format
+msgid "%s does not appear to be a supported wav file.\n"
+msgstr "'%s' scheint keine unterstützte WAV-Datei zu sein.\n"
+
+#, fuzzy
+#~ msgid "<b>Resolution:</b>"
+#~ msgstr "<b>Werkzeugtipps</b>"
+
+#, fuzzy
+#~ msgid "label"
+#~ msgstr "label21"
+
+#~ msgid ""
+#~ "Cannot open '%s' for reading.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Datei '%s' konnte nicht zum Lesen geöffnet werden.\n"
+#~ "\n"
+
+#~ msgid "Unable to open '%s' for reading\n"
+#~ msgstr "Kann '%s' nicht zum Lesen öffnen.\n"
+
+#~ msgid "Could not open \"iTunesDB.ext\" for reading extended info.\n"
+#~ msgstr ""
+#~ "Die \"iTunesDB.ext\" konnte zum Lesen der erweiterten Infos nicht "
+#~ "geöffnet werden.\n"
+
+#~ msgid "Add _Directory"
+#~ msgstr "_Verzeichnisse hinzufügen"
+
+#~ msgid "Dirs"
+#~ msgstr "Verzeichnisse"
+
+#~ msgid "Files"
+#~ msgstr "Dateien"
+
+#~ msgid "New PL"
+#~ msgstr "Neue Wiedergabeliste"
+
+#~ msgid "_About"
+#~ msgstr "_Über"
+
+#, fuzzy
+#~ msgid "Set Cover Art from _Web"
+#~ msgstr "Lege Cover-Bild fest"
+
+#~ msgid "_Other"
+#~ msgstr "S_onstiges"
+
+#~ msgid "File skipped. match exclude masks: '%s'\n"
+#~ msgstr "Datei übersprungen. Erfüllt Ausschlusskriterium: '%s'\n"
+
+#~ msgid "Add Playlists"
+#~ msgstr "Wiedergabeliste(n) hinzufügen"
+
+#~ msgid "Select directory to add recursively"
+#~ msgstr "Wählen Sie Verzeichnis(se) zum Hinzufügen aus"
+
+#~ msgid ""
+#~ "Supposedly something that tells the iPod to increase or decrease the "
+#~ "playback speed"
+#~ msgstr ""
+#~ "Anscheinend ein Feld, das den iPod anweist, die Wiedergabe zu "
+#~ "beschleunigen oder zu verlangsamen"
+
+#~ msgid "Processing '%s'"
+#~ msgstr "Bearbeite '%s'"
+
+#, fuzzy
+#~ msgid "label21"
+#~ msgstr "label21"
+
+#~ msgid "window1"
+#~ msgstr "window1"
+
+#~ msgid "<b>Import</b>"
+#~ msgstr "<b>Importieren</b>"
+
+#~ msgid "Automatically import iTunesDBs on startup"
+#~ msgstr "Beim Start die iTunes Datenbank automatisch importieren"
+
+#~ msgid "Couldn't find pixmap file: %s"
+#~ msgstr "Konnte Bilddatei nicht finden: %s"
+
+#~ msgid "_Synchronize Playlist"
+#~ msgstr "_Abgleich der Wiedergabeliste"
+
+#~ msgid "Stop Display Update"
+#~ msgstr "Aktualisierung der Anzeige abbrechen"
+
+#~ msgid "Stop"
+#~ msgstr "Stopp"
+
+#~ msgid ""
+#~ "It is much faster to sort the display after all tracks have been added. "
+#~ "Some people might feel irritated by this behaviour and should uncheck "
+#~ "this option."
+#~ msgstr ""
+#~ "Es ist deutlich schneller, die Sortierung vorzunehmen nachdem alle Stücke "
+#~ "hinzugefügt wurden. Wen dieses Verhalten irritiert, sollte diese Option "
+#~ "jedoch nicht wählen."
+
+#~ msgid ""
+#~ "Temporarily disable sorting when changing playlist\n"
+#~ "or tab entry (faster!)"
+#~ msgstr ""
+#~ "Sortieren vorübergehend deaktivieren, wenn die Wiedergabeliste oder der "
+#~ "Sortierungseintrag gewechselt wird (schneller!)"
+
+#~ msgid ""
+#~ "The display can be blocked after changing a selection. The display update "
+#~ "is faster, but you have to wait until it's finished. When using this "
+#~ "option, sorting is also temporarily disabled (see option above)."
+#~ msgstr ""
+#~ "Die Anzeige kann bis zur vollständigen Aktualisierung nach einer Änderung "
+#~ "der Auswahl blockiert werden. Die Aktualisierung ist dann schneller, aber "
+#~ "es muss gewartet werden, bis sich gtkpod wieder meldet. Mit dieser Option "
+#~ "wird automatisch auch das Sortieren vorübergehend deaktiviert (siehe "
+#~ "Option weiter oben)."
+
+#~ msgid ""
+#~ "Block display when changing playlist or tab\n"
+#~ " entry (faster!)"
+#~ msgstr ""
+#~ "Anzeige nicht aktualisieren, wenn eine neue Wiedergabeliste oder ein "
+#~ "neuer Sortierungseintrag gewählt wird (schneller!)"
+
+#~ msgid "deleting..."
+#~ msgstr "Lösche Stücke..."
+
+#~ msgid "preparing to copy..."
+#~ msgstr "Kopieren wird vorbereitet..."
+
+#~ msgid "Copied %d of %d new track."
+#~ msgid_plural "Copied %d of %d new tracks."
+#~ msgstr[0] "%d von %d Stücken kopiert."
+#~ msgstr[1] "%d von %d Stücken kopiert."
+
+#~ msgid "Some tracks were not written to iPod. Export aborted!"
+#~ msgstr ""
+#~ "Einige Stücke wurden nicht auf den iPod übertragen. Export abgebrochen!"

Added: trunk/po/es.po
===================================================================
--- trunk/po/es.po	                        (rev 0)
+++ trunk/po/es.po	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,6022 @@
+# translation of gtkpod.es.po to spanish
+# Alejandro Lamas Daviña <alejandro.lamas at ific.uv.es>, 2006, 2007.
+# This file is distributed under the same license as the gtkpod package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gtkpod\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-12-13 18:36-0500\n"
+"PO-Revision-Date: 2007-06-13 21:38+0200\n"
+"Last-Translator: Alejandro Lamas Daviña <alejandro.lamas at ific.uv.es>\n"
+"Language-Team: spanish <es_ES>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: ../data/gtkpod.desktop.in.h:1
+#, fuzzy
+msgid "GtkPod"
+msgstr "gtkpod"
+
+#: ../data/gtkpod.desktop.in.h:2
+msgid "Manage music and video on an Apple iPod"
+msgstr ""
+
+#: ../data/gtkpod.desktop.in.h:3
+msgid "iPod Manager"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:1
+msgid " "
+msgstr " "
+
+#: ../data/gtkpod.glade.h:2
+msgid "    "
+msgstr "    "
+
+#: ../data/gtkpod.glade.h:3
+msgid "     "
+msgstr "     "
+
+#: ../data/gtkpod.glade.h:4
+msgid "      "
+msgstr "      "
+
+#: ../data/gtkpod.glade.h:5
+msgid "   Sort by:"
+msgstr "   Ordenar por:"
+
+#: ../data/gtkpod.glade.h:6
+msgid " <= cts <= "
+msgstr " <= cts <= "
+
+#: ../data/gtkpod.glade.h:7
+msgid " Logic: "
+msgstr "Operadores lógicos:"
+
+#: ../data/gtkpod.glade.h:9
+#, no-c-format
+msgid "%A"
+msgstr "%A"
+
+#: ../data/gtkpod.glade.h:10
+msgid ""
+"'DD/MM/YYYY HH:MM < d < DD/MM/YYYY HH:MM' or similar. Press 'enter' when "
+"finished."
+msgstr ""
+"'DD/MM/AAAA HH:MM < d < DD/MM/AAAA HH:MM' o similar. Pulse 'Intro' al "
+"terminar."
+
+#: ../data/gtkpod.glade.h:11
+msgid "'aacgain' executable:"
+msgstr "programa 'aacgain':"
+
+#: ../data/gtkpod.glade.h:12
+msgid "'mp3gain' executable:"
+msgstr "programa 'mp3gain':"
+
+#: ../data/gtkpod.glade.h:13
+msgid "(Checked)"
+msgstr "(Revisado)"
+
+#: ../data/gtkpod.glade.h:14
+msgid "...as icons"
+msgstr "...como iconos"
+
+#: ../data/gtkpod.glade.h:15
+msgid "...as text"
+msgstr "...como texto"
+
+#: ../data/gtkpod.glade.h:16
+msgid "...both as icons and text"
+msgstr "...ambos. Como iconos y como texto"
+
+#: ../data/gtkpod.glade.h:17
+msgid "...entry 'All' in sort tab..."
+msgstr "...entrada 'Todo' en la pestaña..."
+
+#: ../data/gtkpod.glade.h:18
+msgid "...master playlist"
+msgstr "...lista de reproducción principal"
+
+#: ../data/gtkpod.glade.h:20
+#, no-c-format
+msgid "../%A.jpg"
+msgstr "../%A.jpg"
+
+#: ../data/gtkpod.glade.h:21
+msgid "0"
+msgstr "0"
+
+#: ../data/gtkpod.glade.h:22
+msgid "1"
+msgstr "1"
+
+#: ../data/gtkpod.glade.h:23
+msgid "2"
+msgstr "2"
+
+#: ../data/gtkpod.glade.h:24
+msgid "3"
+msgstr "3"
+
+#: ../data/gtkpod.glade.h:25
+msgid "4"
+msgstr "4"
+
+#: ../data/gtkpod.glade.h:26
+msgid "5"
+msgstr "5"
+
+#: ../data/gtkpod.glade.h:27
+msgid ":"
+msgstr ":"
+
+#: ../data/gtkpod.glade.h:28
+msgid "<"
+msgstr "<"
+
+#: ../data/gtkpod.glade.h:29
+msgid "<b>Account Information</b>"
+msgstr "<b>Información de la cuenta</b>"
+
+#: ../data/gtkpod.glade.h:30
+msgid "<b>Adding/Updating/Syncing</b>"
+msgstr "<b>Añadir/Actualizar/Sincronizar</b>"
+
+#: ../data/gtkpod.glade.h:31
+#, fuzzy
+msgid "<b>Audioscrobbler</b>"
+msgstr "<b>Audioscrobbler</b>"
+
+#: ../data/gtkpod.glade.h:32
+msgid "<b>Auto-Generated Playlists</b>"
+msgstr "<b>Listas de reproducción generadas automáticamente</b>"
+
+#: ../data/gtkpod.glade.h:33
+msgid "<b>Automatically select...</b>"
+msgstr "<b>Seleccionar automáticamente...</b>"
+
+#: ../data/gtkpod.glade.h:34
+msgid "<b>Calendar/Contacts/Notes</b>"
+msgstr "<b>Calendario/Contactos/Notas</b>"
+
+#: ../data/gtkpod.glade.h:35
+msgid "<b>Coverart</b>"
+msgstr "<b>Carátulas</b>"
+
+#: ../data/gtkpod.glade.h:36
+msgid "<b>Delete Confirmation</b>"
+msgstr "<b>Confirmación de borrado</b>"
+
+#: ../data/gtkpod.glade.h:37
+msgid "<b>Examples</b>"
+msgstr "<b>Ejemplos</b>"
+
+#: ../data/gtkpod.glade.h:38
+msgid "<b>Ignore Frequent Words</b>"
+msgstr "<b>Ignorar palabras comunes (p.e: artículos)</b>"
+
+#: ../data/gtkpod.glade.h:39
+msgid "<b>Misc</b>"
+msgstr "<b>Miscelaneo</b>"
+
+#: ../data/gtkpod.glade.h:40
+msgid "<b>Mountpoint and individual repository/playlist options</b>"
+msgstr ""
+"<b>Opciones de punto de montaje y repositorio/lista de reproducción "
+"individual</b>"
+
+#: ../data/gtkpod.glade.h:41
+msgid "<b>On-the-fly Conversion</b>"
+msgstr "<b>Conversión al vuelo</b>"
+
+#: ../data/gtkpod.glade.h:42
+msgid "<b>Play</b>"
+msgstr "<b>Reproducir</b>"
+
+#: ../data/gtkpod.glade.h:43
+msgid "<b>Playlists</b>"
+msgstr "<b>Listas de reproducción</b>"
+
+#: ../data/gtkpod.glade.h:44
+msgid "<b>Please select mountpoint and your iPod model</b>"
+msgstr "<b>Por favor, seleccionar el punto de montaje y el modelo de iPod</b>"
+
+#: ../data/gtkpod.glade.h:45
+msgid "<b>Repositories</b>"
+msgstr "<b>Repositorios</b>"
+
+#: ../data/gtkpod.glade.h:46
+msgid "<b>Sort Order</b>"
+msgstr "<b>Opción de ordenamiento</b>"
+
+#: ../data/gtkpod.glade.h:47
+msgid "<b>Sort Tabs</b>"
+msgstr "<b>Pestañas</b>"
+
+#: ../data/gtkpod.glade.h:48
+msgid "<b>Sync</b>"
+msgstr "<b>Sincronizar</b>"
+
+#: ../data/gtkpod.glade.h:49
+msgid "<b>Synchronization</b>"
+msgstr "<b>Sincronización</b>"
+
+#: ../data/gtkpod.glade.h:50
+msgid "<b>Tag Reading</b>"
+msgstr "<b>Lectura de los atributos</b>"
+
+#: ../data/gtkpod.glade.h:51
+msgid "<b>Toolbar</b>"
+msgstr "<b>Barra de herramientas</b>"
+
+#: ../data/gtkpod.glade.h:52
+msgid "<b>Tooltips</b>"
+msgstr "<b>Sugerencias</b>"
+
+#: ../data/gtkpod.glade.h:53
+#, fuzzy
+msgid "<b>Track Attributes</b>"
+msgstr "<b>Atributos de la pista mostrados</b>"
+
+#: ../data/gtkpod.glade.h:54
+msgid "<b>Track Editing</b>"
+msgstr "<b>Edición de pistas</b>"
+
+#: ../data/gtkpod.glade.h:55
+msgid "<b>Volume Normalization</b>"
+msgstr "<b>Normalización del volumen</b>"
+
+#: ../data/gtkpod.glade.h:56
+msgid "<b>mserv</b>"
+msgstr "<b>mserv</b>"
+
+#: ../data/gtkpod.glade.h:57
+msgid ">"
+msgstr ">"
+
+#: ../data/gtkpod.glade.h:58
+msgid "About gtkpod"
+msgstr "Sobre gtkpod"
+
+#: ../data/gtkpod.glade.h:59
+msgid "Add Directories Recursively"
+msgstr "Añadir directorios recursivamente"
+
+#: ../data/gtkpod.glade.h:60
+#, fuzzy
+msgid "Add Files"
+msgstr "Añadir _ficheros"
+
+#: ../data/gtkpod.glade.h:61
+msgid "Add Files or Directories"
+msgstr "Añadir ficheros o directorios"
+
+#: ../data/gtkpod.glade.h:62
+#, fuzzy
+msgid "Add Fol_der"
+msgstr "Añadir _ficheros"
+
+#: ../data/gtkpod.glade.h:63
+#, fuzzy
+msgid "Add Folder"
+msgstr "Añadir _ficheros"
+
+#: ../data/gtkpod.glade.h:64
+msgid "Add Image_s"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:65
+#, fuzzy
+msgid "Add Images from a Directory"
+msgstr "Añadir ficheros o directorios"
+
+#: ../data/gtkpod.glade.h:66
+#, fuzzy
+msgid "Add Playlist"
+msgstr "Añadir lista de _reproducción"
+
+#: ../data/gtkpod.glade.h:67
+msgid "Add _Files"
+msgstr "Añadir _ficheros"
+
+#: ../data/gtkpod.glade.h:68
+msgid "Add _Playlist"
+msgstr "Añadir lista de _reproducción"
+
+#: ../data/gtkpod.glade.h:69
+msgid "Add coverart from file using the following template"
+msgstr "Añadir carátulas desde fichero usando la siguiente plantilla"
+
+#: ../data/gtkpod.glade.h:70
+msgid "Add directories recursively"
+msgstr "Añadir directorios recursivamente"
+
+#: ../data/gtkpod.glade.h:71
+msgid "Add new repository/iPod"
+msgstr "Añadir nuevo repositorio/iPod"
+
+#: ../data/gtkpod.glade.h:72
+msgid "Add playlist from file"
+msgstr "Añadir lista de reproducción desde fichero"
+
+#: ../data/gtkpod.glade.h:73 ../src/display_sorttabs.c:3247
+#: ../src/display_tracks.c:2103
+msgid "Added"
+msgstr "Añadido"
+
+#: ../data/gtkpod.glade.h:74
+msgid "Advanced Sorting Options"
+msgstr "Opciones de ordenación avanzadas"
+
+#. 0
+#: ../data/gtkpod.glade.h:75 ../src/display_sorttabs.c:2982
+#: ../src/display_spl.c:84 ../src/misc_conversion.c:60
+msgid "Album"
+msgstr "Álbum"
+
+#: ../data/gtkpod.glade.h:76
+msgid "Album Art"
+msgstr "Carátula de álbum"
+
+#: ../data/gtkpod.glade.h:77
+msgid "All (AND)"
+msgstr "y (AND)"
+
+#: ../data/gtkpod.glade.h:78
+msgid "All Tracks Never Listened To"
+msgstr "Todas las pistas nunca escuchadas"
+
+#: ../data/gtkpod.glade.h:79
+msgid "All Tracks Played Since Last Time"
+msgstr "Todas las pistas reproducidas desde la última vez"
+
+#: ../data/gtkpod.glade.h:80
+msgid "All Tracks not Listed in any Playlist"
+msgstr "Todas las pistas no incluidas en otras listas de reproducción"
+
+#: ../data/gtkpod.glade.h:81
+msgid "Also include tracks never played in \"Best Rated\" playlist"
+msgstr ""
+"Incluir también las pistas nunca reproducidas en las listas de reproducción "
+"\"Mejor puntuadas\""
+
+#: ../data/gtkpod.glade.h:82
+msgid "Always write ID3v2.4 tags (only applies to MP3)"
+msgstr "Escribir siempre atributos ID3v2.4 (aplicable sólo a ficheros MP3)"
+
+#: ../data/gtkpod.glade.h:83
+msgid "Any (OR)"
+msgstr "o (OR)"
+
+#: ../data/gtkpod.glade.h:84 ../src/display_sorttabs.c:2979
+#: ../src/display_spl.c:85 ../src/misc_conversion.c:61
+msgid "Artist"
+msgstr "Artista"
+
+#: ../data/gtkpod.glade.h:85
+#, fuzzy
+msgid "Artwork Preview"
+msgstr "Ruta de la carátula"
+
+#: ../data/gtkpod.glade.h:86
+msgid ""
+"As a last resort set the following tags to the\n"
+"filename if they are (still) empty:"
+msgstr ""
+"Como último recurso, establecer los siguientes\n"
+" atributos al nombre de fichero si (todavía) están vacíos."
+
+#: ../data/gtkpod.glade.h:88
+msgid "Ascending"
+msgstr "Ascendente"
+
+#: ../data/gtkpod.glade.h:89
+msgid "Auto Store"
+msgstr "Guardar automáticamente"
+
+#: ../data/gtkpod.glade.h:90
+msgid ""
+"Automatically start displaying tracks that match the criteria entered above. "
+"If not selected, you must press 'Display' to start displaying."
+msgstr ""
+"Mostrar automáticamente las pistas que concuerden con el criterio de "
+"búsqueda. Si no está seleccionado se deberá pulsar 'Mostar' para que "
+"comiencen a visualizarse."
+
+#: ../data/gtkpod.glade.h:91
+msgid "Available:"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:92
+msgid "Before removing playlists or tracks from a playlist"
+msgstr ""
+"Antes de borrar listas de reproducción o pistas de una lista de reproducción"
+
+#: ../data/gtkpod.glade.h:93
+msgid "Before removing tracks from the harddisk"
+msgstr "Antes de borrar pistas del disco duro"
+
+#: ../data/gtkpod.glade.h:94
+msgid "Before removing tracks from the iPod"
+msgstr "Antes de borrar pistas del iPod"
+
+#: ../data/gtkpod.glade.h:95
+msgid "Before removing tracks from the local database"
+msgstr "Antes de borrar pistas de la base de datos"
+
+#: ../data/gtkpod.glade.h:96
+msgid "Best Rated Tracks"
+msgstr "Pistas con mayor puntuación"
+
+#: ../data/gtkpod.glade.h:97
+msgid "Browse"
+msgstr "Examinar"
+
+#: ../data/gtkpod.glade.h:98
+msgid "Cache directory:"
+msgstr "Directorio de caché"
+
+#: ../data/gtkpod.glade.h:99
+msgid "Calendar"
+msgstr "Calendario"
+
+#: ../data/gtkpod.glade.h:100
+msgid "Calendar sync command:"
+msgstr "Programa de sincronización del calendario:"
+
+#: ../data/gtkpod.glade.h:101
+msgid "Call automatically when synchronizing iTunesDB"
+msgstr "Llamar automáticamente al sincronizar la base de datos iTunes"
+
+#: ../data/gtkpod.glade.h:102
+msgid "Category: "
+msgstr "Categoría: "
+
+#: ../data/gtkpod.glade.h:103
+msgid ""
+"Change all tracks\n"
+"simultaneously"
+msgstr ""
+"Cambiar todas las pistas\n"
+"a la vez"
+
+#: ../data/gtkpod.glade.h:105
+msgid ""
+"Check before removing photos from a photo album whether\n"
+"they should be deleted from the Photo Database."
+msgstr ""
+
+#: ../data/gtkpod.glade.h:107
+msgid "Check for existing files when copying from iPod."
+msgstr "Comprobar la existencia previa de ficheros al copiar del iPod."
+
+#: ../data/gtkpod.glade.h:108
+msgid "Command for 'Enqueue':"
+msgstr "Programa para 'Encolar':"
+
+#: ../data/gtkpod.glade.h:109
+msgid "Command for 'Play now':"
+msgstr "Programa para 'Reproducir':"
+
+#. 5
+#: ../data/gtkpod.glade.h:110 ../src/display_spl.c:97
+#: ../src/misc_conversion.c:65
+msgid "Composer"
+msgstr "Compositor"
+
+#: ../data/gtkpod.glade.h:111
+msgid "Confirm before removing tracks from the iPod or repository"
+msgstr "Confirmar antes de borrar pistas del iPod o del repositorio"
+
+#: ../data/gtkpod.glade.h:112
+msgid ""
+"Confirm before removing tracks from the iPod or repository\n"
+"when syncing playlists"
+msgstr ""
+"Confirmar antes de borrar pistas del iPod o del repositorio\n"
+"al sincronizar las listas de reproducción"
+
+#: ../data/gtkpod.glade.h:114
+msgid "Confirm lists of directories"
+msgstr "Confirmar la lista de directorios"
+
+#: ../data/gtkpod.glade.h:115
+msgid "Contacts sync command:"
+msgstr "Programa de sincronización de contactos:"
+
+#: ../data/gtkpod.glade.h:116
+msgid "Containing Displayed Tracks"
+msgstr "Conteniendo pistas mostradas"
+
+#: ../data/gtkpod.glade.h:117
+msgid "Containing Selected Tracks"
+msgstr "Conteniendo pistas seleccionadas"
+
+#: ../data/gtkpod.glade.h:118
+msgid "Conversion Progress Display"
+msgstr "Mostrar el progreso de la conversión"
+
+#: ../data/gtkpod.glade.h:119
+msgid "Cover"
+msgstr "Portada"
+
+#: ../data/gtkpod.glade.h:120
+msgid "Create New Playlist"
+msgstr "Crear nueva lista de reproducción"
+
+#: ../data/gtkpod.glade.h:121
+msgid "Create Repository"
+msgstr "Crear repositorio"
+
+#: ../data/gtkpod.glade.h:122
+msgid "Create _Playlist File"
+msgstr "Crear lista de re_producción"
+
+#: ../data/gtkpod.glade.h:123
+msgid "Credits"
+msgstr "Créditos"
+
+#: ../data/gtkpod.glade.h:124
+msgid "Currently only rating is supported."
+msgstr "De momento sólo se puede puntuar."
+
+#: ../data/gtkpod.glade.h:125
+msgid "Delete repository"
+msgstr "Borrar repositorio"
+
+#: ../data/gtkpod.glade.h:126
+msgid ""
+"Delete tracks that are no longer present from the\n"
+"iPod or repository"
+msgstr ""
+"Borrar del iPod o del repositorio las pistas\n"
+" que ya no se encuentran presentes"
+
+#: ../data/gtkpod.glade.h:128
+msgid "Deleted tracks"
+msgstr "Pistas borradas"
+
+#: ../data/gtkpod.glade.h:129
+msgid "Descending"
+msgstr "Descendente"
+
+#: ../data/gtkpod.glade.h:130
+msgid "Details"
+msgstr "Detalles"
+
+#: ../data/gtkpod.glade.h:132
+#, no-c-format
+msgid ""
+"Determines how the string for the info field should be constructed, e.g '%a/%"
+"A/%T - %t.mp3' or '%o'.  You can separate several templates by semicolons -- "
+"gtkpod will determine which one to use by the filename extension given. "
+"Artist: %a, album: %A, composer: %c, title: %t, genre: %G, track nr: %T, CD "
+"nr: %C, year: %Y, original filename (requires extended information file): %"
+"o, the character '%': %%."
+msgstr ""
+"Indica como debe construirse la cadena del campo de información, p.e: '%a/%A/"
+"%T-%t.mp3' o '%o'. Se pueden separar varias plantillas con puto y coma (;) "
+"-- gtkpod determinará cual usar según la extensión del fichero. Artista: %a, "
+"álbum: %A, compositor: %c, título: %t, género: %G, número de pista: %T, "
+"número de CD: %C, año: %Y, nombre original (necesita el fichero de "
+"información extendida): %o, el carácter '%': %%."
+
+#: ../data/gtkpod.glade.h:134
+#, no-c-format
+msgid ""
+"Determines the filename of tracks you copy from the iPod, e.g '%a/%A/%T - %t."
+"mp3' or '%o'.  You can separate several patterns by semicolons -- gtkpod "
+"will determine which one to use by the filename extension given. Artist: %a, "
+"album: %A, composer: %c, title: %t, genre: %G, track nr: %T, CD nr: %C, "
+"year: %Y, original filename (requires extended information file): %o, "
+"current playlist: %p, the character '%': %%."
+msgstr ""
+"Indica el nombre de las pistas que se copian del iPod, p.e: '%a/%A/%T - %t."
+"mp3' o '%o'. Se pueden separar varios patrones con punto y coma (;) -- "
+"gtkpod determinará cual usar según la extensión del fichero. Artista:%a, "
+"álbum: %A, compositor: %c, título: %t, género: %G, número de pista: %T, "
+"número de CD: %C, año: %Y, nombre original (necesita el fichero de "
+"información extendida): %o, lista de reproducción actual: %p, el caracter "
+"'%': %%."
+
+#: ../data/gtkpod.glade.h:136
+#, no-c-format
+msgid ""
+"Determines the name of the file with the cover art. You can separate several "
+"patterns by semicolons which will be tried in order. Artist: %a, album: %A, "
+"composer: %c, title: %t, genre: %G, track nr: %T, CD nr: %C, year: %Y, "
+"original filename (requires extended information file): %o, original "
+"filename without file extension: %O, current playlist: %p, the character "
+"'%': %%."
+msgstr ""
+"Determina el nombre de fichero con la carátula. Se pueden separar diferentes "
+"cadenas con punto y coma (;) que serán probadas en orden. Artista: %a, "
+"álbum: %A, compositor: %c, título: %t, género: %G, número de pista: %T, "
+"número de CD: %C, año: %Y, nombre del fichero original (necesita el fichero "
+"de información extendida): %o, nombre de fichero sin extensión: %O, actual "
+"lista de reproducción: %p, el carácter '%': %%."
+
+#: ../data/gtkpod.glade.h:137
+msgid ""
+"Directories to sync with are determined from the filenames of the tracks in "
+"the playlist."
+msgstr ""
+"Los directorios con los que sincronizar son determinados mediante los "
+"nombres de fichero de las pistas en la lista de reproducción."
+
+#: ../data/gtkpod.glade.h:138
+msgid "Display a list of tracks that could actually be updated."
+msgstr "Mostrar las pistas que pueden ser actualizadas."
+
+#: ../data/gtkpod.glade.h:139
+msgid "Display a list of tracks that could not be updated."
+msgstr "Mostrar las pistas que no pueden ser actualizadas."
+
+#: ../data/gtkpod.glade.h:140
+msgid "Display conversion log"
+msgstr "Mostar el registro de conversión"
+
+#: ../data/gtkpod.glade.h:141
+msgid "Display info about detected duplicates"
+msgstr "Mostar información sobre los ficheros duplicados detectados"
+
+#: ../data/gtkpod.glade.h:142
+msgid "Display info about non-updated tracks"
+msgstr "Mostrar información sobre las pistas no actualizadas"
+
+#: ../data/gtkpod.glade.h:143
+msgid "Display info about updated tracks"
+msgstr "Mostrar información sobre las pistas actualizadas"
+
+#: ../data/gtkpod.glade.h:144
+msgid "Display messages and warnings at startup"
+msgstr "Mostrar mensajes y avisos al inicio"
+
+#: ../data/gtkpod.glade.h:145
+msgid ""
+"Display the list of duplicates that have been detected after adding files."
+msgstr ""
+"Mostrar la lista de ficheros duplicados que han sido detectados al añadir "
+"ficheros."
+
+#: ../data/gtkpod.glade.h:146
+msgid "Display toolbar..."
+msgstr "Mostrar barra de herramientas..."
+
+#: ../data/gtkpod.glade.h:147
+msgid "Display tooltips in main window"
+msgstr "Mostrar sugerencias en la ventana principal"
+
+#: ../data/gtkpod.glade.h:148
+msgid "Display tooltips in prefs window"
+msgstr "Mostrar sugerencias en la ventana de preferencias"
+
+#: ../data/gtkpod.glade.h:149
+msgid "Display tracks that match the criteria entered above."
+msgstr "Mostrar las pistas que concuerden con el criterio de búsqueda."
+
+#: ../data/gtkpod.glade.h:150
+msgid ""
+"Displayed\n"
+"Tracks"
+msgstr ""
+"Pistas\n"
+"mostradas"
+
+#: ../data/gtkpod.glade.h:152
+#, fuzzy
+msgid "Displayed:"
+msgstr "_Mostrar"
+
+#: ../data/gtkpod.glade.h:153
+msgid "Don't allow file duplication"
+msgstr "No permitir ficheros duplicados"
+
+#: ../data/gtkpod.glade.h:154
+msgid "Don't automatically sync on startup"
+msgstr "No sincronizar automáticamente al inicio"
+
+#: ../data/gtkpod.glade.h:155
+msgid "Duplicate Recognition is based on a (modified) sha1 hash over the file."
+msgstr ""
+"El reconocimiento de duplicados está basado en una función de resumen sha1 "
+"(modificada) sobre el fichero."
+
+#: ../data/gtkpod.glade.h:156
+msgid "Edit Repository/iPod Options"
+msgstr "Editar opciones del iPod/repositorio"
+
+#: ../data/gtkpod.glade.h:157 ../src/context_menus.c:662
+msgid "Edit Smart Playlist"
+msgstr "Editar lista de reproducción inteligente."
+
+#: ../data/gtkpod.glade.h:158 ../src/context_menus.c:749
+msgid "Edit Track Details"
+msgstr "Editar detalles de la pista"
+
+#: ../data/gtkpod.glade.h:159
+msgid "Edit _Preferences"
+msgstr "Editar _preferencias"
+
+#: ../data/gtkpod.glade.h:160
+msgid "Effective free space"
+msgstr "Espacio disponible"
+
+#: ../data/gtkpod.glade.h:161
+msgid "Empty Playlist"
+msgstr "Lista de reproducción vacía"
+
+#: ../data/gtkpod.glade.h:162
+msgid "Exclude file mask(s)"
+msgstr "Mascara(s) de exclusión de ficheros"
+
+#: ../data/gtkpod.glade.h:163
+#, fuzzy
+msgid "Export can be continued at a later time if canceled."
+msgstr ""
+"Pulsar boton para cancelar.\n"
+"La exportación podrá continuar más tarde."
+
+#: ../data/gtkpod.glade.h:164
+msgid "File size"
+msgstr "Tamaño de fichero"
+
+#: ../data/gtkpod.glade.h:165
+msgid "File size (deleted)"
+msgstr "Tamaño de fichero (borrado)"
+
+#: ../data/gtkpod.glade.h:166
+msgid "File size (non-transferred)"
+msgstr "Tamaño de fichero (no transferido)"
+
+#: ../data/gtkpod.glade.h:167
+msgid "Filename Format: "
+msgstr "Formato de nombre de fichero:"
+
+#: ../data/gtkpod.glade.h:168
+msgid ""
+"Find orphan files (files with no track info in DB) and dangling tracks "
+"(tracks with no corresponding files on iPod)"
+msgstr ""
+"Buscar ficheros huérfanos (ficheros sin información de la pista en la base "
+"de datos) y pistas pendientes (pistas sin sus correspondientes ficheros en "
+"el iPod)"
+
+#: ../data/gtkpod.glade.h:169
+#, fuzzy
+msgid "First try <i>folder.jpg</i>, then <i>&lt;artist&gt;.jpg</i>"
+msgstr "Intentar primero <i>folder.jpg</i>, después <i>&lt;artist&gt;.jpg</i>"
+
+#: ../data/gtkpod.glade.h:170
+msgid "Flac with :"
+msgstr "Flac con:"
+
+#: ../data/gtkpod.glade.h:172
+#, no-c-format
+msgid ""
+"For example, 'xmms %s' will clear xmms' current playlist, add the selected "
+"tracks and start playing."
+msgstr ""
+"Por ejemplo, 'xmms %s' limpiará la actual lista de reproducción, añadirá las "
+"pistas seleccionadas y comenzará su reproducción."
+
+#: ../data/gtkpod.glade.h:174
+#, no-c-format
+msgid ""
+"For example, 'xmms -e %s' will append (enqueue) the selected tracks to xmms' "
+"current playlist."
+msgstr ""
+"Por ejemplo, 'xmms -e %s' añadirá las pistas seleccionadas al final de la "
+"actual lista de reproducción de xmms."
+
+#: ../data/gtkpod.glade.h:175 ../src/display_sorttabs.c:2985
+#: ../src/display_spl.c:89 ../src/misc_conversion.c:63
+msgid "Genre"
+msgstr "Género"
+
+#: ../data/gtkpod.glade.h:176
+msgid "Group artists on compilation CDs"
+msgstr "Agrupar los artistas en los CDs generados"
+
+#: ../data/gtkpod.glade.h:177
+msgid ""
+"Highly recommended for faster import when taking advantage of the "
+"duplication recognition. Also, having the PC filenames allows writing "
+"changed ID3 tags to disk, and even to reconstruct your iPod's contents in "
+"case of file system corruption (change the \"transferred=\" entries in your "
+"backuped database)."
+msgstr ""
+"Altamente recomendado para conseguir una importación más rápida cuando se "
+"está usando la detección de duplicados. También, el tener los nombres de "
+"fichero del PC permite escribir las etiquetas ID3 modificadas al disco, e "
+"incluso recontruir los contenidos del iPod en caso de corrupción del sistema "
+"de ficheros (cambiar las entradas \"transferred=\" en la copia de seguridad "
+"de la base de datos)."
+
+#: ../data/gtkpod.glade.h:178 ../src/context_menus.c:685
+#: ../src/context_menus.c:703 ../src/context_menus.c:820
+msgid "I'm sure"
+msgstr "Estoy seguro"
+
+#: ../data/gtkpod.glade.h:179
+msgid ""
+"If available, the local copy of the track is referenced in the playlist. "
+"Otherwise the file on the iPod is used."
+msgstr ""
+"En caso de estar disponible se usará en la lista de reproducción la copia "
+"local de la pista, sino se usará el fichero del iPod."
+
+#: ../data/gtkpod.glade.h:180
+msgid "If both options are selected, embedded APIC data takes precedence."
+msgstr ""
+"Si están seleccionadas ambas opciones, la información empotrada APIC tiene "
+"preferencia."
+
+#: ../data/gtkpod.glade.h:181
+msgid ""
+"If checked, sorting will be case sensitive. Please note that case sensitive "
+"sorting will not work well with most charsets."
+msgstr ""
+"En caso de estar marcado, la ordenación distinguirá mayúsculas y minúsculas. "
+"Tenga en cuenta que una ordenación de este tipo no funciona bien con todos "
+"los juegos de caracteres."
+
+#: ../data/gtkpod.glade.h:182
+msgid ""
+"If the filename (full path) of an existing track matches that of a track to "
+"be added, this option allows you to update the information about the "
+"existing track rather than just skipping the track altogether. No update "
+"will take place if the file hasn't changed and you have selected the 'Don't "
+"allow file duplication' option above."
+msgstr ""
+"Si el nombre (ruta completa) de una pista existente concuerda con una a "
+"añadir, esta opción permite actualizar la información de la pista existente "
+"en vez de ignorar la pista a añadir. No se actualizará la información si el "
+"fichero no ha cambiado y está seleccionada la opción 'No permitir ficheros "
+"duplicados' más arriba."
+
+#: ../data/gtkpod.glade.h:183
+msgid "If you check this, gtkpod will descend into subdirectories recursively."
+msgstr ""
+"Con esta opción, gtkpod descenderá recursivamente en los subdirectorios."
+
+#: ../data/gtkpod.glade.h:184
+msgid ""
+"If you check this, information (cover art and meta information) changed for "
+"this track will be copied to all other selected tracks as well. Use with "
+"care."
+msgstr ""
+"Si está seleccionado, la información (portada o meta-información) de la "
+"pista que se modifique será copiada a la vez a todas las otras pistas "
+"seleccionadas. Usar con precaución."
+
+#: ../data/gtkpod.glade.h:185
+msgid ""
+"If you don't select the master playlist automatically, the initial database "
+"import is much faster because the display dosn't have to be updated."
+msgstr ""
+"Si no se selecciona la lista de reproducción principal automáticamente, la "
+"importación inicial de la base de datos es mucho más rápida porque no es "
+"necesario actualizar la pantalla."
+
+#: ../data/gtkpod.glade.h:186
+msgid ""
+"If you select several tracks in the track list and edit a tag of the first "
+"track, the tags in the other tracks are updated as well."
+msgstr ""
+"Si se seleccionan varias pistas en la lista de pistas y se edita un atributo "
+"en una de las pistas, el atributo también es actualizado en el resto de las "
+"pistas seleccionadas."
+
+#: ../data/gtkpod.glade.h:187
+msgid "Ignore these words when at the beginning of the following fields:"
+msgstr ""
+"Ignorar estas palabras cuando se encuentren al principio de los siguientes "
+"campos:"
+
+#: ../data/gtkpod.glade.h:188
+msgid ""
+"In order to save the displayed track order to the iPod choose 'Save "
+"Displayed Track Order' from the 'Edit' menu or select 'Auto Store' below."
+msgstr ""
+"Pulse 'Guardar' para salvar el orden de las pistas mostradas al iPod. Orden "
+"de las pistas mostradas del menú 'Editar' o seleccionar 'Guardar "
+"automáticamente' más abajo."
+
+#: ../data/gtkpod.glade.h:189
+msgid "Initialize iPod"
+msgstr "Inicializar iPod"
+
+#: ../data/gtkpod.glade.h:190
+msgid ""
+"Insert before\n"
+"Insert after"
+msgstr ""
+"Insertar antes\n"
+"Insertar después"
+
+#: ../data/gtkpod.glade.h:192
+msgid "Keeps all compilation CDs grouped together in the artists sort tab."
+msgstr "Mantiene agrupados en la pestaña de artistas todos los CDs generados."
+
+#: ../data/gtkpod.glade.h:193
+msgid "Live _updating"
+msgstr "Act_ualización directa"
+
+#: ../data/gtkpod.glade.h:194
+msgid "Load iPod(s)"
+msgstr "Cargar iPod(s)"
+
+#: ../data/gtkpod.glade.h:195
+msgid "Lower Margin"
+msgstr "Margen inferior"
+
+#: ../data/gtkpod.glade.h:196
+msgid "M4A with :"
+msgstr "M4A con:"
+
+#: ../data/gtkpod.glade.h:197
+msgid "MP3 with :"
+msgstr "MP3 con:"
+
+#: ../data/gtkpod.glade.h:198
+msgid "Match al_l of the following"
+msgstr "Encontrar todo _lo siguiente"
+
+#: ../data/gtkpod.glade.h:199
+msgid "Match an_y of the following"
+msgstr "Encontrar algo de lo siguiente (_y)"
+
+#: ../data/gtkpod.glade.h:200
+msgid "Match only _checked tracks"
+msgstr "Encontrar sólo pistas verifi_cadas"
+
+#: ../data/gtkpod.glade.h:201
+msgid "Maximum number of background threads:"
+msgstr "Número máximo de hilos en segundo plano."
+
+#: ../data/gtkpod.glade.h:202
+msgid "Maximum size of cache directory (in GB):"
+msgstr "Tamaño máximo del directorio de cache (en GiB):"
+
+#: ../data/gtkpod.glade.h:203
+msgid "Model:"
+msgstr "Modelo:"
+
+#: ../data/gtkpod.glade.h:204 ../src/display_tracks.c:2100
+msgid "Modified"
+msgstr "Modificado"
+
+#: ../data/gtkpod.glade.h:205
+msgid "Most Recently Played Tracks"
+msgstr "Pistas más recientemente escuchadas"
+
+#: ../data/gtkpod.glade.h:206
+msgid "Move selected attributes to the displayed list"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:207
+msgid "Music Root:"
+msgstr "Directorio raíz de la música:"
+
+#: ../data/gtkpod.glade.h:208
+msgid ""
+"Music files can have images embedded in the APIC tag. Currently this is only "
+"supported for MP3 files."
+msgstr ""
+"Los ficheros de música pueden tener imágenes empotradas en la etiqueta APIC. "
+"Actualmente sólo soportado para ficheros MP3."
+
+#: ../data/gtkpod.glade.h:209
+msgid "Never show this dialogue again"
+msgstr "No volver a mostrar este diálogo"
+
+#: ../data/gtkpod.glade.h:210 ../src/display_spl.c:1719
+#: ../src/misc_playlist.c:66 ../src/misc_playlist.c:68
+#: ../src/misc_playlist.c:93 ../src/misc_playlist.c:95
+#: ../src/misc_playlist.c:428 ../src/misc_playlist.c:430
+msgid "New Playlist"
+msgstr "Nueva lista de reproducción"
+
+#: ../data/gtkpod.glade.h:211
+msgid "No lower margin"
+msgstr "Sin margen inferior"
+
+#: ../data/gtkpod.glade.h:212
+msgid "No upper margin"
+msgstr "Sin margen superior"
+
+#: ../data/gtkpod.glade.h:213
+msgid "Non-transferred tracks"
+msgstr "Pistas no transferidas"
+
+#: ../data/gtkpod.glade.h:214
+msgid "None"
+msgstr "Ninguno"
+
+#: ../data/gtkpod.glade.h:215
+msgid ""
+"Normally the charset specified when first importing the track will be used "
+"for the filename. If you set this option you can set a different charset "
+"with the charset selector (Preferences/'Adding/Updating/Syncing'). Note: the "
+"charset info is stored in the extended information file (see "
+"Preferences/'Writing of the iTunesDB'). Tracks imported before V0.51 will "
+"have no charset stored. Instead the charset specified will be used."
+msgstr ""
+"Por defecto para el nombre del fichero se usará el juego de caracteres "
+"especificado en el momento de importar la pista. Con esta opción se puede "
+"configurar un juego de carácteres diferente (Preferencias/'Añadir/Actualizar/"
+"Sincronizar'). Nota: la información del juego de caracteres se guarda en el "
+"fichero de información (ver Preferencias/'Escribiendo la base de datos "
+"iTunes'). Las pistas importadas con versiones previas a la 0.51 no tienen "
+"almacenado el juego de caracteres."
+
+#: ../data/gtkpod.glade.h:216
+msgid ""
+"Normally the charset specified when first importing the track will be used "
+"to update the track information. If you have chosen a wrong charset when "
+"first importing a track and want to correct it using the 'Update Track' "
+"function, you must check this option. Note: the charset info is stored in "
+"the extended information file (see 'Writing of iTunesDB' below) and tracks "
+"imported before V0.51 will have no charset stored. Instead the charset "
+"specified above will be used then."
+msgstr ""
+"Por defecto al actualizar la información de las pistas se usa el juego de "
+"caracteres de su importación. Si se ha elegido un juego de caracteres "
+"erroneo y se quiere corregir al actualizar la información de las pistas se "
+"debe marcar esta opción. Nota: la información del juego de caracteres se "
+"guarda en el fichero de información extendida (ver 'Escribir la base de "
+"datos iTunes' mas abajo). Las pistas importadas con versiones previas a la "
+"0.51 no tienen almacenado el juego de caracteres."
+
+#: ../data/gtkpod.glade.h:217
+msgid ""
+"Normally the charset specified when first importing the track will be used "
+"to write the tags. If you have chosen a wrong charset when first importing a "
+"track, you should select this option along with the correct charset.  Note: "
+"uses the extended information file to store the charset information (see "
+"'Writing of the iTunesDB' on the 'Input/Output' page) and tracks imported "
+"before V0.51 will have no charset stored -- the charset specified on the "
+"'Input/Output' page will be used."
+msgstr ""
+"Por defecto se usará el juego de caracteres especificado en la importación "
+"al escribir los atributos. Si se ha elegido un juego de caracteres erroneo "
+"en la importación de la pista, se puede seleccionar esta opción junto con el "
+"juego de caracteres correcto. Nota: usa el fichero de información extendida "
+"para almacenar la información del juego de caracteres (ver 'Escribiendo la "
+"base de datos iTunes' en el apartado de 'Entrada/Salida'). Las pistas "
+"importadas con versiones anteriores a la 0.51 no tendrán el juego de "
+"caracteres almacenado, el juego de caracteres usado será el especificado en "
+"el apartado de 'Entrada/Salida'."
+
+#: ../data/gtkpod.glade.h:218
+msgid ""
+"Normally, if a track is no longer present in the sync directory, it will be "
+"removed from the playlist, but not from the iPod or local repository.\n"
+"If this option is checked, tracks will be completely removed from the iPod "
+"or local repository, unless the track is a member of other playlists as "
+"well.\n"
+"NOTE: if you sync with the master playlist, you must check this option if "
+"you want tracks to be removed, because removing from the master playlist "
+"means removing from the iPod."
+msgstr ""
+"Normalmente, si una pista no se encuentra presente en el directorio de "
+"sincronización, esta será borrada de la lista de reproducción, pero no del "
+"iPod o del repositorio local.\n"
+"Si esta opción está marcada, las pistas serán borradas por completo del iPod "
+"o del repositorio local a no ser que la pista pertenezca también a otras "
+"listas de reproducción.\n"
+"Nota: si se sincroniza con la lista de reproducción maestra, esta opción "
+"debe estar seleccionada, porque borrar de la lista de reproducción maestra "
+"significa borrar del iPod."
+
+#: ../data/gtkpod.glade.h:221
+msgid "Notes sync command:"
+msgstr "Programa de sincronización de notas:"
+
+#: ../data/gtkpod.glade.h:222
+msgid "Number of playlists"
+msgstr "Número de listas de reproducción"
+
+#: ../data/gtkpod.glade.h:223
+msgid "Number of tracks"
+msgstr "Número de pistas"
+
+#: ../data/gtkpod.glade.h:224
+msgid "Number of tracks in generated playlists:"
+msgstr ""
+"Número de pistas en las listas de reproducción generadas automáticamente:"
+
+#: ../data/gtkpod.glade.h:225
+msgid ""
+"Number of tracks in the generated playlists 'Most Often Listened', 'Best "
+"Rated' and 'Most Recently Played'. Choose '0' for 'no limit'."
+msgstr ""
+"Número de pistas en las listas de reproducción 'Más frecuentemente usadas', "
+"'Mejor puntuadas' y 'Más recientemente reproducidas' generadas "
+"automáticamente. Elegir '0' para suprimir el límite."
+
+#: ../data/gtkpod.glade.h:226
+msgid "Ogg with :"
+msgstr "Ogg con:"
+
+#: ../data/gtkpod.glade.h:227
+msgid "On startup automatically sync with playlist directories"
+msgstr ""
+"Sincronizar automáticamente con los directorios de las listas de "
+"reproducción en el inicio."
+
+#: ../data/gtkpod.glade.h:228
+msgid "On startup automatically sync with the following directory"
+msgstr "Sincronizar automáticamente al inicio con el siguiente directorio"
+
+#: ../data/gtkpod.glade.h:229
+msgid "On startup automatically update (Live Playlist)"
+msgstr "Actualizar automáticamente en el inicio (listas de reproducción vivas)"
+
+#: ../data/gtkpod.glade.h:230
+msgid "One for each Album"
+msgstr "Una para cada álbum"
+
+#: ../data/gtkpod.glade.h:231
+msgid "One for each Artist"
+msgstr "Una para cada artista"
+
+#: ../data/gtkpod.glade.h:232
+msgid "One for each Composer"
+msgstr "Una para cada compositor"
+
+#: ../data/gtkpod.glade.h:233
+msgid "One for each Genre"
+msgstr "Una para cada género"
+
+#: ../data/gtkpod.glade.h:234
+msgid "One for each Rating"
+msgstr "Una para cada puntuación"
+
+#: ../data/gtkpod.glade.h:235
+msgid "One for each Year"
+msgstr "Una para cada año"
+
+#: ../data/gtkpod.glade.h:236
+msgid "Overwrite tags that are already set"
+msgstr "Sobreescribir atributos ya establecidos"
+
+#: ../data/gtkpod.glade.h:237
+msgid "Password:"
+msgstr "Contraseña:"
+
+#: ../data/gtkpod.glade.h:238
+msgid "Path:"
+msgstr "Ruta:"
+
+#: ../data/gtkpod.glade.h:239
+#, fuzzy
+msgid "Photo Window"
+msgstr "Ventana de _información"
+
+#: ../data/gtkpod.glade.h:240 ../src/display_spl.c:94
+msgid "Play time"
+msgstr "Tiempo de reproducción"
+
+#: ../data/gtkpod.glade.h:241 ../src/display_spl.c:98
+#: ../src/misc_conversion.c:77
+msgid "Playcount"
+msgstr "Contador"
+
+#: ../data/gtkpod.glade.h:242 ../src/display_tracks.c:2097
+msgid "Played"
+msgstr "Reproducido"
+
+#: ../data/gtkpod.glade.h:243
+msgid "Playlist name:"
+msgstr "Nombre de la lista de reproducción:"
+
+#: ../data/gtkpod.glade.h:244
+msgid "Playlist type:"
+msgstr "Tipo de lista de reproducción:"
+
+#: ../data/gtkpod.glade.h:245 ../src/display_playlists.c:2258
+msgid "Playlists"
+msgstr "Listas de reproducción"
+
+#: ../data/gtkpod.glade.h:246
+msgid "Please refer to the notice below."
+msgstr "Leer nota inferior"
+
+#: ../data/gtkpod.glade.h:247
+msgid "Please specify a time interval"
+msgstr "Especificar un intervalo de tiempo"
+
+#: ../data/gtkpod.glade.h:248
+msgid "Preferences"
+msgstr "Preferencias"
+
+#: ../data/gtkpod.glade.h:249
+msgid "Progress Information"
+msgstr "Información del progreso"
+
+#: ../data/gtkpod.glade.h:250
+msgid "R_ename Album"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:251
+msgid "Random Playlist from Displayed Tracks"
+msgstr "Lista de reproducción aleatoria de las pistas mostradas"
+
+#: ../data/gtkpod.glade.h:252
+msgid "Randomize Current Playlist"
+msgstr "Lista de reproducción actual aleatoria"
+
+#: ../data/gtkpod.glade.h:253 ../src/display_spl.c:101
+#: ../src/misc_conversion.c:78
+msgid "Rating"
+msgstr "Puntuación"
+
+#: ../data/gtkpod.glade.h:254
+msgid "Read coverart from embedded APIC data"
+msgstr "Leer carátula de la información empotrada APIC"
+
+#: ../data/gtkpod.glade.h:255
+msgid "Read tags from file contents (e.g. ID3 tags in MP3 files)"
+msgstr ""
+"Leer atributos del contenido del fichero (p.e: atributos ID3 en ficheros MP3)"
+
+#: ../data/gtkpod.glade.h:256
+#, fuzzy
+msgid "Remove selected attributes from the displayed list"
+msgstr "Pistas seleccionadas de la lista de reproducción"
+
+#: ../data/gtkpod.glade.h:257
+msgid "Repository Options"
+msgstr "Opciones de repositorio"
+
+#: ../data/gtkpod.glade.h:258
+msgid "Repository name:"
+msgstr "Nombre del repositorio:"
+
+#: ../data/gtkpod.glade.h:259
+msgid "Repository type:"
+msgstr "Tipo de repositorio:"
+
+#: ../data/gtkpod.glade.h:260
+msgid "Root directory of mserv database (trackinfo root)."
+msgstr ""
+"Directorio raíz de la base de datos mserv (raíz de la información sobre las "
+"pistas)."
+
+#: ../data/gtkpod.glade.h:261
+msgid "Rules"
+msgstr "Reglas"
+
+#: ../data/gtkpod.glade.h:262 ../src/context_menus.c:804
+msgid "Save Changes"
+msgstr "Guardar cambios"
+
+#: ../data/gtkpod.glade.h:263
+#, fuzzy
+msgid "Scrobble Tracks?"
+msgstr "Scrobble Tracks?"
+
+#: ../data/gtkpod.glade.h:264
+msgid "Select '-1' for no upper limit."
+msgstr "Seleccionar '-1' para eliminar el límite superior."
+
+#: ../data/gtkpod.glade.h:265
+msgid "Select '0' for no lower limit."
+msgstr "Seleccionar '0' para eliminar el límite inferior."
+
+#: ../data/gtkpod.glade.h:266
+msgid ""
+"Selected\n"
+"Playlist"
+msgstr ""
+"Lista de reproducción\n"
+"seleccionada"
+
+#: ../data/gtkpod.glade.h:268
+msgid ""
+"Selected\n"
+"Tracks"
+msgstr ""
+"Pistas\n"
+"seleccionadas"
+
+#: ../data/gtkpod.glade.h:270
+#, fuzzy
+msgid "Selected Filter Tab Entry from Database"
+msgstr "Borrar selección de la base de datos"
+
+#: ../data/gtkpod.glade.h:271
+#, fuzzy
+msgid "Selected Filter Tab Entry from Hard Disk"
+msgstr "Borrar selección del disco duro"
+
+#: ../data/gtkpod.glade.h:272
+#, fuzzy
+msgid "Selected Filter Tab Entry from Playlist"
+msgstr "Pestaña seleccionada de la lista de reproducción"
+
+#: ../data/gtkpod.glade.h:273
+#, fuzzy
+msgid "Selected Filter Tab Entry from iPod"
+msgstr "Borrar selección del iPod"
+
+#: ../data/gtkpod.glade.h:274
+#, fuzzy
+msgid "Selected Playlist Including Tracks from Database"
+msgstr ""
+"Lista de reproducción seleccionada incluyendo pistas de la base de datos"
+
+#: ../data/gtkpod.glade.h:275
+#, fuzzy
+msgid "Selected Playlist Including Tracks from Hard Disk"
+msgstr "Lista de reproducción seleccionada incluyendo pistas del disco duro"
+
+#: ../data/gtkpod.glade.h:276
+#, fuzzy
+msgid "Selected Playlist Including Tracks from iPod"
+msgstr "Lista de reproducción seleccionada incluyendo pistas del iPod"
+
+#: ../data/gtkpod.glade.h:277
+msgid "Selected Tab _Entry"
+msgstr "_Entrada de pestaña seleccionada"
+
+#: ../data/gtkpod.glade.h:278
+#, fuzzy
+msgid "Selected Tracks from Database"
+msgstr "Pistas seleccionadas de la base de datos"
+
+#: ../data/gtkpod.glade.h:279
+#, fuzzy
+msgid "Selected Tracks from Hard Disk"
+msgstr "Pistas seleccionadas del disco duro"
+
+#: ../data/gtkpod.glade.h:280
+#, fuzzy
+msgid "Selected Tracks from Playlist"
+msgstr "Pistas seleccionadas de la lista de reproducción"
+
+#: ../data/gtkpod.glade.h:281
+#, fuzzy
+msgid "Selected Tracks from iPod"
+msgstr "Pistas seleccionadas del iPod"
+
+#: ../data/gtkpod.glade.h:282
+msgid "Selected _Playlist"
+msgstr "_Lista de reproducción seleccionada"
+
+#: ../data/gtkpod.glade.h:283
+msgid "Selected _Tracks"
+msgstr "_Pistas seleccionadas"
+
+#: ../data/gtkpod.glade.h:284
+msgid "Selected playlist"
+msgstr "Lista de reproducción seleccionada"
+
+#: ../data/gtkpod.glade.h:285
+msgid "Semicolon separated list of file exclusion masks, e.g. '*.mp3'"
+msgstr ""
+"Lista de máscaras de exclusión de ficheros separadas por punto y coma. p.e: "
+"'*.mp3'"
+
+#: ../data/gtkpod.glade.h:286
+#, fuzzy
+msgid "Set Cover Art from _File"
+msgstr "Usar fichero para configurar la carátula"
+
+#: ../data/gtkpod.glade.h:287
+msgid "Set mountpoint or edit repository options"
+msgstr "Configurar el punto de montaje o editar las opciones de repositorio"
+
+#: ../data/gtkpod.glade.h:288
+msgid "Set options for Calendar/Contacts/Notes"
+msgstr "Configurar opciones para Calendario/Contactos/Notas"
+
+#: ../data/gtkpod.glade.h:289
+msgid ""
+"Set this to 'aacgain -q -k' to use the 'Normalize volume' functionality in "
+"the Tools Menu. If this is set, missing normalization data for .m4a and .m4b "
+"files will be calculated and written to your music file using this command."
+msgstr ""
+"Configurar esto a 'aacgain -q -k' para usar la función 'Normalizar el "
+"volumen' en el menú Herramientas. En caso de estar configurado, los datos de "
+"normalización serán calculados y escritos a los ficheros .m4a y m4b que no "
+"los tengan usando este comando."
+
+#: ../data/gtkpod.glade.h:290
+msgid ""
+"Set this to 'mp3gain -q -k' to use the 'Normalize volume' functionality in "
+"the Tools Menu. If this is set, missing normalization data for mp3 files "
+"will be calculated and written to your mp3 file using this command."
+msgstr ""
+"Configurar a 'mp3gain -q -k' para usar la función 'Normalizar el volumen' en "
+"el menú Herramientas. En caso de estar configurado, los datos de "
+"normalización serán calculados y escritos a los ficheros mp3 que no los "
+"tengan usando este comando."
+
+#: ../data/gtkpod.glade.h:291
+msgid "Set this to your last.fm password"
+msgstr "Poner aquí la contraseña de last.fm"
+
+#: ../data/gtkpod.glade.h:292
+msgid "Set this to your last.fm username"
+msgstr "Poner aquí el nombre de usuario de last.fm"
+
+#: ../data/gtkpod.glade.h:293
+msgid ""
+"Set to 0 to effectively disable caching (a maximum of one track will be "
+"cached at a time)."
+msgstr ""
+"Poner a 0 para desactivar el caché (un máximo de una pista será cacheada "
+"cada vez)."
+
+#: ../data/gtkpod.glade.h:294
+msgid ""
+"Set to 0 to use as many background threads as CPUs are available on your "
+"system."
+msgstr ""
+"Poner a 0 para usar tantos hilos en segundo plano como CPUs disponibles en "
+"el sistema."
+
+#: ../data/gtkpod.glade.h:295
+msgid "Show information about problems when accessing mserv"
+msgstr "Mostrar errores en el acceso a mserv"
+
+#: ../data/gtkpod.glade.h:296
+msgid "Show summary of sync result"
+msgstr "Mostrar resumen del resultado de la sincronización"
+
+#: ../data/gtkpod.glade.h:297 ../src/misc_playlist.c:96
+#: ../src/repository.c:1356
+msgid "Smart Playlist"
+msgstr "Lista de reproducción inteligente"
+
+#: ../data/gtkpod.glade.h:298
+msgid "Sort tracks according to: "
+msgstr "Ordenar pistas respecto a:"
+
+#: ../data/gtkpod.glade.h:299
+msgid "Sorting Options"
+msgstr "Opciones de ordenamiento"
+
+#: ../data/gtkpod.glade.h:300
+msgid "Sorting case sensitive"
+msgstr "Ordenamiento distinguiendo mayúsculas y minúsculas"
+
+#: ../data/gtkpod.glade.h:301
+msgid "Sorttab: "
+msgstr "Pestaña:"
+
+#: ../data/gtkpod.glade.h:302
+msgid "Sorttabs"
+msgstr "Orden de pestañas"
+
+#: ../data/gtkpod.glade.h:303
+msgid "Source:"
+msgstr "Fuente:"
+
+#: ../data/gtkpod.glade.h:305
+#, no-c-format
+msgid ""
+"Specify exact path including command line options. '%i' will be replaced "
+"with the mount point of the iPod."
+msgstr ""
+"Especificar la ruta completa del programa, incluyendo opciones del "
+"intérprete de órdenes. '%i' será reemplazado con el directorio de montaje "
+"del iPod."
+
+#: ../data/gtkpod.glade.h:306
+msgid "Specify interval"
+msgstr "Especificar intervalo"
+
+#: ../data/gtkpod.glade.h:307
+msgid "Start display automatically"
+msgstr "Mostrar automáticamente"
+
+#: ../data/gtkpod.glade.h:308
+msgid "Synchronise Contacts, Calendar and Notes"
+msgstr "Sincronizar contactos, calendarios y notas"
+
+#: ../data/gtkpod.glade.h:309
+msgid "Synchronize All"
+msgstr "Sincronizar todo"
+
+#: ../data/gtkpod.glade.h:310
+msgid "Synchronize Calendar"
+msgstr "Sincronizar calendario"
+
+#: ../data/gtkpod.glade.h:311
+msgid "Synchronize Contacts"
+msgstr "Sincronizar contactos"
+
+#: ../data/gtkpod.glade.h:312
+msgid "Synchronize Notes"
+msgstr "Sincronizar notas"
+
+#: ../data/gtkpod.glade.h:313
+msgid "Template for info field: "
+msgstr "Plantilla para el campo de información:"
+
+#: ../data/gtkpod.glade.h:314
+msgid ""
+"The local copy of the track is referenced in the playlist. If the track is "
+"not available locally, an error message is displayed."
+msgstr ""
+"La copia local de la pista se usará en la lista de reproducción. Si la pista "
+"no está disponible localmente, se producirá un error."
+
+#: ../data/gtkpod.glade.h:315
+msgid ""
+"The output of the background conversion scripts is copied below. Each page "
+"of the notebook corresponds to one background thread."
+msgstr ""
+"La salida de los guiones de conversión en segundo plano es mostrada abajo. "
+"Cada página del libro de notas corresponde a un hilo en segundo plano."
+
+#: ../data/gtkpod.glade.h:316
+msgid ""
+"The tags are written to the files on your harddrive and on the iPod (if "
+"available)."
+msgstr ""
+"Los atributos son escritos a los ficheros del disco duro y del iPod (si está "
+"disponible)."
+
+#: ../data/gtkpod.glade.h:317
+msgid "The track on the iPod is referenced in the playlist file."
+msgstr "La pista del iPod será usada en la lista de reproducción."
+
+#: ../data/gtkpod.glade.h:318
+msgid "This is the same option as in 'Edit/Delete Confirmation'"
+msgstr "Esta es la misma opcion que en 'Confirmar Editar/Borrar'"
+
+#: ../data/gtkpod.glade.h:319
+msgid ""
+"This is the way to go, but maybe not all programs support it yet. ID3v2.4 "
+"uses unicode to store the tags, so you won't have to worry about charsets "
+"any more. gtkpod will use UTF8 encoding as this will not increase the size "
+"of pure ASCII tags. ID3v2.2/4 tags will also be written if they are already "
+"present in the file to write to."
+msgstr ""
+"Esta es la forma de hacerlo, pero quizás no todos los programas lo soporten "
+"todavía: ID3v2.4 usa unicode para guardar los atributos, por lo que nunca "
+"más será necesario preocuparse por los juegos de caracteres. gtkpod va a "
+"usar codificación UTF8 porque esta no aumentará el tamaño de los atributos "
+"en ASCII. Los atributos ID·v2.2/4 también serán escritos si se encuentran "
+"previamente en el fichero a escribir."
+
+#: ../data/gtkpod.glade.h:320
+msgid "This option will be re-activated when you upgrade gtkpod."
+msgstr "Esta opción se reactivará al acualizar gtkpod."
+
+#: ../data/gtkpod.glade.h:321
+msgid "Time:"
+msgstr "Tiempo:"
+
+#: ../data/gtkpod.glade.h:322 ../src/display_sorttabs.c:2991
+#: ../src/display_spl.c:83 ../src/misc_conversion.c:62
+msgid "Title"
+msgstr "Título"
+
+#: ../data/gtkpod.glade.h:323
+msgid ""
+"Total\n"
+"(iPod)"
+msgstr ""
+"Total\n"
+"(iPod)"
+
+#: ../data/gtkpod.glade.h:325
+msgid ""
+"Total\n"
+"(local)"
+msgstr ""
+"Total\n"
+"(local)"
+
+#: ../data/gtkpod.glade.h:327
+msgid "Tracks"
+msgstr "Pistas"
+
+#: ../data/gtkpod.glade.h:328
+msgid "Tracks Most Often Listened To"
+msgstr "Pistas escuchadas más a menudo"
+
+#: ../data/gtkpod.glade.h:329
+msgid ""
+"Tracks can be transferred in the background as soon as they are added to an "
+"iPod repository. Otherwise they will be transferred when ejecting the "
+"contents of the iPod completely unchanged until then."
+msgstr ""
+"Las pistas pueden ser transferidas en segundo plano nada más ser añadidas al "
+"repositorio del iPod. En caso contrario serán transferidas al expulsar el "
+"iPod, sin hacer modificaciones hasta entonces."
+
+#: ../data/gtkpod.glade.h:330
+msgid "Tracks in Selected Tab _Entry"
+msgstr "Pistas en la pestaña s_eleccionada"
+
+#: ../data/gtkpod.glade.h:331
+msgid "Tracks in Selected _Playlist"
+msgstr "Pistas en la lista de re_producción seleccionada"
+
+#: ../data/gtkpod.glade.h:332
+msgid "Transfer tracks to the iPod in the background"
+msgstr "Transferir pistas al iPod en segundo plano"
+
+#: ../data/gtkpod.glade.h:333
+msgid "Translators"
+msgstr "Traductores"
+
+#: ../data/gtkpod.glade.h:334
+msgid ""
+"Try to load contents of all connected iPods. For each iPod a separate "
+"repository must be set up."
+msgstr ""
+"Intentar cargar los contenidos de todos los iPods. Debe configurarse un "
+"repositorio individual para cada iPod."
+
+#: ../data/gtkpod.glade.h:335
+#, fuzzy
+msgid "Undo _Track"
+msgstr "_Deshacer pista"
+
+#: ../data/gtkpod.glade.h:336
+msgid "Update _mserv Data from File"
+msgstr "Actualizar datos de _mserv desde fichero"
+
+#: ../data/gtkpod.glade.h:337
+msgid "Update/Sync all playlists now"
+msgstr "Actualizar/sincronizar ahora todas las listas de reproducción."
+
+#: ../data/gtkpod.glade.h:338
+msgid "Update/Sync playlist now"
+msgstr "Actualizar/sincronizar ahora las listas de reproducción"
+
+#: ../data/gtkpod.glade.h:339
+msgid "Upper margin"
+msgstr "Margen superior"
+
+#: ../data/gtkpod.glade.h:340
+msgid "Use 'Multi-Edit' also for title field"
+msgstr "Usar 'Multi-Edición' también para el campo título"
+
+#: ../data/gtkpod.glade.h:341
+msgid "Use 'Multi-Edit' for tracks selections"
+msgstr "Usar 'Multi-Edición' en la selección de las pistas"
+
+#: ../data/gtkpod.glade.h:342
+#, fuzzy
+msgid "Use <i>&lt;Album&gt;.jpg</i> in the parent directory"
+msgstr "Usar <i>&lt;Álbum&gt;.jpg</i> en el directorio padre"
+
+#: ../data/gtkpod.glade.h:343
+#, fuzzy
+msgid "Use <i>&lt;Album&gt;.jpg</i>, <i>&lt;Album&gt;.png</i>..."
+msgstr "Usar <i>&lt;Álbum&gt;.jpg</i>, <i>&lt;Álbum&gt;.png</i>..."
+
+#: ../data/gtkpod.glade.h:344
+msgid "Use <i>folder.jpg</i> as cover art."
+msgstr "Usar <i>folder.jpg</i> como carátula."
+
+#: ../data/gtkpod.glade.h:345
+msgid "Use <i>folder.jpg</i>, <i>folder.png</i>..."
+msgstr "Usar <i>folder.jpg</i>, <i>folder.png</i>..."
+
+#: ../data/gtkpod.glade.h:346
+msgid "Use mserv database to fill additional information"
+msgstr "Usar la base de datos mserv para rellenar la información adicional"
+
+#: ../data/gtkpod.glade.h:347
+msgid ""
+"Use selected charset (Preferences/'Adding/Updating/ Syncing')\n"
+"for this filename."
+msgstr ""
+"Usar juego de caracteres especificado (Preferencias/'Añadir/Actualizar/"
+"Sincronizar')\n"
+"para este nombre de fichero."
+
+#: ../data/gtkpod.glade.h:349
+msgid ""
+"Use selected encoding (on the 'General' page)\n"
+"when writing tags"
+msgstr ""
+"Usar la condificación seleccionada (en la pestaña 'General')\n"
+"al escribir los atributos"
+
+#: ../data/gtkpod.glade.h:351
+msgid "Use selected encoding also when updating or syncing tracks"
+msgstr ""
+"Usar la codificación seleccionada también al actualizar o sincronizar las "
+"pistas"
+
+#: ../data/gtkpod.glade.h:352
+msgid "Use this template to parse filename for tag information:"
+msgstr ""
+"Usar esta plantilla para analizar sintácticamente el nombre de fichero para "
+"la información de los atributos."
+
+#: ../data/gtkpod.glade.h:353
+msgid "Username to be used for mserv database lookup."
+msgstr ""
+"Nombre de usuario que se usará en la búsqueda de la base de datos mserv."
+
+#: ../data/gtkpod.glade.h:354
+msgid "Username:"
+msgstr "Nombre de usuario:"
+
+#: ../data/gtkpod.glade.h:355
+msgid ""
+"Usually you don't want to set the title of several tracks to the same text. "
+"This option might avoid unwanted results (especially since there is no "
+"'undo' yet)."
+msgstr ""
+"Normalmente no se quiere modificar el título de varias pistas con el mismo "
+"texto. Esta opción evita resultados no deseados (especialmente al no "
+"disponer de la opción 'deshacer')"
+
+#: ../data/gtkpod.glade.h:356
+#, fuzzy
+msgid "View Full Size"
+msgstr "Ver carátula a tamaño completo"
+
+#: ../data/gtkpod.glade.h:357
+msgid "WAV with :"
+msgstr "WAV con:"
+
+#: ../data/gtkpod.glade.h:358
+msgid ""
+"When adding dirs/files, update information of\n"
+"existing tracks with identical filenames"
+msgstr ""
+"Actualizar la información de las pistas existentes al añadir directorios/"
+"ficheros con el mismo nombre"
+
+#: ../data/gtkpod.glade.h:360
+msgid ""
+"When copying from iPod no check is performed on whether the destination file "
+"exists. Enabling this option will make gtkpod check whether the length of "
+"the destination file is the same as the file in the iPod. If so the file is "
+"skipped, allowing a quick sync of the iPod's contents."
+msgstr ""
+"Al copiar del iPod no se comprueba si el fichero destino existe. Activando "
+"esta opción gtkpod comparará el tamaño del fichero destino con el del "
+"origen. Si son iguales, el fichero será ignorado permitiendo una rápida "
+"sincronización de los contenidos del iPod."
+
+#: ../data/gtkpod.glade.h:361
+msgid "When syncing playlists"
+msgstr "Al sincronizar listas de reproducción"
+
+#: ../data/gtkpod.glade.h:362
+msgid ""
+"Will show a list of tracks removed and a list of tracks newly added or "
+"updated."
+msgstr ""
+"Se mostrará una lista de las pistas eliminadas y una lista de las pistas "
+"añadidas o actualizadas."
+
+#: ../data/gtkpod.glade.h:363
+msgid "Write ID3 tags to disk when modified in gtkpod"
+msgstr "Escribir los atributos ID3 al disco cuando se modifiquen en gtkpod"
+
+#: ../data/gtkpod.glade.h:364
+msgid "Write all changes made to the disk and the iPod(s)."
+msgstr "Escribir todos los cambios hechos al disco y al/los iPod(s)."
+
+#: ../data/gtkpod.glade.h:365
+msgid ""
+"Write extended information (PC filenames, SHA1 hashes,\n"
+"encoding...). Recommended."
+msgstr ""
+"Escribir la información extendida (nombre de fichero en PC,\n"
+"función resumen SHA1, codificación). Recomendado."
+
+#: ../data/gtkpod.glade.h:367
+msgid ""
+"You can also use the table headers, but this allows you to sort according to "
+"a column that is not displayed."
+msgstr ""
+"También se pueden usar las cabeceras de la tabla,pero esto le permite "
+"ordenar respecto a columnas no mostradas."
+
+#: ../data/gtkpod.glade.h:368
+#, fuzzy
+msgid "_About gtkpod"
+msgstr "Sobre gtkpod"
+
+#: ../data/gtkpod.glade.h:369
+#, fuzzy
+msgid "_Add Album"
+msgstr "Álbum"
+
+#: ../data/gtkpod.glade.h:370
+msgid "_Add Image"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:371
+#, fuzzy
+msgid "_Album"
+msgstr "Álbum"
+
+#: ../data/gtkpod.glade.h:372
+msgid "_All Tracks"
+msgstr "Tod_as las pistas"
+
+#: ../data/gtkpod.glade.h:373
+msgid "_Arrange Sort Tabs"
+msgstr "_Ordenar pestañas"
+
+#: ../data/gtkpod.glade.h:374
+msgid "_Check iPod's Files"
+msgstr "_Comprobar ficheros del iPod"
+
+#: ../data/gtkpod.glade.h:375
+msgid "_Conversion Log"
+msgstr "Registro de _conversión"
+
+#: ../data/gtkpod.glade.h:376
+msgid "_Create Playlists"
+msgstr "_Crear lista de reproducción"
+
+#: ../data/gtkpod.glade.h:377
+msgid "_Create iPod's Directories"
+msgstr "_Crear estructura de directorios del iPod"
+
+#: ../data/gtkpod.glade.h:378
+msgid "_Delete"
+msgstr "_Borrar"
+
+#: ../data/gtkpod.glade.h:379
+msgid "_Display"
+msgstr "_Mostrar"
+
+#: ../data/gtkpod.glade.h:380
+msgid "_Displayed Tracks"
+msgstr "Pistas mostra_das"
+
+#: ../data/gtkpod.glade.h:381
+msgid "_Edit"
+msgstr "_Editar"
+
+#: ../data/gtkpod.glade.h:382
+msgid "_Encoding (ID3, files):"
+msgstr "Codificación(ID3, fich_eros):"
+
+#: ../data/gtkpod.glade.h:383
+msgid "_Enqueue"
+msgstr "_Encolar"
+
+#: ../data/gtkpod.glade.h:384
+msgid "_Export Tracks from Database"
+msgstr "_Exportar pistas de la base de datos"
+
+#: ../data/gtkpod.glade.h:385
+msgid "_File"
+msgstr "_Fichero"
+
+#: ../data/gtkpod.glade.h:386
+msgid "_General"
+msgstr "_General"
+
+#: ../data/gtkpod.glade.h:387
+msgid "_Help"
+msgstr "_Ayuda"
+
+#: ../data/gtkpod.glade.h:388
+msgid "_Ignore rules"
+msgstr "_Ignorar reglas"
+
+#: ../data/gtkpod.glade.h:389
+msgid "_Image"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:390
+msgid "_Info Window"
+msgstr "Ventana de _información"
+
+#: ../data/gtkpod.glade.h:391
+msgid "_Last.FM"
+msgstr "_Last.FM"
+
+#: ../data/gtkpod.glade.h:392
+msgid "_Less Sort Tabs"
+msgstr "M_enos pestañas"
+
+#: ../data/gtkpod.glade.h:393
+msgid "_Limit to"
+msgstr "_Limitar a"
+
+#: ../data/gtkpod.glade.h:394
+msgid "_Load iPod(s)"
+msgstr "Cargar _iPod(s)"
+
+#: ../data/gtkpod.glade.h:395
+msgid "_Local"
+msgstr "_Local"
+
+#: ../data/gtkpod.glade.h:396
+msgid "_M3U"
+msgstr "_M3U"
+
+#: ../data/gtkpod.glade.h:397
+msgid "_Misc."
+msgstr ""
+
+#: ../data/gtkpod.glade.h:398
+msgid "_More Sort Tabs"
+msgstr "_Mas pestañas"
+
+#: ../data/gtkpod.glade.h:399
+msgid "_Newly Added Tracks"
+msgstr "Pistas añadidas recie_ntemente"
+
+#: ../data/gtkpod.glade.h:400
+msgid "_Normalize Volume"
+msgstr "_Normalizar el volumen"
+
+#: ../data/gtkpod.glade.h:401
+msgid "_Number of sort tabs:"
+msgstr "_Número de pestañas:"
+
+#: ../data/gtkpod.glade.h:402
+msgid "_PLS"
+msgstr "_PLS"
+
+#: ../data/gtkpod.glade.h:403
+msgid "_Play Now"
+msgstr "Re_producir"
+
+#: ../data/gtkpod.glade.h:404
+msgid "_Podcasts"
+msgstr "_Podcasts"
+
+#: ../data/gtkpod.glade.h:405
+msgid "_Prefer Local"
+msgstr "_Preferir local"
+
+#: ../data/gtkpod.glade.h:406
+#, fuzzy
+msgid "_Remove Album"
+msgstr "Álbum"
+
+#: ../data/gtkpod.glade.h:407
+#, fuzzy
+msgid "_Remove Cover Art"
+msgstr "Borrar portada"
+
+#: ../data/gtkpod.glade.h:408
+msgid "_Remove Images"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:409
+msgid "_Save Changes"
+msgstr "_Guardar cambios"
+
+#: ../data/gtkpod.glade.h:410
+msgid "_Save Displayed Track Order"
+msgstr "Guardar orden de pista_s mostrado"
+
+#: ../data/gtkpod.glade.h:411
+msgid "_Sorting"
+msgstr "_Ordenar"
+
+#: ../data/gtkpod.glade.h:412
+msgid "_Synchronize Playlist with Dir(s)"
+msgstr "_Sincronizar la lista de reproducción con el/los directorio(s)"
+
+#: ../data/gtkpod.glade.h:413
+msgid "_Toolbar"
+msgstr "Barra de _Herramientas"
+
+#: ../data/gtkpod.glade.h:414
+msgid "_Tools"
+msgstr "_Herramientas"
+
+#: ../data/gtkpod.glade.h:415
+msgid "_Tooltips"
+msgstr "_Sugerencias"
+
+#: ../data/gtkpod.glade.h:416
+msgid "_Track Info"
+msgstr "_Información de la pista"
+
+#: ../data/gtkpod.glade.h:417
+msgid "_Undo All"
+msgstr "_Deshacer Todo"
+
+#: ../data/gtkpod.glade.h:418
+msgid "_Update Tracks from File"
+msgstr "Act_ualizar pistas desde fichero"
+
+#: ../data/gtkpod.glade.h:419
+msgid "_Video"
+msgstr "_Vídeo"
+
+#: ../data/gtkpod.glade.h:420
+msgid "_View"
+msgstr "_Ver"
+
+#: ../data/gtkpod.glade.h:421
+msgid "_iPod"
+msgstr "_iPod"
+
+#: ../data/gtkpod.glade.h:423
+#, no-c-format
+msgid ""
+"artist: %a, album: %A, composer: %c, title: %t, genre: %G, track nr: %T, CD "
+"nr: %C, year: %Y, skip data: %*, the character '%': %%. You can separate "
+"several templates by a ';'. The first one matching the filename will be "
+"used. Example: '%a - %A/%T %t.mp3;%t.wav'."
+msgstr ""
+"artista: %a, álbum: %A, compositor: %c, título: %t, género: %G, número de "
+"pista: %T, número de CD: %C, año: %Y, ignorar dato: %*, el carácter '%': %%. "
+"Se pueden separar varias plantillas con punto y coma ';'. La primera que "
+"concuerde con el nombre de fichero será usada. Ejemplo: '%a - %A/%T %t.mp3;%"
+"t.wav'."
+
+#: ../data/gtkpod.glade.h:424
+msgid "folder"
+msgstr "folder"
+
+#: ../data/gtkpod.glade.h:425
+msgid "folder.jpg"
+msgstr "folder.jpg"
+
+#: ../data/gtkpod.glade.h:427
+#, no-c-format
+msgid "folder.jpg;%a.jpg"
+msgstr "folder.jpg;%a.jpg"
+
+#: ../data/gtkpod.glade.h:428
+msgid "gtkpod"
+msgstr "gtkpod"
+
+#: ../data/gtkpod.glade.h:429
+msgid "gtkpod Info"
+msgstr "Información sobre gtkpod"
+
+#: ../data/gtkpod.glade.h:430
+msgid ""
+"gtkpod expects the ID3 tags and the filenames to be in the encoding "
+"specified here. You can change it for consecutive 'Add Files' and 'Add Dirs' "
+"operation. 'System Charset' is the charset used by your current locale."
+msgstr ""
+"gtkpod espera que las etiquetas ID3 y los nombres de fichero estén en la "
+"codificación aquí especificada. Se puede modificar para las operaciones de "
+"'Añadir ficheros' y 'Añadir directorios'. El juego de caracteres del sistema "
+"es el de la localización en uso."
+
+#: ../data/gtkpod.glade.h:431
+msgid "gtkpod options"
+msgstr "Opciones de gtkpod"
+
+#. These are the items for the 'Repository type' combo in the 'Create Repository' dialog. Keep the three items in order!
+#: ../data/gtkpod.glade.h:433
+msgid ""
+"iPod\n"
+"Local Repository (Standard)\n"
+"Local Repository (Podcasts)\n"
+msgstr ""
+"iPod\n"
+"Repositorio local (Standard)\n"
+"Repositorio local (Podcasts)\n"
+
+#: ../data/gtkpod.glade.h:437
+msgid "iPod mountpoint:"
+msgstr "Punto de montaje del iPod:"
+
+#: ../data/gtkpod.glade.h:438
+msgid "iTunesDB backup:"
+msgstr "Copia de seguridad de iTunesDB:"
+
+#: ../data/gtkpod.glade.h:439
+msgid "mserv Root:"
+msgstr "Directorio raíz de mserv:"
+
+#: ../data/gtkpod.glade.h:440
+msgid "mserv database lookup will be done for music in this directory."
+msgstr "La base de datos mserv buscará música en este directorio."
+
+#: ../data/gtkpod.glade.h:441 ../src/details.c:1347
+msgid "n/a"
+msgstr "no disponible"
+
+#: ../data/gtkpod.glade.h:442
+msgid "special_sorttab -- Don't translate!"
+msgstr ""
+
+#: ../src/autodetection.c:310
+msgid "Could not initialize GnomeVFS\n"
+msgstr ""
+
+#: ../src/autodetection.c:397
+#, c-format
+msgid ""
+"Newly mounted iPod at '%s' could not be loaded into gtkpod.\n"
+"\n"
+msgstr ""
+
+#: ../src/autodetection.c:403
+#, c-format
+msgid ""
+"Newly mounted iPod at '%s' appears to be already loaded!\n"
+"\n"
+msgstr ""
+
+#: ../src/autodetection.c:416
+#, fuzzy
+msgid "New iPod"
+msgstr "Nueva lista de reproducción"
+
+#: ../src/charset.c:53
+msgid "Arabic (IBM-864)"
+msgstr "Árabe (IBM-864)"
+
+#: ../src/charset.c:54
+msgid "Arabic (ISO-8859-6)"
+msgstr "Árabe (ISO-8859-6)"
+
+#: ../src/charset.c:55
+msgid "Arabic (Windows-1256)"
+msgstr "Árabe (Windows-1256)"
+
+#: ../src/charset.c:56
+msgid "Baltic (ISO-8859-13)"
+msgstr "Báltico (ISO-8859-13)"
+
+#: ../src/charset.c:57
+msgid "Baltic (ISO-8859-4)"
+msgstr "Báltico (ISO-8859-4)"
+
+#: ../src/charset.c:58
+msgid "Baltic (Windows-1257)"
+msgstr "Báltico (Windows-1257)"
+
+#: ../src/charset.c:59
+msgid "Celtic (ISO-8859-14)"
+msgstr "Celta (ISO-8859-14)"
+
+#: ../src/charset.c:60
+msgid "Central European (IBM-852)"
+msgstr "Europa Central (IBM-852)"
+
+#: ../src/charset.c:61
+msgid "Central European (ISO-8859-2)"
+msgstr "Europa Central (ISO-8859-2)"
+
+#: ../src/charset.c:62
+msgid "Central European (Windows-1250)"
+msgstr "Europa Central (Windows-1250)"
+
+#: ../src/charset.c:63
+msgid "Chinese Simplified (GB18030)"
+msgstr "Chino Simplificado (GB18030)"
+
+#: ../src/charset.c:64
+msgid "Chinese Simplified (GB2312)"
+msgstr "Chino Simplificado (GB2312)"
+
+#: ../src/charset.c:65
+msgid "Chinese Traditional (Big5)"
+msgstr "Chino Tradicional (Big5)"
+
+#: ../src/charset.c:66
+msgid "Chinese Traditional (Big5-HKSCS)"
+msgstr "Chino Tradicional (Big5-HKSCS)"
+
+#: ../src/charset.c:67
+msgid "Cyrillic (IBM-855)"
+msgstr "Cirílico (IBM-855)"
+
+#: ../src/charset.c:68
+msgid "Cyrillic (ISO-8859-5)"
+msgstr "Cirílico (ISO-8859-5)"
+
+#: ../src/charset.c:69
+msgid "Cyrillic (ISO-IR-111)"
+msgstr "Cirílico (ISO-IR-111)"
+
+#: ../src/charset.c:70
+msgid "Cyrillic (KOI8-R)"
+msgstr "Cirílico (KOI8-R)"
+
+#: ../src/charset.c:71
+msgid "Cyrillic (Windows-1251)"
+msgstr "Cirílico (Windows-1251)"
+
+#: ../src/charset.c:72
+msgid "Cyrillic/Russian (CP-866)"
+msgstr "Cirílico/Ruso (CP-866)"
+
+#: ../src/charset.c:73
+msgid "Cyrillic/Ukrainian (KOI8-U)"
+msgstr "Cirílico/Ucraniano (KOI8-U)"
+
+#: ../src/charset.c:74
+msgid "English (US-ASCII)"
+msgstr "Inglés (US-ASCII)"
+
+#: ../src/charset.c:75
+msgid "Greek (ISO-8859-7)"
+msgstr "Griego (ISO-8859-7)"
+
+#: ../src/charset.c:76
+msgid "Greek (Windows-1253)"
+msgstr "Griego (Windows-1253)"
+
+#: ../src/charset.c:77
+msgid "Hebrew (IBM-862)"
+msgstr "Hebreo (IBM-862)"
+
+#: ../src/charset.c:78
+msgid "Hebrew (Windows-1255)"
+msgstr "Hebreo (Windows-1255)"
+
+#: ../src/charset.c:79
+msgid "Japanese (automatic detection)"
+msgstr "Japonés (automático)"
+
+#: ../src/charset.c:80
+msgid "Japanese (EUC-JP)"
+msgstr "Japonés (EUC-JP)"
+
+#: ../src/charset.c:81
+msgid "Japanese (ISO-2022-JP)"
+msgstr "Japonés (ISO-2022-JP)"
+
+#: ../src/charset.c:82
+msgid "Japanese (Shift_JIS)"
+msgstr "Japonés (Shift_JIS)"
+
+#: ../src/charset.c:83
+msgid "Korean (EUC-KR)"
+msgstr "Coreano (EUC-KR)"
+
+#: ../src/charset.c:84
+msgid "Nordic (ISO-8859-10)"
+msgstr "Nórdico (ISO-8859-10)"
+
+#: ../src/charset.c:85
+msgid "South European (ISO-8859-3)"
+msgstr "Europa del sur (ISO-8859-3)"
+
+#: ../src/charset.c:86
+msgid "Thai (TIS-620)"
+msgstr "Tailandés (TIS-620)"
+
+#: ../src/charset.c:87
+msgid "Turkish (IBM-857)"
+msgstr "Turco (IBM-857)"
+
+#: ../src/charset.c:88
+msgid "Turkish (ISO-8859-9)"
+msgstr "Turco (ISO-8859-9)"
+
+#: ../src/charset.c:89
+msgid "Turkish (Windows-1254)"
+msgstr "Turco (Windows-1254)"
+
+#: ../src/charset.c:90
+msgid "Unicode (UTF-7)"
+msgstr "Unicode (UTF-7)"
+
+#: ../src/charset.c:91
+msgid "Unicode (UTF-8)"
+msgstr "Unicode (UTF-8)"
+
+#: ../src/charset.c:92
+msgid "Unicode (UTF-16BE)"
+msgstr "Unicode (UTF-16BE)"
+
+#: ../src/charset.c:93
+msgid "Unicode (UTF-16LE)"
+msgstr "Unicode (UTF-16LE)"
+
+#: ../src/charset.c:94
+msgid "Unicode (UTF-32BE)"
+msgstr "Unicode (UTF-32BE)"
+
+#: ../src/charset.c:95
+msgid "Unicode (UTF-32LE)"
+msgstr "Unicode (UTF-32LE)"
+
+#: ../src/charset.c:96
+msgid "Vietnamese (VISCII)"
+msgstr "Vietnamita (VISCII)"
+
+#: ../src/charset.c:97
+msgid "Vietnamese (Windows-1258)"
+msgstr "Vietnamita (Windows-1258)"
+
+#: ../src/charset.c:98
+msgid "Visual Hebrew (ISO-8859-8)"
+msgstr "Hebreo Visual (ISO-8859-8)"
+
+#: ../src/charset.c:99
+msgid "Western (IBM-850)"
+msgstr "Europa occidental (IBM-850)"
+
+#: ../src/charset.c:100
+msgid "Western (ISO-8859-1)"
+msgstr "Europa occidental (ISO-8859-1)"
+
+#: ../src/charset.c:101
+msgid "Western (ISO-8859-15)"
+msgstr "Europa occidental (ISO-8859-15)"
+
+#: ../src/charset.c:102
+msgid "Western (Windows-1252)"
+msgstr "Europa occidental (Windows-1252)"
+
+#. sanity!
+#. check for "System Charset" and return NULL
+#: ../src/charset.c:160 ../src/charset.c:170 ../src/charset.c:223
+msgid "System Charset"
+msgstr "Juego de caracteres del sistema"
+
+#. we are not the first instance of gtkpod -- the socket is
+#. already being used, so we pass
+#: ../src/clientserver.c:214
+msgid ""
+"Another instance of gtkpod was detected. Playcount server not started.\n"
+msgstr ""
+"Se ha detectado otra instancia de gtkpod. No se ha arrancado el servidor de "
+"contadores.\n"
+
+#: ../src/confirmation.c:377
+msgid "Confirmation Dialogue"
+msgstr "Diálogo de confirmación"
+
+#: ../src/context_menus.c:362
+#, c-format
+msgid "Copied \"%s\" playlist to %s"
+msgstr "Copiada la lista de reproducción \"%s\" a %s"
+
+#: ../src/context_menus.c:401
+#, c-format
+msgid "Copied %d track to '%s'"
+msgid_plural "Copied %d tracks to '%s'"
+msgstr[0] "Copiada %d  pista a '%s'"
+msgstr[1] "Copiadas %d pistas a '%s'"
+
+#: ../src/context_menus.c:429
+#, c-format
+msgid "Copied '%s' playlist to '%s' in '%s'"
+msgstr "Copiada la lista de reproducción '%s' a '%s' en '%s'"
+
+#: ../src/context_menus.c:462
+#, c-format
+msgid "Copied %d track to '%s' in '%s'"
+msgid_plural "Copied %d tracks to %s in '%s'"
+msgstr[0] "Copiada %d pista a '%s' en '%s'"
+msgstr[1] "Copiadas %d pistas a '%s' en '%s'"
+
+#: ../src/context_menus.c:622 ../src/tools.c:854
+msgid "Play Now"
+msgstr "Reproducir"
+
+#: ../src/context_menus.c:628 ../src/tools.c:867
+msgid "Enqueue"
+msgstr "Encolar"
+
+#: ../src/context_menus.c:634
+msgid "Copy Tracks to Filesystem"
+msgstr "Copiar pistas al sistema de ficheros"
+
+#: ../src/context_menus.c:641 ../src/file_export.c:1085
+msgid "Create Playlist File"
+msgstr "Crear lista de reproducción"
+
+#: ../src/context_menus.c:648
+msgid "Create new Playlist"
+msgstr "Crear nueva lista de reproducción"
+
+#: ../src/context_menus.c:655
+msgid "Update Tracks from File"
+msgstr "Actualizar pistas desde fichero"
+
+#: ../src/context_menus.c:669
+msgid "Sync Playlist with Dir(s)"
+msgstr "Sincronizar la lista de reproducción con el/los directorio(s)"
+
+#: ../src/context_menus.c:679
+msgid "Remove All Tracks from iPod"
+msgstr "Borrar todas las pistas del iPod"
+
+#: ../src/context_menus.c:697
+msgid "Remove All Podcasts from iPod"
+msgstr "Borrar todos los podcasts del iPod"
+
+#: ../src/context_menus.c:712
+msgid "Delete Including Tracks"
+msgstr "Borrar incluyendo pistas"
+
+#: ../src/context_menus.c:720
+msgid "Delete But Keep Tracks"
+msgstr "Borrar manteniendo las pistas"
+
+#: ../src/context_menus.c:728
+msgid "Edit iPod Properties"
+msgstr "Editar las propiedades del iPod"
+
+#: ../src/context_menus.c:735
+msgid "Edit Repository Properties"
+msgstr "Editar las propiedades del repositorio"
+
+#: ../src/context_menus.c:742
+msgid "Edit Playlist Properties"
+msgstr "Editar propiedades de la lista de reproducción"
+
+#: ../src/context_menus.c:770
+msgid "View Full Size Artwork"
+msgstr "Ver carátula a tamaño completo"
+
+#: ../src/context_menus.c:777
+msgid "Select Cover From File"
+msgstr "Seleccionar carátula desde fichero"
+
+#: ../src/context_menus.c:790
+msgid "Load iPod"
+msgstr "Cargar iPod"
+
+#: ../src/context_menus.c:797
+msgid "Eject iPod"
+msgstr "Expulsar iPod"
+
+#: ../src/context_menus.c:814
+msgid "Remove All Tracks from Database"
+msgstr "Borrar todas las pistas de la base de datos"
+
+#: ../src/context_menus.c:829
+msgid "Delete Including Tracks (Harddisk)"
+msgstr "Borrar incluyendo pistas (disco duro)"
+
+#: ../src/context_menus.c:837
+msgid "Delete Including Tracks (Database)"
+msgstr "Borrar incluyendo pistas (base de datos)"
+
+#: ../src/context_menus.c:845
+msgid "Delete From iPod"
+msgstr "Borrar del iPod"
+
+#: ../src/context_menus.c:853
+msgid "Delete From Playlist"
+msgstr "Borrar de la lista de reproducción"
+
+#: ../src/context_menus.c:861
+msgid "Delete From Harddisk"
+msgstr "Borrar del disco duro"
+
+#: ../src/context_menus.c:869
+msgid "Delete From Database"
+msgstr "Borrar de la base de datos"
+
+#: ../src/context_menus.c:877
+msgid "Alphabetize"
+msgstr "Orden alfabético"
+
+#: ../src/context_menus.c:895
+#, fuzzy
+msgid "Remove Album"
+msgstr "Álbum"
+
+#: ../src/context_menus.c:905
+#, fuzzy
+msgid "Remove Photo"
+msgstr "Borrar portada"
+
+#: ../src/context_menus.c:922
+msgid "Rename Album"
+msgstr ""
+
+#: ../src/context_menus.c:981 ../src/context_menus.c:1030
+msgid "Copy selected playlist to..."
+msgstr "Copiar la lista de reproducción seleccionada a..."
+
+#: ../src/context_menus.c:1083
+msgid "Copy selected track(s) to..."
+msgstr "Copiar las pistas seleccionadas a..."
+
+#: ../src/date_parser.l:269
+#, c-format
+msgid "Date format error: unrecognized character: '%s'\n"
+msgstr "Error en el formato de la fecha: carácter desconocido:'%s'\n"
+
+#: ../src/details.c:82
+#, fuzzy
+msgid "Audio/Video"
+msgstr "Vídeo musical"
+
+#: ../src/details.c:83
+msgid "Audio"
+msgstr ""
+
+#: ../src/details.c:84
+#, fuzzy
+msgid "Video"
+msgstr "_Vídeo"
+
+#: ../src/details.c:85
+#, fuzzy
+msgid "Podcast"
+msgstr "Podcasts"
+
+#: ../src/details.c:86
+#, fuzzy
+msgid "Video Podcast"
+msgstr "Podcasts"
+
+#: ../src/details.c:87
+msgid "Audiobook"
+msgstr ""
+
+#: ../src/details.c:88 ../src/display_spl.c:209 ../src/display_spl.c:218
+msgid "Music Video"
+msgstr "Vídeo musical"
+
+#: ../src/details.c:89 ../src/display_spl.c:107 ../src/display_spl.c:210
+#: ../src/display_spl.c:219 ../src/misc_conversion.c:101
+#, fuzzy
+msgid "TV Show"
+msgstr "TV Show"
+
+#: ../src/details.c:90
+#, fuzzy
+msgid "TV Show & Music Video"
+msgstr "Vídeo musical"
+
+#: ../src/details.c:836
+#, c-format
+msgid "%s (image data corrupted or unreadable)"
+msgstr "%s (imagen corrupta o no legible)"
+
+#: ../src/details.c:973
+#, c-format
+msgid "Please report unknown mediatype %x\n"
+msgstr ""
+
+#: ../src/details.c:1418
+msgid "<b>n/a</b>"
+msgstr "<b>no disponible</b>"
+
+#: ../src/details.c:1906
+#, c-format
+msgid "Error occurred dropping an image onto the details window: %s\n"
+msgstr ""
+
+#: ../src/details.c:1952 ../src/display_coverart.c:2128
+msgid "Successfully set new coverart for selected tracks"
+msgstr ""
+
+#: ../src/display.c:490
+#, c-format
+msgid "<b>Image Dimensions: %s</b>"
+msgstr ""
+
+#: ../src/display.c:744
+msgid "Edit selected entry of which sort tab?"
+msgstr "¿De qué pestaña desea editar la entrada seleccionada?"
+
+#. no entry selected
+#: ../src/display.c:751 ../src/misc_confirm.c:435 ../src/misc_track.c:2138
+msgid "No entry selected."
+msgstr "No se ha seleccionado ninguna entrada"
+
+#: ../src/display.c:910 ../src/display.c:1230 ../src/display.c:1286
+#: ../src/display.c:1340 ../src/display.c:1395 ../src/display.c:1656
+#, c-format
+msgid "No entry selected in Sort Tab %d"
+msgstr "No se ha seleccionado ninguna entrada en la pestaña %d"
+
+#: ../src/display.c:949
+msgid "Remove entry of which sort tab from database?"
+msgstr "¿De qué pestaña desea borrar su entrada en la base de datos?"
+
+#: ../src/display.c:957
+msgid "Remove tracks in selected entry of which filter tab from the iPod?"
+msgstr "¿De qué pestaña desea borrar la entrada en el iPod?"
+
+#: ../src/display.c:979
+msgid "Remove tracks in selected entry of which filter tab from the harddisk?"
+msgstr "¿De qué pestaña desea borrar la entrada en el disco duro?"
+
+#: ../src/display.c:1009
+msgid "Remove tracks in selected entry of which filter tab from playlist?"
+msgstr "¿De qué pestaña desea borrar la entrada en la lista de reproducción?"
+
+#: ../src/display.c:1036 ../src/display.c:1074
+#, c-format
+msgid ""
+"iPod at '%s' is not loaded.\n"
+"Please load it first."
+msgstr ""
+"El iPod de '%s' no está cargado.\n"
+"Por favor, cargar primero."
+
+#: ../src/display.c:1111 ../src/display.c:1138
+msgid "Update selected entry of which sort tab?"
+msgstr "¿De qué pestaña desea actualizar la entrada seleccionada?"
+
+#: ../src/display.c:1224
+msgid "Export selected entry of which sort tab?"
+msgstr "¿De qué pestaña desea exportar su selección?"
+
+#: ../src/display.c:1280
+msgid "Create playlist file from selected entry of which sort tab?"
+msgstr "¿De qué pestaña desea crear la lista de reproducción con su selección?"
+
+#: ../src/display.c:1334
+msgid "Play tracks in selected entry of which sort tab?"
+msgstr "¿De qué pestaña desea reproducir las pistas seleccionadas?"
+
+#: ../src/display.c:1389
+msgid "Enqueue tracks in selected entry of which sort tab?"
+msgstr "¿De qué pestaña desea encolar las pistas seleccionadas?"
+
+#: ../src/display.c:1646
+msgid "Normalize tracks in selected entry of which sort tab?"
+msgstr ""
+"¿De qué pestaña desea normalizar el volumen de las pistas seleccionadas?"
+
+#: ../src/display_coverart.c:1713
+msgid "Failed to remove the album from the album hash store."
+msgstr "Fallo al borrar el álbum de la lista de resúmenes de álbumes."
+
+#: ../src/display_coverart.c:2098
+#, c-format
+msgid "Error occurred dropping an image onto the coverart display: %s\n"
+msgstr ""
+
+#: ../src/display_itdb.c:376
+#, c-format
+msgid "Failed to set cover art: '%s'\n"
+msgstr "Error al configurar la carátula: '%s'\n"
+
+#: ../src/display_itdb.c:858 ../src/display_itdb.c:991
+msgid "Local"
+msgstr "Local"
+
+#. add podcast playlist
+#: ../src/display_itdb.c:866 ../src/display_itdb.c:989
+#: ../src/display_itdb.c:1025
+msgid "Podcasts"
+msgstr "Podcasts"
+
+#: ../src/display_itdb.c:875 ../src/display_itdb.c:993
+#: ../src/repository.c:1186
+msgid "iPod"
+msgstr "iPod"
+
+#: ../src/display_itdb.c:1084
+#, c-format
+msgid "Increased playcount for '%s'"
+msgstr "Contador incrementado en '%s'"
+
+#: ../src/display_photo.c:163
+#, c-format
+msgid "Error reading iPod photo database (%s).\n"
+msgstr ""
+
+#: ../src/display_photo.c:168
+msgid "Error reading iPod photo database.\n"
+msgstr ""
+
+#: ../src/display_photo.c:238
+msgid "Could not access the iPod's photo database."
+msgstr ""
+
+#: ../src/display_photo.c:441
+#, fuzzy
+msgid "Photo Albums"
+msgstr "Álbum"
+
+#: ../src/display_photo.c:451 ../src/display_photo.c:1685
+msgid "<Unnamed>"
+msgstr ""
+
+#: ../src/display_photo.c:939
+msgid "The Photo Library album cannot be removed"
+msgstr ""
+
+#: ../src/display_photo.c:961
+#, fuzzy
+msgid "Do you want to remove the album's photos too?"
+msgstr "¿Desea realmente borrar todos los podcasts del iPod?"
+
+#: ../src/display_photo.c:967
+msgid "Yes. Do Not Display Again"
+msgstr ""
+
+#: ../src/display_photo.c:1038
+msgid ""
+"This will remove the photo selection from the selected album.\n"
+" Do you want to delete them from the database as well?"
+msgstr ""
+
+#: ../src/display_photo.c:1053
+msgid ""
+"This will delete the photo selection from the Photo Library and all albums. "
+"Are you sure?"
+msgstr ""
+
+#: ../src/display_photo.c:1128
+msgid "New Photo Album Name"
+msgstr ""
+
+#: ../src/display_photo.c:1129
+#, fuzzy
+msgid "Please enter a new name for the photo album"
+msgstr "Introducir el nombre de la nueva lista de reproducción"
+
+#: ../src/display_photo.c:1141 ../src/display_photo.c:1223
+msgid "An album with that name already exists."
+msgstr ""
+
+#: ../src/display_photo.c:1210
+#, fuzzy
+msgid "New Photo Album"
+msgstr "Álbum"
+
+#: ../src/display_photo.c:1211
+#, fuzzy
+msgid "Please enter a name for the new photo album"
+msgstr "Introducir el nombre de la nueva lista de reproducción"
+
+#: ../src/display_photo.c:1232
+msgid "The new album failed to be created."
+msgstr ""
+
+#: ../src/display_photo.c:1256
+#, fuzzy
+msgid "Add Image to iPod"
+msgstr "Añadir nuevo repositorio/iPod"
+
+#. Open a dialog directory chooser window
+#: ../src/display_photo.c:1311
+msgid "Add a Directory of Images to the iPod. Select the Directory."
+msgstr ""
+
+#: ../src/display_photo.c:1699
+#, c-format
+msgid "<No members>\n"
+msgstr ""
+
+#. give a notice on the statusbar -- otherwise the user
+#. * will never know why the drag is not possible
+#: ../src/display_playlists.c:516 ../src/display_playlists.c:558
+msgid "Error: drag from iPod not possible in offline mode."
+msgstr "Error: arrastrar desde el iPod no es posible en el modo desconectado"
+
+#: ../src/display_playlists.c:585 ../src/display_tracks.c:286
+#, c-format
+msgid "Copied one track"
+msgid_plural "Copied %d tracks"
+msgstr[0] "Copiada una pista"
+msgstr[1] "Copiadas %d pistas"
+
+#: ../src/display_playlists.c:865 ../src/display_playlists.c:877
+msgid "Can't reorder sorted treeview."
+msgstr "No se puede reordenar una vista en árbol ya ordenada"
+
+#: ../src/display_playlists.c:954
+#, c-format
+msgid ""
+"This DND type (%d) is not (yet) supported. If you feel implementing this "
+"would be useful, please contact the author.\n"
+"\n"
+msgstr ""
+"Este tipo DND (%d) todavía no está soportado. Si piensa que implementarlo "
+"puede ser útil, por favor, contacte con el autor.\n"
+
+#. no existing photo playlist found so add one
+#. * either itdb had no children or none of them
+#. * were of the photo type.
+#.
+#: ../src/display_playlists.c:1569
+msgid "Photos"
+msgstr ""
+
+#: ../src/display_sorttabs.c:473
+msgid "'Played' condition ignored because of error."
+msgstr "Ignorada la condición de «reproducido» debido a un error"
+
+#: ../src/display_sorttabs.c:476
+msgid "'Modified' condition ignored because of error."
+msgstr "Ignorada la condición de «modificado» debido a un error"
+
+#: ../src/display_sorttabs.c:479
+msgid "'Added' condition ignored because of error."
+msgstr "Ignorada la condición de «añadido» debido a un error"
+
+#: ../src/display_sorttabs.c:1562 ../src/misc_conversion.c:59
+msgid "All"
+msgstr "Todo"
+
+#: ../src/display_sorttabs.c:1588
+msgid "Compilations"
+msgstr "Compilaciones"
+
+#: ../src/display_sorttabs.c:2988
+msgid "Comp."
+msgstr "Comp."
+
+#: ../src/display_sorttabs.c:2994 ../src/display_spl.c:88
+#: ../src/display_tracks.c:2109 ../src/misc_conversion.c:84
+msgid "Year"
+msgstr "Año"
+
+#: ../src/display_sorttabs.c:2997
+msgid "Special"
+msgstr "Especial"
+
+#: ../src/display_sorttabs.c:3245
+msgid "Last Played"
+msgstr "Última reproducción"
+
+#: ../src/display_sorttabs.c:3246
+msgid "Last Modified"
+msgstr "Última modificación"
+
+#: ../src/display_spl.c:64
+msgid "days"
+msgstr "días"
+
+#: ../src/display_spl.c:65
+msgid "weeks"
+msgstr "semanas"
+
+#: ../src/display_spl.c:66
+msgid "months"
+msgstr "meses"
+
+#: ../src/display_spl.c:73
+msgid "kbps"
+msgstr "kbps"
+
+#: ../src/display_spl.c:74
+msgid "Hz"
+msgstr "Hz"
+
+#: ../src/display_spl.c:75 ../src/display_spl.c:179 ../src/info.c:780
+msgid "MB"
+msgstr "MB"
+
+#: ../src/display_spl.c:76
+msgid "secs"
+msgstr "segundos"
+
+#: ../src/display_spl.c:86 ../src/misc_conversion.c:74
+msgid "Bitrate"
+msgstr "Ratio de bits"
+
+#. 15
+#: ../src/display_spl.c:87 ../src/misc_conversion.c:75
+msgid "Samplerate"
+msgstr "Ratio de muestras"
+
+#: ../src/display_spl.c:90
+msgid "Kind"
+msgstr "Tipo"
+
+#: ../src/display_spl.c:91 ../src/misc_conversion.c:81
+msgid "Date modified"
+msgstr "Fecha de modificación"
+
+#: ../src/display_spl.c:92
+msgid "Track number"
+msgstr "Número de pista"
+
+#: ../src/display_spl.c:93
+msgid "Size"
+msgstr "Tamaño"
+
+#: ../src/display_spl.c:95 ../src/misc_conversion.c:64
+msgid "Comment"
+msgstr "Comentario"
+
+#: ../src/display_spl.c:96 ../src/misc_conversion.c:79
+msgid "Date added"
+msgstr "Fecha de adición"
+
+#: ../src/display_spl.c:99
+msgid "Last played"
+msgstr "Última reproducción"
+
+#: ../src/display_spl.c:100
+msgid "Disc number"
+msgstr "Número de disco"
+
+#: ../src/display_spl.c:102 ../src/misc_conversion.c:87
+msgid "Compilation"
+msgstr "Compilación"
+
+#: ../src/display_spl.c:103 ../src/misc_conversion.c:76
+msgid "BPM"
+msgstr "BPM"
+
+#: ../src/display_spl.c:104 ../src/misc_conversion.c:86
+msgid "Grouping"
+msgstr "Agrupando"
+
+#: ../src/display_spl.c:105
+msgid "Playlist"
+msgstr "Lista de reproducción"
+
+#: ../src/display_spl.c:106
+#, fuzzy
+msgid "Video Kind"
+msgstr "Video Kind"
+
+#: ../src/display_spl.c:108
+msgid "Season number"
+msgstr "Número de temporada"
+
+#: ../src/display_spl.c:109
+msgid "Skip count"
+msgstr "Ignorar contador"
+
+#: ../src/display_spl.c:110
+msgid "Last skipped"
+msgstr "Última vez ignorada"
+
+#: ../src/display_spl.c:111
+msgid "Album artist"
+msgstr "Artista del álbum"
+
+#: ../src/display_spl.c:117
+msgid "contains"
+msgstr "contiene"
+
+#: ../src/display_spl.c:118
+msgid "does not contain"
+msgstr "no contiene"
+
+#: ../src/display_spl.c:119 ../src/display_spl.c:128 ../src/display_spl.c:138
+#: ../src/display_spl.c:157 ../src/display_spl.c:164
+msgid "is"
+msgstr "es"
+
+#: ../src/display_spl.c:120 ../src/display_spl.c:129 ../src/display_spl.c:139
+#: ../src/display_spl.c:158 ../src/display_spl.c:165
+msgid "is not"
+msgstr "no es"
+
+#: ../src/display_spl.c:121
+msgid "starts with"
+msgstr "empieza con"
+
+#: ../src/display_spl.c:122
+msgid "ends with"
+msgstr "termina con"
+
+#: ../src/display_spl.c:130
+msgid "is greater than"
+msgstr "es mayor que"
+
+#: ../src/display_spl.c:131
+msgid "is less than"
+msgstr "es menor que"
+
+#: ../src/display_spl.c:132 ../src/display_spl.c:144
+msgid "is in the range"
+msgstr "está en el rango"
+
+#: ../src/display_spl.c:140
+msgid "is after"
+msgstr "está después"
+
+#: ../src/display_spl.c:141
+msgid "is before"
+msgstr "está antes"
+
+#: ../src/display_spl.c:142
+msgid "in the last"
+msgstr "al final"
+
+#: ../src/display_spl.c:143
+msgid "not in the last"
+msgstr "no al final"
+
+#: ../src/display_spl.c:150
+msgid "is set"
+msgstr "configurado"
+
+#: ../src/display_spl.c:151
+msgid "is not set"
+msgstr "no configurado"
+
+#: ../src/display_spl.c:171
+msgid "Not supported"
+msgstr "No soportado"
+
+#: ../src/display_spl.c:178
+msgid "minutes"
+msgstr "minutos"
+
+#: ../src/display_spl.c:180
+msgid "tracks"
+msgstr "pistas"
+
+#: ../src/display_spl.c:181
+msgid "hours"
+msgstr "horas"
+
+#: ../src/display_spl.c:182 ../src/info.c:780
+msgid "GB"
+msgstr "GiB"
+
+#: ../src/display_spl.c:189
+msgid "random order"
+msgstr "orden aleatorio"
+
+#: ../src/display_spl.c:190
+msgid "title"
+msgstr "título"
+
+#: ../src/display_spl.c:191
+msgid "album"
+msgstr "álbum"
+
+#: ../src/display_spl.c:192
+msgid "artist"
+msgstr "artista"
+
+#: ../src/display_spl.c:193
+msgid "genre"
+msgstr "género"
+
+#: ../src/display_spl.c:194
+msgid "most recently added"
+msgstr "más recientemente añadido"
+
+#: ../src/display_spl.c:195
+msgid "least recently added"
+msgstr "menos recientemente añadido"
+
+#: ../src/display_spl.c:196
+msgid "most often played"
+msgstr "más frecuentemente reproducido"
+
+#: ../src/display_spl.c:197
+msgid "least often played"
+msgstr "menos frecuentemente reproducido"
+
+#: ../src/display_spl.c:198
+msgid "most recently played"
+msgstr "más recientemente reproducido"
+
+#: ../src/display_spl.c:199
+msgid "least recently played"
+msgstr "menos recientemente reproducido"
+
+#: ../src/display_spl.c:200
+msgid "highest rating"
+msgstr "mayor puntuación"
+
+#: ../src/display_spl.c:201
+msgid "lowest rating"
+msgstr "menor puntuación"
+
+#: ../src/display_spl.c:208 ../src/display_spl.c:217
+msgid "Movie"
+msgstr "Película"
+
+#: ../src/display_spl.c:1192 ../src/display_spl.c:1207
+msgid "to"
+msgstr "a"
+
+#: ../src/display_spl.c:1485
+msgid "-"
+msgstr "-"
+
+#: ../src/display_spl.c:1500
+msgid "+"
+msgstr "+"
+
+#: ../src/display_tracks.c:281
+#, c-format
+msgid "Moved one track"
+msgid_plural "Moved %d tracks"
+msgstr[0] "Movida una pista"
+msgstr[1] "Movidas %d pistas"
+
+#: ../src/display_tracks.c:1810
+#, c-format
+msgid ""
+"Cannot unsort track view because of a bug in the GTK lib you are using (%d.%"
+"d.%d < 2.5.4). Once you sort the track view, you cannot go back to the "
+"unsorted state.\n"
+"\n"
+msgstr ""
+"No se puede desordenar la vista debido a un error en la biblioteca GTK que "
+"está siendo usada (%d %d %d < 2.5.4). Una vez se ordena la vista no se puede "
+"volver al estado anterior.\n"
+"\n"
+
+#: ../src/display_tracks.c:2069
+msgid "Rtng"
+msgstr "Puntuación"
+
+#: ../src/display_tracks.c:2072
+msgid "#"
+msgstr "#"
+
+#: ../src/display_tracks.c:2075
+msgid "CD"
+msgstr "CD"
+
+#: ../src/display_tracks.c:2078
+msgid "ID"
+msgstr "ID"
+
+#: ../src/display_tracks.c:2081
+msgid "Trnsfrd"
+msgstr "Transferido"
+
+#: ../src/display_tracks.c:2085
+msgid "Cmpl"
+msgstr "Cmpl"
+
+#: ../src/display_tracks.c:2091
+msgid "Time"
+msgstr "Duración"
+
+#: ../src/display_tracks.c:2094
+msgid "Plycnt"
+msgstr "Contador"
+
+#: ../src/display_tracks.c:2106
+msgid "Released"
+msgstr "Liberado"
+
+#: ../src/display_tracks.c:2112
+msgid "Vol."
+msgstr "Vol."
+
+#: ../src/display_tracks.c:2115
+msgid "Sndchk."
+msgstr "Control de sonido"
+
+#: ../src/fetchcover.c:358
+msgid "Coverart file already exists"
+msgstr ""
+
+#: ../src/fetchcover.c:371
+#, c-format
+msgid ""
+"The picture file %s already exists.\n"
+"This may be associated with other music files in the directory.\n"
+"\n"
+"-  Clicking Yes will overwrite the existing file, possibly associating\n"
+"   other music files in the same directory with this coverart file.\n"
+"-  Clicking No will save the file with a unique file name.\n"
+"-  Clicking Cancel will abort the fetchcover operation."
+msgstr ""
+
+#: ../src/file.c:236
+#, c-format
+msgid ""
+"'%s' is a directory, not a playlist file.\n"
+"\n"
+msgstr ""
+"'%s' es un directorio, no una lista de reproducción.\n"
+"\n"
+
+#: ../src/file.c:266
+#, c-format
+msgid ""
+"'%s' is a not a known playlist file.\n"
+"\n"
+msgstr ""
+"'%s' no es una lista de reproducción conocida.\n"
+"\n"
+
+#: ../src/file.c:283 ../src/file_export.c:217 ../src/oggfile.c:62
+#: ../src/wavfile.c:107
+#, c-format
+msgid "Could not open '%s' for reading.\n"
+msgstr "No se ha podido abrir '%s' para su lectura.\n"
+
+#: ../src/file.c:369
+#, c-format
+msgid "Skipping '%s' because it is a directory.\n"
+msgstr "Ignorando '%s' porque es un directorio.\n"
+
+#: ../src/file.c:374
+#, c-format
+msgid "Skipping '%s' to avoid adding playlist file recursively\n"
+msgstr ""
+"Ignorando '%s' para evitar añadir lista de reproducción recursivamente\n"
+
+#: ../src/file.c:629
+#, c-format
+msgid "Unknown token '%s' in template '%s'\n"
+msgstr "Testigo '%s' desconocido en la plantilla '%s'\n"
+
+#: ../src/file.c:923
+#, c-format
+msgid "Local filename not valid (%s)"
+msgstr "Nombre de fichero local no válido (%s)"
+
+#: ../src/file.c:982
+#, c-format
+msgid "No information found for user '%s' in '%s'"
+msgstr "No se ha encontrado información para el usuario '%s' en '%s'"
+
+#: ../src/file.c:991
+#, c-format
+msgid "mserv data file (%s) not available for track (%s)"
+msgstr "fichero de datos mserv (%s) no disponible para la pista (%s)"
+
+#: ../src/file.c:999
+#, c-format
+msgid "Track (%s) not in mserv music root directory (%s)"
+msgstr "La pista (%s) no está en el directorio raíz mserv (%s)"
+
+#: ../src/file.c:1123
+#, c-format
+msgid ""
+"The following track could not be processed (file does not exist): '%s'\n"
+msgstr ""
+"La siguiente pista no pudo ser procesada (no existe el fichero): '%s'\n"
+
+#: ../src/file.c:1209
+#, c-format
+msgid "The following track could not be processed (filetype unknown): '%s'\n"
+msgstr ""
+"La siguiente pista no pudo ser procesada (tipo de fichero desconocido): '%"
+"s'\n"
+
+#: ../src/file.c:1307
+#, c-format
+msgid ""
+"The following track could not be processed (filetype is known but analysis "
+"failed): '%s'\n"
+msgstr ""
+"La siguiente pista no pudo ser procesada (se ha reconocido el tipo de "
+"fichero, pero ha fallado el análisis): '%s'\n"
+
+#: ../src/file.c:1337 ../src/file.c:1391
+msgid "Nothing to update"
+msgstr "Nada que actualizar"
+
+#: ../src/file.c:1358
+#, c-format
+msgid "Updating %s"
+msgstr "Actualizando %s"
+
+#: ../src/file.c:1372
+msgid "Updated selected tracks with info from file."
+msgstr "Actualizadas las pistas seleccionadas con la información del fichero."
+
+#: ../src/file.c:1406
+#, c-format
+msgid "Retrieving mserv data %s"
+msgstr "Recibiendo datos mserv %s"
+
+#: ../src/file.c:1411
+msgid "no filename available"
+msgstr "Ningún nombre de fichero disponible"
+
+#: ../src/file.c:1416
+msgid "Updated selected tracks with data from mserv."
+msgstr "Actualizadas las pistas seleccionadas con la información de mserv"
+
+#: ../src/file.c:1437
+#, c-format
+msgid "The following track could not be updated"
+msgid_plural "The following %d tracks could not be updated"
+msgstr[0] "La siguiente pista no ha podido ser actualizada"
+msgstr[1] "Las siguientes %d pistas no han podido ser actualizadas"
+
+#. gint id,
+#. gboolean modal,
+#: ../src/file.c:1443
+msgid "Failed Track Update"
+msgstr "Error al actualizar la pista"
+
+#: ../src/file.c:1501
+#, c-format
+msgid "The following track has been updated"
+msgid_plural "The following %d tracks have been updated"
+msgstr[0] "La siguiente pista ha sido actualizada"
+msgstr[1] "Las siguientes pistas %d han sido actualizadas"
+
+#. gint id,
+#. gboolean modal,
+#: ../src/file.c:1507
+msgid "Successful Track Update"
+msgstr "Actualización exitosa de la pista"
+
+#: ../src/file.c:1566
+#, c-format
+msgid "No mserv information could be retrieved for the following track"
+msgid_plural ""
+"No mserv information could be retrieved for the following %d tracks"
+msgstr[0] "No se ha podido conseguir información mserv para la siguiente pista"
+msgstr[1] ""
+"No se ha podido conseguir información mserv para las siguientes %d pistas"
+
+#. gint id,
+#. gboolean modal,
+#: ../src/file.c:1572
+msgid "mserv data retrieval problem"
+msgstr "Problema al recoger datos mserv"
+
+#: ../src/file.c:1661
+msgid "no local filename available, file on the iPod will be used instead"
+msgstr ""
+"No está disponible el nombre local, se usará el nombre del iPod en su lugar"
+
+#: ../src/file.c:1667
+msgid "no local filename available and copy on iPod cannot be found"
+msgstr ""
+"No está disponible el nombre local y no se encuentra la copia en el iPod"
+
+#: ../src/file.c:1671 ../src/file.c:1689
+msgid "no local filename available"
+msgstr "No se encuentra disponible el nombre de fichero local"
+
+#: ../src/file.c:1679
+msgid "local file could not be found, file on the iPod will be used instead"
+msgstr ""
+"No se encuentra el fichero local, se usará el fichero del iPod en su lugar"
+
+#: ../src/file.c:1685
+msgid "local file as well as copy on the iPod cannot be found"
+msgstr "No se encuentran ni el fichero local ni la copia del iPod"
+
+#. update not successful -- log this track for later display
+#: ../src/file.c:1788
+#, fuzzy
+msgid "update failed (format not supported?)"
+msgstr "Error al actualizar (¿formato no soportado?)"
+
+#: ../src/file.c:1873 ../src/misc_playlist.c:916
+#, c-format
+msgid "Processing '%s'..."
+msgstr "Procesando '%s'..."
+
+#: ../src/file.c:1879
+#, fuzzy, c-format
+msgid "Skipping '%s' because it matches exclude masks.\n"
+msgstr "Ignorando '%s' porque es un directorio.\n"
+
+#: ../src/file.c:1999 ../src/misc_track.c:1773 ../src/misc_track.c:1878
+#, c-format
+msgid ""
+"Podcast already present: '%s'\n"
+"\n"
+msgstr ""
+"Podcast ya almacenado: '%s'\n"
+"\n"
+
+#: ../src/file.c:2064
+#, c-format
+msgid ""
+"Writing to video files not yet supported (%s).\n"
+"\n"
+msgstr ""
+"Escribir a ficheros de video no está todavía soportado (%s). \n"
+"\n"
+
+#: ../src/file.c:2116 ../src/file.c:2130
+#, c-format
+msgid "Couldn't change tags of file: %s\n"
+msgstr "No se pueden modificar las etiquetas del fichero: %s\n"
+
+#: ../src/file.c:2232
+#, c-format
+msgid "Could not open '%s' for reading and writing.\n"
+msgstr "No se puede abrir '%s' para lectura escritura.\n"
+
+#: ../src/file.c:2239
+#, c-format
+msgid "Could not obtain lock on '%s'.\n"
+msgstr "No se pudo bloquear '%s'.\n"
+
+#. error!
+#: ../src/file.c:2256 ../src/file.c:2265 ../src/file.c:2276 ../src/file.c:2286
+#, c-format
+msgid "Malformed line in '%s': %s\n"
+msgstr "Linea incorrecta en '%s':%s\n"
+
+#. gint id,
+#. gboolean modal,
+#: ../src/file.c:2315
+msgid "Remove offline playcounts?"
+msgstr "¿Borrar cuenta reproducciones no en linea?"
+
+#. title
+#: ../src/file.c:2316
+msgid ""
+"Some tracks played offline could not be found in the iTunesDB. Press 'OK' to "
+"remove them from the offline playcount file, 'Cancel' to keep them."
+msgstr ""
+"Algunas pistas reproducidas en modo desconectado no han sido encontradas en "
+"la base de datos de iTunes. Pulsa «Aceptar» para borrarlas del contador de "
+"modo desconectado, o «Cancelar» para mantenerlas."
+
+#: ../src/file.c:2333
+#, c-format
+msgid "Error writing to '%s'.\n"
+msgstr "Error al escribir a '%s'.\n"
+
+#: ../src/file.c:2390 ../src/tools.c:270
+#, c-format
+msgid ""
+"Normalization failed: file type not supported (%s).\n"
+"\n"
+msgstr ""
+"Error al normalizar: tipo de fichero no soportado (%s)\n"
+"\n"
+
+#: ../src/file.c:2406 ../src/tools.c:287
+#, c-format
+msgid ""
+"Normalization failed: file not available (%s).\n"
+"\n"
+msgstr ""
+"Error al normalizar: fichero no disponible (%s).\n"
+"\n"
+
+#: ../src/file_convert.c:316
+msgid "Summary status of conversion processes"
+msgstr "Resumen del estado de los procesos de conversión"
+
+#: ../src/file_convert.c:564
+msgid "active"
+msgstr "activo"
+
+#: ../src/file_convert.c:569
+msgid "inactive"
+msgstr "inactivo"
+
+#: ../src/file_convert.c:580
+#, c-format
+msgid "Active threads: %d. Scheduled tracks: %d."
+msgstr "Hilos activos: %d. Pistas planificadas: %d."
+
+#: ../src/file_convert.c:1071
+#, c-format
+msgid "Original filename not available for '%s.'\n"
+msgstr "Nombre de fichero original no disponible para '%s'.\n"
+
+#: ../src/file_convert.c:1086
+#, c-format
+msgid "Filename '%s' is no longer valid for '%s'.\n"
+msgstr "El nombre de fichero '%s' ha dejado de ser válido para '%s'.\n"
+
+#: ../src/file_convert.c:1137
+msgid "Ogg Vorbis"
+msgstr "Ogg Vorbis"
+
+#: ../src/file_convert.c:1143
+msgid "FLAC"
+msgstr "FLAC"
+
+#: ../src/file_convert.c:1198
+#, c-format
+msgid ""
+"Files of type '%s' are not supported by the iPod. Please go to the "
+"Preferences to set up and turn on a suitable conversion script for '%s'.\n"
+"\n"
+msgstr ""
+"Los ficheros del tipo '%s' no están soportados por el iPod. Por favor, vaya "
+"a preferencias para especificar un guión de conversión adecuado para '%s'.\n"
+
+#: ../src/file_convert.c:1284
+msgid "No information available"
+msgstr "Información no disponible"
+
+#: ../src/file_convert.c:1323
+#, c-format
+msgid "Could not create '%s'. Filetype conversion will not work.\n"
+msgstr ""
+"No se ha podido crear '%s'. La conversión de tipo de fichero no funcionará.\n"
+
+#: ../src/file_convert.c:1641 ../src/file_convert.c:3049
+#, c-format
+msgid ""
+"Transfer of '%s' failed. %s\n"
+"\n"
+msgstr ""
+"Ha fallado la transferencia de '%s'. %s\n"
+"\n"
+
+#: ../src/file_convert.c:2047 ../src/file_convert.c:2325
+#, c-format
+msgid ""
+"Conversion of '%s' failed: '%s'.\n"
+"\n"
+msgstr ""
+"Ha fallado la conversión de '%s': '%s'\n"
+"\n"
+
+#: ../src/file_convert.c:2062
+#, c-format
+msgid ""
+"Conversion of '%s' failed: '%s %s' returned exit status %d.\n"
+"\n"
+msgstr ""
+"Ha fallado la conversión de '%s': '%s %s' ha devuelto el estado de salida %"
+"d.\n"
+"\n"
+
+#: ../src/file_convert.c:2091
+#, fuzzy, c-format
+msgid ""
+"Conversion of '%s' failed: '\"%s\" %s' did not return filename extension as "
+"expected.\n"
+"\n"
+msgstr ""
+"Ha fallado la conversión de '%s': '%s %s' no ha devuelto la extensión de "
+"fichero como era esperado.\n"
+"\n"
+
+#: ../src/file_convert.c:2167
+#, fuzzy, c-format
+msgid ""
+"Conversion of '%s' failed: Could not access original file '%s' (%s).\n"
+"\n"
+msgstr ""
+"Ha fallado la conversión de '%s': No se ha podido acceder al fichero "
+"original '%s' (%s).\n"
+"\n"
+
+#: ../src/file_convert.c:2222
+#, c-format
+msgid ""
+"Conversion of '%s' failed: Could not create directory '%s'.\n"
+"\n"
+msgstr ""
+"Ha fallado la extensión de '%s': No se ha podido crear el directorio '%s'.\n"
+"\n"
+
+#: ../src/file_convert.c:2356
+#, c-format
+msgid ""
+"Conversion of '%s' failed: '%s' returned exit status %d.\n"
+"\n"
+msgstr ""
+"Ha fallado la conversión de '%s': %s ha devuelto el estado de salida %d.\n"
+"\n"
+
+#: ../src/file_convert.c:2395
+#, c-format
+msgid ""
+"Conversion of '%s' failed: could not stat the converted file '%s'.\n"
+"\n"
+msgstr ""
+"Ha fallado la conversión de '%s': no se ha podido obtener el estado del "
+"fichero convertido '%s'.\n"
+
+#: ../src/file_export.c:182
+#, c-format
+msgid "Skipping existing file with same length: '%s'\n"
+msgstr "Ignorando fichero existente con la misma longitud:'%s'\n"
+
+#: ../src/file_export.c:190
+#, c-format
+msgid "Overwriting existing file: '%s'\n"
+msgstr "Sobreescribiendo fichero:'%s'\n"
+
+#: ../src/file_export.c:207
+#, c-format
+msgid "Error copying '%s' to '%s': Permission Error (%s)\n"
+msgstr "Error al copiar '%s' a '%s': Error en los permisos (%s)\n"
+
+#: ../src/file_export.c:209
+#, c-format
+msgid "Error copying '%s' to '%s' (%s)\n"
+msgstr "Error copiando '%s' a '%s' (%s)\n"
+
+#: ../src/file_export.c:327
+#, c-format
+msgid "Could find file for '%s' on the iPod\n"
+msgstr "No se encuentra el fichero de '%s' en el iPod\n"
+
+#. create the dialog window
+#: ../src/file_export.c:395 ../src/tools.c:360
+msgid "Information"
+msgstr "Información"
+
+#: ../src/file_export.c:406 ../src/tools.c:372
+msgid "Press button to abort."
+msgstr "Pulsar botón para cancelar."
+
+#: ../src/file_export.c:419
+msgid "copying..."
+msgstr "copiando..."
+
+#: ../src/file_export.c:476
+#, c-format
+msgid "Failed to write '%s-%s'\n"
+msgstr "Error al escribir '%s-%s'\n"
+
+#: ../src/file_export.c:489
+#, c-format
+msgid "Copied %d of %d track."
+msgid_plural "Copied %d of %d tracks."
+msgstr[0] "Copiada %d de %d pista."
+msgstr[1] "Copiadas %d de %d pistas."
+
+#: ../src/file_export.c:505 ../src/tools.c:518
+#, c-format
+msgid "%d%% (%d:%02d:%02d left)"
+msgstr "%d%% (%d:%02d:%02d restantes)"
+
+#: ../src/file_export.c:514
+msgid "Some tracks were not copied."
+msgstr "Algunas pistas no han sido copiadas."
+
+#: ../src/file_export.c:579
+msgid "Export from iPod database not possible in offline mode."
+msgstr ""
+"Exportar de la base de datos iPod no es posible en el modo desconectado."
+
+#: ../src/file_export.c:587
+msgid "Select Export Destination Directory"
+msgstr "Seleccionar directorio de destino de la exportación"
+
+#: ../src/file_export.c:736
+msgid "Drag from iPod database not possible in offline mode."
+msgstr ""
+"Arrastrar de la base de datos iPod no es posible en el modo desconectado."
+
+#: ../src/file_export.c:770
+msgid "The following tracks have to be copied to your harddisk"
+msgstr "Las siguientes pistas serán copiadas al disco duro."
+
+#: ../src/file_export.c:815
+msgid ""
+"Some tracks were not copied to your harddisk. Only the copied tracks will be "
+"included in the current drag and drop operation.\n"
+"\n"
+msgstr ""
+"Algunas pistas no fueron copiadas al disco duro. Solo las pistas copiadas "
+"serán incluidas en la actual operación de arrastrar y soltar.\n"
+"\n"
+
+#: ../src/file_export.c:1010
+#, c-format
+msgid ""
+"No valid filename for: %s\n"
+"\n"
+msgstr ""
+"Ningún nombre de fichero valido para:%s\n"
+"\n"
+
+#: ../src/file_export.c:1026
+#, c-format
+msgid "Created playlist with one track."
+msgid_plural "Created playlist with %d tracks."
+msgstr[0] "Creada lista de reproducción con una pista."
+msgstr[1] "Creada lista de reproducción con %d pistas."
+
+#: ../src/file_export.c:1031
+#, c-format
+msgid ""
+"Could not open '%s' for writing (%s).\n"
+"\n"
+msgstr ""
+"No se puede abrir '%s' para escritura (%s).\n"
+"\n"
+
+#: ../src/file_itunesdb.c:129
+#, c-format
+msgid "Matching SHA1 checksum for file %d/%d"
+msgstr ""
+"Buscando concordancias de la suma de comprobación SHA1 para el fichero %d/%d"
+
+#: ../src/file_itunesdb.c:236
+#, fuzzy, c-format
+msgid "Could not open \"%s\" for reading extended info.\n"
+msgstr "No es posible abrir \"%s\" para escribir la información extendida.\n"
+
+#: ../src/file_itunesdb.c:243
+msgid "Could not create hash value from itunesdb\n"
+msgstr "No se puede crear valor de resumen (hash) de la base de datos iTunes\n"
+
+#: ../src/file_itunesdb.c:259
+#, c-format
+msgid "Error while reading extended info: %s\n"
+msgstr "Error al leer la información extendida: %s\n"
+
+#: ../src/file_itunesdb.c:276
+#, c-format
+msgid ""
+"iTunesDB '%s' does not match checksum in extended information file '%s'\n"
+"gtkpod will try to match the information using SHA1 checksums. This may take "
+"a long time.\n"
+"\n"
+msgstr ""
+"La suma de comprobación de la base de datos iTunes '%s' no concuerda con la "
+"del fichero de información extendida '%s'\n"
+"gtkpod intentará comprobar la información usando sumas de comprobación SHA1. "
+"Esto puede durar bastante tiempo.\n"
+"\n"
+
+#: ../src/file_itunesdb.c:288
+#, c-format
+msgid ""
+"%s:\n"
+"Expected \"itunesdb_hash=\" but got:\"%s\"\n"
+msgstr ""
+"%s:\n"
+"Esperado \"itunesdb_hash=\" , pero encontrado:\"%s\"\n"
+
+#: ../src/file_itunesdb.c:348
+#, c-format
+msgid ""
+"%s:\n"
+"Format error: %s\n"
+msgstr ""
+"%s:\n"
+"Error de formato: %s\n"
+
+#: ../src/file_itunesdb.c:393
+msgid ""
+"No SHA1 checksums on individual tracks are available.\n"
+"\n"
+"To avoid this situation in the future either switch on duplicate detection "
+"(will provide SHA1 checksums) or avoid using the iPod with programs other "
+"than gtkpod.\n"
+"\n"
+msgstr ""
+"No hay disponibles sumas de comprobación (checksums) de pistas "
+"individuales.\n"
+"\n"
+"Para evitar esta situación en el futuro activar la detección de duplicados "
+"(generará sumas de comprobación SHA1) o evitar usar el iPod con otros "
+"programas que no sean gtkpod.\n"
+"\n"
+
+#: ../src/file_itunesdb.c:457
+msgid ""
+"Extended info will not be used. If you have non-transferred tracks,\n"
+"these will be lost.\n"
+msgstr ""
+"La información extendida no será usada. Las pistas no transferidas serán "
+"perdidas.\n"
+
+#: ../src/file_itunesdb.c:465
+msgid "Offline iPod database successfully imported"
+msgstr "Base de datos del iPod en modo desconectado importada con éxito."
+
+#: ../src/file_itunesdb.c:468
+msgid "Local database successfully imported"
+msgstr "Base de datos local importada con éxito."
+
+#: ../src/file_itunesdb.c:476
+#, c-format
+msgid ""
+"Offline iPod database import failed: '%s'\n"
+"\n"
+msgstr ""
+"Error en la importación de la base de datos del iPod en modo desconectado: '%"
+"s'\n"
+"\n"
+
+#: ../src/file_itunesdb.c:480
+#, c-format
+msgid ""
+"Local database import failed: '%s'\n"
+"\n"
+msgstr ""
+"Error en la importación de la base de datos local: '%s'\n"
+"\n"
+
+#: ../src/file_itunesdb.c:487
+msgid ""
+"Offline iPod database import failed: \n"
+"\n"
+msgstr ""
+"Error en la importación de la base de datos del iPod en modo desconectado:\n"
+"\n"
+
+#: ../src/file_itunesdb.c:490
+msgid ""
+"Local database import failed: \n"
+"\n"
+msgstr ""
+"Error en la importación de la base de datos local:\n"
+"\n"
+
+#: ../src/file_itunesdb.c:497
+#, c-format
+msgid ""
+"'%s' does not exist. Import aborted.\n"
+"\n"
+msgstr ""
+"'%s' no existe. Importación cancelada.\n"
+"\n"
+
+#: ../src/file_itunesdb.c:520
+msgid "Extended info will not be used.\n"
+msgstr "La información extendida no será usada.\n"
+
+#: ../src/file_itunesdb.c:527
+msgid "iPod Database Successfully Imported"
+msgstr "Base de datos del iPod importada con éxito"
+
+#: ../src/file_itunesdb.c:534
+#, c-format
+msgid ""
+"iPod Database Import Failed: '%s'\n"
+"\n"
+msgstr ""
+"Error en la importación de la base de datos del iPod:'%s'\n"
+"\n"
+
+#: ../src/file_itunesdb.c:540
+msgid ""
+"iPod Database Import Failed.\n"
+"\n"
+msgstr ""
+"Error en la importación de la base de datos del iPod.\n"
+"\n"
+
+#: ../src/file_itunesdb.c:549
+#, c-format
+msgid ""
+"'%s' (or similar) does not exist. Import aborted.\n"
+"\n"
+msgstr ""
+"'%s' (o similar) no existe. Importación cancelada.\n"
+"\n"
+
+#: ../src/file_itunesdb.c:865
+#, c-format
+msgid ""
+"Could not find iPod directory structure at '%s'.\n"
+"If you are sure that the iPod is properly mounted at '%s', gtkpod can create "
+"the directory structure for you.\n"
+"\n"
+"Do you want to create the directory structure now?\n"
+msgstr ""
+"No se ha encontrado la estructura del iPod en '%s'.\n"
+"Si estás seguro que el iPod está montado correctamente en '%s', gtkpod puede "
+"crear la esctructura de directorios para ti.\n"
+"\n"
+"¿Quieres crear la estructura de directorios ahora?\n"
+
+#: ../src/file_itunesdb.c:1180
+#, c-format
+msgid "Could not open \"%s\" for writing extended info.\n"
+msgstr "No es posible abrir \"%s\" para escribir la información extendida.\n"
+
+#: ../src/file_itunesdb.c:1195
+msgid "Aborted writing of extended info.\n"
+msgstr "Cancelada la escritura de la información extendida.\n"
+
+#: ../src/file_itunesdb.c:1397
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: ../src/file_itunesdb.c:1411
+#, c-format
+msgid "%d%% (%d/%d  %d:%02d:%02d left)"
+msgstr "%d%% (%d/%d  %d:%02d:%02d restantes)"
+
+#: ../src/file_itunesdb.c:1463
+msgid "Status: Deleting File"
+msgstr "Estado: borrando fichero"
+
+#: ../src/file_itunesdb.c:1524
+#, c-format
+msgid ""
+"Could not remove the following file: '%s'\n"
+"\n"
+msgstr ""
+"No se ha podido borrar el siguiente fichero: '%s'\n"
+"\n"
+
+#: ../src/file_itunesdb.c:1632
+msgid ""
+"The following track could not be converted successfully:\n"
+"\n"
+msgid_plural ""
+"The following tracks could not be converted successfully:\n"
+"\n"
+msgstr[0] ""
+"La siguiente pista no ha podido ser convertida:\n"
+"\n"
+msgstr[1] ""
+"Las siguientes pistas no han podido ser convertidas:\n"
+"\n"
+
+#: ../src/file_itunesdb.c:1642
+msgid ""
+"The following track could not be transferred successfully:\n"
+"\n"
+msgid_plural ""
+"The following tracks could not be transferred successfully:\n"
+"\n"
+msgstr[0] ""
+"La siguiente pista no ha podido ser transferida:\n"
+"\n"
+msgstr[1] ""
+"Las siguientes pistas no han podido ser actualizadas:\n"
+"\n"
+
+#. ID
+#. modal,
+#. gint id,
+#. gboolean modal,
+#: ../src/file_itunesdb.c:1651 ../src/misc_confirm.c:70
+msgid "Warning"
+msgstr "Atención"
+
+#. title
+#: ../src/file_itunesdb.c:1652
+msgid ""
+"The iPod could not be ejected. Please fix the problems mentioned below and "
+"then eject the iPod again. Pressing 'OK' will re-schedule the failed tracks "
+"for conversion and transfer."
+msgstr ""
+"El iPod no ha podido ser expulsado. Por favor corrija los problemas que se "
+"muestran a continuación y expulse el iPod de nuevo. Pulsando OK las pistas "
+"que han fallado serán re-añadidas para su conversión y transferencia."
+
+#: ../src/file_itunesdb.c:1715
+#, c-format
+msgid "Status: Copying track"
+msgstr "Estado: copiando pista"
+
+#: ../src/file_itunesdb.c:1721
+#, c-format
+msgid "Status: Waiting for conversion to complete"
+msgstr "Estado: esperando a que finalice al conversión"
+
+#: ../src/file_itunesdb.c:1725
+#, c-format
+msgid "Status: Finished transfer"
+msgstr "Estado: transferencia finalizada"
+
+#: ../src/file_itunesdb.c:1770
+#, c-format
+msgid ""
+"One track could not be transferred because your iPod is full. Either delete "
+"some tracks or otherwise create space on the iPod before ejecting the iPod "
+"again."
+msgid_plural ""
+"%d tracks could not be transferred because your iPod is full. Either delete "
+"some tracks or otherwise create space on the iPod before ejecting the iPod "
+"again."
+msgstr[0] ""
+"Una pista no ha podido ser transferida porque el iPod está lleno. Borre "
+"algunas pistas o haga espacio en el iPod antes de expulsarlo de nuevo."
+msgstr[1] ""
+"%d pistas no han podido ser transferidas porque el iPod está lleno. Borre "
+"algunas pistas o haga espacio en el iPod antes de expulsarlo de nuevo."
+
+#: ../src/file_itunesdb.c:1852
+#, c-format
+msgid ""
+"You did not import the existing iTunesDB ('%s'). This is most likely "
+"incorrect and will result in the loss of the existing database.\n"
+"\n"
+"Press 'OK' if you want to proceed anyhow or 'Cancel' to skip storing. If you "
+"cancel, you can import the existing database before calling this function "
+"again.\n"
+msgstr ""
+"La base de datos iTunes ('%s') no ha sido importada. Esto no es correcto y "
+"puede ocasionar la pérdida de la base de datos actual.\n"
+"\n"
+"Pulsar «Aceptar» para continuar o «Cancelar» para detener la copia. Si se "
+"cancela, se podrá importar la base de datos iTunes antes de usar de nuevo "
+"esta función.\n"
+
+#: ../src/file_itunesdb.c:1887
+msgid ""
+"iPod directory structure must be present before synching to the iPod can be "
+"performed.\n"
+msgstr ""
+"La estructura de directorios del iPod debe estar creada antes de que se "
+"pueda sincronizar con el iPod.\n"
+
+#: ../src/file_itunesdb.c:1896
+msgid "Some tracks could not be deleted from the iPod. Export aborted!"
+msgstr ""
+"No ha sido posible borrar algunas pistas del iPod. ¡La exportación ha sido "
+"cancelada!"
+
+#: ../src/file_itunesdb.c:1914
+#, fuzzy, c-format
+msgid "Now writing database '%s'. Please wait..."
+msgstr "Escribiendo la base de datos. Espere, por favor."
+
+#: ../src/file_itunesdb.c:1963
+#, c-format
+msgid "Extended information file not deleted: '%s'"
+msgstr "El fichero de información extendida '%s' no ha sido borrado."
+
+#: ../src/file_itunesdb.c:2070
+#, c-format
+msgid "%s: Database saved"
+msgstr "Guardada la base de datos: %s"
+
+#: ../src/file_itunesdb.c:2074
+#, c-format
+msgid "%s: Changes saved"
+msgstr "%s: Cambios guardados"
+
+#: ../src/fileselection.c:129
+msgid "Successfully added files"
+msgstr "Ficheros añadidos con éxito."
+
+#: ../src/fileselection.c:131
+msgid "Some files were not added successfully"
+msgstr "Algunos ficheros no han sido añadidos con exito"
+
+#: ../src/fileselection.c:164 ../src/fileselection.c:305
+#: ../src/fileselection.c:792
+msgid "Please select a playlist or repository before adding tracks."
+msgstr ""
+
+#: ../src/fileselection.c:175 ../src/fileselection.c:314
+#: ../src/fileselection.c:803
+msgid "Please load the iPod before adding tracks."
+msgstr ""
+
+#: ../src/fileselection.c:185
+#, fuzzy, c-format
+msgid "Add files to '%s'"
+msgstr "Añadir ficheros"
+
+#: ../src/fileselection.c:189
+#, c-format
+msgid "Add files to '%s/%s'"
+msgstr ""
+
+#. Create window title
+#: ../src/fileselection.c:322
+#, fuzzy, c-format
+msgid "Add playlist files to '%s'"
+msgstr "Añadir lista de reproducción desde fichero"
+
+#. Create the file chooser, and handle the response
+#: ../src/fileselection.c:378
+msgid "Set Cover"
+msgstr "Configurar portada"
+
+#: ../src/fileselection.c:816
+#, fuzzy, c-format
+msgid "Add directories to '%s'"
+msgstr "Añadir directorios recursivamente"
+
+#: ../src/fileselection.c:820
+#, fuzzy, c-format
+msgid "Add directories to '%s/%s'"
+msgstr "Añadir directorios recursivamente"
+
+#: ../src/fileselection.c:1097
+msgid "Ok"
+msgstr "Aceptar"
+
+#: ../src/fileselection.c:1106
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: ../src/flacfile.c:62
+#, c-format
+msgid "'%s' does not appear to be an FLAC audio file.\n"
+msgstr "'%s' no parece ser un fichero de audio FLAC.\n"
+
+#: ../src/flacfile.c:78
+#, c-format
+msgid "Error retrieving tags for '%s'.\n"
+msgstr "Error al recuperar las etiquetas de '%s'.\n"
+
+#: ../src/flacfile.c:165
+#, c-format
+msgid ""
+"Import of '%s' failed: FLAC not supported without the FLAC library. You must "
+"compile the gtkpod source together with the FLAC library.\n"
+msgstr ""
+"Error en la importación de '%s': FLAC no están soportados sin la biblioteca "
+"FLAC. gtkpod debe estar compilado junto con la biblioteca FLAC.\n"
+
+#: ../src/flacfile.c:171
+#, c-format
+msgid ""
+"FLAC metadata update for '%s' failed: FLAC not supported without the FLAC "
+"library. You must compile the gtkpod source together with the FLAC library.\n"
+msgstr ""
+"Error al actualizar los metadatos FLAC para '%s': FLAC no está soportado sin "
+"la biblioteca FLAC. gtkpod debe estar compilado junto con la biblioteca "
+"FLAC.\n"
+
+#: ../src/getopt.c:681
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: la opción `%s' es ambigua\n"
+
+#: ../src/getopt.c:706
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: la opción `--%s' no permite un argumento\n"
+
+#: ../src/getopt.c:711
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: la opción `%c%s' no permite un argumento\n"
+
+#: ../src/getopt.c:729 ../src/getopt.c:902
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: la opción `%s' necesita un argumento\n"
+
+#. --option
+#: ../src/getopt.c:758
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: opción desconocida `--%s'\n"
+
+#. +option or -option
+#: ../src/getopt.c:762
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: opción desconocida `%c%s'\n"
+
+#. 1003.2 specifies the format of this message.
+#: ../src/getopt.c:788
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: opción no permitida -- %c\n"
+
+#: ../src/getopt.c:791
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: opción no válida -- %c\n"
+
+#. 1003.2 specifies the format of this message.
+#: ../src/getopt.c:821 ../src/getopt.c:951
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: la opción necesita un argumento -- %c\n"
+
+#: ../src/getopt.c:868
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: la opción `-W %s' es ambigua \n"
+
+#: ../src/getopt.c:886
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: la opción `-W %s' no permite un argumento\n"
+
+#: ../src/info.c:383
+msgid "n/c"
+msgstr "n/c"
+
+#: ../src/info.c:388 ../src/info.c:838
+msgid "offline"
+msgstr "modo desconectado"
+
+#: ../src/info.c:486
+#, c-format
+msgid " P:%d T:%d/%d"
+msgstr " P:%d T:%d/%d"
+
+#: ../src/info.c:780
+msgid "B"
+msgstr "B"
+
+#: ../src/info.c:780
+msgid "kB"
+msgstr "KiB"
+
+#: ../src/info.c:780
+msgid "TB"
+msgstr "TiB"
+
+#: ../src/info.c:823
+#, c-format
+msgid " %s Free"
+msgstr " %s Libre"
+
+#: ../src/info.c:828
+#, c-format
+msgid " %s Pending"
+msgstr " %s Pendiente"
+
+#: ../src/info.c:833
+msgid " disconnected"
+msgstr " desconectado"
+
+#: ../src/info.c:884
+msgid "No database or playlist selected"
+msgstr "No se ha seleccionado ninguna base de datos o lista de reproducción"
+
+#: ../src/info.c:889
+msgid "No tracks selected"
+msgstr "No se ha seleccionado ninguna pista"
+
+#: ../src/info.c:894
+msgid "No playlist selected"
+msgstr "No se ha seleccionado ninguna lista de reproducción"
+
+#: ../src/info.c:899
+msgid "No iPod or iPod playlist selected"
+msgstr "No se ha seleccionado ningún iPod o lista de reproducción del iPod."
+
+#. Strings used several times
+#: ../src/ipod_init.c:48
+msgid "Select or enter your model"
+msgstr "Seleccione o introduzca su modelo"
+
+#: ../src/ipod_init.c:79 ../src/repository.c:546 ../src/repository.c:2369
+msgid "Select mountpoint"
+msgstr "Seleccionar el punto de montaje del iPod"
+
+#: ../src/ipod_init.c:359
+#, c-format
+msgid "Error initialising iPod: %s\n"
+msgstr "Error al iniciar el iPod: %s\n"
+
+#: ../src/ipod_init.c:366
+msgid "Error initialising iPod, unknown error\n"
+msgstr "Error al iniciar el iPod, error desconocido\n"
+
+#: ../src/ipod_init.c:422
+#, c-format
+msgid "<b>Please select your iPod model at </b><i>%s</i>"
+msgstr "<b>Por favor, seleccionar el modelo de iPod en </b><i>%s</i>"
+
+#: ../src/ipod_init.c:463
+msgid ""
+"Could not determine the model you selected -- this could be a bug or "
+"incompatibilty in the GTK+ or glade library.\n"
+"\n"
+msgstr ""
+
+#: ../src/misc.c:70
+#, fuzzy
+msgid ""
+"© 2002 - 2007\n"
+"Jorg Schuler (jcsjcs at users dot sourceforge dot net)\n"
+"Corey Donohoe (atmos at atmos dot org)\n"
+msgstr ""
+"(C) 2002 - 2007\n"
+"Jorg Schuler (jcsjcs en users punto sourceforge punto net)\n"
+"Corey Donohoe (atmos en atmos punto org)\n"
+"\n"
+"\n"
+
+#: ../src/misc.c:74
+#, fuzzy
+msgid ""
+"Patches were supplied by the following people (list may be incomplete -- "
+"please contact me)\n"
+msgstr ""
+"Los parches fueron proveídos por: (la lista puede estar incompleta-- por "
+"favor, contactar conmigo)\n"
+"\n"
+
+#: ../src/misc.c:75
+#, fuzzy
+msgid "Ramesh Dharan: Multi-Edit (edit tags of several tracks in one run)"
+msgstr ""
+"Ramesh Dharan: Multi-Edición (editar etiquetas de varias pistas al al vez)\n"
+
+#: ../src/misc.c:76
+#, fuzzy
+msgid "Hiroshi Kawashima: Japanese charset autodetection feature"
+msgstr ""
+"Hiroshi Kawashima: Función de autodetección del juego de caracteres "
+"japonés.\n"
+
+#: ../src/misc.c:77
+#, fuzzy
+msgid "Adrian Ulrich: porting of playlist code from mktunes.pl to itunesdb.c"
+msgstr ""
+"Adrian Ulrich: paso del código de las listas de reproducción de mktunes.pl a "
+"itunesdb.c\n"
+
+#: ../src/misc.c:78
+#, fuzzy
+msgid ""
+"Walter Bell: correct handling of DND URIs with escaped characters and/or cr/"
+"newlines at the end"
+msgstr ""
+"Walter Bell: manejo correcto de URIs DND con la presencia de \"caracteres de "
+"escape\" y/o \"cr/nueva linea\" al final\n"
+
+#: ../src/misc.c:79
+#, fuzzy
+msgid "Sam Clegg: user defined filenames when exporting tracks from the iPod"
+msgstr ""
+"Sam Clegg: Nombre de ficheros definidos por el usuario al exportar pistas "
+"desde el iPod\n"
+
+#: ../src/misc.c:80
+#, fuzzy
+msgid "Chris Cutler: automatic creation of various playlist types"
+msgstr ""
+"Chris Cutler: creación automática de varios tipos de listas de reproducción\n"
+
+#: ../src/misc.c:81
+#, fuzzy
+msgid ""
+"Graeme Wilford: reading and writing of the 'Composer' ID3 tags, progress "
+"dialogue during sync"
+msgstr ""
+"Graeme Wilford: lectura y escritura del compositor de etiquetas  ID3, "
+"diálogo de progreso durante la sincronización\n"
+
+#: ../src/misc.c:82
+#, fuzzy
+msgid ""
+"Edward Matteucci: debugging, special playlist creation, most of the volume "
+"normalizing code"
+msgstr ""
+"Edward Matteucci: depuración, creación de listas de reproducción especiales, "
+"mayor parte del código de normalización del volumen\n"
+
+#: ../src/misc.c:83
+#, fuzzy
+msgid "Jens Lautenbach: some optical improvements"
+msgstr "Jens Lautenbach: algunas mejoras visuales\n"
+
+#: ../src/misc.c:84
+#, fuzzy
+msgid "Alex Tribble: iPod eject patch"
+msgstr "Alex Tribble: parche de expulsion del iPod mediante \"eject\"\n"
+
+#: ../src/misc.c:85
+#, fuzzy
+msgid "Yaroslav Halchenko: Orphaned and dangling tracks handling"
+msgstr "Yaroslav Halchenko: manejo de pistas en estado huérfano y pendiente\n"
+
+#: ../src/misc.c:86
+#, fuzzy
+msgid ""
+"Andrew Huntwork: Filename case sensitivity fix and various other bugfixes"
+msgstr ""
+"Andrew Huntwork: Corrección de la distinción de mayúsculas y minúsculas en "
+"los nombres de fichero y otras correcciones varias\n"
+
+#: ../src/misc.c:87
+#, fuzzy
+msgid ""
+"Ero Carrera: Filename validation and quick sync when copying tracks from the "
+"iPod"
+msgstr ""
+"Ero Carrera: Validación de los nombres de fichero y sincronización rápida al "
+"copiar pistas desde el iPod\n"
+
+#: ../src/misc.c:88
+#, fuzzy
+msgid "Jens Taprogge: Support for LAME's replay gain tag to normalize volume"
+msgstr ""
+"Jens Taprogge: Soporte de la etiqueta de reproducción de ganancia de LAME "
+"para normalizar el volumen\n"
+
+#: ../src/misc.c:89
+#, fuzzy
+msgid "Armando Atienza: Support with external playcounts"
+msgstr "Armando Atienza: Soporte para contadores externos\n"
+
+#: ../src/misc.c:90
+#, fuzzy
+msgid "D.L. Sharp: Support for m4b files (bookmarkable AAC files)"
+msgstr "D.L. Sharp: Soporte para ficheros m4b (audio libros AAC )\n"
+
+#: ../src/misc.c:91
+#, fuzzy
+msgid "Jim Hall: Decent INSTALL file"
+msgstr "Jim Hall: Fichero INSTALL decente\n"
+
+#: ../src/misc.c:92
+#, fuzzy
+msgid ""
+"Juergen Helmers, Markus Gaugusch: Conversion scripts to sync calendar/"
+"contacts to the iPod"
+msgstr ""
+"Juergen Helmers, Markus Gaugusch: guiones de conversión para sincronizar "
+"calendario/contactos al iPod\n"
+
+#. J"urgen!
+#: ../src/misc.c:93
+#, fuzzy
+msgid "Flavio Stanchina: bugfixes"
+msgstr "Flavio Stanchina: corrección de errores\n"
+
+#: ../src/misc.c:94
+#, fuzzy
+msgid ""
+"Chris Micacchi: when sorting ignore 'the' and similar at the beginning of "
+"the title"
+msgstr ""
+"Chris Micacchi: Ignorar artículos al principio de los títulos al ordenar\n"
+
+#: ../src/misc.c:95
+#, fuzzy
+msgid "Steve Jay: use statvfs() instead of df (better portability, faster)"
+msgstr ""
+"Steve Jay: uso de statvfs() en vez de df (mejor portabilidad, más rápido)\n"
+
+#: ../src/misc.c:97
+#, fuzzy
+msgid ""
+"Christoph Kunz: address compatibility issues when writing id3v2.4 type mp3 "
+"tags"
+msgstr ""
+"Christoph Kunz: resolución de los problemas de compatibilidad en la "
+"escritura de la etiquetas de tipo mp3 id3v2.4\n"
+
+#: ../src/misc.c:99
+#, fuzzy
+msgid ""
+"James Liggett:\n"
+"replacement of old GTK file selection dialogs with new GTK filechooser "
+"dialogs\n"
+"refactored user preferences system."
+msgstr ""
+"James Liggett:\n"
+"      reemplazo de los antiguos diálogos GTK de selección de ficheros por "
+"los nuevos GTK\n"
+"     rehecho el sistema de preferencias del usuario.\n"
+
+#: ../src/misc.c:103
+#, fuzzy
+msgid "Daniel Kercher: sync scripts for abook and webcalendar"
+msgstr "Daniel Kercher: guiones de sincronización para abook y webcalendar\n"
+
+#: ../src/misc.c:105
+#, fuzzy
+msgid "Clinton Gormley: sync scripts for thunderbird"
+msgstr "Clinton Gormley: guión de sincronización para thunderbird\n"
+
+#: ../src/misc.c:107
+#, fuzzy
+msgid "Sebastien Beridot: sync script for ldif addressbook format"
+msgstr ""
+"Sebastien Beridot: guión de sincronización para formato de contactos ldif\n"
+
+#: ../src/misc.c:109
+#, fuzzy
+msgid "Sebastian Scherer: sync script for kNotes"
+msgstr "Sebastian Scherer: guión de sincronización para kNotes\n"
+
+#: ../src/misc.c:111
+#, fuzzy
+msgid "Nick Piper: sync script for Palm, type-ahead search"
+msgstr "Nick Piper: guión de sincronización para Palm, búsqueda type-ahead\n"
+
+#: ../src/misc.c:113
+#, fuzzy
+msgid "Uwe Hermann: help with support for iPod Video"
+msgstr "Uwe Hermann: ayuda con el soporte para el iPod Video\n"
+
+#: ../src/misc.c:115
+#, fuzzy
+msgid ""
+"Iain Benson: support for compilation tag in mp3 files and separate display "
+"of compilations in the sort tab."
+msgstr ""
+"Iain Benson: soporte para compilar etiquetas en ficheros mp3 y visualización "
+"separada de las compilaciones en las pestañas.\n"
+
+#: ../src/misc.c:116
+#, fuzzy
+msgid ""
+"Nicolas Chariot: icons of buttons\n"
+"\n"
+msgstr ""
+"Nicolas Chariot: botones de los iconos\n"
+"\n"
+"\n"
+
+#: ../src/misc.c:118
+#, fuzzy
+msgid "This program borrows code from the following projects:"
+msgstr "Este programa usa código de los siguientes proyectos:\n"
+
+#: ../src/misc.c:119
+#, fuzzy
+msgid ""
+"gnutools: (mktunes.pl, ported to C) reading and writing of iTunesDB  (http://"
+"www.gnu.org/software/gnupod/)"
+msgstr ""
+"    gnutools: (mktunes.pl, portado a C) lectura y escritura de la base de "
+"datos iTunes (http://www.gnu.org/software/gnupod/)\n"
+
+#: ../src/misc.c:120
+#, fuzzy
+msgid ""
+"iPod.cpp, iPod.h by Samuel Wood (sam dot wood at gmail dot com): some code "
+"for smart playlists is based on his C++-classes."
+msgstr ""
+"    iPod.cpp, iPod.h de Samuel Wood (sam punto wood en gmail punto com): "
+"parte del código de las listas de reproducción inteligentes está basado en "
+"sus clases C++.\n"
+
+#: ../src/misc.c:121
+#, fuzzy
+msgid "mp3info: mp3 playlength detection (http://ibiblio.org/mp3info/)"
+msgstr ""
+"    mp3info:  detección de la duración de los mp3 (http://ibiblio.org/"
+"mp3info/)\n"
+
+#: ../src/misc.c:122
+#, fuzzy
+msgid "xmms: dirbrowser, mp3 playlength detection (http://www.xmms.org)"
+msgstr ""
+"    xmms:     exploración de directorios, detección de la duración de los "
+"mp3 (http://www.xmms.org)\n"
+
+#: ../src/misc.c:124
+#, fuzzy
+msgid "The GUI was created with the help of glade-2 (http://glade.gnome.org/)."
+msgstr ""
+"El interfaz gráfico ha sido creado con la ayuda de glade-2 (http://glade."
+"gnome.org/).\n"
+
+#: ../src/misc.c:128
+#, fuzzy
+msgid "French: David Le Brun (david at dyn-ns dot net)"
+msgstr "Francés:   David Le Brun (david en dyn-ns punto net)\n"
+
+#: ../src/misc.c:129
+msgid "French: Éric Lassauge (rpmfarm at free dot fr)"
+msgstr ""
+
+#: ../src/misc.c:130
+#, fuzzy
+msgid "German: Jorg Schuler (jcsjcs at users dot sourceforge dot net)"
+msgstr "Alemán:   Jorg Schuler (jcsjcs en users punto sourceforge punto net)\n"
+
+#: ../src/misc.c:131
+msgid "German: Kai-Ove"
+msgstr ""
+
+#: ../src/misc.c:132
+#, fuzzy
+msgid "Hebrew: Assaf Gillat (gillata at gmail dot com)"
+msgstr "Hebreo: Assaf Gillat (gillata en gmail punto com)\n"
+
+#: ../src/misc.c:133
+#, fuzzy
+msgid ""
+"Italian: Edward Matteucci (edward_matteucc at users dot sourceforge dot net)"
+msgstr ""
+"Italiano:  Edward Matteucci (edward_matteucc en users punto sourceforge "
+"punto net)\n"
+
+#: ../src/misc.c:134
+msgid "Italian: Daniele Forsi (dforsi at gmail dot com)"
+msgstr ""
+
+#: ../src/misc.c:135
+#, fuzzy
+msgid "Japanese: Ayako Sano"
+msgstr "Japonés: Ayako Sano\n"
+
+#: ../src/misc.c:136
+#, fuzzy
+msgid "Japanese: Kentaro Fukuchi (fukuchi at users dot sourceforge dot net)"
+msgstr ""
+"Japonés: Kentaro Fukuchi (fukuchi en users punto sourceforge punto net)\n"
+
+#: ../src/misc.c:137
+msgid "Romanian: Alex Eftimie (alexeftimie at gmail dot com)"
+msgstr ""
+
+#: ../src/misc.c:138
+msgid "Spanish: Alejandro Lamas Daviña (alejandro.lamas at ific dot uv dot es)"
+msgstr ""
+
+#: ../src/misc.c:139
+#, fuzzy
+msgid "Swedish: Stefan Asserhall (stefan.asserhall at comhem dot se)"
+msgstr "Sueco: Stefan Asserhall (stefan asserhall en comhem punto se)\n"
+
+#: ../src/misc.c:144
+#, fuzzy
+msgid ""
+"This program is free software; you can redistribute it and/or\n"
+"modify it under the terms of the GNU General Public License as\n"
+"published by the Free Software Foundation; either version 2 of the\n"
+"License, or (at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful, but\n"
+"WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See\n"
+"the GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public\n"
+"License along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA\n"
+"02111-1307, USA."
+msgstr ""
+"Este programa es software libre. Puede redistribuirlo y/o modificarlo bajo "
+"los términos de la Licencia Pública General de GNU según es publicada por la "
+"Free Software Foundation, bien de la versión 2 de dicha Licencia o bien "
+"(según su elección) de cualquier versión posterior.\n"
+"\n"
+"Este programa se distribuye con la esperanza de que sea útil, pero SIN "
+"NINGUNA GARANTÍA, incluso sin la garantía MERCANTIL implícita o sin "
+"garantizar la CONVENIENCIA PARA UN PROPÓSITO PARTICULAR. Véase la Licencia "
+"Pública General de GNU para más detalles.\n"
+"\n"
+"Debería haber recibido una copia de la Licencia Pública General junto con "
+"este programa. Si no ha sido así, escriba a la Free Software Foundation, "
+"Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"\n"
+
+#: ../src/misc.c:159
+#, fuzzy
+msgid ""
+"© 2002-2007\n"
+"Jorg Schuler <jcsjcs at users.sourceforge.net>\n"
+"Corey Donohoe <atmos at atmos.org>"
+msgstr ""
+"(C) 2002 - 2007\n"
+"Jorg Schuler (jcsjcs en users punto sourceforge punto net)\n"
+"Corey Donohoe (atmos en atmos punto org)\n"
+"\n"
+"\n"
+
+#: ../src/misc.c:167
+#, fuzzy
+msgid "Cross-platform multilingual interface to Apple's iPod™"
+msgstr ""
+"gtkpod versión %s: Interfaz multi-plataforma y multi-idioma para iPods Apple."
+
+#: ../src/misc.c:934
+#, c-format
+msgid "Could not process '%s' (no filename available)"
+msgstr "No se puede procesar '%s' (ningún nombre de fichero disponible)"
+
+#: ../src/misc.c:1088
+#, c-format
+msgid "Unknown token '%%%c' in template '%s'"
+msgstr "Testigo desconocido '%%%c' en la plantilla '%s'"
+
+#: ../src/misc.c:1171
+#, c-format
+msgid "Template ('%s') does not match file type '%s'\n"
+msgstr "La plantilla ('%s') no concuerda con el tipo de fichero '%s'\n"
+
+#: ../src/misc.c:1257
+#, c-format
+msgid "Error creating %s: %s\n"
+msgstr "Error al crear %s: %s\n"
+
+#: ../src/misc.c:1691
+#, c-format
+msgid ""
+"Writing preferences file '%s' failed (%s).\n"
+"\n"
+msgstr ""
+"Fallo al escribir el fichero de preferencias '%s' (%s).\n"
+"\n"
+
+#: ../src/misc.c:1693
+msgid "unspecified error"
+msgstr "error no especificado"
+
+#: ../src/misc.c:1701
+#, c-format
+msgid ""
+"Writing preferences to the iPod (%s) failed: could not get path to Control "
+"Directory.\n"
+"\n"
+msgstr ""
+"La escritura de las preferencias en el iPod (%s) ha fallado: no se ha podido "
+"acceder al directorio de control.\n"
+"\n"
+
+#. title
+#: ../src/misc_confirm.c:71
+msgid "The following has occurred:"
+msgstr "Ha ocurrido lo siguiente:"
+
+#: ../src/misc_confirm.c:122
+msgid ""
+"Are you sure you want to delete the following track completely from your "
+"iPod? The number of playlists this track is a member of is indicated in "
+"parentheses."
+msgid_plural ""
+"Are you sure you want to delete the following tracks completely from your "
+"iPod? The number of playlists the tracks are member of is indicated in "
+"parentheses."
+msgstr[0] ""
+"¿Desea realmente borrar la siguiente pista del iPod? El número de listas de "
+"reproducción a las que pertenece esta pista está indicado entre paréntesis."
+msgstr[1] ""
+"¿Desea realmente borrar las siguientes pistas del iPod? El número de listas "
+"de reproducción a las que pertenecen estas pistas está indicado entre "
+"paréntesis."
+
+#: ../src/misc_confirm.c:126
+msgid "Delete Track Completely from iPod?"
+msgid_plural "Delete Tracks Completely from iPod?"
+msgstr[0] "¿Borrar por completo la pista del iPod?"
+msgstr[1] "¿Borrar por completo las pistas del iPod?"
+
+#: ../src/misc_confirm.c:137 ../src/misc_confirm.c:178
+#, c-format
+msgid ""
+"Are you sure you want to remove the following track from the playlist \"%s\"?"
+msgid_plural ""
+"Are you sure you want to remove the following tracks from the playlist \"%s"
+"\"?"
+msgstr[0] ""
+"¿Desea realmente borrar la siguiente pista de la lista de reproducción \"%s"
+"\"?"
+msgstr[1] ""
+"¿Desea realmente borrar las siguientes pistas de la lista de reproducción \"%"
+"s\"?"
+
+#: ../src/misc_confirm.c:141 ../src/misc_confirm.c:182
+msgid "Remove Track From Playlist?"
+msgid_plural "Remove Tracks From Playlist?"
+msgstr[0] "¿Borrar la pista de la lista de reproducción?"
+msgstr[1] "¿Borrar las pistas de la lista de reproducción?"
+
+#: ../src/misc_confirm.c:163
+msgid ""
+"Are you sure you want to delete the following track completely from your "
+"harddisk? The number of playlists this track is a member of is indicated in "
+"parentheses."
+msgid_plural ""
+"Are you sure you want to delete the following tracks completely from your "
+"harddisk? The number of playlists the tracks are member of is indicated in "
+"parentheses."
+msgstr[0] ""
+"¿Desea realmente borrar la siguiente pista del disco duro? El número de "
+"listas de reproducción a las que pertenece esta pista está indicado entre "
+"paréntesis."
+msgstr[1] ""
+"¿Desea realmente borrar las siguientes pistas del disco duro? El número de "
+"listas de reproducción a las que pertenecen estas pistas está indicado entre "
+"paréntesis."
+
+#: ../src/misc_confirm.c:167
+msgid "Delete Track from Harddisk?"
+msgid_plural "Delete Tracks from Harddisk?"
+msgstr[0] "¿Borrar la pista del disco duro?"
+msgstr[1] "¿Borrar las pistas del disco duro?"
+
+#: ../src/misc_confirm.c:192
+msgid ""
+"Are you sure you want to remove the following track completely from your "
+"local database? The number of playlists this track is a member of is "
+"indicated in parentheses."
+msgid_plural ""
+"Are you sure you want to remove the following tracks completely from your "
+"local database? The number of playlists the tracks are member of is "
+"indicated in parentheses."
+msgstr[0] ""
+"¿Desea realmente borrar la siguiente pista de la base de datos local? El "
+"número de listas de reproducción a las que pertenece esta pista está "
+"indicado entre paréntesis."
+msgstr[1] ""
+"¿Desea realmente borrar las siguientes pistas de la base de datos local? El "
+"número de listas de reproducción a las que pertenecen estas pistas está "
+"indicado entre paréntesis."
+
+#: ../src/misc_confirm.c:196
+msgid "Remove Track from Local Database?"
+msgid_plural "Remove Tracks from Local Database?"
+msgstr[0] "¿Borrar la pista de la base de datos local?"
+msgstr[1] "¿Borrar las pistas de la base de datos local?"
+
+#: ../src/misc_confirm.c:261
+#, c-format
+msgid "Deleted one track completely from iPod"
+msgid_plural "Deleted %d tracks completely from iPod"
+msgstr[0] "Una pista ha sido borrada por completo del iPod"
+msgstr[1] "%d pistas han sido borradas por completo del iPod"
+
+#: ../src/misc_confirm.c:267 ../src/misc_confirm.c:291
+#, c-format
+msgid "Deleted %d track from playlist '%s'"
+msgid_plural "Deleted %d tracks from playlist '%s'"
+msgstr[0] "%d pista ha sido borrada de la lista de reproducción '%s'"
+msgstr[1] "%d pistas han sido borradas de la lista de reproducción '%s'"
+
+#: ../src/misc_confirm.c:285
+#, c-format
+msgid "Deleted one track from harddisk"
+msgid_plural "Deleted %d tracks from harddisk"
+msgstr[0] "Una pista ha sido borrada del disco duro"
+msgstr[1] "%d pistas han sido borradas del disco duro"
+
+#: ../src/misc_confirm.c:297
+#, c-format
+msgid "Deleted track from local database"
+msgid_plural "Deleted %d tracks from local database"
+msgstr[0] "Una pista ha sido borrada de la base de datos local"
+msgstr[1] "%d pistas han sido borradas de la base de datos local"
+
+#: ../src/misc_confirm.c:442
+msgid "Cannot remove entry 'All'"
+msgstr "No se puede borrar la entrada 'Todo'"
+
+#: ../src/misc_confirm.c:536
+#, c-format
+msgid "Removed all %d tracks from the iPod"
+msgstr "Todas las %d pistas han sido borradas del iPod"
+
+#: ../src/misc_confirm.c:541
+#, c-format
+msgid "Removed all podcasts from the iPod"
+msgstr "Todos los podcasts han sido borrados del iPod"
+
+#: ../src/misc_confirm.c:550 ../src/misc_confirm.c:624
+#, c-format
+msgid "Deleted playlist '%s' including %d member track"
+msgid_plural "Deleted playlist '%s' including %d member tracks"
+msgstr[0] "Borrada la lista de reproducción '%s' conteniendo %d pista"
+msgstr[1] "Borrada la lista de reproducción '%s' conteniendo %d pistas"
+
+#. first use playlist name
+#: ../src/misc_confirm.c:566 ../src/misc_confirm.c:640
+#, c-format
+msgid "Deleted playlist '%s'"
+msgstr "Borrada la lista de reproducción '%s'"
+
+#: ../src/misc_confirm.c:600
+#, c-format
+msgid "Deleted playlist '%s' including %d member track on harddisk"
+msgid_plural "Deleted playlist '%s' including %d member tracks on harddisk"
+msgstr[0] ""
+"Borrada la lista de reproducción '%s' conteniendo %d pista en el disco duro"
+msgstr[1] ""
+"Borrada la lista de reproducción '%s' conteniendo %d pistas en el disco duro"
+
+#: ../src/misc_confirm.c:617
+#, c-format
+msgid "Removed all %d tracks from the database"
+msgstr "Borradas todas las %d pistas de la base de datos"
+
+#: ../src/misc_confirm.c:695
+#, c-format
+msgid "Are you sure you want to remove all tracks from your iPod?"
+msgstr "¿Desea realmente borrar todas las pistas del iPod?"
+
+#: ../src/misc_confirm.c:700
+#, c-format
+msgid "Are you sure you want to remove all podcasts from your iPod?"
+msgstr "¿Desea realmente borrar todos los podcasts del iPod?"
+
+#: ../src/misc_confirm.c:708
+#, fuzzy, c-format
+msgid ""
+"Are you sure you want to delete playlist '%s' and the following track "
+"completely from your iPod? The number of playlists this track is a member of "
+"is indicated in parentheses."
+msgid_plural ""
+"Are you sure you want to delete playlist '%s' and the following tracks "
+"completely from your iPod? The number of playlists the tracks are member of "
+"is indicated in parentheses."
+msgstr[0] ""
+"¿Desea realmente borrar la lista de reproducción '%s' y la siguiente pista "
+"del iPod? El número de listas de reproducción a las que pertenece esta pista "
+"está indicado entre paréntesis."
+msgstr[1] ""
+"¿Desea realmente borrar la lista de reproducción '%s' y las siguientes "
+"pistas del iPod? El número de listas de reproducción a las que pertenecen "
+"estas pistas está indicado entre paréntesis."
+
+#: ../src/misc_confirm.c:719 ../src/misc_confirm.c:774
+#, c-format
+msgid "Are you sure you want to delete the playlist '%s'?"
+msgstr "¿Está seguro de querer borrar la lista de reproducción '%s'?"
+
+#: ../src/misc_confirm.c:745
+#, c-format
+msgid ""
+"Are you sure you want to delete playlist '%s' and remove the following track "
+"from your harddisk? The number of playlists this track is a member of is "
+"indicated in parentheses."
+msgid_plural ""
+"Are you sure you want to delete playlist '%s' and remove the following "
+"tracks from your harddisk? The number of playlists the tracks are member of "
+"is indicated in parentheses."
+msgstr[0] ""
+"¿Desea realmente borrar la lista de reproducción '%s' y la siguiente pista "
+"del disco duro? El número de listas de reproducción a las que pertenece esta "
+"pista está indicado entre paréntesis."
+msgstr[1] ""
+"¿Desea realmente borrar la lista de reproducción '%s' y la siguiente pista "
+"del disco duro? El número de listas de reproducción a las que pertenecen "
+"estas pistas está indicado entre paréntesis."
+
+#: ../src/misc_confirm.c:753
+#, c-format
+msgid "Are you sure you want to remove all tracks from the database?"
+msgstr "¿Está seguro de querer borrar todas las pistas de la base de datos?"
+
+#: ../src/misc_confirm.c:762
+#, c-format
+msgid ""
+"Are you sure you want to delete playlist '%s' and remove the following track "
+"from the database? The number of playlists this track is a member of is "
+"indicated in parentheses."
+msgid_plural ""
+"Are you sure you want to delete playlist '%s' and remove the following "
+"tracks from the database? The number of playlists the tracks are member of "
+"is indicated in parentheses."
+msgstr[0] ""
+"¿Desea realmente borrar la lista de reproducción '%s' y la siguiente pista "
+"de la base de datos? El número de listas de reproducción a las que pertenece "
+"esta pista está indicado entre paréntesis."
+msgstr[1] ""
+"¿Desea realmente borrar la lista de reproducción '%s' y la siguiente pista "
+"de la base de datos? El número de listas de reproducción a las que "
+"pertenecen estas pistas está indicado entre paréntesis."
+
+#: ../src/misc_confirm.c:841
+msgid ""
+"Data has been changed and not been saved.\n"
+"OK to exit gtkpod?"
+msgstr ""
+"Algunos datos han sido modificados y no se han guardado ¿está seguro de que "
+"desea cerrar gtkpod?"
+
+#: ../src/misc_conversion.c:66
+msgid "File type"
+msgstr "Tipo de fichero"
+
+#: ../src/misc_conversion.c:67
+msgid "PC File"
+msgstr "Fichero PC"
+
+#: ../src/misc_conversion.c:68
+msgid "iPod File"
+msgstr "Fichero iPod"
+
+#: ../src/misc_conversion.c:69
+msgid "iPod ID"
+msgstr "ID iPod"
+
+#. 10
+#: ../src/misc_conversion.c:70
+msgid "Track Nr (#)"
+msgstr "Número de pista (#)"
+
+#: ../src/misc_conversion.c:71
+msgid "Transferred"
+msgstr "Transferido"
+
+#: ../src/misc_conversion.c:72
+msgid "File Size"
+msgstr "Tamaño del fichero"
+
+#: ../src/misc_conversion.c:73
+msgid "Play Time"
+msgstr "Tiempo de reproducción"
+
+#. 20
+#: ../src/misc_conversion.c:80
+msgid "Date played"
+msgstr "Fecha de reproducción"
+
+#: ../src/misc_conversion.c:82
+msgid "Volume"
+msgstr "Volumen"
+
+#: ../src/misc_conversion.c:83
+msgid "Soundcheck"
+msgstr "Control de sonido"
+
+#. 25
+#: ../src/misc_conversion.c:85
+msgid "CD Nr"
+msgstr "Número de CD"
+
+#: ../src/misc_conversion.c:88
+msgid "Category"
+msgstr "Categoría"
+
+#: ../src/misc_conversion.c:89
+msgid "Description"
+msgstr "Descripción"
+
+#. 30
+#: ../src/misc_conversion.c:90
+msgid "Podcast URL"
+msgstr "URL del podcast"
+
+#: ../src/misc_conversion.c:91
+msgid "Podcast RSS"
+msgstr "RSS del podcast"
+
+#: ../src/misc_conversion.c:92
+msgid "Subtitle"
+msgstr "Subtítulo"
+
+#: ../src/misc_conversion.c:93
+msgid "Date released"
+msgstr "Fecha de publicación"
+
+#: ../src/misc_conversion.c:94
+msgid "Checked"
+msgstr "Revisado"
+
+#. 35
+#: ../src/misc_conversion.c:95
+msgid "Start time"
+msgstr "Hora de inicio"
+
+#: ../src/misc_conversion.c:96
+msgid "Stop time"
+msgstr "Hora de finalización"
+
+#: ../src/misc_conversion.c:97
+msgid "Remember Playback Position"
+msgstr "Recordar posición de la lista de reproducción"
+
+#: ../src/misc_conversion.c:98
+msgid "Skip when Shuffling"
+msgstr "Ignorar en modo aleatorio"
+
+#: ../src/misc_conversion.c:99
+msgid "Artwork Path"
+msgstr "Ruta de la carátula"
+
+#. 40
+#: ../src/misc_conversion.c:100
+msgid "Media Type"
+msgstr "Tipo de medio"
+
+#: ../src/misc_conversion.c:102
+msgid "TV Episode"
+msgstr "Episodio de TV"
+
+#: ../src/misc_conversion.c:103
+#, fuzzy
+msgid "TV Network"
+msgstr "TV Network"
+
+#: ../src/misc_conversion.c:104
+msgid "Season Nr"
+msgstr "Temporada Nº"
+
+#. 45
+#: ../src/misc_conversion.c:105
+msgid "Episode Nr"
+msgstr "Episodio Nº"
+
+#: ../src/misc_conversion.c:106
+#, fuzzy
+msgid "Album Artist"
+msgstr "Artista del álbum"
+
+#: ../src/misc_conversion.c:107
+#, fuzzy
+msgid "Sort Artist"
+msgstr "Artista"
+
+#: ../src/misc_conversion.c:108
+#, fuzzy
+msgid "Sort Title"
+msgstr "Subtítulo"
+
+#: ../src/misc_conversion.c:109
+#, fuzzy
+msgid "Sort Album"
+msgstr "Álbum"
+
+#. 50
+#: ../src/misc_conversion.c:110
+#, fuzzy
+msgid "Sort Album Artist"
+msgstr "Artista del álbum"
+
+#: ../src/misc_conversion.c:111
+#, fuzzy
+msgid "Sort Composer"
+msgstr "Compositor"
+
+#: ../src/misc_conversion.c:112
+#, fuzzy
+msgid "Sort TV Show"
+msgstr "TV Show"
+
+#: ../src/misc_conversion.c:113
+msgid "Gapless Track Flag"
+msgstr ""
+
+#: ../src/misc_conversion.c:126
+msgid "Name of file on PC, if available"
+msgstr "Nombre del fichero en el PC, si está disponible"
+
+#: ../src/misc_conversion.c:127
+msgid "Name of file on the iPod"
+msgstr "Nombre del fichero en el iPod"
+
+#. 10
+#: ../src/misc_conversion.c:129
+msgid "Track Nr. and total number of tracks on CD"
+msgstr "Número de pista y número total de pistas en el CD"
+
+#: ../src/misc_conversion.c:130
+msgid "Whether the file has already been transferred to the iPod or not"
+msgstr "Si el fichero ha sido transferido al iPod o no"
+
+#: ../src/misc_conversion.c:136
+msgid "Beats per minute"
+msgstr ""
+
+#: ../src/misc_conversion.c:137
+msgid "Number of times the track has been played"
+msgstr "Número de veces que la pista ha sido reproducida"
+
+#: ../src/misc_conversion.c:138
+msgid "Star rating from 0 to 5"
+msgstr "Puntuación de estrellas del 0 al 5"
+
+#: ../src/misc_conversion.c:139
+msgid "Date and time track has been added"
+msgstr "Fecha y hora en la que la pista ha sido añadida"
+
+#. 20
+#: ../src/misc_conversion.c:140
+msgid "Date and time track has last been played"
+msgstr "Fecha y hora en la que la pista ha sido reproducida por última vez"
+
+#: ../src/misc_conversion.c:141
+msgid "Date and time track has last been modified"
+msgstr "Fecha y hora en la que la pista ha sido modificada por última vez"
+
+#: ../src/misc_conversion.c:142
+msgid "Manual volume adjust"
+msgstr "Ajuste manual del volumen"
+
+#: ../src/misc_conversion.c:143
+msgid ""
+"Volume adjust in dB (replay gain) -- you need to activate 'soundcheck' on "
+"the iPod"
+msgstr ""
+"Ajuste del volumen en dB (ganancia de reproducción) -- Es necesario activar "
+"el control de volumen en el iPod"
+
+#. 25
+#: ../src/misc_conversion.c:146
+msgid "CD Nr. and total number of CDS in set"
+msgstr "Número de CD y número total de CDS en conjunto"
+
+#: ../src/misc_conversion.c:149
+msgid ""
+"The category (e.g. 'Technology' or 'Music') where the podcast was located."
+msgstr ""
+"La categoría (p.e. 'Tecnología' o 'Música') en la que el podcast estaba "
+"ubicado."
+
+#: ../src/misc_conversion.c:150
+msgid "Accessible by selecting the center button on the iPod."
+msgstr "Accesible al seleccionar el botón central en el iPod"
+
+#: ../src/misc_conversion.c:154
+msgid "Release date (for podcasts displayed next to the title on the iPod)"
+msgstr ""
+"Fecha de publicación (para podcasts. Mostrada junto al título en el iPod)"
+
+#. 50
+#: ../src/misc_conversion.c:168 ../src/misc_conversion.c:169
+#: ../src/misc_conversion.c:170 ../src/misc_conversion.c:171
+#: ../src/misc_conversion.c:172 ../src/misc_conversion.c:173
+#, fuzzy
+msgid "Used for sorting on the iPod"
+msgstr "Nombre del fichero en el iPod"
+
+#: ../src/misc_conversion.c:735
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the file scheme"
+msgstr "Usando el esquema del fichero, el URI '%s' no es un URI absoluto"
+
+#: ../src/misc_conversion.c:745
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "El URI de fichero local '%s' no puede contener '#'"
+
+#: ../src/misc_conversion.c:762
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "El URI '%s' no es válido"
+
+#: ../src/misc_conversion.c:774
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "El nombre de máquina del URI '%s' no es válido"
+
+#: ../src/misc_conversion.c:790
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "El URI '%s' contiene caracteres de escape no válidos"
+
+#: ../src/misc_playlist.c:67 ../src/misc_playlist.c:94
+#: ../src/misc_playlist.c:429
+msgid "Please enter a name for the new playlist"
+msgstr "Introducir el nombre de la nueva lista de reproducción"
+
+#: ../src/misc_playlist.c:154
+msgid "AR:"
+msgstr "AR:"
+
+#: ../src/misc_playlist.c:157
+msgid "AL:"
+msgstr "AL:"
+
+#: ../src/misc_playlist.c:160
+msgid "GE:"
+msgstr "GE:"
+
+#: ../src/misc_playlist.c:163
+#, fuzzy
+msgid "CO:"
+msgstr "CO:"
+
+#: ../src/misc_playlist.c:166
+#, fuzzy
+msgid "YE:"
+msgstr "YE:"
+
+#: ../src/misc_playlist.c:194
+msgid "Unknown"
+msgstr "Desconocido"
+
+#: ../src/misc_playlist.c:272
+#, c-format
+msgid "Random (%d)"
+msgstr "Aleatorio (%d)"
+
+#: ../src/misc_playlist.c:297
+msgid ""
+"Auto Store of track view disabled.\n"
+"\n"
+msgstr ""
+"Memorización automática de la vista desactivada.\n"
+"\n"
+
+#: ../src/misc_playlist.c:356
+msgid "Not Listed"
+msgstr "No escuchado"
+
+#: ../src/misc_playlist.c:406
+#, c-format
+msgid "Created playlist '%s' with %d track."
+msgid_plural "Created playlist '%s' with %d tracks."
+msgstr[0] "Creada lista de reproducción '%s' con %d pista."
+msgstr[1] "Creada lista de reproducción '%s' con %d pistas."
+
+#. n==0
+#: ../src/misc_playlist.c:417
+msgid "No tracks available, playlist not created"
+msgstr "Ninguna pista disponible, lista de reproducción no creada"
+
+#: ../src/misc_playlist.c:543
+#, c-format
+msgid "Most Listened (%d)"
+msgstr "La más escuchada (%d)"
+
+#: ../src/misc_playlist.c:584
+#, c-format
+msgid "Never Listened"
+msgstr "Nunca escuchada"
+
+#: ../src/misc_playlist.c:624
+#, c-format
+msgid "Best Rated (%d)"
+msgstr "Mejor puntuada (%d)"
+
+#: ../src/misc_playlist.c:666
+msgid "Unrated tracks"
+msgstr "Pistas sin puntuar"
+
+#: ../src/misc_playlist.c:671
+#, c-format
+msgid "Rated %d"
+msgstr "Puntuación %d"
+
+#: ../src/misc_playlist.c:714
+#, c-format
+msgid "Recent (%d)"
+msgstr "Reciente (%d)"
+
+#: ../src/misc_playlist.c:753
+msgid "Last Time"
+msgstr "Última vez"
+
+#: ../src/misc_playlist.c:844
+msgid "Removal of dangling tracks with no files on PC was canceled."
+msgstr ""
+"La eliminación de pistas pendientes sin su fichero correspondiente en el PC "
+"ha sido cancelada."
+
+#: ../src/misc_playlist.c:854
+msgid "Handling of dangling tracks with files on PC was canceled."
+msgstr ""
+"El manejo de pistas pendientes con sus correspondientes ficheros en el PC ha "
+"sido cancelada."
+
+#: ../src/misc_playlist.c:882
+msgid "Dangling tracks with no files on PC were removed."
+msgstr ""
+"Las pistas pendientes sin su correspondiente fichero en el PC han sido "
+"eliminadas."
+
+#: ../src/misc_playlist.c:943
+msgid "Dangling tracks with files on PC were handled."
+msgstr ""
+"Las pistas pendientes con ficheros correspondientes en el PC han sido "
+"procesadas."
+
+#: ../src/misc_playlist.c:976
+msgid "Track"
+msgstr "Pista"
+
+#: ../src/misc_playlist.c:1019
+msgid ""
+"You did not import the existing iTunesDB. This is most likely incorrect and "
+"will result in the loss of the existing database.\n"
+"\n"
+"Press 'OK' if you want to proceed anyhow or 'Cancel' to abort. If you "
+"cancel, you can import the existing database before calling this function "
+"again.\n"
+msgstr ""
+"No se ha importado la base de datos iTunes. Esto puede dar lugar a la "
+"pérdida de la actual base de datos.\n"
+"\n"
+"Pulsar 'Aceptar' para continuar o 'Cancelar' para detener la operación. Si "
+"se cancela ahora, se podrá importar la actual base de datos antes de usar de "
+"nuevo esta función.\n"
+
+#: ../src/misc_playlist.c:1033
+msgid "Creating a tree of known files"
+msgstr "Creando un árbol de ficheros conocidos"
+
+#: ../src/misc_playlist.c:1077
+msgid "Checking iPOD files against known files in DB"
+msgstr ""
+"Comprobando los ficheros del iPod con los ficheros conocidos en la base de "
+"datos"
+
+#: ../src/misc_playlist.c:1120
+msgid "Orphaned"
+msgstr "Huérfano"
+
+#: ../src/misc_playlist.c:1147
+#, c-format
+msgid ""
+"The following orphaned file had already been added to the iPod again. It "
+"will be removed with the next sync:\n"
+"%s\n"
+"\n"
+msgstr ""
+"El siguiente fichero huérfano ha sido añadido de nuevo al iPod. Será borrado "
+"en la siguiente sincronización:\n"
+"%s\n"
+"\n"
+
+#: ../src/misc_playlist.c:1175
+#, c-format
+msgid "Found %d orphaned and %d dangling files. Processing..."
+msgstr "Encontrados %d ficheros huerfanos y %d pendientes. Procesando..."
+
+#: ../src/misc_playlist.c:1199
+#, c-format
+msgid ""
+"The following dangling track has a file on PC.\n"
+"Press OK to have them transfered from the file on next Sync, CANCEL to leave "
+"it as is."
+msgid_plural ""
+"The following %d dangling tracks have files on PC.\n"
+"Press OK to have them transfered from the files on next Sync, CANCEL to "
+"leave them as is."
+msgstr[0] ""
+"La siguiente pista pendiente tiene un fichero en el PC.\n"
+" Pulse «Aceptar» para transferir el fichero en la siguiente sincronización, "
+"«Cancelar» para dejarla como está."
+msgstr[1] ""
+"Las siguientes %d pistas pendientes tienen ficheros en el PC.\n"
+"Pulse «Aceptar» para transferir los ficheros en la siguiente sincronización, "
+"«Cancelar» para dejarlos como están."
+
+#: ../src/misc_playlist.c:1204
+#, c-format
+msgid ""
+"The following dangling track doesn't have file on PC. \n"
+"Press OK to remove it, CANCEL to leave it as is."
+msgid_plural ""
+"The following %d dangling tracks do not have files on PC. \n"
+"Press OK to remove them, CANCEL to leave them. as is"
+msgstr[0] ""
+"La siguiente pista pendiente no tiene su fichero correspondiente en el PC.\n"
+"Pulse «Aceptar» para borrarla, «Cancelar» para dejarla como está."
+msgstr[1] ""
+"Las siguientes %d pistas pendientes no tienen sus ficheros correspondientes "
+"en el PC.\n"
+"Pulse «Aceptar» para borrarlas, «Cancelar» para dejarlas como están."
+
+#. we want unique window for each
+#. gboolean modal,
+#: ../src/misc_playlist.c:1211
+msgid "Dangling Tracks"
+msgstr "Pistas pendientes"
+
+#: ../src/misc_playlist.c:1234
+#, c-format
+msgid "Found %d orphaned and %d dangling files. Done."
+msgstr "Encontradas %d huérfanos y %d ficheros pendientes. Finalizado."
+
+#. update for count == 1, 21, 41 ... and for count == n
+#: ../src/misc_track.c:89
+#, c-format
+msgid "Hashed %d of %d track."
+msgid_plural "Hashed %d of %d tracks."
+msgstr[0] "Calculada %d función resumen de %d pista"
+msgstr[1] "Calculadas %d funciones resumen de %d pistas"
+
+#: ../src/misc_track.c:198
+#, c-format
+msgid "The following duplicate track has been removed."
+msgid_plural "The following %d duplicate tracks have been removed."
+msgstr[0] "La siguiente pista duplicada ha sido borrada."
+msgstr[1] "Las siguientes %d pistas duplicadas han sido borradas."
+
+#: ../src/misc_track.c:205
+#, c-format
+msgid ""
+"The following duplicate track has not been added to the master play list."
+msgid_plural ""
+"The following %d duplicate tracks have not been added to the master play "
+"list."
+msgstr[0] ""
+"La siguiente pista duplicada no ha sido añadida a la lista de reproducción "
+"principal."
+msgstr[1] ""
+"Las siguientes %d pistas duplicadas no han sido añadidas a la lista de "
+"reproducción principal."
+
+#. gint id,
+#. gboolean modal,
+#: ../src/misc_track.c:212
+msgid "Duplicate detection"
+msgstr "Detección de duplicados"
+
+#: ../src/misc_track.c:1339
+msgid "Local Database"
+msgstr "Base de datos local"
+
+#. artwork is set
+#: ../src/misc_track.c:1350
+msgid "Embedded or filename was lost"
+msgstr "Se ha perdido el nombre de fichero o el empotrado."
+
+#: ../src/misc_track.c:1354
+msgid "Artwork not set"
+msgstr "Carátula no configurada."
+
+#: ../src/misc_track.c:1816
+#, c-format
+msgid "Could not find source file for '%s'. Track not copied."
+msgstr "No se ha podido encontrar el fichero fuente de '%s'. Pista no copiada."
+
+#: ../src/misc_track.c:2052
+#, c-format
+msgid "drag and drop: ignored '%s'\n"
+msgstr "Operación de arrastrar y soltar ignorada '%s'\n"
+
+#: ../src/mp3file.c:1336
+#, c-format
+msgid "Error setting ID3 field: %s\n"
+msgstr "Error al rellenar campo ID3: %s\n"
+
+#: ../src/mp3file.c:1360 ../src/mp3file.c:1453 ../src/mp3file.c:1608
+#: ../src/mp3file.c:2733
+#, c-format
+msgid "ERROR while opening file: '%s' (%s).\n"
+msgstr "Error al abrir el fichero: '%s' (%s).\n"
+
+#: ../src/mp3file.c:1688
+#, c-format
+msgid "ERROR while writing tag to file: '%s' (%s).\n"
+msgstr "Error al escribir etiqueta al fichero: '%s' (%s).\n"
+
+#. Tracks with zero play length are ignored by iPod...
+#: ../src/mp3file.c:2770
+#, c-format
+msgid "File \"%s\" has zero play length. Ignoring.\n"
+msgstr ""
+"El fichero \"%s\" tiene una duración de reproducción nula. Será ignorado.\n"
+
+#: ../src/mp4file.c:243 ../src/mp4file.c:404
+#, c-format
+msgid "'%s' does not appear to be a mp4 audio or video file.\n"
+msgstr "'%s' no parece ser un fichero de audio o vídeo mp4.\n"
+
+#: ../src/mp4file.c:253 ../src/mp4file.c:414
+#, c-format
+msgid "Could not open '%s' for reading, or file is not an mp4 file.\n"
+msgstr ""
+"No se ha podido abrir '%s' para su lectura o el fichero no es de tipo mp4.\n"
+
+#: ../src/mp4file.c:529
+#, c-format
+msgid "'%s' does not appear to be a mp4 audio file.\n"
+msgstr "'%s' no parece ser un fichero de audio mp4.\n"
+
+#: ../src/mp4file.c:540
+#, c-format
+msgid "Could not open '%s' for writing, or file is not an mp4 file.\n"
+msgstr ""
+"No se ha podido abrir '%s' para su escritura o el fichero no es de tipo "
+"mp4.\n"
+
+#: ../src/mp4file.c:553
+#, c-format
+msgid ""
+"Import of '%s' failed: m4a/m4p/m4b not supported without the mp4v2 library. "
+"You must compile the gtkpod source together with the mp4v2 library.\n"
+msgstr ""
+"Error en la importación de '%s': m4a/m4p/m4b no están soportados sin la "
+"biblioteca mp4v2. gtkpod debe estar compilado junto con la biblioteca "
+"mp4v2.\n"
+
+#: ../src/mp4file.c:559
+#, c-format
+msgid ""
+"m4a/m4p/m4b metadata update for '%s' failed: m4a/m4p/m4b not supported "
+"without the mp4v2 library. You must compile the gtkpod source together with "
+"the mp4v2 library.\n"
+msgstr ""
+"Error al actualizar los metadatos m4a/m4p/m4b para '%s': m4a/m4p/m4b no "
+"están soportados sin la biblioteca mp4v2. gtkpod debe estar compilado junto "
+"con la biblioteca mp4v2.\n"
+
+#: ../src/mp4file.c:565
+#, c-format
+msgid ""
+"m4a/m4p/m4b soundcheck update for '%s' failed: m4a/m4p/m4b not supported "
+"without the mp4v2 library. You must compile the gtkpod source together with "
+"the mp4v2 library.\n"
+msgstr ""
+"Error al actualizar el control de volumen m4a/m4p/m4b para '%s': m4a/m4p/m4b "
+"no están soportados sin la biblioteca mp4v2. gtkpod debe estar compilado "
+"junto con la biblioteca mp4v2.\n"
+
+#: ../src/oggfile.c:73
+#, c-format
+msgid "'%s' does not appear to be an ogg audio file.\n"
+msgstr "'%s' no parece ser un fichero de audio ogg.\n"
+
+#: ../src/oggfile.c:154
+#, c-format
+msgid ""
+"Import of '%s' failed: ogg not supported without the ogg library. You must "
+"compile the gtkpod source together with the ogg library.\n"
+msgstr ""
+"Error en la importación de '%s': ogg no está soportado sin la biblioteca "
+"ogg. gtkpod debe estar compilado junto con la biblioteca ogg.\n"
+
+#: ../src/oggfile.c:160
+#, c-format
+msgid ""
+"ogg metadata update for '%s' failed: ogg not supported without the ogg "
+"library. You must compile the gtkpod source together with the ogg library.\n"
+msgstr ""
+"Error al actualizar los metadatos ogg para '%s': ogg no está soportado sin "
+"la biblioteca ogg. gtkpod debe estar compilado junto con la biblioteca ogg.\n"
+
+#: ../src/prefs.c:357
+#, c-format
+msgid "gtkpod version %s usage:\n"
+msgstr "Uso de gtkpod versión %s:\n"
+
+#: ../src/prefs.c:358
+msgid "  -h, --help:   display this message\n"
+msgstr "  -h, --help:   muestra este mensaje\n"
+
+#: ../src/prefs.c:359
+msgid "  -p <file>:    increment playcount for file by one\n"
+msgstr "  -p <fichero>:    incrementa el contador del fichero en uno\n"
+
+#: ../src/prefs.c:360
+msgid "  --hash <file>:print gtkpod hash for file\n"
+msgstr "  --hash <file>:muestra la suma de resumen de gtkpod para el fichero\n"
+
+#: ../src/prefs.c:361
+msgid "  -m path:      define the mountpoint of your iPod\n"
+msgstr "  -m ruta:      define el punto de montaje del iPod\n"
+
+#: ../src/prefs.c:362
+msgid "  --mountpoint: same as '-m'.\n"
+msgstr "  --mountpoint: igual que '-m'.\n"
+
+#: ../src/prefs.c:363
+msgid "  -a:           import database automatically after start.\n"
+msgstr ""
+"  -a:           importa automáticamente la base de datos al arrancar.\n"
+
+#: ../src/prefs.c:364
+msgid "  --auto:       same as '-a'.\n"
+msgstr "  --auto:       igual que '-a'.\n"
+
+#: ../src/prefs.c:561
+#, c-format
+msgid "Couldn't create ~/.gtkpod\n"
+msgstr "No se ha podido crear ~/.gtkpod\n"
+
+#: ../src/prefs_window.c:133
+msgid "Please select command for 'Play Now'"
+msgstr "Seleccionar programa para 'Reproducir'"
+
+#: ../src/prefs_window.c:134
+msgid "Please select command for 'Enqueue'"
+msgstr "Seleccionar programa para 'Encolar'"
+
+#: ../src/prefs_window.c:135
+msgid "Please select the mp3gain executable"
+msgstr "Seleccionar el ejecutable mp3gain"
+
+#: ../src/prefs_window.c:136
+msgid "Please select the aacgain executable"
+msgstr "Seleccionar el ejecutable aacgain"
+
+#: ../src/prefs_window.c:137
+msgid "Select the mserv music root directory"
+msgstr "Seleccionar el directorio raíz de música de mserv"
+
+#: ../src/prefs_window.c:138
+msgid "Select the mserv trackinfo root directory"
+msgstr ""
+"Seleccionar el directorio raíz de la información de las pistas de mserv"
+
+#: ../src/prefs_window.c:139
+msgid "Select the ogg/vorbis converter command"
+msgstr "Seleccionar el comando de conversión a ogg/vorbis."
+
+#: ../src/prefs_window.c:140
+msgid "Select the flac converter command"
+msgstr "Seleccionar el comando de conversión a flac."
+
+#: ../src/prefs_window.c:141
+msgid "Select the m4a converter command."
+msgstr "Seleccionar el comando de conversión a m4a."
+
+#: ../src/prefs_window.c:142
+msgid "Select the mp3 converter command."
+msgstr "Seleccionar el comando de conversión a mp3."
+
+#: ../src/prefs_window.c:143
+msgid "Select the wav converter command."
+msgstr "Seleccionar el comando de conversión a wav."
+
+#: ../src/prefs_window.c:201 ../src/repository.c:662
+#, c-format
+msgid ""
+"<i>Have a look at the scripts provided in '%s'. If you write a new script or "
+"improve an existing one, please send it to jcsjcs at users.sourceforge.net "
+"for inclusion into the next release.</i>"
+msgstr ""
+"<i>Heche un vistazo a los guiones de '%s'. En caso de escribir un nuevo "
+"guión o mejorar uno existente, por favor, envielo a jcsjcs en users."
+"sourceforge.net para añadirlo en la siguiente publicación.</i>"
+
+#: ../src/prefs_window.c:1205 ../src/prefs_window.c:1223
+msgid "Preferences not updated"
+msgstr "Preferencias no actualizadas"
+
+#: ../src/prefs_window.c:1232
+msgid "Preferences applied"
+msgstr "Preferencias actualizadas"
+
+#: ../src/repository.c:573 ../src/repository.c:2395
+msgid "Set backup file"
+msgstr "Configurar fichero de copia de seguridad"
+
+#: ../src/repository.c:612
+msgid "Select directory for synchronization"
+msgstr "Seleccionar directorio a sincronizar"
+
+#: ../src/repository.c:638
+msgid "Please select command to sync contacts"
+msgstr "Seleccionar programa para sincronizar contactos"
+
+#: ../src/repository.c:644
+msgid "Please select command to sync calendar"
+msgstr "Seleccionar programa para sincronizar calendario"
+
+#: ../src/repository.c:650
+msgid "Please select command to sync notes"
+msgstr "Seleccionar programa para sincronizar notas"
+
+#: ../src/repository.c:729
+msgid "Smart playlist updated."
+msgstr "Lista de reproducción inteligente actualizada."
+
+#: ../src/repository.c:1190
+msgid "Podcasts Repository"
+msgstr "Repositorio de podcasts"
+
+#: ../src/repository.c:1194
+msgid "Local Repository"
+msgstr "Repositorio local"
+
+#: ../src/repository.c:1348
+msgid "Master Playlist"
+msgstr "Lista de reproducción principal"
+
+#: ../src/repository.c:1352
+msgid "Podcasts Playlist"
+msgstr "Lista de reproducción de podcasts"
+
+#: ../src/repository.c:1360
+msgid "Regular Playlist"
+msgstr "Lista de reproducción regular"
+
+#: ../src/repository.c:2423
+msgid "Set local repository file"
+msgstr "Configurar el fichero de repositorio local"
+
+#: ../src/repository.c:2522
+msgid "New Repository"
+msgstr "Nuevo repositorio"
+
+#: ../src/sha1.c:186
+msgid "Hashed file is 0 bytes long\n"
+msgstr "El fichero de resumen tiene una longitud de 0 bytes\n"
+
+#: ../src/sha1.c:239
+#, c-format
+msgid "Could not open '%s' to calculate SHA1 checksum: %s\n"
+msgstr "No se puede abrir '%s' para calcuar la suma de comprobación SHA1: %s\n"
+
+#: ../src/syncdir.c:237
+#, c-format
+msgid "Sync summary for %s/%s\n"
+msgstr "Sincronizar resumen para %s/%s\n"
+
+#: ../src/syncdir.c:246
+msgid "The following track has been added or updated:\n"
+msgid_plural "The following tracks have been added or updated:\n"
+msgstr[0] "La siguiente pista ha sido añadida o actualizada:\n"
+msgstr[1] "Las siguientes pistas han sido añadidas o actualizadas:\n"
+
+#: ../src/syncdir.c:255
+msgid "The following track has been completely removed from the iPod:\n"
+msgid_plural ""
+"The following tracks have been completely removed from the iPod:\n"
+msgstr[0] "La siguiente pista ha sido borrada por completo del iPod:\n"
+msgstr[1] "Las siguientes pistas han sido borradas por completo del iPod:\n"
+
+#: ../src/syncdir.c:264
+msgid "The following track has been removed from the repository:\n"
+msgid_plural "The following tracks have been removed from the repository:\n"
+msgstr[0] "La siguiente pista ha sido borrada del repositorio:\n"
+msgstr[1] ""
+"Las siguientes pistas duplicadas han sido borradas del repositorio:\n"
+
+#: ../src/syncdir.c:271
+msgid "The following track has been removed from the playlist:\n"
+msgid_plural "The following tracks have been removed from the playlist:\n"
+msgstr[0] "La siguiente pista ha sido borrada de la lista de reproducción:\n"
+msgstr[1] ""
+"Las siguientes pistas han sido borradas de la lista de reproducción:\n"
+
+#: ../src/syncdir.c:277
+msgid "Nothing was changed.\n"
+msgstr "No ha habido cambios.\n"
+
+#: ../src/syncdir.c:282
+msgid "Sync summary"
+msgstr "Sincronizar resumen"
+
+#: ../src/tools.c:118
+#, c-format
+msgid ""
+"Could not find '%s'.\n"
+"Please specifiy the exact path in the Tools section of the preference dialog "
+"or install the program if it is not installed on your system.\n"
+"\n"
+msgstr ""
+"No se ha encontrado '%s'.\n"
+"Especificar la ruta exacta en en el apartado 'Herramientas' del diálogo de "
+"edición de preferencias o instalar el programa si no está instalado en el "
+"sistema.\n"
+"\n"
+
+#: ../src/tools.c:203
+#, c-format
+msgid ""
+"Execution of '%s' failed.\n"
+"\n"
+msgstr ""
+"Error al ejecutar '%s'.\n"
+"\n"
+
+#: ../src/tools.c:248
+#, c-format
+msgid ""
+"Did not normalize '%s'. Set mp3gain path in the Tools section of the "
+"preferences.\n"
+msgstr ""
+"No se ha normalizado '%s'. Configurar la ruta de mp3gain en el apartado "
+"'Herramientas' del diálogo de edición de preferencias.\n"
+
+#: ../src/tools.c:258
+#, c-format
+msgid ""
+"Did not normalize '%s'. Set aacgain path in the Tools section of the "
+"preferences.\n"
+msgstr ""
+"No se ha normalizado '%s'. Configurar la ruta de aacgain en el apartado "
+"'Herramientas' del diálogo de edición de preferencias.\n"
+
+#: ../src/tools.c:385
+msgid "Normalizing..."
+msgstr "Normalizando..."
+
+#: ../src/tools.c:435
+#, c-format
+msgid "%s - %s"
+msgstr "%s - %s"
+
+#: ../src/tools.c:461
+msgid "Aborting..."
+msgstr "Cancelando..."
+
+#: ../src/tools.c:465
+msgid "Will abort after current mp3gain process ends."
+msgstr "Se cancelará al termino del actual proceso de mp3gain."
+
+#: ../src/tools.c:491
+#, c-format
+msgid ""
+"'%s-%s' (%s) could not be normalized.\n"
+"\n"
+msgstr ""
+"'%s-%s' (%s) no se ha podido normalizar.\n"
+"\n"
+
+#: ../src/tools.c:530
+#, c-format
+msgid "Normalized %d of %d tracks."
+msgid_plural "Normalized %d of %d tracks."
+msgstr[0] "Normalizada %d de %d pista."
+msgstr[1] "Normalizadas %d de %d pistas."
+
+#: ../src/tools.c:633
+msgid ""
+"Please specify the command to be called on the 'Tools' section of the "
+"preferences dialog.\n"
+msgstr ""
+"Seleccionar el programa a ser ejecutado en la sección de 'Herramientas' del "
+"diálogo de edición de preferencias.\n"
+
+#: ../src/tools.c:645
+#, c-format
+msgid ""
+"Could not find the command '%s'.\n"
+"\n"
+"Please verify the setting in the 'Tools' section of the preferences dialog.\n"
+"\n"
+msgstr ""
+"No se ha encontrado el programa '%s'.\n"
+"\n"
+"Conprobar la configuración en el apartado 'Herramientas' del diálogo de "
+"edición de preferencias.\n"
+"\n"
+
+#: ../src/tools.c:687
+#, c-format
+msgid ""
+"'%s' returned the following output:\n"
+"%s\n"
+msgstr ""
+"'%s' ha devuelto:\n"
+"%s\n"
+
+#: ../src/tools.c:754
+#, c-format
+msgid "No command set for '%s'"
+msgstr "No hay programa configurado para '%s'"
+
+#: ../src/tools.c:774
+#, c-format
+msgid "Could not find command '%s' specified for '%s'"
+msgstr "No se ha encontrado el programa '%s' usado para '%s'"
+
+#: ../src/wavfile.c:181
+#, c-format
+msgid "%s does not appear to be a supported wav file.\n"
+msgstr "%s no parece ser un fichero wav soportado.\n"
+
+#, fuzzy
+#~ msgid "<b>Resolution:</b>"
+#~ msgstr "<b>Sugerencias</b>"
+
+#~ msgid "label"
+#~ msgstr "etiqueta"
+
+#~ msgid ""
+#~ "Cannot open '%s' for reading.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "No se puede leer '%s'.\n"
+#~ "\n"
+
+#~ msgid "Unable to open '%s' for reading\n"
+#~ msgstr "Imposible abrir '%s' para lectura\n"
+
+#~ msgid "Could not open \"iTunesDB.ext\" for reading extended info.\n"
+#~ msgstr ""
+#~ "No se puede abrir \"iTunesDB.ext\" para leer información extendida.\n"
+
+#~ msgid "Add _Directory"
+#~ msgstr "Añadir _directorio"
+
+#~ msgid "Dirs"
+#~ msgstr "Directorios"
+
+#~ msgid "Files"
+#~ msgstr "Ficheros"
+
+#~ msgid "New PL"
+#~ msgstr "Nueva lista de reproducción"
+
+#~ msgid "_About"
+#~ msgstr "_Sobre"
+
+#~ msgid "Download Cover"
+#~ msgstr "Descargar carátula"
+
+#, fuzzy
+#~ msgid "Find _New"
+#~ msgstr "_Encontrar nuevo"
+
+#, fuzzy
+#~ msgid "Set Cover Art from _Web"
+#~ msgstr "Usar la web para configurar la carátula"
+
+#, fuzzy
+#~ msgid "_Previous"
+#~ msgstr "Previo"
+
+#~ msgid "Find Cover on Web"
+#~ msgstr "Encontrar carátula en la web"
+
+#~ msgid ""
+#~ "Audio/Video\n"
+#~ "Audio\n"
+#~ "Video\n"
+#~ "Podcast\n"
+#~ "Video Podcast\n"
+#~ "Audiobook\n"
+#~ "Music Video\n"
+#~ "TV Show\n"
+#~ "TV Show & Music Video\n"
+#~ msgstr ""
+#~ "Audio/Vídeo\n"
+#~ "Audio\n"
+#~ "Vídeo\n"
+#~ "Podcast\n"
+#~ "Podcast de vídeo\n"
+#~ "Audiolibro\n"
+#~ "Vídeo musical\n"
+#~ "TV Show\n"
+#~ "TV Show & Vídeo musical\n"
+
+#~ msgid "_Other"
+#~ msgstr "_Otro"
+
+#~ msgid "File skipped. match exclude masks: '%s'\n"
+#~ msgstr "Fichero ignorado. Concuerda con máscaras de exclusión: '%s'\n"
+
+#~ msgid "Add Playlists"
+#~ msgstr "Añadir listas de reproducción"
+
+#~ msgid "Select directory to add recursively"
+#~ msgstr "Seleccionar directorio para añadir recursivamente"
+
+#~ msgid ""
+#~ "Supposedly something that tells the iPod to increase or decrease the "
+#~ "playback speed"
+#~ msgstr ""
+#~ "Supuestamente, algo que le dice al iPod que incremente o reduzca la "
+#~ "velocidad de reproducción"
+
+#~ msgid "Processing '%s'"
+#~ msgstr "Procesando '%s'"
+
+#~ msgid "label21"
+#~ msgstr "etiqueta21"
+
+#~ msgid "window1"
+#~ msgstr "ventana1"

Added: trunk/po/fr.po
===================================================================
--- trunk/po/fr.po	                        (rev 0)
+++ trunk/po/fr.po	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,5912 @@
+# French language translation for gtkpod 
+# Copyright (C) 2005-2007 Eric Lassauge
+# Eric Lassauge <lassauge at users.sf.net>, 2006.
+# Copyright (C) 2003 David Le Brun
+# David Le Brun <david at dyn-ns.net>, 2003.
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gtkpod 0.99\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-12-13 18:36-0500\n"
+"PO-Revision-Date: 2007-07-03 16:28+0100\n"
+"Last-Translator: Éric Lassauge <rpmfarm at free.fr>\n"
+"Language-Team: FR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n>1;\n"
+
+#: ../data/gtkpod.desktop.in.h:1
+msgid "GtkPod"
+msgstr "GtkPod"
+
+#: ../data/gtkpod.desktop.in.h:2
+msgid "Manage music and video on an Apple iPod"
+msgstr "Gérer musiques et vidéos sur un iPod Apple"
+
+#: ../data/gtkpod.desktop.in.h:3
+msgid "iPod Manager"
+msgstr "Gestionnaire iPod"
+
+#: ../data/gtkpod.glade.h:1
+msgid " "
+msgstr " "
+
+#: ../data/gtkpod.glade.h:2
+msgid "    "
+msgstr "     "
+
+#: ../data/gtkpod.glade.h:3
+msgid "     "
+msgstr "     "
+
+#: ../data/gtkpod.glade.h:4
+msgid "      "
+msgstr "      "
+
+#: ../data/gtkpod.glade.h:5
+msgid "   Sort by:"
+msgstr "   Trier par :"
+
+#: ../data/gtkpod.glade.h:6
+msgid " <= cts <= "
+msgstr " <= et <= "
+
+#: ../data/gtkpod.glade.h:7
+msgid " Logic: "
+msgstr " Opérateur logique : "
+
+#: ../data/gtkpod.glade.h:9
+#, no-c-format
+msgid "%A"
+msgstr "%A"
+
+#: ../data/gtkpod.glade.h:10
+msgid ""
+"'DD/MM/YYYY HH:MM < d < DD/MM/YYYY HH:MM' or similar. Press 'enter' when "
+"finished."
+msgstr ""
+"'JJ/MM/AAAA HH:MM < d < JJ/MM/AAAA HH:MM' ou similaire. Appuyer sur «Entrée» "
+"pour valider."
+
+#: ../data/gtkpod.glade.h:11
+msgid "'aacgain' executable:"
+msgstr "Chemin de l'exécutable « aacgain » :"
+
+#: ../data/gtkpod.glade.h:12
+msgid "'mp3gain' executable:"
+msgstr "Chemin de l'exécutable « mp3gain » :"
+
+#: ../data/gtkpod.glade.h:13
+msgid "(Checked)"
+msgstr "(Coché)"
+
+#: ../data/gtkpod.glade.h:14
+msgid "...as icons"
+msgstr "…avec seulement les icônes"
+
+#: ../data/gtkpod.glade.h:15
+msgid "...as text"
+msgstr "…avec seulement les libellés"
+
+#: ../data/gtkpod.glade.h:16
+msgid "...both as icons and text"
+msgstr "…avec les icônes et libellés"
+
+#: ../data/gtkpod.glade.h:17
+msgid "...entry 'All' in sort tab..."
+msgstr "…onglet « Tous » dans la zone de tri…"
+
+#: ../data/gtkpod.glade.h:18
+msgid "...master playlist"
+msgstr "…liste de lecture principale"
+
+#: ../data/gtkpod.glade.h:20
+#, no-c-format
+msgid "../%A.jpg"
+msgstr "../%A.jpg"
+
+#: ../data/gtkpod.glade.h:21
+msgid "0"
+msgstr "0"
+
+#: ../data/gtkpod.glade.h:22
+msgid "1"
+msgstr "1"
+
+#: ../data/gtkpod.glade.h:23
+msgid "2"
+msgstr "2"
+
+#: ../data/gtkpod.glade.h:24
+msgid "3"
+msgstr "3"
+
+#: ../data/gtkpod.glade.h:25
+msgid "4"
+msgstr "4"
+
+#: ../data/gtkpod.glade.h:26
+msgid "5"
+msgstr "5"
+
+#: ../data/gtkpod.glade.h:27
+msgid ":"
+msgstr " :"
+
+#: ../data/gtkpod.glade.h:28
+msgid "<"
+msgstr "<"
+
+#: ../data/gtkpod.glade.h:29
+msgid "<b>Account Information</b>"
+msgstr "<b>Informations du compte</b>"
+
+#: ../data/gtkpod.glade.h:30
+msgid "<b>Adding/Updating/Syncing</b>"
+msgstr "<b>Ajout/Mise à jour/Synchronisation</b>"
+
+#: ../data/gtkpod.glade.h:31
+msgid "<b>Audioscrobbler</b>"
+msgstr "<b>Audioscrobbler</b>"
+
+#: ../data/gtkpod.glade.h:32
+msgid "<b>Auto-Generated Playlists</b>"
+msgstr "<b>Listes de lecture générées automatiquement</b>"
+
+#: ../data/gtkpod.glade.h:33
+msgid "<b>Automatically select...</b>"
+msgstr "<b>Sélection automatique…</b>"
+
+#: ../data/gtkpod.glade.h:34
+msgid "<b>Calendar/Contacts/Notes</b>"
+msgstr "<b>Calendrier/Contacts/Notes</b>"
+
+#: ../data/gtkpod.glade.h:35
+msgid "<b>Coverart</b>"
+msgstr "<b>Pochette</b>"
+
+#: ../data/gtkpod.glade.h:36
+msgid "<b>Delete Confirmation</b>"
+msgstr "<b>Confirmation de suppression</b>"
+
+#: ../data/gtkpod.glade.h:37
+msgid "<b>Examples</b>"
+msgstr "<b>Exemples</b>"
+
+#: ../data/gtkpod.glade.h:38
+msgid "<b>Ignore Frequent Words</b>"
+msgstr "<b>Ignorer les mots courants</b>"
+
+#: ../data/gtkpod.glade.h:39
+msgid "<b>Misc</b>"
+msgstr "<b>Divers</b>"
+
+#: ../data/gtkpod.glade.h:40
+msgid "<b>Mountpoint and individual repository/playlist options</b>"
+msgstr "<b>Point de montage et options pour dépots/listes</b>"
+
+#: ../data/gtkpod.glade.h:41
+msgid "<b>On-the-fly Conversion</b>"
+msgstr "<b>Conversion au fil de l'eau</b>"
+
+#: ../data/gtkpod.glade.h:42
+msgid "<b>Play</b>"
+msgstr "<b>Jouer</b>"
+
+#: ../data/gtkpod.glade.h:43
+msgid "<b>Playlists</b>"
+msgstr "<b>Listes</b>"
+
+#: ../data/gtkpod.glade.h:44
+msgid "<b>Please select mountpoint and your iPod model</b>"
+msgstr "<b>Sélectionnez le point de montage et le modèle de votre iPod</b>"
+
+#: ../data/gtkpod.glade.h:45
+msgid "<b>Repositories</b>"
+msgstr "<b>Dépots</b>"
+
+#: ../data/gtkpod.glade.h:46
+msgid "<b>Sort Order</b>"
+msgstr "<b>Ordre de tri</b>"
+
+#: ../data/gtkpod.glade.h:47
+msgid "<b>Sort Tabs</b>"
+msgstr "<b>Zones de tri</b>"
+
+#: ../data/gtkpod.glade.h:48
+msgid "<b>Sync</b>"
+msgstr "<b>Synchroniser</b>"
+
+#: ../data/gtkpod.glade.h:49
+msgid "<b>Synchronization</b>"
+msgstr "<b>Synchronisation</b>"
+
+#: ../data/gtkpod.glade.h:50
+msgid "<b>Tag Reading</b>"
+msgstr "<b>Lecture des attributs</b>"
+
+#: ../data/gtkpod.glade.h:51
+msgid "<b>Toolbar</b>"
+msgstr "<b>Barre d'outils</b>"
+
+#: ../data/gtkpod.glade.h:52
+msgid "<b>Tooltips</b>"
+msgstr "<b>Infobulles</b>"
+
+#: ../data/gtkpod.glade.h:53
+#, fuzzy
+msgid "<b>Track Attributes</b>"
+msgstr "<b>Attributs des morceaux affichés</b>"
+
+#: ../data/gtkpod.glade.h:54
+msgid "<b>Track Editing</b>"
+msgstr "<b>Édition de morceau</b>"
+
+#: ../data/gtkpod.glade.h:55
+msgid "<b>Volume Normalization</b>"
+msgstr "<b>Normalisation du volume</b>"
+
+#: ../data/gtkpod.glade.h:56
+msgid "<b>mserv</b>"
+msgstr "<b>mserv</b>"
+
+#: ../data/gtkpod.glade.h:57
+msgid ">"
+msgstr ">"
+
+#: ../data/gtkpod.glade.h:58
+msgid "About gtkpod"
+msgstr "A propos de gtkpod"
+
+#: ../data/gtkpod.glade.h:59
+msgid "Add Directories Recursively"
+msgstr "Ajouter récursivement des répertoires."
+
+#: ../data/gtkpod.glade.h:60
+#, fuzzy
+msgid "Add Files"
+msgstr "Ajouter des _fichiers"
+
+#: ../data/gtkpod.glade.h:61
+msgid "Add Files or Directories"
+msgstr "Ajouter des fichiers ou répertoires."
+
+#: ../data/gtkpod.glade.h:62
+#, fuzzy
+msgid "Add Fol_der"
+msgstr "Ajouter des _fichiers"
+
+#: ../data/gtkpod.glade.h:63
+#, fuzzy
+msgid "Add Folder"
+msgstr "Ajouter des _fichiers"
+
+#: ../data/gtkpod.glade.h:64
+msgid "Add Image_s"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:65
+#, fuzzy
+msgid "Add Images from a Directory"
+msgstr "Ajouter des fichiers ou répertoires."
+
+#: ../data/gtkpod.glade.h:66
+#, fuzzy
+msgid "Add Playlist"
+msgstr "Ajouter une _liste de lecture"
+
+#: ../data/gtkpod.glade.h:67
+msgid "Add _Files"
+msgstr "Ajouter des _fichiers"
+
+#: ../data/gtkpod.glade.h:68
+msgid "Add _Playlist"
+msgstr "Ajouter une _liste de lecture"
+
+#: ../data/gtkpod.glade.h:69
+msgid "Add coverart from file using the following template"
+msgstr ""
+"Ajouter la pochette depuis un fichier en utilisant l'expression suivante"
+
+#: ../data/gtkpod.glade.h:70
+msgid "Add directories recursively"
+msgstr "Ajouter les répertoires récursivement"
+
+#: ../data/gtkpod.glade.h:71
+msgid "Add new repository/iPod"
+msgstr "Ajouter un nouvel iPod/dépôt"
+
+#: ../data/gtkpod.glade.h:72
+msgid "Add playlist from file"
+msgstr "Ajouter une liste de lecture depuis un fichier"
+
+#: ../data/gtkpod.glade.h:73 ../src/display_sorttabs.c:3247
+#: ../src/display_tracks.c:2103
+msgid "Added"
+msgstr "Ajouté"
+
+#: ../data/gtkpod.glade.h:74
+msgid "Advanced Sorting Options"
+msgstr "Options de tri avancées"
+
+#. 0
+#: ../data/gtkpod.glade.h:75 ../src/display_sorttabs.c:2982
+#: ../src/display_spl.c:84 ../src/misc_conversion.c:60
+msgid "Album"
+msgstr "Album"
+
+#: ../data/gtkpod.glade.h:76
+msgid "Album Art"
+msgstr "Affichage pochette"
+
+#: ../data/gtkpod.glade.h:77
+msgid "All (AND)"
+msgstr "Et"
+
+#: ../data/gtkpod.glade.h:78
+msgid "All Tracks Never Listened To"
+msgstr "Contenant les morceaux qui n'ont jamais été écoutés"
+
+#: ../data/gtkpod.glade.h:79
+msgid "All Tracks Played Since Last Time"
+msgstr "Contenant les morceaux joués depuis la dernière fois"
+
+#: ../data/gtkpod.glade.h:80
+msgid "All Tracks not Listed in any Playlist"
+msgstr "Contenant tous les morceaux qui n'appartiennent à aucune liste"
+
+#: ../data/gtkpod.glade.h:81
+msgid "Also include tracks never played in \"Best Rated\" playlist"
+msgstr ""
+"Inclure aussi les morceaux qui n'ont jamais été joués dans la liste de \n"
+"lecture des morceaux les mieux notés"
+
+#: ../data/gtkpod.glade.h:82
+msgid "Always write ID3v2.4 tags (only applies to MP3)"
+msgstr "Toujours écrire les attributs ID3v2.4 (s'applique seulement aux MP3)"
+
+#: ../data/gtkpod.glade.h:83
+msgid "Any (OR)"
+msgstr "Ou"
+
+#: ../data/gtkpod.glade.h:84 ../src/display_sorttabs.c:2979
+#: ../src/display_spl.c:85 ../src/misc_conversion.c:61
+msgid "Artist"
+msgstr "Artiste"
+
+#: ../data/gtkpod.glade.h:85
+#, fuzzy
+msgid "Artwork Preview"
+msgstr "Chemin de la pochette"
+
+#: ../data/gtkpod.glade.h:86
+msgid ""
+"As a last resort set the following tags to the\n"
+"filename if they are (still) empty:"
+msgstr ""
+"Mettre un attribut par défaut au cas où les attributs restent\n"
+"vides après l'extraction à partir du nom de fichier :"
+
+#: ../data/gtkpod.glade.h:88
+msgid "Ascending"
+msgstr "Croissant"
+
+#: ../data/gtkpod.glade.h:89
+msgid "Auto Store"
+msgstr "Sauver automatiquement"
+
+#: ../data/gtkpod.glade.h:90
+msgid ""
+"Automatically start displaying tracks that match the criteria entered above. "
+"If not selected, you must press 'Display' to start displaying."
+msgstr ""
+"Affiche automatiquement les morceaux qui correspondent aux critères saisis."
+"En désactivant cette option, vous devrez appuyer sur « Afficher »."
+
+#: ../data/gtkpod.glade.h:91
+msgid "Available:"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:92
+msgid "Before removing playlists or tracks from a playlist"
+msgstr "Avant de supprimer les listes ou morceaux d'une liste de lecture"
+
+#: ../data/gtkpod.glade.h:93
+msgid "Before removing tracks from the harddisk"
+msgstr "Avant de supprimer complètement les morceaux du disque dur"
+
+#: ../data/gtkpod.glade.h:94
+msgid "Before removing tracks from the iPod"
+msgstr "Avant de supprimer complètement les morceaux de l'iPod"
+
+#: ../data/gtkpod.glade.h:95
+msgid "Before removing tracks from the local database"
+msgstr ""
+"Avant de supprimer complètement les morceaux de la base de données locale"
+
+#: ../data/gtkpod.glade.h:96
+msgid "Best Rated Tracks"
+msgstr "Contenant les morceaux les mieux notés"
+
+#: ../data/gtkpod.glade.h:97
+msgid "Browse"
+msgstr "Parcourir"
+
+#: ../data/gtkpod.glade.h:98
+msgid "Cache directory:"
+msgstr "Dossier de cache :"
+
+#: ../data/gtkpod.glade.h:99
+msgid "Calendar"
+msgstr "Calendrier"
+
+#: ../data/gtkpod.glade.h:100
+msgid "Calendar sync command:"
+msgstr "Commande pour la synchronisation du calendrier :"
+
+#: ../data/gtkpod.glade.h:101
+msgid "Call automatically when synchronizing iTunesDB"
+msgstr "Exécuter en même temps que la synchronisation de la base iTunesDB"
+
+#: ../data/gtkpod.glade.h:102
+msgid "Category: "
+msgstr "Catégorie : "
+
+#: ../data/gtkpod.glade.h:103
+msgid ""
+"Change all tracks\n"
+"simultaneously"
+msgstr ""
+"Changer tous les morceaux\n"
+"simultanément"
+
+#: ../data/gtkpod.glade.h:105
+msgid ""
+"Check before removing photos from a photo album whether\n"
+"they should be deleted from the Photo Database."
+msgstr ""
+
+#: ../data/gtkpod.glade.h:107
+msgid "Check for existing files when copying from iPod."
+msgstr ""
+"Contrôler l'existence des fichiers lors de la copie à partir de l'iPod."
+
+#: ../data/gtkpod.glade.h:108
+msgid "Command for 'Enqueue':"
+msgstr "Ligne de commande pour « Ajouter à la file d'attente » :"
+
+#: ../data/gtkpod.glade.h:109
+msgid "Command for 'Play now':"
+msgstr "Ligne de commande pour « Jouer maintenant » :"
+
+#. 5
+#: ../data/gtkpod.glade.h:110 ../src/display_spl.c:97
+#: ../src/misc_conversion.c:65
+msgid "Composer"
+msgstr "Compositeur"
+
+#: ../data/gtkpod.glade.h:111
+msgid "Confirm before removing tracks from the iPod or repository"
+msgstr "Confirmer avant de supprimer les morceaux de l'iPod ou du dépôt"
+
+#: ../data/gtkpod.glade.h:112
+msgid ""
+"Confirm before removing tracks from the iPod or repository\n"
+"when syncing playlists"
+msgstr ""
+"Confirmer avant de supprimer les morceaux de l'iPod ou du dépôt\n"
+"lors de la synchronisation des listes"
+
+#: ../data/gtkpod.glade.h:114
+msgid "Confirm lists of directories"
+msgstr "Confirmer la liste des répertoires"
+
+#: ../data/gtkpod.glade.h:115
+msgid "Contacts sync command:"
+msgstr "Commande pour la synchronisation des contacts :"
+
+#: ../data/gtkpod.glade.h:116
+msgid "Containing Displayed Tracks"
+msgstr "Contenant les morceaux affichés"
+
+#: ../data/gtkpod.glade.h:117
+msgid "Containing Selected Tracks"
+msgstr "Contenant les morceaux sélectionnés"
+
+#: ../data/gtkpod.glade.h:118
+msgid "Conversion Progress Display"
+msgstr "Afficher une boîte de dialogue de barre de progression"
+
+#: ../data/gtkpod.glade.h:119
+msgid "Cover"
+msgstr "Pochette"
+
+#: ../data/gtkpod.glade.h:120
+msgid "Create New Playlist"
+msgstr "Créer une nouvelle liste de lecture."
+
+#: ../data/gtkpod.glade.h:121
+msgid "Create Repository"
+msgstr "Créer un dépot"
+
+#: ../data/gtkpod.glade.h:122
+msgid "Create _Playlist File"
+msgstr "Créer un fichier de _liste"
+
+#: ../data/gtkpod.glade.h:123
+msgid "Credits"
+msgstr "Crédits"
+
+#: ../data/gtkpod.glade.h:124
+msgid "Currently only rating is supported."
+msgstr "Actuellement, seule la notation est supportée."
+
+#: ../data/gtkpod.glade.h:125
+msgid "Delete repository"
+msgstr "Supprimer le dépot"
+
+#: ../data/gtkpod.glade.h:126
+msgid ""
+"Delete tracks that are no longer present from the\n"
+"iPod or repository"
+msgstr ""
+"Effacer les morceaux qui ne sont plus présents\n"
+"dans l'iPod ou le dépôt"
+
+#: ../data/gtkpod.glade.h:128
+msgid "Deleted tracks"
+msgstr "Morceaux supprimés"
+
+#: ../data/gtkpod.glade.h:129
+msgid "Descending"
+msgstr "Décroissant"
+
+#: ../data/gtkpod.glade.h:130
+msgid "Details"
+msgstr "Détails"
+
+#: ../data/gtkpod.glade.h:132
+#, no-c-format
+msgid ""
+"Determines how the string for the info field should be constructed, e.g '%a/%"
+"A/%T - %t.mp3' or '%o'.  You can separate several templates by semicolons -- "
+"gtkpod will determine which one to use by the filename extension given. "
+"Artist: %a, album: %A, composer: %c, title: %t, genre: %G, track nr: %T, CD "
+"nr: %C, year: %Y, original filename (requires extended information file): %"
+"o, the character '%': %%."
+msgstr ""
+"Détermine comment le champ d'information doit être construit, par exemple «%"
+"a/%A/%T - %t» ou «%o». Vous pouvez séparer les expressions par des points-"
+"virgules -- gtkpod déterminera laquelle utiliser suivant l'extension du "
+"fichier donnée. Artiste: %a, album: %A, compositeur: %c, titre: %t, genre: %"
+"G, N° de piste: %T, N° de CD: %C, année: %Y, le nom de fichier original "
+"(nécessite le fichier d'infos étendues): %o, le caractère '%': %%."
+
+#: ../data/gtkpod.glade.h:134
+#, no-c-format
+msgid ""
+"Determines the filename of tracks you copy from the iPod, e.g '%a/%A/%T - %t."
+"mp3' or '%o'.  You can separate several patterns by semicolons -- gtkpod "
+"will determine which one to use by the filename extension given. Artist: %a, "
+"album: %A, composer: %c, title: %t, genre: %G, track nr: %T, CD nr: %C, "
+"year: %Y, original filename (requires extended information file): %o, "
+"current playlist: %p, the character '%': %%."
+msgstr ""
+"Détermine le nom de fichier des morceaux que vous copiez de l'iPod, par "
+"exemple «%a/%A/%T - %t» ou «%o». Vous pouvez séparer les expressions par des "
+"points-virgules -- gtkpod déterminera laquelle utiliser suivant l'extension "
+"du fichier donnée. Artiste: %a, album: %A, compositeur: %c, titre: %t, "
+"genre: %G, N° de piste: %T, N° de CD: %C, année: %Y, le nom de fichier "
+"original (nécessite le fichier d'infos étendues): %o, le caractère '%': %%."
+
+#: ../data/gtkpod.glade.h:136
+#, no-c-format
+msgid ""
+"Determines the name of the file with the cover art. You can separate several "
+"patterns by semicolons which will be tried in order. Artist: %a, album: %A, "
+"composer: %c, title: %t, genre: %G, track nr: %T, CD nr: %C, year: %Y, "
+"original filename (requires extended information file): %o, original "
+"filename without file extension: %O, current playlist: %p, the character "
+"'%': %%."
+msgstr ""
+"Détermine le nom du fichier pour la pochette. Vous pouvez séparer les "
+"expressions utilisées dans l'ordre par des points-virgules. Artiste: %a, "
+"album: %A, compositeur; %c, titre: %t, genre: %G, N° de piste: %T, N° de CD: "
+"%C, année: %Y, le nom de fichier original (nécessite le fichier d'infos "
+"étendues): %o, le nom de fichier original sans extension: %O, la liste "
+"courante: %p,  le caractère '%': %%."
+
+#: ../data/gtkpod.glade.h:137
+msgid ""
+"Directories to sync with are determined from the filenames of the tracks in "
+"the playlist."
+msgstr ""
+"Répertoires à synchroniser déterminés par les noms de fichier des morceaux "
+"de la liste de lecture."
+
+#: ../data/gtkpod.glade.h:138
+msgid "Display a list of tracks that could actually be updated."
+msgstr "Afficher la liste des morceaux qui peuvent être mis à jour."
+
+#: ../data/gtkpod.glade.h:139
+msgid "Display a list of tracks that could not be updated."
+msgstr "Afficher la liste des morceaux qui ne peuvent pas être mis à jour."
+
+#: ../data/gtkpod.glade.h:140
+msgid "Display conversion log"
+msgstr "Afficher les traces des conversions"
+
+#: ../data/gtkpod.glade.h:141
+msgid "Display info about detected duplicates"
+msgstr "Afficher les infos au sujet des doublons"
+
+#: ../data/gtkpod.glade.h:142
+msgid "Display info about non-updated tracks"
+msgstr "Afficher les infos des morceaux qui n'ont pas été mis à jour"
+
+#: ../data/gtkpod.glade.h:143
+msgid "Display info about updated tracks"
+msgstr "Afficher les infos des morceaux mis à jour"
+
+#: ../data/gtkpod.glade.h:144
+msgid "Display messages and warnings at startup"
+msgstr "Afficher les messages et avertissements au démarrage"
+
+#: ../data/gtkpod.glade.h:145
+msgid ""
+"Display the list of duplicates that have been detected after adding files."
+msgstr "Afficher la liste des doublons détectés lors de l'ajout de fichier."
+
+#: ../data/gtkpod.glade.h:146
+msgid "Display toolbar..."
+msgstr "Afficher la barre d'outils…"
+
+#: ../data/gtkpod.glade.h:147
+msgid "Display tooltips in main window"
+msgstr "Afficher les infobulles dans la fenêtre principale"
+
+#: ../data/gtkpod.glade.h:148
+msgid "Display tooltips in prefs window"
+msgstr "Afficher les infobulles dans la fenêtre des préférences"
+
+#: ../data/gtkpod.glade.h:149
+msgid "Display tracks that match the criteria entered above."
+msgstr "Afficher les morceaux qui correspondent aux critères saisis."
+
+#: ../data/gtkpod.glade.h:150
+msgid ""
+"Displayed\n"
+"Tracks"
+msgstr ""
+"Morceaux\n"
+"Affichés"
+
+#: ../data/gtkpod.glade.h:152
+#, fuzzy
+msgid "Displayed:"
+msgstr "_Affichage"
+
+#: ../data/gtkpod.glade.h:153
+msgid "Don't allow file duplication"
+msgstr "Ne pas autoriser de doublons de fichiers"
+
+#: ../data/gtkpod.glade.h:154
+msgid "Don't automatically sync on startup"
+msgstr "Ne pas synchroniser automatiquement au démarrage"
+
+#: ../data/gtkpod.glade.h:155
+msgid "Duplicate Recognition is based on a (modified) sha1 hash over the file."
+msgstr ""
+"La détection de doublons est basée sur la somme de contrôle sha1 des "
+"fichiers."
+
+#: ../data/gtkpod.glade.h:156
+msgid "Edit Repository/iPod Options"
+msgstr "Editer les _options du dépot/iPod"
+
+#: ../data/gtkpod.glade.h:157 ../src/context_menus.c:662
+msgid "Edit Smart Playlist"
+msgstr "Éditer la liste intelligente"
+
+#: ../data/gtkpod.glade.h:158 ../src/context_menus.c:749
+msgid "Edit Track Details"
+msgstr "Editer les _détails du morceau"
+
+#: ../data/gtkpod.glade.h:159
+msgid "Edit _Preferences"
+msgstr "_Préférences"
+
+#: ../data/gtkpod.glade.h:160
+msgid "Effective free space"
+msgstr "Espace libre effectif"
+
+#: ../data/gtkpod.glade.h:161
+msgid "Empty Playlist"
+msgstr "Vide"
+
+#: ../data/gtkpod.glade.h:162
+msgid "Exclude file mask(s)"
+msgstr "Masque(s) d'exclusion de fichiers :"
+
+#: ../data/gtkpod.glade.h:163
+msgid "Export can be continued at a later time if canceled."
+msgstr "L'export peut être repris plus tard après l'annulation."
+
+#: ../data/gtkpod.glade.h:164
+msgid "File size"
+msgstr "Taille des fichiers"
+
+#: ../data/gtkpod.glade.h:165
+msgid "File size (deleted)"
+msgstr "Taille des fichiers (supprimés)"
+
+#: ../data/gtkpod.glade.h:166
+msgid "File size (non-transferred)"
+msgstr "Taille des fichiers (non transférés)"
+
+#: ../data/gtkpod.glade.h:167
+msgid "Filename Format: "
+msgstr "Format du nom des fichiers : "
+
+#: ../data/gtkpod.glade.h:168
+msgid ""
+"Find orphan files (files with no track info in DB) and dangling tracks "
+"(tracks with no corresponding files on iPod)"
+msgstr ""
+"Trouver les fichiers orphelins (fichiers sans entrée dans la base iTunesDB) "
+"et les morceaux fictifs (morceaux sans fichier correspondant sur l'iPod)."
+
+#: ../data/gtkpod.glade.h:169
+#, fuzzy
+msgid "First try <i>folder.jpg</i>, then <i>&lt;artist&gt;.jpg</i>"
+msgstr "Essaye <i>répertoire.jpg</i>, puis <i>&lt;artiste&gt;.jpg</i>"
+
+#: ../data/gtkpod.glade.h:170
+msgid "Flac with :"
+msgstr "FLAC avec :"
+
+#: ../data/gtkpod.glade.h:172
+#, no-c-format
+msgid ""
+"For example, 'xmms %s' will clear xmms' current playlist, add the selected "
+"tracks and start playing."
+msgstr ""
+"Par exemple « xmms %s » videra la liste de lecture actuelle de xmms, "
+"ajoutera les morceaux sélectionnés et commencera la lecture."
+
+#: ../data/gtkpod.glade.h:174
+#, no-c-format
+msgid ""
+"For example, 'xmms -e %s' will append (enqueue) the selected tracks to xmms' "
+"current playlist."
+msgstr ""
+"Par exemple « xmms -e %s » ajoutera à la liste de lecture de xmms les "
+"morceaux sélectionnés."
+
+#: ../data/gtkpod.glade.h:175 ../src/display_sorttabs.c:2985
+#: ../src/display_spl.c:89 ../src/misc_conversion.c:63
+msgid "Genre"
+msgstr "Genre"
+
+#: ../data/gtkpod.glade.h:176
+msgid "Group artists on compilation CDs"
+msgstr "Grouper les artistes pour les CDs de compilation"
+
+#: ../data/gtkpod.glade.h:177
+msgid ""
+"Highly recommended for faster import when taking advantage of the "
+"duplication recognition. Also, having the PC filenames allows writing "
+"changed ID3 tags to disk, and even to reconstruct your iPod's contents in "
+"case of file system corruption (change the \"transferred=\" entries in your "
+"backuped database)."
+msgstr ""
+"Cette option est plus que recommandée pour des raisons de performance lors "
+"de l'import en prenant en compte les doublons. De plus, cela permet de "
+"mettre à jour les attributs ID3 des fichiers sur disque, et de restaurer le "
+"contenu de votre iPod en cas de corruption du système de fichiers (change "
+"l'entrée « transferred= » dans la sauvegarde de la base de données)."
+
+#: ../data/gtkpod.glade.h:178 ../src/context_menus.c:685
+#: ../src/context_menus.c:703 ../src/context_menus.c:820
+msgid "I'm sure"
+msgstr "Je suis sûr"
+
+#: ../data/gtkpod.glade.h:179
+msgid ""
+"If available, the local copy of the track is referenced in the playlist. "
+"Otherwise the file on the iPod is used."
+msgstr ""
+"Si possible, c'est la copie locale du fichier qui est référencée dans la "
+"liste. Autrement, le fichier de l'iPod est utilisé."
+
+#: ../data/gtkpod.glade.h:180
+msgid "If both options are selected, embedded APIC data takes precedence."
+msgstr ""
+"Si les deux options sont validées, les données APIC sont utilisées en "
+"priorité."
+
+#: ../data/gtkpod.glade.h:181
+msgid ""
+"If checked, sorting will be case sensitive. Please note that case sensitive "
+"sorting will not work well with most charsets."
+msgstr ""
+"En cochant cette option, le tri tiendra compte de la casse (minuscule/"
+"majuscule). Le tri dépend du jeu de caractères."
+
+#: ../data/gtkpod.glade.h:182
+msgid ""
+"If the filename (full path) of an existing track matches that of a track to "
+"be added, this option allows you to update the information about the "
+"existing track rather than just skipping the track altogether. No update "
+"will take place if the file hasn't changed and you have selected the 'Don't "
+"allow file duplication' option above."
+msgstr ""
+"Si le fichier (chemin complet) d'un morceau existant correspond au morceau à "
+"ajouter, cette option vous permet de mettre à jour les informations du "
+"morceau existant plutôt que de l'écraser. Notez que cette option est "
+"différente de l'option ci-dessus : les doublons sont des fichiers "
+"strictement identiques (même taille, mêmes tags)"
+
+#: ../data/gtkpod.glade.h:183
+msgid "If you check this, gtkpod will descend into subdirectories recursively."
+msgstr ""
+"Si vous cochez cette case, gtkpod analysera les sous-répertoires "
+"récursivement."
+
+#: ../data/gtkpod.glade.h:184
+msgid ""
+"If you check this, information (cover art and meta information) changed for "
+"this track will be copied to all other selected tracks as well. Use with "
+"care."
+msgstr ""
+"Si vous cochez ceci, les informations (pochette et méta-informations) "
+"modifiées pour ce morceau seront copiées également pour tous les morceaux "
+"sélectionnés. A utiliser avec précaution."
+
+#: ../data/gtkpod.glade.h:185
+msgid ""
+"If you don't select the master playlist automatically, the initial database "
+"import is much faster because the display dosn't have to be updated."
+msgstr ""
+"Si vous ne choisissez pas de liste de lecture principale automatiquement, "
+"l'import initial sera beaucoup plus rapide car l'affichage n'aura pas à être "
+"mis à jour à chaque morceau."
+
+#: ../data/gtkpod.glade.h:186
+msgid ""
+"If you select several tracks in the track list and edit a tag of the first "
+"track, the tags in the other tracks are updated as well."
+msgstr ""
+"Si vous sélectionnez plusieures chansons et éditez un attribut du premier "
+"morceau les attributs des autres morceaux seront également mis à jour."
+
+#: ../data/gtkpod.glade.h:187
+msgid "Ignore these words when at the beginning of the following fields:"
+msgstr "Ignorer ces mots au début des champs suivants :"
+
+#: ../data/gtkpod.glade.h:188
+msgid ""
+"In order to save the displayed track order to the iPod choose 'Save "
+"Displayed Track Order' from the 'Edit' menu or select 'Auto Store' below."
+msgstr ""
+"Afin de trier par ordre alphabétique sur l'iPod, vous devez cliquer sur le "
+"menu « Édition » puis « Sauver l'ordre de tri des morceaux affichés » ou "
+"l'option « Sauver automatiquement » ci-dessus."
+
+#: ../data/gtkpod.glade.h:189
+msgid "Initialize iPod"
+msgstr "Initialiser l'iPod"
+
+#: ../data/gtkpod.glade.h:190
+msgid ""
+"Insert before\n"
+"Insert after"
+msgstr ""
+"Insérer avant\n"
+"Insérer après"
+
+#: ../data/gtkpod.glade.h:192
+msgid "Keeps all compilation CDs grouped together in the artists sort tab."
+msgstr "Garder les CDs de compilation groupés dans la zone de tri Artistes"
+
+#: ../data/gtkpod.glade.h:193
+msgid "Live _updating"
+msgstr "Mise à jour automatique"
+
+#: ../data/gtkpod.glade.h:194
+msgid "Load iPod(s)"
+msgstr "Charger _iPod(s)"
+
+#: ../data/gtkpod.glade.h:195
+msgid "Lower Margin"
+msgstr "Borne inférieure"
+
+#: ../data/gtkpod.glade.h:196
+msgid "M4A with :"
+msgstr "M4A avec :"
+
+#: ../data/gtkpod.glade.h:197
+msgid "MP3 with :"
+msgstr "MP3 avec :"
+
+#: ../data/gtkpod.glade.h:198
+msgid "Match al_l of the following"
+msgstr "Répondant à _toutes"
+
+#: ../data/gtkpod.glade.h:199
+msgid "Match an_y of the following"
+msgstr "Répondant à _quelques"
+
+#: ../data/gtkpod.glade.h:200
+msgid "Match only _checked tracks"
+msgstr "Seulement les morceaux _cochés"
+
+#: ../data/gtkpod.glade.h:201
+msgid "Maximum number of background threads:"
+msgstr "Nombre maximum de threads en arrière-plan :"
+
+#: ../data/gtkpod.glade.h:202
+msgid "Maximum size of cache directory (in GB):"
+msgstr "Taille maximale du dossier cache (en Go) :"
+
+#: ../data/gtkpod.glade.h:203
+msgid "Model:"
+msgstr "Modèle :"
+
+#: ../data/gtkpod.glade.h:204 ../src/display_tracks.c:2100
+msgid "Modified"
+msgstr "Modifié le"
+
+#: ../data/gtkpod.glade.h:205
+msgid "Most Recently Played Tracks"
+msgstr "Contenant les morceaux dernièrement joués"
+
+#: ../data/gtkpod.glade.h:206
+msgid "Move selected attributes to the displayed list"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:207
+msgid "Music Root:"
+msgstr "Racine musique :"
+
+#: ../data/gtkpod.glade.h:208
+msgid ""
+"Music files can have images embedded in the APIC tag. Currently this is only "
+"supported for MP3 files."
+msgstr ""
+"Les fichiers de musique peuvent avoir des images dans le tag APIC. Pour "
+"l'instant ceci est uniquement vrai pour les fichiers MP3."
+
+#: ../data/gtkpod.glade.h:209
+msgid "Never show this dialogue again"
+msgstr "Ne plus afficher ce message"
+
+#: ../data/gtkpod.glade.h:210 ../src/display_spl.c:1719
+#: ../src/misc_playlist.c:66 ../src/misc_playlist.c:68
+#: ../src/misc_playlist.c:93 ../src/misc_playlist.c:95
+#: ../src/misc_playlist.c:428 ../src/misc_playlist.c:430
+msgid "New Playlist"
+msgstr "Nouvelle liste de lecture"
+
+#: ../data/gtkpod.glade.h:211
+msgid "No lower margin"
+msgstr "Pas de borne inférieure"
+
+#: ../data/gtkpod.glade.h:212
+msgid "No upper margin"
+msgstr "Pas de borne supérieure"
+
+#: ../data/gtkpod.glade.h:213
+msgid "Non-transferred tracks"
+msgstr "Morceaux non transférés"
+
+#: ../data/gtkpod.glade.h:214
+msgid "None"
+msgstr "Aucun"
+
+#: ../data/gtkpod.glade.h:215
+msgid ""
+"Normally the charset specified when first importing the track will be used "
+"for the filename. If you set this option you can set a different charset "
+"with the charset selector (Preferences/'Adding/Updating/Syncing'). Note: the "
+"charset info is stored in the extended information file (see "
+"Preferences/'Writing of the iTunesDB'). Tracks imported before V0.51 will "
+"have no charset stored. Instead the charset specified will be used."
+msgstr ""
+"Par défaut, le jeu de caractères spécifié lors du premier import d'un "
+"morceau sera celui utilisé pour la mise à jour. Si vous cochez cette option, "
+"vous pouvez utiliser un jeu de caractère différent de ci-dessus. Note : les "
+"infos sur les caractères sont stockées dans un fichier d'informations "
+"étendues. Les morceaux importés avant la version 0.51 de gtkpod "
+"n'utilisaient pas ce fichier. Ce sera le jeu de caractère spécifié ici qui "
+"sera utilisé en cas de mise à jour de ces morceaux."
+
+#: ../data/gtkpod.glade.h:216
+msgid ""
+"Normally the charset specified when first importing the track will be used "
+"to update the track information. If you have chosen a wrong charset when "
+"first importing a track and want to correct it using the 'Update Track' "
+"function, you must check this option. Note: the charset info is stored in "
+"the extended information file (see 'Writing of iTunesDB' below) and tracks "
+"imported before V0.51 will have no charset stored. Instead the charset "
+"specified above will be used then."
+msgstr ""
+"Par défaut, le jeu de caractère spécifié lors du premier import d'un morceau "
+"sera celui utilisé pour la mise à jour. Pour corriger un mauvais jeu de car. "
+"sélectionné à l'import initial d'un morceau, cocher cette option pour le "
+"modifier lors de la mise à jour de ce morceau. Note : les infos sur les "
+"caractères sont stockées dans un fichier d'informations étendues et les "
+"morceaux importés.avant la version 0.51 de gtkpod n'utilisait pas ce "
+"fichier. Ce sera le jeu de caractères spécifié ici qui sera utilisé en cas "
+"de mise à jour de ces morceaux."
+
+#: ../data/gtkpod.glade.h:217
+msgid ""
+"Normally the charset specified when first importing the track will be used "
+"to write the tags. If you have chosen a wrong charset when first importing a "
+"track, you should select this option along with the correct charset.  Note: "
+"uses the extended information file to store the charset information (see "
+"'Writing of the iTunesDB' on the 'Input/Output' page) and tracks imported "
+"before V0.51 will have no charset stored -- the charset specified on the "
+"'Input/Output' page will be used."
+msgstr ""
+"Par défaut, le jeu de caractère spécifié lors du premier import d'un morceau "
+"sera celui utilisé pour la mise à jour. Pour corriger un mauvais jeu de car. "
+"sélectionné à l'import initial d'un morceau, cocher cette option pour le "
+"modifier lors de la mise à jour de ce morceau. Note : les infos sur les "
+"caractères sont stockées dans un fichier d'information étendu et les "
+"morceaux importés avant la version 0.51 de gtkpod n'utilisait pas ce "
+"fichier. Ce sera le jeu spécifié ici qui sera utilisé en cas de mise à jour "
+"de ces morceaux."
+
+#: ../data/gtkpod.glade.h:218
+msgid ""
+"Normally, if a track is no longer present in the sync directory, it will be "
+"removed from the playlist, but not from the iPod or local repository.\n"
+"If this option is checked, tracks will be completely removed from the iPod "
+"or local repository, unless the track is a member of other playlists as "
+"well.\n"
+"NOTE: if you sync with the master playlist, you must check this option if "
+"you want tracks to be removed, because removing from the master playlist "
+"means removing from the iPod."
+msgstr ""
+"Par défaut si un morceau n'est plus présent dans le répertoire à "
+"synchroniser, il sera éliminé de la liste, mais pas de l'iPod ni du dépot "
+"local.\n"
+"Si cette option est sélectionnée, les morceaux seront effacés de l'iPod ou "
+"du dépot local, à moins qu'ils soient également inclus dans d'autres "
+"listes.\n"
+"NOTE : si vous synchronisez la liste principale, vous devez valider cette "
+"option si vous voulez que des morceaux soient effacés, car enlever de la "
+"liste principale signifie effacer de l'iPod."
+
+#: ../data/gtkpod.glade.h:221
+msgid "Notes sync command:"
+msgstr "Commande pour la synchronisation des notes :"
+
+#: ../data/gtkpod.glade.h:222
+msgid "Number of playlists"
+msgstr "Nombre de listes de lecture"
+
+#: ../data/gtkpod.glade.h:223
+msgid "Number of tracks"
+msgstr "Nombre de morceaux"
+
+#: ../data/gtkpod.glade.h:224
+msgid "Number of tracks in generated playlists:"
+msgstr "Nombre de morceaux dans les listes de lecture générées :"
+
+#: ../data/gtkpod.glade.h:225
+msgid ""
+"Number of tracks in the generated playlists 'Most Often Listened', 'Best "
+"Rated' and 'Most Recently Played'. Choose '0' for 'no limit'."
+msgstr ""
+"Nombre de morceaux dans les listes de lecture générées automatiquement."
+"Mettre '0' pour ne pas spécifier de limite."
+
+#: ../data/gtkpod.glade.h:226
+msgid "Ogg with :"
+msgstr "Ogg avec :"
+
+#: ../data/gtkpod.glade.h:227
+msgid "On startup automatically sync with playlist directories"
+msgstr ""
+"Au démarrage synchroniser automatiquement avec les répertoires de liste de "
+"lecture"
+
+#: ../data/gtkpod.glade.h:228
+msgid "On startup automatically sync with the following directory"
+msgstr "Au démarrage synchroniser automatiquement avec le répertoire suivant"
+
+#: ../data/gtkpod.glade.h:229
+msgid "On startup automatically update (Live Playlist)"
+msgstr "Au démarrage synchroniser automatiquement (liste dynamique)"
+
+#: ../data/gtkpod.glade.h:230
+msgid "One for each Album"
+msgstr "Par album"
+
+#: ../data/gtkpod.glade.h:231
+msgid "One for each Artist"
+msgstr "Par artiste"
+
+#: ../data/gtkpod.glade.h:232
+msgid "One for each Composer"
+msgstr "Par compositeur"
+
+#: ../data/gtkpod.glade.h:233
+msgid "One for each Genre"
+msgstr "Par genre"
+
+#: ../data/gtkpod.glade.h:234
+msgid "One for each Rating"
+msgstr "Par note"
+
+#: ../data/gtkpod.glade.h:235
+msgid "One for each Year"
+msgstr "Par année"
+
+#: ../data/gtkpod.glade.h:236
+msgid "Overwrite tags that are already set"
+msgstr "Écraser les attributs déjà présents"
+
+#: ../data/gtkpod.glade.h:237
+msgid "Password:"
+msgstr "Mot de passe :"
+
+#: ../data/gtkpod.glade.h:238
+msgid "Path:"
+msgstr "Chemin :"
+
+#: ../data/gtkpod.glade.h:239
+#, fuzzy
+msgid "Photo Window"
+msgstr "_Fenêtre d'infos"
+
+#: ../data/gtkpod.glade.h:240 ../src/display_spl.c:94
+msgid "Play time"
+msgstr "Durée"
+
+#: ../data/gtkpod.glade.h:241 ../src/display_spl.c:98
+#: ../src/misc_conversion.c:77
+msgid "Playcount"
+msgstr "Cpt. lecture"
+
+#: ../data/gtkpod.glade.h:242 ../src/display_tracks.c:2097
+msgid "Played"
+msgstr "Joué le"
+
+#: ../data/gtkpod.glade.h:243
+msgid "Playlist name:"
+msgstr "Nom de la liste :"
+
+#: ../data/gtkpod.glade.h:244
+msgid "Playlist type:"
+msgstr "Type de liste :"
+
+#: ../data/gtkpod.glade.h:245 ../src/display_playlists.c:2258
+msgid "Playlists"
+msgstr "Listes de lecture"
+
+#: ../data/gtkpod.glade.h:246
+msgid "Please refer to the notice below."
+msgstr "Référez vous à la règle ci-dessous."
+
+#: ../data/gtkpod.glade.h:247
+msgid "Please specify a time interval"
+msgstr "Spécifiez un intervalle de temps"
+
+#: ../data/gtkpod.glade.h:248
+msgid "Preferences"
+msgstr "Préférences"
+
+#: ../data/gtkpod.glade.h:249
+msgid "Progress Information"
+msgstr "Afficher des informations de progression"
+
+#: ../data/gtkpod.glade.h:250
+msgid "R_ename Album"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:251
+msgid "Random Playlist from Displayed Tracks"
+msgstr "Contenant les morceaux affichés aléatoirement"
+
+#: ../data/gtkpod.glade.h:252
+msgid "Randomize Current Playlist"
+msgstr "Mélanger l'ordre de la liste de lecture actuelle"
+
+#: ../data/gtkpod.glade.h:253 ../src/display_spl.c:101
+#: ../src/misc_conversion.c:78
+msgid "Rating"
+msgstr "Note"
+
+#: ../data/gtkpod.glade.h:254
+msgid "Read coverart from embedded APIC data"
+msgstr "Lire la pochette depuis les données APIC"
+
+#: ../data/gtkpod.glade.h:255
+msgid "Read tags from file contents (e.g. ID3 tags in MP3 files)"
+msgstr ""
+"Lire les attributs à partir du contenu des fichiers (attributs ID3 dans les "
+"fichiers)"
+
+#: ../data/gtkpod.glade.h:256
+#, fuzzy
+msgid "Remove selected attributes from the displayed list"
+msgstr "Morceaux sélectionnés de la liste de lecture"
+
+#: ../data/gtkpod.glade.h:257
+msgid "Repository Options"
+msgstr "Options du dépot"
+
+#: ../data/gtkpod.glade.h:258
+msgid "Repository name:"
+msgstr "Nom du dépot :"
+
+#: ../data/gtkpod.glade.h:259
+msgid "Repository type:"
+msgstr "Type de dépot :"
+
+#: ../data/gtkpod.glade.h:260
+msgid "Root directory of mserv database (trackinfo root)."
+msgstr "Rép. de la base mserv (infos)."
+
+#: ../data/gtkpod.glade.h:261
+msgid "Rules"
+msgstr "Règles"
+
+#: ../data/gtkpod.glade.h:262 ../src/context_menus.c:804
+msgid "Save Changes"
+msgstr "Enregistrer"
+
+#: ../data/gtkpod.glade.h:263
+msgid "Scrobble Tracks?"
+msgstr "« scrobbling » des morceaux ?"
+
+#: ../data/gtkpod.glade.h:264
+msgid "Select '-1' for no upper limit."
+msgstr "Choisissez «-1» pour aucune limite supérieure."
+
+#: ../data/gtkpod.glade.h:265
+msgid "Select '0' for no lower limit."
+msgstr "Choisissez «0» pour aucune limite inférieure."
+
+#: ../data/gtkpod.glade.h:266
+msgid ""
+"Selected\n"
+"Playlist"
+msgstr ""
+"Liste de lecture\n"
+"Sélectionnée"
+
+#: ../data/gtkpod.glade.h:268
+msgid ""
+"Selected\n"
+"Tracks"
+msgstr ""
+"Morceaux\n"
+"Sélectionnés"
+
+#: ../data/gtkpod.glade.h:270
+#, fuzzy
+msgid "Selected Filter Tab Entry from Database"
+msgstr "Zone de tri sélectionnée de la base de données"
+
+#: ../data/gtkpod.glade.h:271
+#, fuzzy
+msgid "Selected Filter Tab Entry from Hard Disk"
+msgstr "Zone de tri sélectionnée du disque dur"
+
+#: ../data/gtkpod.glade.h:272
+#, fuzzy
+msgid "Selected Filter Tab Entry from Playlist"
+msgstr "Zone de tri sélectionnée de la liste de lecture"
+
+#: ../data/gtkpod.glade.h:273
+#, fuzzy
+msgid "Selected Filter Tab Entry from iPod"
+msgstr "Zone de tri sélectionnée de l'iPod"
+
+#: ../data/gtkpod.glade.h:274
+#, fuzzy
+msgid "Selected Playlist Including Tracks from Database"
+msgstr ""
+"Liste de lecture sélectionnée incluant des morceaux de la base de données"
+
+#: ../data/gtkpod.glade.h:275
+#, fuzzy
+msgid "Selected Playlist Including Tracks from Hard Disk"
+msgstr "Liste de lecture sélectionnée incluant des morceaux du disque dur"
+
+#: ../data/gtkpod.glade.h:276
+#, fuzzy
+msgid "Selected Playlist Including Tracks from iPod"
+msgstr "Liste de lecture sélectionnée incluant des morceaux de l'iPod"
+
+#: ../data/gtkpod.glade.h:277
+msgid "Selected Tab _Entry"
+msgstr "Zon_e de tri sélectionnée"
+
+#: ../data/gtkpod.glade.h:278
+#, fuzzy
+msgid "Selected Tracks from Database"
+msgstr "Morceaux sélectionnés de la base de données"
+
+#: ../data/gtkpod.glade.h:279
+#, fuzzy
+msgid "Selected Tracks from Hard Disk"
+msgstr "Morceaux sélectionnés du disque dur"
+
+#: ../data/gtkpod.glade.h:280
+#, fuzzy
+msgid "Selected Tracks from Playlist"
+msgstr "Morceaux sélectionnés de la liste de lecture"
+
+#: ../data/gtkpod.glade.h:281
+#, fuzzy
+msgid "Selected Tracks from iPod"
+msgstr "Morceaux sélectionnés de l'iPod"
+
+#: ../data/gtkpod.glade.h:282
+msgid "Selected _Playlist"
+msgstr "_Liste de lecture sélectionnée"
+
+#: ../data/gtkpod.glade.h:283
+msgid "Selected _Tracks"
+msgstr "Morceaux sélec_tionnés"
+
+#: ../data/gtkpod.glade.h:284
+msgid "Selected playlist"
+msgstr "_Liste de lecture sélectionnée"
+
+#: ../data/gtkpod.glade.h:285
+msgid "Semicolon separated list of file exclusion masks, e.g. '*.mp3'"
+msgstr ""
+"Liste de fichiers à exclure séparés par des points-virgules, par exemple « *."
+"mp3 »"
+
+#: ../data/gtkpod.glade.h:286
+msgid "Set Cover Art from _File"
+msgstr "Pochette à partir du _fichier"
+
+#: ../data/gtkpod.glade.h:287
+msgid "Set mountpoint or edit repository options"
+msgstr "Définir le point de montage ou éditer les options du dépot"
+
+#: ../data/gtkpod.glade.h:288
+msgid "Set options for Calendar/Contacts/Notes"
+msgstr "Options pour Calendrier/Contacts/Notes"
+
+#: ../data/gtkpod.glade.h:289
+msgid ""
+"Set this to 'aacgain -q -k' to use the 'Normalize volume' functionality in "
+"the Tools Menu. If this is set, missing normalization data for .m4a and .m4b "
+"files will be calculated and written to your music file using this command."
+msgstr ""
+"Choisissez « aacgain -q -k » pour la fonctionnalité « Normaliser le volume » "
+"du menu Outils. Si ceci est validé, les données manquantes de normalisation "
+"des fichiers .m4a et .m4b seront calculées et ajoutées aux fichiers avec "
+"cette commande."
+
+#: ../data/gtkpod.glade.h:290
+msgid ""
+"Set this to 'mp3gain -q -k' to use the 'Normalize volume' functionality in "
+"the Tools Menu. If this is set, missing normalization data for mp3 files "
+"will be calculated and written to your mp3 file using this command."
+msgstr ""
+"Choisissez « mp3gain -q -k » pour la fonctionnalité « Normaliser le volume » "
+"du menu Outils. Si ceci est validé, les données manquantes de normalisation "
+"des fichiers MP3 seront calculées et ajoutées aux fichiers avec cette "
+"commande."
+
+#: ../data/gtkpod.glade.h:291
+msgid "Set this to your last.fm password"
+msgstr "Remplir avec le mot de passe last.fm"
+
+#: ../data/gtkpod.glade.h:292
+msgid "Set this to your last.fm username"
+msgstr "Remplir avec le nom d'utilisateur last.fm"
+
+#: ../data/gtkpod.glade.h:293
+msgid ""
+"Set to 0 to effectively disable caching (a maximum of one track will be "
+"cached at a time)."
+msgstr ""
+"Mettre à 0 pour inhiber le cache (un morceau au maximum dans le cache)."
+
+#: ../data/gtkpod.glade.h:294
+msgid ""
+"Set to 0 to use as many background threads as CPUs are available on your "
+"system."
+msgstr "Mettre à 0 pour utiliser autant de « threads » que possible."
+
+#: ../data/gtkpod.glade.h:295
+msgid "Show information about problems when accessing mserv"
+msgstr "Afficher les informations sur les problèmes liés à mserv"
+
+#: ../data/gtkpod.glade.h:296
+msgid "Show summary of sync result"
+msgstr "Montrer le résumé du résultat de la synchronisation"
+
+#: ../data/gtkpod.glade.h:297 ../src/misc_playlist.c:96
+#: ../src/repository.c:1356
+msgid "Smart Playlist"
+msgstr "Intelligente"
+
+#: ../data/gtkpod.glade.h:298
+msgid "Sort tracks according to: "
+msgstr "Trier les morceaux suivant :"
+
+#: ../data/gtkpod.glade.h:299
+msgid "Sorting Options"
+msgstr "Options de tri"
+
+#: ../data/gtkpod.glade.h:300
+msgid "Sorting case sensitive"
+msgstr "Trier en tenant compte de la casse"
+
+#: ../data/gtkpod.glade.h:301
+msgid "Sorttab: "
+msgstr "Zone de tri :"
+
+#: ../data/gtkpod.glade.h:302
+msgid "Sorttabs"
+msgstr "Zones de tri :"
+
+#: ../data/gtkpod.glade.h:303
+msgid "Source:"
+msgstr "Source :"
+
+#: ../data/gtkpod.glade.h:305
+#, no-c-format
+msgid ""
+"Specify exact path including command line options. '%i' will be replaced "
+"with the mount point of the iPod."
+msgstr ""
+"Indiquer le chemin exact ainsi que les paramètres de ligne de commande. « %"
+"i » sera remplacé par le point de montage de l'iPod."
+
+#: ../data/gtkpod.glade.h:306
+msgid "Specify interval"
+msgstr "Spécifier un intervalle"
+
+#: ../data/gtkpod.glade.h:307
+msgid "Start display automatically"
+msgstr "Afficher automatiquement"
+
+#: ../data/gtkpod.glade.h:308
+msgid "Synchronise Contacts, Calendar and Notes"
+msgstr "Synchroniser le calendrier, contacts et notes"
+
+#: ../data/gtkpod.glade.h:309
+msgid "Synchronize All"
+msgstr "Tout synchroniser"
+
+#: ../data/gtkpod.glade.h:310
+msgid "Synchronize Calendar"
+msgstr "Synchroniser le calendrier"
+
+#: ../data/gtkpod.glade.h:311
+msgid "Synchronize Contacts"
+msgstr "Synchroniser les contacts"
+
+#: ../data/gtkpod.glade.h:312
+msgid "Synchronize Notes"
+msgstr "Synchroniser les notes"
+
+#: ../data/gtkpod.glade.h:313
+msgid "Template for info field: "
+msgstr "Modèle pour le champ d'info :"
+
+#: ../data/gtkpod.glade.h:314
+msgid ""
+"The local copy of the track is referenced in the playlist. If the track is "
+"not available locally, an error message is displayed."
+msgstr ""
+"Le fichier local du morceau est référencé dans la liste. Si le fichier "
+"n'existe pas, un message d'erreur est affiché."
+
+#: ../data/gtkpod.glade.h:315
+msgid ""
+"The output of the background conversion scripts is copied below. Each page "
+"of the notebook corresponds to one background thread."
+msgstr ""
+"La sortie du script de conversion est donnée ci-dessous. Chaque onglet "
+"correspond à une tâche d'arrière-plan."
+
+#: ../data/gtkpod.glade.h:316
+msgid ""
+"The tags are written to the files on your harddrive and on the iPod (if "
+"available)."
+msgstr ""
+"Les attributs ID3 seront écrits dans les fichiers sur votre disque et l'iPod "
+"(si disponible)."
+
+#: ../data/gtkpod.glade.h:317
+msgid "The track on the iPod is referenced in the playlist file."
+msgstr ""
+"Le morceau de l'iPod est référencé dans le fichier de liste de lecture."
+
+#: ../data/gtkpod.glade.h:318
+msgid "This is the same option as in 'Edit/Delete Confirmation'"
+msgstr "C'est la même option que dans « Édition/Confirmation de suppression »"
+
+#: ../data/gtkpod.glade.h:319
+msgid ""
+"This is the way to go, but maybe not all programs support it yet. ID3v2.4 "
+"uses unicode to store the tags, so you won't have to worry about charsets "
+"any more. gtkpod will use UTF8 encoding as this will not increase the size "
+"of pure ASCII tags. ID3v2.2/4 tags will also be written if they are already "
+"present in the file to write to."
+msgstr ""
+"Les tags ID3v2.4 utilisent l'unicode pour stocker les attributs de façon à "
+"ce que vous n'ayez pas à gérer vous même les jeux de caractères. gtkpod "
+"utilise UTF8 afin de ne pas augmenter la taille des attributs en ASCII."
+
+#: ../data/gtkpod.glade.h:320
+msgid "This option will be re-activated when you upgrade gtkpod."
+msgstr "Cette option se réactivera quand vous mettrez à jour gtkpod"
+
+#: ../data/gtkpod.glade.h:321
+msgid "Time:"
+msgstr "Heure :"
+
+#: ../data/gtkpod.glade.h:322 ../src/display_sorttabs.c:2991
+#: ../src/display_spl.c:83 ../src/misc_conversion.c:62
+msgid "Title"
+msgstr "Titre"
+
+#: ../data/gtkpod.glade.h:323
+msgid ""
+"Total\n"
+"(iPod)"
+msgstr ""
+"Total\n"
+"(iPod)"
+
+#: ../data/gtkpod.glade.h:325
+msgid ""
+"Total\n"
+"(local)"
+msgstr ""
+"Total\n"
+"(local)"
+
+#: ../data/gtkpod.glade.h:327
+msgid "Tracks"
+msgstr "Morceaux"
+
+#: ../data/gtkpod.glade.h:328
+msgid "Tracks Most Often Listened To"
+msgstr "Contenant les morceaux les plus écoutés"
+
+#: ../data/gtkpod.glade.h:329
+msgid ""
+"Tracks can be transferred in the background as soon as they are added to an "
+"iPod repository. Otherwise they will be transferred when ejecting the "
+"contents of the iPod completely unchanged until then."
+msgstr ""
+"Les morceaux seront copiés en tâche de fond dès qu'ils sont ajoutés au dépôt "
+"d'un iPod. Dans le cas contraire ils seront copiés uniquement à l'éjection "
+"du iPod."
+
+#: ../data/gtkpod.glade.h:330
+msgid "Tracks in Selected Tab _Entry"
+msgstr "Morceaux dans la Zon_e de tri sélectionnée"
+
+#: ../data/gtkpod.glade.h:331
+msgid "Tracks in Selected _Playlist"
+msgstr "Morceaux de la _Liste de lecture sélectionnée"
+
+#: ../data/gtkpod.glade.h:332
+msgid "Transfer tracks to the iPod in the background"
+msgstr ""
+"Confirmer avant de supprimer les morceaux de l'iPod ou du dépot\n"
+"lors de la synchronisation des listes"
+
+#: ../data/gtkpod.glade.h:333
+msgid "Translators"
+msgstr "Traducteurs"
+
+#: ../data/gtkpod.glade.h:334
+msgid ""
+"Try to load contents of all connected iPods. For each iPod a separate "
+"repository must be set up."
+msgstr ""
+"Essaye de charger le contenu des iPods connectés. Pour chaque iPod un dépot "
+"différent doit être créé."
+
+#: ../data/gtkpod.glade.h:335
+msgid "Undo _Track"
+msgstr "Annuler pour le _Morceau"
+
+#: ../data/gtkpod.glade.h:336
+msgid "Update _mserv Data from File"
+msgstr "Mettre à jour les données _mserv à partir des fichiers"
+
+#: ../data/gtkpod.glade.h:337
+msgid "Update/Sync all playlists now"
+msgstr "Mettre à jour/Synchroniser toutes les listes"
+
+#: ../data/gtkpod.glade.h:338
+msgid "Update/Sync playlist now"
+msgstr "Mettre à jour/Synchroniser"
+
+#: ../data/gtkpod.glade.h:339
+msgid "Upper margin"
+msgstr "Borne supérieure"
+
+#: ../data/gtkpod.glade.h:340
+msgid "Use 'Multi-Edit' also for title field"
+msgstr "Utiliser « Édition multiple » également pour les titres"
+
+#: ../data/gtkpod.glade.h:341
+msgid "Use 'Multi-Edit' for tracks selections"
+msgstr "Utiliser « Édition multiple » pour les morceaux sélectionnés"
+
+#: ../data/gtkpod.glade.h:342
+#, fuzzy
+msgid "Use <i>&lt;Album&gt;.jpg</i> in the parent directory"
+msgstr "Utilise <i>&lt;Album&gt;.jpg</i> dans le répertoire parent"
+
+#: ../data/gtkpod.glade.h:343
+#, fuzzy
+msgid "Use <i>&lt;Album&gt;.jpg</i>, <i>&lt;Album&gt;.png</i>..."
+msgstr "Utilise <i>&lt;Album&gt;.jpg</i>; <i>&lt;Album&gt;.png</i>…"
+
+#: ../data/gtkpod.glade.h:344
+msgid "Use <i>folder.jpg</i> as cover art."
+msgstr "Utilise <i>répertoire.jpg</i> pour la pochette."
+
+#: ../data/gtkpod.glade.h:345
+msgid "Use <i>folder.jpg</i>, <i>folder.png</i>..."
+msgstr "Utilise <i>répertoire.jpg</i>, <i>répertoire.png</i>…"
+
+#: ../data/gtkpod.glade.h:346
+msgid "Use mserv database to fill additional information"
+msgstr "Utiliser la base mserv pour remplir les autres informations"
+
+#: ../data/gtkpod.glade.h:347
+msgid ""
+"Use selected charset (Preferences/'Adding/Updating/ Syncing')\n"
+"for this filename."
+msgstr ""
+"Utilise le jeu de caractère sélectionné pour ce fichier\n"
+"(voir la section ci-dessus : « Ajout/Mise à jour/Synchronisation »)."
+
+#: ../data/gtkpod.glade.h:349
+msgid ""
+"Use selected encoding (on the 'General' page)\n"
+"when writing tags"
+msgstr ""
+"Utiliser le jeu de caractère sélectionné (dans l'onglet « Général ») pour "
+"l'écriture des attributs"
+
+#: ../data/gtkpod.glade.h:351
+msgid "Use selected encoding also when updating or syncing tracks"
+msgstr ""
+"Le jeu de caractères sélectionné sera utilisé pour\n"
+"la mise à jour ou la synchronisation des morceaux"
+
+#: ../data/gtkpod.glade.h:352
+msgid "Use this template to parse filename for tag information:"
+msgstr ""
+"Utiliser ce masque pour générer les attributs à partir du nom de fichier :"
+
+#: ../data/gtkpod.glade.h:353
+msgid "Username to be used for mserv database lookup."
+msgstr "Utilisateur pour se connecter à la base mserv."
+
+#: ../data/gtkpod.glade.h:354
+msgid "Username:"
+msgstr "Utilisateur :"
+
+#: ../data/gtkpod.glade.h:355
+msgid ""
+"Usually you don't want to set the title of several tracks to the same text. "
+"This option might avoid unwanted results (especially since there is no "
+"'undo' yet)."
+msgstr ""
+"Généralement, vous ne devriez pas avoir à utiliser cette option, car elle "
+"peut avoir des effets inattendus (pas d'annulation possible)."
+
+#: ../data/gtkpod.glade.h:356
+#, fuzzy
+msgid "View Full Size"
+msgstr "Voir les pochettes en taille réelle"
+
+#: ../data/gtkpod.glade.h:357
+msgid "WAV with :"
+msgstr "WAV avec :"
+
+#: ../data/gtkpod.glade.h:358
+msgid ""
+"When adding dirs/files, update information of\n"
+"existing tracks with identical filenames"
+msgstr ""
+"Lors de l'ajout de fichiers/répertoires, mettre à jour\n"
+"les informations des morceaux existants avec les doublons"
+
+#: ../data/gtkpod.glade.h:360
+msgid ""
+"When copying from iPod no check is performed on whether the destination file "
+"exists. Enabling this option will make gtkpod check whether the length of "
+"the destination file is the same as the file in the iPod. If so the file is "
+"skipped, allowing a quick sync of the iPod's contents."
+msgstr ""
+"Lors de la copie de morceaux à partir de l'iPod, aucun contrôle n'est fait "
+"pour déterminer si le fichier existe déjà. En activant cette option, gtkpod "
+"vérifiera que la taille du fichier de destination est identique à la taille "
+"du fichier sur l'iPod. En ce cas, le fichier n'est pas recopié pour "
+"accélérer la synchronisation du contenu de l'iPod."
+
+#: ../data/gtkpod.glade.h:361
+msgid "When syncing playlists"
+msgstr "Lors de la synchronisation des listes"
+
+#: ../data/gtkpod.glade.h:362
+msgid ""
+"Will show a list of tracks removed and a list of tracks newly added or "
+"updated."
+msgstr ""
+"Montrer la liste des morceaux supprimés et une liste des morceaux récemment "
+"ajoutés ou modifiés."
+
+#: ../data/gtkpod.glade.h:363
+msgid "Write ID3 tags to disk when modified in gtkpod"
+msgstr ""
+"Écrire les attributs ID3 sur le disque lors de leur modification dans gtkpod"
+
+#: ../data/gtkpod.glade.h:364
+msgid "Write all changes made to the disk and the iPod(s)."
+msgstr ""
+"Écrire toutes les modifications faites dans le disque et le(s) iPod(s)."
+
+#: ../data/gtkpod.glade.h:365
+msgid ""
+"Write extended information (PC filenames, SHA1 hashes,\n"
+"encoding...). Recommended."
+msgstr ""
+"Écrire les infos supplémentaires (noms de fichiers PC,\n"
+"somme de contrôle SHA1, jeu de caractères…). Recommandé."
+
+#: ../data/gtkpod.glade.h:367
+msgid ""
+"You can also use the table headers, but this allows you to sort according to "
+"a column that is not displayed."
+msgstr ""
+"Vous pouvez aussi utiliser le tableau des entêtes, mais cela permet de trier "
+"sur une colonne qui n'est pas affichée."
+
+#: ../data/gtkpod.glade.h:368
+#, fuzzy
+msgid "_About gtkpod"
+msgstr "A propos de gtkpod"
+
+#: ../data/gtkpod.glade.h:369
+#, fuzzy
+msgid "_Add Album"
+msgstr "Album"
+
+#: ../data/gtkpod.glade.h:370
+msgid "_Add Image"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:371
+#, fuzzy
+msgid "_Album"
+msgstr "Album"
+
+#: ../data/gtkpod.glade.h:372
+msgid "_All Tracks"
+msgstr "_Tous les morceaux"
+
+#: ../data/gtkpod.glade.h:373
+msgid "_Arrange Sort Tabs"
+msgstr "_Organiser les zones de tri"
+
+#: ../data/gtkpod.glade.h:374
+msgid "_Check iPod's Files"
+msgstr "_Contrôler les fichiers de l'iPod"
+
+#: ../data/gtkpod.glade.h:375
+msgid "_Conversion Log"
+msgstr "_Trace des conversions"
+
+#: ../data/gtkpod.glade.h:376
+msgid "_Create Playlists"
+msgstr "_Créer une liste de lecture"
+
+#: ../data/gtkpod.glade.h:377
+msgid "_Create iPod's Directories"
+msgstr "_Créer les répertoires système de l'iPod"
+
+#: ../data/gtkpod.glade.h:378
+msgid "_Delete"
+msgstr "_Effacer"
+
+#: ../data/gtkpod.glade.h:379
+msgid "_Display"
+msgstr "_Affichage"
+
+#: ../data/gtkpod.glade.h:380
+msgid "_Displayed Tracks"
+msgstr "Morceaux _affichés"
+
+#: ../data/gtkpod.glade.h:381
+msgid "_Edit"
+msgstr "_Édition"
+
+#: ../data/gtkpod.glade.h:382
+msgid "_Encoding (ID3, files):"
+msgstr "Jeu de caractères (ID3, fichiers) :"
+
+#: ../data/gtkpod.glade.h:383
+msgid "_Enqueue"
+msgstr "_Ajouter à la file d'attente"
+
+#: ../data/gtkpod.glade.h:384
+msgid "_Export Tracks from Database"
+msgstr "E_xporter les morceaux de la base de données"
+
+#: ../data/gtkpod.glade.h:385
+msgid "_File"
+msgstr "_Fichier"
+
+#: ../data/gtkpod.glade.h:386
+msgid "_General"
+msgstr "_Général"
+
+#: ../data/gtkpod.glade.h:387
+msgid "_Help"
+msgstr "A_ide"
+
+#: ../data/gtkpod.glade.h:388
+msgid "_Ignore rules"
+msgstr "Ne respectant _pas"
+
+#: ../data/gtkpod.glade.h:389
+msgid "_Image"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:390
+msgid "_Info Window"
+msgstr "_Fenêtre d'infos"
+
+#: ../data/gtkpod.glade.h:391
+msgid "_Last.FM"
+msgstr "_Last.FM"
+
+#: ../data/gtkpod.glade.h:392
+msgid "_Less Sort Tabs"
+msgstr "_Supprimer une zone de tri"
+
+#: ../data/gtkpod.glade.h:393
+msgid "_Limit to"
+msgstr "_Limiter à"
+
+#: ../data/gtkpod.glade.h:394
+msgid "_Load iPod(s)"
+msgstr "_Chargement iPod(s)"
+
+#: ../data/gtkpod.glade.h:395
+msgid "_Local"
+msgstr "_Locale"
+
+#: ../data/gtkpod.glade.h:396
+msgid "_M3U"
+msgstr "_M3U"
+
+#: ../data/gtkpod.glade.h:397
+msgid "_Misc."
+msgstr "_Divers"
+
+#: ../data/gtkpod.glade.h:398
+msgid "_More Sort Tabs"
+msgstr "_Ajouter une zone de tri"
+
+#: ../data/gtkpod.glade.h:399
+msgid "_Newly Added Tracks"
+msgstr "_Nouveaux morceaux ajoutés"
+
+#: ../data/gtkpod.glade.h:400
+msgid "_Normalize Volume"
+msgstr "_Normaliser le volume"
+
+#: ../data/gtkpod.glade.h:401
+msgid "_Number of sort tabs:"
+msgstr "_Nombre de zones de tri :"
+
+#: ../data/gtkpod.glade.h:402
+msgid "_PLS"
+msgstr "_PLS"
+
+#: ../data/gtkpod.glade.h:403
+msgid "_Play Now"
+msgstr "_Jouer maintenant"
+
+#: ../data/gtkpod.glade.h:404
+msgid "_Podcasts"
+msgstr "_Podcasts"
+
+#: ../data/gtkpod.glade.h:405
+msgid "_Prefer Local"
+msgstr "Locale de _préférence"
+
+#: ../data/gtkpod.glade.h:406
+#, fuzzy
+msgid "_Remove Album"
+msgstr "Trier par Album"
+
+#: ../data/gtkpod.glade.h:407
+msgid "_Remove Cover Art"
+msgstr "_Supprimer la pochette"
+
+#: ../data/gtkpod.glade.h:408
+msgid "_Remove Images"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:409
+msgid "_Save Changes"
+msgstr "_Enregistrer les modifications"
+
+#: ../data/gtkpod.glade.h:410
+msgid "_Save Displayed Track Order"
+msgstr "_Sauver l'ordre de tri des morceaux affichés"
+
+#: ../data/gtkpod.glade.h:411
+msgid "_Sorting"
+msgstr "_Tri"
+
+#: ../data/gtkpod.glade.h:412
+msgid "_Synchronize Playlist with Dir(s)"
+msgstr "_Sync les listes avec le(s) répertoire(s)"
+
+#: ../data/gtkpod.glade.h:413
+msgid "_Toolbar"
+msgstr "_Barre d'outils"
+
+#: ../data/gtkpod.glade.h:414
+msgid "_Tools"
+msgstr "_Outils"
+
+#: ../data/gtkpod.glade.h:415
+msgid "_Tooltips"
+msgstr "_Infobulles"
+
+#: ../data/gtkpod.glade.h:416
+msgid "_Track Info"
+msgstr "Infos du _Morceau"
+
+#: ../data/gtkpod.glade.h:417
+msgid "_Undo All"
+msgstr "Annuler _Tout"
+
+#: ../data/gtkpod.glade.h:418
+msgid "_Update Tracks from File"
+msgstr "_Mettre à jour les morceaux à partir des fichiers"
+
+#: ../data/gtkpod.glade.h:419
+msgid "_Video"
+msgstr "_Vidéo"
+
+#: ../data/gtkpod.glade.h:420
+msgid "_View"
+msgstr "_Affichage"
+
+#: ../data/gtkpod.glade.h:421
+msgid "_iPod"
+msgstr "_iPod"
+
+#: ../data/gtkpod.glade.h:423
+#, no-c-format
+msgid ""
+"artist: %a, album: %A, composer: %c, title: %t, genre: %G, track nr: %T, CD "
+"nr: %C, year: %Y, skip data: %*, the character '%': %%. You can separate "
+"several templates by a ';'. The first one matching the filename will be "
+"used. Example: '%a - %A/%T %t.mp3;%t.wav'."
+msgstr ""
+"artiste: %a, album: %A, compositeur: %c, titre: %t, genre: %G, N° de piste: %"
+"T, N° de CD: %C, année: %Y, ignore: %*, le caractère '%': %%. Vous pouvez "
+"séparer plusieurs masques par un ';'. Le premier masque concordant sera "
+"utilisé. Exemple : «%a - %A/%T %t.mp3;%t.wav»."
+
+#: ../data/gtkpod.glade.h:424
+msgid "folder"
+msgstr "répertoire"
+
+#: ../data/gtkpod.glade.h:425
+msgid "folder.jpg"
+msgstr "répertoire.jpg"
+
+#: ../data/gtkpod.glade.h:427
+#, no-c-format
+msgid "folder.jpg;%a.jpg"
+msgstr "répertoire.jpg;%a.jpg"
+
+#: ../data/gtkpod.glade.h:428
+msgid "gtkpod"
+msgstr "gtkpod"
+
+#: ../data/gtkpod.glade.h:429
+msgid "gtkpod Info"
+msgstr "Infos gtkpod"
+
+#: ../data/gtkpod.glade.h:430
+msgid ""
+"gtkpod expects the ID3 tags and the filenames to be in the encoding "
+"specified here. You can change it for consecutive 'Add Files' and 'Add Dirs' "
+"operation. 'System Charset' is the charset used by your current locale."
+msgstr ""
+"gtkpod utilisera le jeu de caractères spécifié ici pour les attributs ID3 et "
+"les fichiers. Vous pouvez le modifier entre chaque opération d'ajout. « Jeu "
+"de caractères du système » est le jeu de caractère défini par les locales de "
+"votre système."
+
+#: ../data/gtkpod.glade.h:431
+msgid "gtkpod options"
+msgstr "Options gtkpod"
+
+#. These are the items for the 'Repository type' combo in the 'Create Repository' dialog. Keep the three items in order!
+#: ../data/gtkpod.glade.h:433
+msgid ""
+"iPod\n"
+"Local Repository (Standard)\n"
+"Local Repository (Podcasts)\n"
+msgstr ""
+"iPod\n"
+"Dépot local (standard)\n"
+"Dépot local (Podcasts)\n"
+
+#: ../data/gtkpod.glade.h:437
+msgid "iPod mountpoint:"
+msgstr "Point de montage de l'iPod :"
+
+#: ../data/gtkpod.glade.h:438
+msgid "iTunesDB backup:"
+msgstr "Sauvegarde iTunesDB :"
+
+#: ../data/gtkpod.glade.h:439
+msgid "mserv Root:"
+msgstr "Racine mserv :"
+
+#: ../data/gtkpod.glade.h:440
+msgid "mserv database lookup will be done for music in this directory."
+msgstr "La base mserv utilise ce répertoire pour chercher une musique."
+
+#: ../data/gtkpod.glade.h:441 ../src/details.c:1347
+msgid "n/a"
+msgstr "nd"
+
+#: ../data/gtkpod.glade.h:442
+msgid "special_sorttab -- Don't translate!"
+msgstr ""
+
+#: ../src/autodetection.c:310
+msgid "Could not initialize GnomeVFS\n"
+msgstr ""
+
+#: ../src/autodetection.c:397
+#, c-format
+msgid ""
+"Newly mounted iPod at '%s' could not be loaded into gtkpod.\n"
+"\n"
+msgstr ""
+
+#: ../src/autodetection.c:403
+#, c-format
+msgid ""
+"Newly mounted iPod at '%s' appears to be already loaded!\n"
+"\n"
+msgstr ""
+
+#: ../src/autodetection.c:416
+#, fuzzy
+msgid "New iPod"
+msgstr "Nouvelle liste"
+
+#: ../src/charset.c:53
+msgid "Arabic (IBM-864)"
+msgstr "Arabe (IBM-864)"
+
+#: ../src/charset.c:54
+msgid "Arabic (ISO-8859-6)"
+msgstr "Arabe (ISO-8859-6)"
+
+#: ../src/charset.c:55
+msgid "Arabic (Windows-1256)"
+msgstr "Arabe (Windows-1256)"
+
+#: ../src/charset.c:56
+msgid "Baltic (ISO-8859-13)"
+msgstr "Balte (ISO-8859-13)"
+
+#: ../src/charset.c:57
+msgid "Baltic (ISO-8859-4)"
+msgstr "Balte (ISO-8859-4)"
+
+#: ../src/charset.c:58
+msgid "Baltic (Windows-1257)"
+msgstr "Balte (Windows-1257)"
+
+#: ../src/charset.c:59
+msgid "Celtic (ISO-8859-14)"
+msgstr "Celte (ISO-8859-14)"
+
+#: ../src/charset.c:60
+msgid "Central European (IBM-852)"
+msgstr "Europe centrale (IBM-852)"
+
+#: ../src/charset.c:61
+msgid "Central European (ISO-8859-2)"
+msgstr "Europe centrale (ISO-8859-2)"
+
+#: ../src/charset.c:62
+msgid "Central European (Windows-1250)"
+msgstr "Europe centrale (Windows-1250)"
+
+#: ../src/charset.c:63
+msgid "Chinese Simplified (GB18030)"
+msgstr "Chinois simplifié (GB18030)"
+
+#: ../src/charset.c:64
+msgid "Chinese Simplified (GB2312)"
+msgstr "Chinois simplifié (GB2312)"
+
+#: ../src/charset.c:65
+msgid "Chinese Traditional (Big5)"
+msgstr "Chinois traditionnel (Big5)"
+
+#: ../src/charset.c:66
+msgid "Chinese Traditional (Big5-HKSCS)"
+msgstr "Chinois traditionnel (Big5-HKSCS)"
+
+#: ../src/charset.c:67
+msgid "Cyrillic (IBM-855)"
+msgstr "Cyrillique (IBM-855)"
+
+#: ../src/charset.c:68
+msgid "Cyrillic (ISO-8859-5)"
+msgstr "Cyrillique (ISO-8859-5)"
+
+#: ../src/charset.c:69
+msgid "Cyrillic (ISO-IR-111)"
+msgstr "Cyrillique (ISO-IR-111)"
+
+#: ../src/charset.c:70
+msgid "Cyrillic (KOI8-R)"
+msgstr "Cyrillique (KOI8-R)"
+
+#: ../src/charset.c:71
+msgid "Cyrillic (Windows-1251)"
+msgstr "Cyrillique (Windows-1251)"
+
+#: ../src/charset.c:72
+msgid "Cyrillic/Russian (CP-866)"
+msgstr "Cyrillique/Russe (CP-866)"
+
+#: ../src/charset.c:73
+msgid "Cyrillic/Ukrainian (KOI8-U)"
+msgstr "Cyrillique/Ukrainien (KOI8-U)"
+
+#: ../src/charset.c:74
+msgid "English (US-ASCII)"
+msgstr "Anglais (US-ASCII)"
+
+#: ../src/charset.c:75
+msgid "Greek (ISO-8859-7)"
+msgstr "Grec (ISO-8859-7)"
+
+#: ../src/charset.c:76
+msgid "Greek (Windows-1253)"
+msgstr "Grec (Windows-1253)"
+
+#: ../src/charset.c:77
+msgid "Hebrew (IBM-862)"
+msgstr "Hébreu (IBM-862)"
+
+#: ../src/charset.c:78
+msgid "Hebrew (Windows-1255)"
+msgstr "Hébreu (Windows-1255)"
+
+#: ../src/charset.c:79
+msgid "Japanese (automatic detection)"
+msgstr "Japonais (détection automatique)"
+
+#: ../src/charset.c:80
+msgid "Japanese (EUC-JP)"
+msgstr "Japonais (EUC-JP)"
+
+#: ../src/charset.c:81
+msgid "Japanese (ISO-2022-JP)"
+msgstr "Japonais (ISO-2022-JP)"
+
+#: ../src/charset.c:82
+msgid "Japanese (Shift_JIS)"
+msgstr "Japonais (Shift_JIS)"
+
+#: ../src/charset.c:83
+msgid "Korean (EUC-KR)"
+msgstr "Coréen (EUC-KR)"
+
+#: ../src/charset.c:84
+msgid "Nordic (ISO-8859-10)"
+msgstr "Nordique (ISO-8859-10)"
+
+#: ../src/charset.c:85
+msgid "South European (ISO-8859-3)"
+msgstr "Europe du sud (ISO-8859-3)"
+
+#: ../src/charset.c:86
+msgid "Thai (TIS-620)"
+msgstr "Thaï (TIS-620)"
+
+#: ../src/charset.c:87
+msgid "Turkish (IBM-857)"
+msgstr "Turc (IBM-857)"
+
+#: ../src/charset.c:88
+msgid "Turkish (ISO-8859-9)"
+msgstr "Turc (ISO-8859-9)"
+
+#: ../src/charset.c:89
+msgid "Turkish (Windows-1254)"
+msgstr "Turc (Windows-1254)"
+
+#: ../src/charset.c:90
+msgid "Unicode (UTF-7)"
+msgstr "Unicode (UTF-7)"
+
+#: ../src/charset.c:91
+msgid "Unicode (UTF-8)"
+msgstr "Unicode (UTF-8)"
+
+#: ../src/charset.c:92
+msgid "Unicode (UTF-16BE)"
+msgstr "Unicode (UTF-16BE)"
+
+#: ../src/charset.c:93
+msgid "Unicode (UTF-16LE)"
+msgstr "Unicode (UTF-16LE)"
+
+#: ../src/charset.c:94
+msgid "Unicode (UTF-32BE)"
+msgstr "Unicode (UTF-32BE)"
+
+#: ../src/charset.c:95
+msgid "Unicode (UTF-32LE)"
+msgstr "Unicode (UTF-32LE)"
+
+#: ../src/charset.c:96
+msgid "Vietnamese (VISCII)"
+msgstr "Vietnamien (VISCII)"
+
+#: ../src/charset.c:97
+msgid "Vietnamese (Windows-1258)"
+msgstr "Vietnamien (Windows-1258)"
+
+#: ../src/charset.c:98
+msgid "Visual Hebrew (ISO-8859-8)"
+msgstr "Hébreu visuel (ISO-8859-8)"
+
+#: ../src/charset.c:99
+msgid "Western (IBM-850)"
+msgstr "Europe occidentale (IBM-850)"
+
+#: ../src/charset.c:100
+msgid "Western (ISO-8859-1)"
+msgstr "Europe occidentale (ISO-8859-1)"
+
+#: ../src/charset.c:101
+msgid "Western (ISO-8859-15)"
+msgstr "Europe occidentale (ISO-8859-15)"
+
+#: ../src/charset.c:102
+msgid "Western (Windows-1252)"
+msgstr "Europe occidentale (Windows-1252)"
+
+#. sanity!
+#. check for "System Charset" and return NULL
+#: ../src/charset.c:160 ../src/charset.c:170 ../src/charset.c:223
+msgid "System Charset"
+msgstr "Jeu de caractères du système"
+
+#. we are not the first instance of gtkpod -- the socket is
+#. already being used, so we pass
+#: ../src/clientserver.c:214
+msgid ""
+"Another instance of gtkpod was detected. Playcount server not started.\n"
+msgstr ""
+"Une autre instance de gtkpod tourne déjà. Serveur de compteur non démarré.\n"
+
+#: ../src/confirmation.c:377
+msgid "Confirmation Dialogue"
+msgstr "Message de confirmation"
+
+#: ../src/context_menus.c:362
+#, c-format
+msgid "Copied \"%s\" playlist to %s"
+msgstr "Copie liste de lecture « %s » vers %s"
+
+#: ../src/context_menus.c:401
+#, c-format
+msgid "Copied %d track to '%s'"
+msgid_plural "Copied %d tracks to '%s'"
+msgstr[0] "Extraction de %d morceau %d vers « %s »"
+msgstr[1] "Extraction de %d morceaux vers « %s »"
+
+#: ../src/context_menus.c:429
+#, c-format
+msgid "Copied '%s' playlist to '%s' in '%s'"
+msgstr "Extraction liste de lecture « %s » vers « %s » dans « %s »"
+
+#: ../src/context_menus.c:462
+#, c-format
+msgid "Copied %d track to '%s' in '%s'"
+msgid_plural "Copied %d tracks to %s in '%s'"
+msgstr[0] "Extraction de %d morceau %d vers « %s » dans « %s »"
+msgstr[1] "Extraction de %d morceaux %d vers « %s » dans « %s »"
+
+#: ../src/context_menus.c:622 ../src/tools.c:854
+msgid "Play Now"
+msgstr "Jouer maintenant"
+
+#: ../src/context_menus.c:628 ../src/tools.c:867
+msgid "Enqueue"
+msgstr "Mettre dans la file d'attente"
+
+#: ../src/context_menus.c:634
+msgid "Copy Tracks to Filesystem"
+msgstr "Copier les morceaux vers le disque dur"
+
+#: ../src/context_menus.c:641 ../src/file_export.c:1085
+msgid "Create Playlist File"
+msgstr "Créer un fichier de liste"
+
+#: ../src/context_menus.c:648
+msgid "Create new Playlist"
+msgstr "Créer une nouvelle liste"
+
+#: ../src/context_menus.c:655
+msgid "Update Tracks from File"
+msgstr "Mette à jour les morceaux depuis le fichier"
+
+#: ../src/context_menus.c:669
+msgid "Sync Playlist with Dir(s)"
+msgstr "Sync. les listes avec le(s) répertoire(s)"
+
+#: ../src/context_menus.c:679
+msgid "Remove All Tracks from iPod"
+msgstr "Supprimer tout les morceaux de l'iPod"
+
+#: ../src/context_menus.c:697
+msgid "Remove All Podcasts from iPod"
+msgstr "Supprimer tout les podcats de l'iPod"
+
+#: ../src/context_menus.c:712
+msgid "Delete Including Tracks"
+msgstr "Supprimer avec les morceaux inclus"
+
+#: ../src/context_menus.c:720
+msgid "Delete But Keep Tracks"
+msgstr "Supprimer mais garder les morceaux"
+
+#: ../src/context_menus.c:728
+msgid "Edit iPod Properties"
+msgstr "Editer les propriétes de l'iPod"
+
+#: ../src/context_menus.c:735
+msgid "Edit Repository Properties"
+msgstr "Éditer les propriétés du dépôt"
+
+#: ../src/context_menus.c:742
+msgid "Edit Playlist Properties"
+msgstr "Editer les propriétes de la liste de lecture"
+
+#: ../src/context_menus.c:770
+msgid "View Full Size Artwork"
+msgstr "Voir les pochettes en taille réelle"
+
+#: ../src/context_menus.c:777
+msgid "Select Cover From File"
+msgstr "Choisir la pochette à partir d'un fichier"
+
+#: ../src/context_menus.c:790
+msgid "Load iPod"
+msgstr "Charger l'iPod"
+
+#: ../src/context_menus.c:797
+msgid "Eject iPod"
+msgstr "Ejecter l'iPod"
+
+#: ../src/context_menus.c:814
+msgid "Remove All Tracks from Database"
+msgstr "Supprimer tout les morceaux de la base de données"
+
+#: ../src/context_menus.c:829
+msgid "Delete Including Tracks (Harddisk)"
+msgstr "Supprimer avec les morceaux inclus (disque dur)"
+
+#: ../src/context_menus.c:837
+msgid "Delete Including Tracks (Database)"
+msgstr "Supprimer avec les morceaux inclus (base de données)"
+
+#: ../src/context_menus.c:845
+msgid "Delete From iPod"
+msgstr "Supprimer de l'iPod"
+
+#: ../src/context_menus.c:853
+msgid "Delete From Playlist"
+msgstr "Supprimer de la liste de lecture"
+
+#: ../src/context_menus.c:861
+msgid "Delete From Harddisk"
+msgstr "Supprimer du disque dur"
+
+#: ../src/context_menus.c:869
+msgid "Delete From Database"
+msgstr "Supprimer de la base de données"
+
+#: ../src/context_menus.c:877
+msgid "Alphabetize"
+msgstr "Trier"
+
+#: ../src/context_menus.c:895
+#, fuzzy
+msgid "Remove Album"
+msgstr "Trier par Album"
+
+#: ../src/context_menus.c:905
+#, fuzzy
+msgid "Remove Photo"
+msgstr "_Supprimer la pochette"
+
+#: ../src/context_menus.c:922
+msgid "Rename Album"
+msgstr ""
+
+#: ../src/context_menus.c:981 ../src/context_menus.c:1030
+msgid "Copy selected playlist to..."
+msgstr "Copier la liste de lecture sélectionné vers …"
+
+#: ../src/context_menus.c:1083
+msgid "Copy selected track(s) to..."
+msgstr "Copier le(s) morceau(x) sélectionné(s) vers …"
+
+#: ../src/date_parser.l:269
+#, c-format
+msgid "Date format error: unrecognized character: '%s'\n"
+msgstr "Erreur dans le format de date : caractère inconnu : « %s »\n"
+
+#: ../src/details.c:82
+msgid "Audio/Video"
+msgstr "Audio/Vidéo"
+
+#: ../src/details.c:83
+msgid "Audio"
+msgstr "Audio"
+
+#: ../src/details.c:84
+msgid "Video"
+msgstr "Vidéo"
+
+#: ../src/details.c:85
+msgid "Podcast"
+msgstr "Podcast"
+
+#: ../src/details.c:86
+msgid "Video Podcast"
+msgstr "Podcast vidéo"
+
+#: ../src/details.c:87
+msgid "Audiobook"
+msgstr "Livre Audio"
+
+#: ../src/details.c:88 ../src/display_spl.c:209 ../src/display_spl.c:218
+msgid "Music Video"
+msgstr "Vidéo musicale"
+
+#: ../src/details.c:89 ../src/display_spl.c:107 ../src/display_spl.c:210
+#: ../src/display_spl.c:219 ../src/misc_conversion.c:101
+msgid "TV Show"
+msgstr "Émission télé"
+
+#: ../src/details.c:90
+msgid "TV Show & Music Video"
+msgstr "Émission télé & vidéo musicale"
+
+#: ../src/details.c:836
+#, c-format
+msgid "%s (image data corrupted or unreadable)"
+msgstr "%s (données de l'image corrompues ou invalides)"
+
+#: ../src/details.c:973
+#, c-format
+msgid "Please report unknown mediatype %x\n"
+msgstr "Type de média %x inconnu\n"
+
+#: ../src/details.c:1418
+msgid "<b>n/a</b>"
+msgstr "<b>nd</b>"
+
+#: ../src/details.c:1906
+#, c-format
+msgid "Error occurred dropping an image onto the details window: %s\n"
+msgstr ""
+
+#: ../src/details.c:1952 ../src/display_coverart.c:2128
+msgid "Successfully set new coverart for selected tracks"
+msgstr ""
+
+#: ../src/display.c:490
+#, c-format
+msgid "<b>Image Dimensions: %s</b>"
+msgstr ""
+
+#: ../src/display.c:744
+msgid "Edit selected entry of which sort tab?"
+msgstr "Mettre à jour l'entrée sélectionnée de quelle zone de tri ?"
+
+#. no entry selected
+#: ../src/display.c:751 ../src/misc_confirm.c:435 ../src/misc_track.c:2138
+msgid "No entry selected."
+msgstr "Aucun élément sélectionné."
+
+#: ../src/display.c:910 ../src/display.c:1230 ../src/display.c:1286
+#: ../src/display.c:1340 ../src/display.c:1395 ../src/display.c:1656
+#, c-format
+msgid "No entry selected in Sort Tab %d"
+msgstr "Aucune entrée sélectionnée dans la zone de tri %d"
+
+#: ../src/display.c:949
+msgid "Remove entry of which sort tab from database?"
+msgstr "Supprimer l'entrée de quelle zone de tri de la base de données ?"
+
+#: ../src/display.c:957
+msgid "Remove tracks in selected entry of which filter tab from the iPod?"
+msgstr "Supprimer les morceaux de quelle zone de tri de l'iPod ?"
+
+#: ../src/display.c:979
+msgid "Remove tracks in selected entry of which filter tab from the harddisk?"
+msgstr "Supprimer les morceaux de quelle zone de tri du disque dur ?"
+
+#: ../src/display.c:1009
+msgid "Remove tracks in selected entry of which filter tab from playlist?"
+msgstr "Supprimer les morceaux de quelle zone de tri de la liste de lecture ?"
+
+#: ../src/display.c:1036 ../src/display.c:1074
+#, c-format
+msgid ""
+"iPod at '%s' is not loaded.\n"
+"Please load it first."
+msgstr ""
+"L'iPod en « %s » n'est pas chargé.\n"
+"Charger d'abord."
+
+#: ../src/display.c:1111 ../src/display.c:1138
+msgid "Update selected entry of which sort tab?"
+msgstr "Mettre à jour l'entrée sélectionnée de quelle zone de tri ?"
+
+#: ../src/display.c:1224
+msgid "Export selected entry of which sort tab?"
+msgstr "Exporter l'entrée sélectionnée de quelle zone de tri ?"
+
+#: ../src/display.c:1280
+msgid "Create playlist file from selected entry of which sort tab?"
+msgstr "Créer un fichier de liste à partir de quelle zone de tri ?"
+
+#: ../src/display.c:1334
+msgid "Play tracks in selected entry of which sort tab?"
+msgstr "Jouer les morceaux de l'entrée sélectionnée de quelle zone de tri ?"
+
+#: ../src/display.c:1389
+msgid "Enqueue tracks in selected entry of which sort tab?"
+msgstr ""
+"Ajouter dans la file d'attente les morceaux de l'entrée sélectionnée de "
+"quelle zone de tri ?"
+
+#: ../src/display.c:1646
+msgid "Normalize tracks in selected entry of which sort tab?"
+msgstr ""
+"Normaliser les morceaux de l'entrée sélectionnée de quelle zone de tri ?"
+
+#: ../src/display_coverart.c:1713
+msgid "Failed to remove the album from the album hash store."
+msgstr "Impossible d'enlever l'album de la table de hachage des albums."
+
+#: ../src/display_coverart.c:2098
+#, c-format
+msgid "Error occurred dropping an image onto the coverart display: %s\n"
+msgstr ""
+
+#: ../src/display_itdb.c:376
+#, c-format
+msgid "Failed to set cover art: '%s'\n"
+msgstr "Impossible d'écrire la pochette : « %s »\n"
+
+#: ../src/display_itdb.c:858 ../src/display_itdb.c:991
+msgid "Local"
+msgstr "Local"
+
+#. add podcast playlist
+#: ../src/display_itdb.c:866 ../src/display_itdb.c:989
+#: ../src/display_itdb.c:1025
+msgid "Podcasts"
+msgstr "Podcasts"
+
+#: ../src/display_itdb.c:875 ../src/display_itdb.c:993
+#: ../src/repository.c:1186
+msgid "iPod"
+msgstr "iPod"
+
+#: ../src/display_itdb.c:1084
+#, c-format
+msgid "Increased playcount for '%s'"
+msgstr "Compteur de lecture incrémenté pour « %s »"
+
+#: ../src/display_photo.c:163
+#, c-format
+msgid "Error reading iPod photo database (%s).\n"
+msgstr ""
+
+#: ../src/display_photo.c:168
+msgid "Error reading iPod photo database.\n"
+msgstr ""
+
+#: ../src/display_photo.c:238
+msgid "Could not access the iPod's photo database."
+msgstr ""
+
+#: ../src/display_photo.c:441
+#, fuzzy
+msgid "Photo Albums"
+msgstr "Trier par Album"
+
+#: ../src/display_photo.c:451 ../src/display_photo.c:1685
+msgid "<Unnamed>"
+msgstr ""
+
+#: ../src/display_photo.c:939
+msgid "The Photo Library album cannot be removed"
+msgstr ""
+
+#: ../src/display_photo.c:961
+#, fuzzy
+msgid "Do you want to remove the album's photos too?"
+msgstr "Êtes-vous sûr de vouloir supprimer tous les podcasts de votre iPod ?"
+
+#: ../src/display_photo.c:967
+msgid "Yes. Do Not Display Again"
+msgstr ""
+
+#: ../src/display_photo.c:1038
+msgid ""
+"This will remove the photo selection from the selected album.\n"
+" Do you want to delete them from the database as well?"
+msgstr ""
+
+#: ../src/display_photo.c:1053
+msgid ""
+"This will delete the photo selection from the Photo Library and all albums. "
+"Are you sure?"
+msgstr ""
+
+#: ../src/display_photo.c:1128
+msgid "New Photo Album Name"
+msgstr ""
+
+#: ../src/display_photo.c:1129
+#, fuzzy
+msgid "Please enter a new name for the photo album"
+msgstr "Entrer le nom de la nouvelle liste de lecture"
+
+#: ../src/display_photo.c:1141 ../src/display_photo.c:1223
+msgid "An album with that name already exists."
+msgstr ""
+
+#: ../src/display_photo.c:1210
+#, fuzzy
+msgid "New Photo Album"
+msgstr "Trier par Album"
+
+#: ../src/display_photo.c:1211
+#, fuzzy
+msgid "Please enter a name for the new photo album"
+msgstr "Entrer le nom de la nouvelle liste de lecture"
+
+#: ../src/display_photo.c:1232
+msgid "The new album failed to be created."
+msgstr ""
+
+#: ../src/display_photo.c:1256
+#, fuzzy
+msgid "Add Image to iPod"
+msgstr "Ajouter un nouvel iPod/dépôt"
+
+#. Open a dialog directory chooser window
+#: ../src/display_photo.c:1311
+msgid "Add a Directory of Images to the iPod. Select the Directory."
+msgstr ""
+
+#: ../src/display_photo.c:1699
+#, c-format
+msgid "<No members>\n"
+msgstr ""
+
+#. give a notice on the statusbar -- otherwise the user
+#. * will never know why the drag is not possible
+#: ../src/display_playlists.c:516 ../src/display_playlists.c:558
+msgid "Error: drag from iPod not possible in offline mode."
+msgstr "Erreur : glisser-déposer depuis l'iPod impossible en mode hors-ligne."
+
+#: ../src/display_playlists.c:585 ../src/display_tracks.c:286
+#, c-format
+msgid "Copied one track"
+msgid_plural "Copied %d tracks"
+msgstr[0] "Un morceau copié"
+msgstr[1] "%d morceaux copiés"
+
+#: ../src/display_playlists.c:865 ../src/display_playlists.c:877
+msgid "Can't reorder sorted treeview."
+msgstr "Impossíble de réorganiser la vue arborescente triée."
+
+#: ../src/display_playlists.c:954
+#, c-format
+msgid ""
+"This DND type (%d) is not (yet) supported. If you feel implementing this "
+"would be useful, please contact the author.\n"
+"\n"
+msgstr ""
+"Ce type de glisser-déposer (%d) n'est pas (encore) supporté. Si vous vous "
+"sentez prêt à l'implémenter, veuillez contacter l'auteur.\n"
+
+#. no existing photo playlist found so add one
+#. * either itdb had no children or none of them
+#. * were of the photo type.
+#.
+#: ../src/display_playlists.c:1569
+msgid "Photos"
+msgstr ""
+
+#: ../src/display_sorttabs.c:473
+msgid "'Played' condition ignored because of error."
+msgstr "Condition « Joué le » ignorée à cause d'une erreur."
+
+#: ../src/display_sorttabs.c:476
+msgid "'Modified' condition ignored because of error."
+msgstr "Condition « Modifié le » ignorée à cause d'une erreur."
+
+#: ../src/display_sorttabs.c:479
+msgid "'Added' condition ignored because of error."
+msgstr "Condition « Ajouté le » ignorée à cause d'une erreur."
+
+#: ../src/display_sorttabs.c:1562 ../src/misc_conversion.c:59
+msgid "All"
+msgstr "Tous"
+
+#: ../src/display_sorttabs.c:1588
+msgid "Compilations"
+msgstr "Compilations"
+
+#: ../src/display_sorttabs.c:2988
+msgid "Comp."
+msgstr "Comp."
+
+#: ../src/display_sorttabs.c:2994 ../src/display_spl.c:88
+#: ../src/display_tracks.c:2109 ../src/misc_conversion.c:84
+msgid "Year"
+msgstr "Année"
+
+#: ../src/display_sorttabs.c:2997
+msgid "Special"
+msgstr "Spécial"
+
+#: ../src/display_sorttabs.c:3245
+msgid "Last Played"
+msgstr "Dernière fois joué"
+
+#: ../src/display_sorttabs.c:3246
+msgid "Last Modified"
+msgstr "Dernière fois modifié"
+
+#: ../src/display_spl.c:64
+msgid "days"
+msgstr "jours"
+
+#: ../src/display_spl.c:65
+msgid "weeks"
+msgstr "semaines"
+
+#: ../src/display_spl.c:66
+msgid "months"
+msgstr "mois"
+
+#: ../src/display_spl.c:73
+msgid "kbps"
+msgstr "kbps"
+
+#: ../src/display_spl.c:74
+msgid "Hz"
+msgstr "Hz"
+
+#: ../src/display_spl.c:75 ../src/display_spl.c:179 ../src/info.c:780
+msgid "MB"
+msgstr "Mo"
+
+#: ../src/display_spl.c:76
+msgid "secs"
+msgstr "secs"
+
+#: ../src/display_spl.c:86 ../src/misc_conversion.c:74
+msgid "Bitrate"
+msgstr "Débit"
+
+#. 15
+#: ../src/display_spl.c:87 ../src/misc_conversion.c:75
+msgid "Samplerate"
+msgstr "Tx d'échant."
+
+#: ../src/display_spl.c:90
+msgid "Kind"
+msgstr "Type"
+
+#: ../src/display_spl.c:91 ../src/misc_conversion.c:81
+msgid "Date modified"
+msgstr "Modifié le"
+
+#: ../src/display_spl.c:92
+msgid "Track number"
+msgstr "N° de piste"
+
+#: ../src/display_spl.c:93
+msgid "Size"
+msgstr "Taille"
+
+#: ../src/display_spl.c:95 ../src/misc_conversion.c:64
+msgid "Comment"
+msgstr "Commentaire"
+
+#: ../src/display_spl.c:96 ../src/misc_conversion.c:79
+msgid "Date added"
+msgstr "Ajouté le"
+
+#: ../src/display_spl.c:99
+msgid "Last played"
+msgstr "Dernière fois joué"
+
+#: ../src/display_spl.c:100
+msgid "Disc number"
+msgstr "N° de disque"
+
+#: ../src/display_spl.c:102 ../src/misc_conversion.c:87
+msgid "Compilation"
+msgstr "Compilation"
+
+#: ../src/display_spl.c:103 ../src/misc_conversion.c:76
+msgid "BPM"
+msgstr "BPM"
+
+#: ../src/display_spl.c:104 ../src/misc_conversion.c:86
+msgid "Grouping"
+msgstr "Regroupement"
+
+#: ../src/display_spl.c:105
+msgid "Playlist"
+msgstr "Liste de lecture"
+
+#: ../src/display_spl.c:106
+msgid "Video Kind"
+msgstr "Type de vidéo"
+
+#: ../src/display_spl.c:108
+msgid "Season number"
+msgstr "Numéro de saison"
+
+#: ../src/display_spl.c:109
+msgid "Skip count"
+msgstr "Nombre de fois ignoré"
+
+#: ../src/display_spl.c:110
+msgid "Last skipped"
+msgstr "Dernière fois ignoré"
+
+#: ../src/display_spl.c:111
+msgid "Album artist"
+msgstr "Artiste de l'album"
+
+#: ../src/display_spl.c:117
+msgid "contains"
+msgstr "contient"
+
+#: ../src/display_spl.c:118
+msgid "does not contain"
+msgstr "ne contient pas"
+
+#: ../src/display_spl.c:119 ../src/display_spl.c:128 ../src/display_spl.c:138
+#: ../src/display_spl.c:157 ../src/display_spl.c:164
+msgid "is"
+msgstr "est"
+
+#: ../src/display_spl.c:120 ../src/display_spl.c:129 ../src/display_spl.c:139
+#: ../src/display_spl.c:158 ../src/display_spl.c:165
+msgid "is not"
+msgstr "n'est pas"
+
+#: ../src/display_spl.c:121
+msgid "starts with"
+msgstr "commence par"
+
+#: ../src/display_spl.c:122
+msgid "ends with"
+msgstr "finit par"
+
+#: ../src/display_spl.c:130
+msgid "is greater than"
+msgstr "est plus grand que"
+
+#: ../src/display_spl.c:131
+msgid "is less than"
+msgstr "est plus petit que"
+
+#: ../src/display_spl.c:132 ../src/display_spl.c:144
+msgid "is in the range"
+msgstr "est dans l'intervalle"
+
+#: ../src/display_spl.c:140
+msgid "is after"
+msgstr "est après"
+
+#: ../src/display_spl.c:141
+msgid "is before"
+msgstr "est avant"
+
+#: ../src/display_spl.c:142
+msgid "in the last"
+msgstr "est le dernier"
+
+#: ../src/display_spl.c:143
+msgid "not in the last"
+msgstr "n'est pas le dernier"
+
+#: ../src/display_spl.c:150
+msgid "is set"
+msgstr "est rempli"
+
+#: ../src/display_spl.c:151
+msgid "is not set"
+msgstr "n'est pas rempli"
+
+#: ../src/display_spl.c:171
+msgid "Not supported"
+msgstr "Non supporté"
+
+#: ../src/display_spl.c:178
+msgid "minutes"
+msgstr "minutes"
+
+#: ../src/display_spl.c:180
+msgid "tracks"
+msgstr "morceaux"
+
+#: ../src/display_spl.c:181
+msgid "hours"
+msgstr "heures"
+
+#: ../src/display_spl.c:182 ../src/info.c:780
+msgid "GB"
+msgstr "Go"
+
+#: ../src/display_spl.c:189
+msgid "random order"
+msgstr "ordre aléatoire"
+
+#: ../src/display_spl.c:190
+msgid "title"
+msgstr "titre"
+
+#: ../src/display_spl.c:191
+msgid "album"
+msgstr "album"
+
+#: ../src/display_spl.c:192
+msgid "artist"
+msgstr "artiste"
+
+#: ../src/display_spl.c:193
+msgid "genre"
+msgstr "genre"
+
+#: ../src/display_spl.c:194
+msgid "most recently added"
+msgstr "ajoutés en dernier"
+
+#: ../src/display_spl.c:195
+msgid "least recently added"
+msgstr "ajoutés en premier"
+
+#: ../src/display_spl.c:196
+msgid "most often played"
+msgstr "joués le plus souvent"
+
+#: ../src/display_spl.c:197
+msgid "least often played"
+msgstr "joués le moins souvent"
+
+#: ../src/display_spl.c:198
+msgid "most recently played"
+msgstr "joués le plus récemment"
+
+#: ../src/display_spl.c:199
+msgid "least recently played"
+msgstr "joués il y a longtemps"
+
+#: ../src/display_spl.c:200
+msgid "highest rating"
+msgstr "les mieux notés"
+
+#: ../src/display_spl.c:201
+msgid "lowest rating"
+msgstr "les moins bien notés"
+
+#: ../src/display_spl.c:208 ../src/display_spl.c:217
+msgid "Movie"
+msgstr "Film"
+
+#: ../src/display_spl.c:1192 ../src/display_spl.c:1207
+msgid "to"
+msgstr "à"
+
+#: ../src/display_spl.c:1485
+msgid "-"
+msgstr "-"
+
+#: ../src/display_spl.c:1500
+msgid "+"
+msgstr "+"
+
+#: ../src/display_tracks.c:281
+#, c-format
+msgid "Moved one track"
+msgid_plural "Moved %d tracks"
+msgstr[0] "Un morceau déplacé"
+msgstr[1] "%d morceaux déplacés"
+
+#: ../src/display_tracks.c:1810
+#, c-format
+msgid ""
+"Cannot unsort track view because of a bug in the GTK lib you are using (%d.%"
+"d.%d < 2.5.4). Once you sort the track view, you cannot go back to the "
+"unsorted state.\n"
+"\n"
+msgstr ""
+"La biblitohèque GTK que vous utilisez (%d.%d.%d < 2.5.4) contient un bogue. "
+"Une fois que vous triez par morceau, vous ne pouvez pas revenir au tri "
+"précédent.\n"
+"\n"
+
+#: ../src/display_tracks.c:2069
+msgid "Rtng"
+msgstr "Note"
+
+#: ../src/display_tracks.c:2072
+msgid "#"
+msgstr "N°"
+
+#: ../src/display_tracks.c:2075
+msgid "CD"
+msgstr "CD"
+
+#: ../src/display_tracks.c:2078
+msgid "ID"
+msgstr "Id"
+
+#: ../src/display_tracks.c:2081
+msgid "Trnsfrd"
+msgstr "Transféré"
+
+#: ../src/display_tracks.c:2085
+msgid "Cmpl"
+msgstr "Cmpl"
+
+#: ../src/display_tracks.c:2091
+msgid "Time"
+msgstr "Durée"
+
+#: ../src/display_tracks.c:2094
+msgid "Plycnt"
+msgstr "Cpt. lect"
+
+#: ../src/display_tracks.c:2106
+msgid "Released"
+msgstr "Sortie"
+
+#: ../src/display_tracks.c:2112
+msgid "Vol."
+msgstr "Vol."
+
+#: ../src/display_tracks.c:2115
+msgid "Sndchk."
+msgstr "Ctrl. Son"
+
+#: ../src/fetchcover.c:358
+msgid "Coverart file already exists"
+msgstr ""
+
+#: ../src/fetchcover.c:371
+#, fuzzy, c-format
+msgid ""
+"The picture file %s already exists.\n"
+"This may be associated with other music files in the directory.\n"
+"\n"
+"-  Clicking Yes will overwrite the existing file, possibly associating\n"
+"   other music files in the same directory with this coverart file.\n"
+"-  Clicking No will save the file with a unique file name.\n"
+"-  Clicking Cancel will abort the fetchcover operation."
+msgstr ""
+"Le fichier d'image %s existe déjà.\n"
+"Il peut être déjà associé avec d'autres morceaux de musique dans le "
+"dossier.\n"
+"\n"
+"- avec le bouton Oui le fichier sera écrasé, avec la possibilité d'avoir\n"
+"  l'association de ce fichier de pochette avec d'autres morceaux\n"
+"  de musique dans ce même dossier.\n"
+"- avec le bouton Non le fichier sera enregistré sous un nom unique.\n"
+"- avec le bouton Annuler l'opération de gestion de la pochette sera annulée."
+
+#: ../src/file.c:236
+#, c-format
+msgid ""
+"'%s' is a directory, not a playlist file.\n"
+"\n"
+msgstr ""
+"« %s » est un répertoire, pas un fichier de liste.\n"
+"\n"
+
+#: ../src/file.c:266
+#, c-format
+msgid ""
+"'%s' is a not a known playlist file.\n"
+"\n"
+msgstr ""
+"« %s » n'est pas un fichier de liste reconnu\n"
+"\n"
+
+#: ../src/file.c:283 ../src/file_export.c:217 ../src/oggfile.c:62
+#: ../src/wavfile.c:107
+#, c-format
+msgid "Could not open '%s' for reading.\n"
+msgstr "Ne peut ouvrir en lecture le fichier « %s ».\n"
+
+#: ../src/file.c:369
+#, c-format
+msgid "Skipping '%s' because it is a directory.\n"
+msgstr "Saut de « %s » parce qu'il s'agit d'un répertoire.\n"
+
+#: ../src/file.c:374
+#, c-format
+msgid "Skipping '%s' to avoid adding playlist file recursively\n"
+msgstr ""
+"Saut de « %s » pour éviter d'ajouter une liste de lecture récursivement\n"
+
+#: ../src/file.c:629
+#, c-format
+msgid "Unknown token '%s' in template '%s'\n"
+msgstr "Paramètre « %s » inconnu dans le modèle « %s »\n"
+
+#: ../src/file.c:923
+#, c-format
+msgid "Local filename not valid (%s)"
+msgstr "Nom de fichier local invalide (%s)"
+
+#: ../src/file.c:982
+#, c-format
+msgid "No information found for user '%s' in '%s'"
+msgstr "Aucune info pour l'utilisateur « %s » dans « %s »"
+
+#: ../src/file.c:991
+#, c-format
+msgid "mserv data file (%s) not available for track (%s)"
+msgstr "Fichier de données mserv (%s) non présent pour le morceau (%s)"
+
+#: ../src/file.c:999
+#, c-format
+msgid "Track (%s) not in mserv music root directory (%s)"
+msgstr "Morceau (%s) non présent dans le répertoire de musique mserv (%s)"
+
+#: ../src/file.c:1123
+#, c-format
+msgid ""
+"The following track could not be processed (file does not exist): '%s'\n"
+msgstr ""
+"Le morceau suivant ne peut pas être mis à jour (fichier inexistant) : « %"
+"s »\n"
+
+#: ../src/file.c:1209
+#, c-format
+msgid "The following track could not be processed (filetype unknown): '%s'\n"
+msgstr ""
+"Le morceau suivant ne peut pas être mis à jour (type de fichier inconnu) : "
+"« %s »\n"
+
+#: ../src/file.c:1307
+#, c-format
+msgid ""
+"The following track could not be processed (filetype is known but analysis "
+"failed): '%s'\n"
+msgstr ""
+"Le morceau suivant ne peut pas être mis à jour (type de fichier connu mais "
+"échec de l'analyse) : « %s »\n"
+
+#: ../src/file.c:1337 ../src/file.c:1391
+msgid "Nothing to update"
+msgstr "Rien à mettre à jour"
+
+#: ../src/file.c:1358
+#, c-format
+msgid "Updating %s"
+msgstr "%s en cours de mise à jour"
+
+#: ../src/file.c:1372
+msgid "Updated selected tracks with info from file."
+msgstr "Les morceaux sélectionnés ont été mis à jour à partir des fichiers."
+
+#: ../src/file.c:1406
+#, c-format
+msgid "Retrieving mserv data %s"
+msgstr "Récupération des données mserv %s"
+
+#: ../src/file.c:1411
+msgid "no filename available"
+msgstr "pas de nom de fichier disponible"
+
+#: ../src/file.c:1416
+msgid "Updated selected tracks with data from mserv."
+msgstr ""
+"Les morceaux sélectionnés ont été mis à jour à partir des données mserv."
+
+#: ../src/file.c:1437
+#, c-format
+msgid "The following track could not be updated"
+msgid_plural "The following %d tracks could not be updated"
+msgstr[0] "Le morceau suivant ne peut pas être mis à jour."
+msgstr[1] "Les %d morceaux suivants ne peuvent pas être mis à jour."
+
+#. gint id,
+#. gboolean modal,
+#: ../src/file.c:1443
+msgid "Failed Track Update"
+msgstr "Échec de la mise à jour du morceau"
+
+#: ../src/file.c:1501
+#, c-format
+msgid "The following track has been updated"
+msgid_plural "The following %d tracks have been updated"
+msgstr[0] "Le morceau suivant a été mis à jour"
+msgstr[1] "Les %d morceaux suivants ont été mis à jour"
+
+#. gint id,
+#. gboolean modal,
+#: ../src/file.c:1507
+msgid "Successful Track Update"
+msgstr "Morceau mis à jour"
+
+#: ../src/file.c:1566
+#, c-format
+msgid "No mserv information could be retrieved for the following track"
+msgid_plural ""
+"No mserv information could be retrieved for the following %d tracks"
+msgstr[0] "Aucune info mserv n'a pû être récupérée pour le morceau suivant"
+msgstr[1] ""
+"Aucune info mserv n'a pû être récupérée pour les %d fichiers suivants"
+
+#. gint id,
+#. gboolean modal,
+#: ../src/file.c:1572
+msgid "mserv data retrieval problem"
+msgstr "problème de récupération des données mserv"
+
+#: ../src/file.c:1661
+msgid "no local filename available, file on the iPod will be used instead"
+msgstr ""
+"pas de nom de fichier local disponible, les fichiers de l'iPod seront "
+"utilisés"
+
+#: ../src/file.c:1667
+msgid "no local filename available and copy on iPod cannot be found"
+msgstr "pas de nom de fichier local disponible ainsi que de copie sur le iPod"
+
+#: ../src/file.c:1671 ../src/file.c:1689
+msgid "no local filename available"
+msgstr "pas de nom de fichier disponible"
+
+#: ../src/file.c:1679
+msgid "local file could not be found, file on the iPod will be used instead"
+msgstr "fichier local introuvable, le fichier de l'iPod sera utilisé"
+
+#: ../src/file.c:1685
+msgid "local file as well as copy on the iPod cannot be found"
+msgstr "fichier local et copie sur le iPod introuvables"
+
+#. update not successful -- log this track for later display
+#: ../src/file.c:1788
+msgid "update failed (format not supported?)"
+msgstr "échec de la mise à jour (format non supporté ?)"
+
+#: ../src/file.c:1873 ../src/misc_playlist.c:916
+#, c-format
+msgid "Processing '%s'..."
+msgstr "Traitement de « %s » …"
+
+#: ../src/file.c:1879
+#, c-format
+msgid "Skipping '%s' because it matches exclude masks.\n"
+msgstr "Saut de « %s » parce qu'il correspond à un masque d'exclusion.\n"
+
+#: ../src/file.c:1999 ../src/misc_track.c:1773 ../src/misc_track.c:1878
+#, c-format
+msgid ""
+"Podcast already present: '%s'\n"
+"\n"
+msgstr ""
+"Podcast déjà présent : « %s »\n"
+"\n"
+
+#: ../src/file.c:2064
+#, c-format
+msgid ""
+"Writing to video files not yet supported (%s).\n"
+"\n"
+msgstr ""
+"L'écriture de fichiers vidéo n'est pas encore supportée (%s).\n"
+"\n"
+
+#: ../src/file.c:2116 ../src/file.c:2130
+#, c-format
+msgid "Couldn't change tags of file: %s\n"
+msgstr "Impossible de changer les attributs du fichier : « %s »\n"
+
+#: ../src/file.c:2232
+#, c-format
+msgid "Could not open '%s' for reading and writing.\n"
+msgstr "Impossible d'ouvrir en lecture/écriture le fichier « %s ».\n"
+
+#: ../src/file.c:2239
+#, c-format
+msgid "Could not obtain lock on '%s'.\n"
+msgstr "Impossible de verrouiller « %s ».\n"
+
+#. error!
+#: ../src/file.c:2256 ../src/file.c:2265 ../src/file.c:2276 ../src/file.c:2286
+#, c-format
+msgid "Malformed line in '%s': %s\n"
+msgstr "Ligne incomplète dans « %s » : %s\n"
+
+#. gint id,
+#. gboolean modal,
+#: ../src/file.c:2315
+msgid "Remove offline playcounts?"
+msgstr "Supprimer les compteurs de lecture hors-ligne ?"
+
+#. title
+#: ../src/file.c:2316
+msgid ""
+"Some tracks played offline could not be found in the iTunesDB. Press 'OK' to "
+"remove them from the offline playcount file, 'Cancel' to keep them."
+msgstr ""
+"Certains morceaux joués hors-ligne ne peuvent être trouvés dans iTunesDB.\n"
+"OK pour les supprimer du fichier de compteur de lecture hors-ligne ?"
+
+#: ../src/file.c:2333
+#, c-format
+msgid "Error writing to '%s'.\n"
+msgstr "Erreur d'écriture du fichier « %s ».\n"
+
+#: ../src/file.c:2390 ../src/tools.c:270
+#, c-format
+msgid ""
+"Normalization failed: file type not supported (%s).\n"
+"\n"
+msgstr "Échec de la normalisation : type de fichier non supporté (%s).\n"
+
+#: ../src/file.c:2406 ../src/tools.c:287
+#, c-format
+msgid ""
+"Normalization failed: file not available (%s).\n"
+"\n"
+msgstr "Échec de la normalisation : fichier non disponible (%s).\n"
+
+#: ../src/file_convert.c:316
+msgid "Summary status of conversion processes"
+msgstr "État de la conversion"
+
+#: ../src/file_convert.c:564
+msgid "active"
+msgstr "actif"
+
+#: ../src/file_convert.c:569
+msgid "inactive"
+msgstr "inactif"
+
+#: ../src/file_convert.c:580
+#, c-format
+msgid "Active threads: %d. Scheduled tracks: %d."
+msgstr "threads actifs : %d. Morceaux prévus : %d."
+
+#: ../src/file_convert.c:1071
+#, c-format
+msgid "Original filename not available for '%s.'\n"
+msgstr "Nom de fichier original introuvable pour « %s ».\n"
+
+#: ../src/file_convert.c:1086
+#, c-format
+msgid "Filename '%s' is no longer valid for '%s'.\n"
+msgstr "Le nom de fichier « %s » n'est plus valide pour « %s ».\n"
+
+#: ../src/file_convert.c:1137
+msgid "Ogg Vorbis"
+msgstr "Ogg Vorbis"
+
+#: ../src/file_convert.c:1143
+msgid "FLAC"
+msgstr "Audio FLAC"
+
+#: ../src/file_convert.c:1198
+#, c-format
+msgid ""
+"Files of type '%s' are not supported by the iPod. Please go to the "
+"Preferences to set up and turn on a suitable conversion script for '%s'.\n"
+"\n"
+msgstr ""
+"Les fichiers de type « %s » ne sont pas reconnus par le iPod. Allez dans les "
+"préférences pour configurer un script de conversion adéquat pour « %s ».\n"
+"\n"
+
+#: ../src/file_convert.c:1284
+msgid "No information available"
+msgstr "Pas d'information disponible."
+
+#: ../src/file_convert.c:1323
+#, c-format
+msgid "Could not create '%s'. Filetype conversion will not work.\n"
+msgstr "Impossible de créer « %s ». La conversion ne fonctionnera pas.\n"
+
+#: ../src/file_convert.c:1641 ../src/file_convert.c:3049
+#, c-format
+msgid ""
+"Transfer of '%s' failed. %s\n"
+"\n"
+msgstr ""
+"Échec du transfert de « %s ». %s\n"
+"\n"
+
+#: ../src/file_convert.c:2047 ../src/file_convert.c:2325
+#, c-format
+msgid ""
+"Conversion of '%s' failed: '%s'.\n"
+"\n"
+msgstr ""
+"Échec de la conversion de « %s » : « %s ».\n"
+"\n"
+
+#: ../src/file_convert.c:2062
+#, c-format
+msgid ""
+"Conversion of '%s' failed: '%s %s' returned exit status %d.\n"
+"\n"
+msgstr ""
+"Échec de la conversion de « %s » : « %s %s » a un code de retour de %d.\n"
+"\n"
+
+#: ../src/file_convert.c:2091
+#, fuzzy, c-format
+msgid ""
+"Conversion of '%s' failed: '\"%s\" %s' did not return filename extension as "
+"expected.\n"
+"\n"
+msgstr ""
+"Échec de la conversion de « %s » : « %s %s » n'a pas retourné une extension "
+"de fichier comme attendu.\n"
+"\n"
+
+#: ../src/file_convert.c:2167
+#, c-format
+msgid ""
+"Conversion of '%s' failed: Could not access original file '%s' (%s).\n"
+"\n"
+msgstr ""
+"Échec de la conversion de « %s » : impossible d'accéder au fichier original "
+"« %s » (%s).\n"
+"\n"
+
+#: ../src/file_convert.c:2222
+#, c-format
+msgid ""
+"Conversion of '%s' failed: Could not create directory '%s'.\n"
+"\n"
+msgstr ""
+"Échec de la conversion de « %s » : impossible de créer le répertoire « %"
+"s ».\n"
+"\n"
+
+#: ../src/file_convert.c:2356
+#, c-format
+msgid ""
+"Conversion of '%s' failed: '%s' returned exit status %d.\n"
+"\n"
+msgstr ""
+"Échec de la conversion de « %s » : « %s » a un code de retour de %d.\n"
+"\n"
+
+#: ../src/file_convert.c:2395
+#, c-format
+msgid ""
+"Conversion of '%s' failed: could not stat the converted file '%s'.\n"
+"\n"
+msgstr ""
+"Échec de la conversion de « %s » : fichier résultat « %s » introuvable.\n"
+"\n"
+
+#: ../src/file_export.c:182
+#, c-format
+msgid "Skipping existing file with same length: '%s'\n"
+msgstr "Saut du fichier existant de même taille : « %s »\n"
+
+#: ../src/file_export.c:190
+#, c-format
+msgid "Overwriting existing file: '%s'\n"
+msgstr "Écrasement du fichier existant : « %s »\n"
+
+#: ../src/file_export.c:207
+#, c-format
+msgid "Error copying '%s' to '%s': Permission Error (%s)\n"
+msgstr "Impossible de copier « %s » vers « %s » : Autorisation refusée (%s)\n"
+
+#: ../src/file_export.c:209
+#, c-format
+msgid "Error copying '%s' to '%s' (%s)\n"
+msgstr "Impossible de copier « %s » vers « %s » (%s)\n"
+
+#: ../src/file_export.c:327
+#, c-format
+msgid "Could find file for '%s' on the iPod\n"
+msgstr "Impossible de trouver le fichier pour « %s » sur l'iPod\n"
+
+#. create the dialog window
+#: ../src/file_export.c:395 ../src/tools.c:360
+msgid "Information"
+msgstr "Information"
+
+#: ../src/file_export.c:406 ../src/tools.c:372
+msgid "Press button to abort."
+msgstr "Appuyer sur le bouton pour interrompre"
+
+#: ../src/file_export.c:419
+msgid "copying..."
+msgstr "copie …"
+
+#: ../src/file_export.c:476
+#, c-format
+msgid "Failed to write '%s-%s'\n"
+msgstr "Impossible d'écrire « %s-%s »\n"
+
+#: ../src/file_export.c:489
+#, c-format
+msgid "Copied %d of %d track."
+msgid_plural "Copied %d of %d tracks."
+msgstr[0] "%d morceau copiés sur %d."
+msgstr[1] "%d morceaux copiés sur %d."
+
+#: ../src/file_export.c:505 ../src/tools.c:518
+#, c-format
+msgid "%d%% (%d:%02d:%02d left)"
+msgstr "%d%% (%d:%02d:%02d restant)"
+
+#: ../src/file_export.c:514
+msgid "Some tracks were not copied."
+msgstr "Certains morceaux n'ont pas été copiés."
+
+#: ../src/file_export.c:579
+msgid "Export from iPod database not possible in offline mode."
+msgstr ""
+"Exportation depuis la base de données iPod impossible en mode déconnecté."
+
+#: ../src/file_export.c:587
+msgid "Select Export Destination Directory"
+msgstr "Sélectionner le répertoire de destination d'export"
+
+#: ../src/file_export.c:736
+msgid "Drag from iPod database not possible in offline mode."
+msgstr "Glisser depuis la base de données iPod impossible en mode déconnecté."
+
+#: ../src/file_export.c:770
+msgid "The following tracks have to be copied to your harddisk"
+msgstr "Les morceaux suivants doivent être copiés sur votre disque dur"
+
+#: ../src/file_export.c:815
+msgid ""
+"Some tracks were not copied to your harddisk. Only the copied tracks will be "
+"included in the current drag and drop operation.\n"
+"\n"
+msgstr ""
+"Quelques morceaux non copiés depuis votre disque dur. Seuls les moreceaux "
+"copiés seront inclus dans l'opération de glisser-déposer en cours.\n"
+"\n"
+
+#: ../src/file_export.c:1010
+#, c-format
+msgid ""
+"No valid filename for: %s\n"
+"\n"
+msgstr ""
+"Pas de nom de fichier valide pour : %s\n"
+"\n"
+
+#: ../src/file_export.c:1026
+#, c-format
+msgid "Created playlist with one track."
+msgid_plural "Created playlist with %d tracks."
+msgstr[0] "Liste de lecture créée avec un morceau."
+msgstr[1] "Liste de lecture créée avec %d morceaux."
+
+#: ../src/file_export.c:1031
+#, c-format
+msgid ""
+"Could not open '%s' for writing (%s).\n"
+"\n"
+msgstr "Ne peut ouvrir le fichier « %s » en lecture (%s).\n"
+
+#: ../src/file_itunesdb.c:129
+#, c-format
+msgid "Matching SHA1 checksum for file %d/%d"
+msgstr "Correspondance des sommes de contrôles SHA1 pour le fichier %d/%d"
+
+#: ../src/file_itunesdb.c:236
+#, fuzzy, c-format
+msgid "Could not open \"%s\" for reading extended info.\n"
+msgstr "Ne peut ouvrir en écriture le fichier d'infos étendues « %s ».\n"
+
+#: ../src/file_itunesdb.c:243
+msgid "Could not create hash value from itunesdb\n"
+msgstr "Ne peut pas créer de hachage à partir de itunesdb\n"
+
+#: ../src/file_itunesdb.c:259
+#, c-format
+msgid "Error while reading extended info: %s\n"
+msgstr "Erreur lors de la lecture des infos étendues : %s\n"
+
+#: ../src/file_itunesdb.c:276
+#, c-format
+msgid ""
+"iTunesDB '%s' does not match checksum in extended information file '%s'\n"
+"gtkpod will try to match the information using SHA1 checksums. This may take "
+"a long time.\n"
+"\n"
+msgstr ""
+"La base iTunesDB « %s » ne correspond pas à la somme de contrôle des infos "
+"étendues du fichier « %s ».\n"
+"gtkpod essaiera de faire concorder l'information en utilisant les sommes de "
+"contrôle SHA1. Cela peut prendre du temps.\n"
+"\n"
+
+#: ../src/file_itunesdb.c:288
+#, c-format
+msgid ""
+"%s:\n"
+"Expected \"itunesdb_hash=\" but got:\"%s\"\n"
+msgstr ""
+"%s :\n"
+"« itunesdb_hash= » attendue mais réception de : « %s »\n"
+
+#: ../src/file_itunesdb.c:348
+#, c-format
+msgid ""
+"%s:\n"
+"Format error: %s\n"
+msgstr ""
+"%s :\n"
+"Erreur de format : %s\n"
+
+#: ../src/file_itunesdb.c:393
+msgid ""
+"No SHA1 checksums on individual tracks are available.\n"
+"\n"
+"To avoid this situation in the future either switch on duplicate detection "
+"(will provide SHA1 checksums) or avoid using the iPod with programs other "
+"than gtkpod.\n"
+"\n"
+msgstr ""
+"Pas de sommes de contrôle SHA1 disponibles pour les morceaux.\n"
+"\n"
+"Pour éviter cette situation dans le futur, activez la détection des doublons "
+"(afin de générer les sommes de contrôle SHA1) ou bien évitez d'utiliser "
+"votre iPod avec d'autres programmes que gtkpod.\n"
+"\n"
+
+#: ../src/file_itunesdb.c:457
+msgid ""
+"Extended info will not be used. If you have non-transferred tracks,\n"
+"these will be lost.\n"
+msgstr ""
+"Les infos étendues ne seront pas utilisées. Si vous avez des morceaux non,\n"
+"transférés, elles seront perdues.\n"
+
+#: ../src/file_itunesdb.c:465
+msgid "Offline iPod database successfully imported"
+msgstr ""
+"La base de données de l'iPod (mode déconnecté) a été importée avec succès"
+
+#: ../src/file_itunesdb.c:468
+msgid "Local database successfully imported"
+msgstr "La base de données locale a été importée avec succès"
+
+# y, c-format
+#: ../src/file_itunesdb.c:476
+#, c-format
+msgid ""
+"Offline iPod database import failed: '%s'\n"
+"\n"
+msgstr ""
+"Échec de l'import de la base de l'iPod en mode déconnecté : « %s »\n"
+"\n"
+
+#: ../src/file_itunesdb.c:480
+#, c-format
+msgid ""
+"Local database import failed: '%s'\n"
+"\n"
+msgstr ""
+"Échec de l'import de la base de données locale : « %s »\n"
+"\n"
+
+#: ../src/file_itunesdb.c:487
+msgid ""
+"Offline iPod database import failed: \n"
+"\n"
+msgstr ""
+"Échec de l'import de la base de données de l'iPod en mode déconnecté : \n"
+"\n"
+
+#: ../src/file_itunesdb.c:490
+msgid ""
+"Local database import failed: \n"
+"\n"
+msgstr ""
+"Échec de l'import de la base données locale : \n"
+"\n"
+
+#: ../src/file_itunesdb.c:497
+#, c-format
+msgid ""
+"'%s' does not exist. Import aborted.\n"
+"\n"
+msgstr ""
+"« %s » n'existe pas. Import annulé.\n"
+"\n"
+
+#: ../src/file_itunesdb.c:520
+msgid "Extended info will not be used.\n"
+msgstr "Les infos étendues ne seront pas utilisées.\n"
+
+#: ../src/file_itunesdb.c:527
+msgid "iPod Database Successfully Imported"
+msgstr "La base de l'iPod a été importée avec succès"
+
+#: ../src/file_itunesdb.c:534
+#, c-format
+msgid ""
+"iPod Database Import Failed: '%s'\n"
+"\n"
+msgstr ""
+"Échec de l'import de la base de l'iPod : « %s »\n"
+"\n"
+
+#: ../src/file_itunesdb.c:540
+msgid ""
+"iPod Database Import Failed.\n"
+"\n"
+msgstr ""
+"Échec de l'import de la base de l'iPod.\n"
+"\n"
+
+#: ../src/file_itunesdb.c:549
+#, c-format
+msgid ""
+"'%s' (or similar) does not exist. Import aborted.\n"
+"\n"
+msgstr ""
+"« %s » (ou similaire) n'existe pas. Import annulé.\n"
+"\n"
+
+#: ../src/file_itunesdb.c:865
+#, c-format
+msgid ""
+"Could not find iPod directory structure at '%s'.\n"
+"If you are sure that the iPod is properly mounted at '%s', gtkpod can create "
+"the directory structure for you.\n"
+"\n"
+"Do you want to create the directory structure now?\n"
+msgstr ""
+"Impossible de trouver les répertoires système de l'iPod dans « %s ».\n"
+"Si vous êtes certain que le iPod est correctement monté en « %s », gtkpod "
+"peut créer ces répertoires pour vous.\n"
+
+#: ../src/file_itunesdb.c:1180
+#, c-format
+msgid "Could not open \"%s\" for writing extended info.\n"
+msgstr "Ne peut ouvrir en écriture le fichier d'infos étendues « %s ».\n"
+
+#: ../src/file_itunesdb.c:1195
+msgid "Aborted writing of extended info.\n"
+msgstr "Écriture des infos étendues interrompue.\n"
+
+#: ../src/file_itunesdb.c:1397
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: ../src/file_itunesdb.c:1411
+#, c-format
+msgid "%d%% (%d/%d  %d:%02d:%02d left)"
+msgstr "%d%% (%d:%02d:%02d restant)"
+
+#: ../src/file_itunesdb.c:1463
+msgid "Status: Deleting File"
+msgstr "État : suppression de fichier"
+
+#: ../src/file_itunesdb.c:1524
+#, c-format
+msgid ""
+"Could not remove the following file: '%s'\n"
+"\n"
+msgstr ""
+"Impossible de supprimer le fichier : « %s »\n"
+"\n"
+
+#: ../src/file_itunesdb.c:1632
+msgid ""
+"The following track could not be converted successfully:\n"
+"\n"
+msgid_plural ""
+"The following tracks could not be converted successfully:\n"
+"\n"
+msgstr[0] "Le morceau suivant ne peut pas être converti :\n"
+msgstr[1] "Les morceaux suivants ne peuvent pas être converti :\n"
+
+#: ../src/file_itunesdb.c:1642
+msgid ""
+"The following track could not be transferred successfully:\n"
+"\n"
+msgid_plural ""
+"The following tracks could not be transferred successfully:\n"
+"\n"
+msgstr[0] "Le morceau suivant ne peut pas être transféré :\n"
+msgstr[1] "Les morceaux suivants ne peuvent pas être transféré :\n"
+
+#. ID
+#. modal,
+#. gint id,
+#. gboolean modal,
+#: ../src/file_itunesdb.c:1651 ../src/misc_confirm.c:70
+msgid "Warning"
+msgstr "Attention"
+
+#. title
+#: ../src/file_itunesdb.c:1652
+msgid ""
+"The iPod could not be ejected. Please fix the problems mentioned below and "
+"then eject the iPod again. Pressing 'OK' will re-schedule the failed tracks "
+"for conversion and transfer."
+msgstr ""
+"Impossible d'éjecter le iPod. Veuillez résoudre les problèmes indiqués ci-"
+"dessous avant d'éjecter de nouveau le iPod. Avec le bouton « OK » la "
+"conversion et le transfert des morceaux qui ont eu des problèmes sera re-"
+"planifiée."
+
+#: ../src/file_itunesdb.c:1715
+#, c-format
+msgid "Status: Copying track"
+msgstr "État : copie de morceau"
+
+#: ../src/file_itunesdb.c:1721
+#, c-format
+msgid "Status: Waiting for conversion to complete"
+msgstr "État : attente de la fin de la conversion"
+
+#: ../src/file_itunesdb.c:1725
+#, c-format
+msgid "Status: Finished transfer"
+msgstr "État : fin du transfert"
+
+#: ../src/file_itunesdb.c:1770
+#, c-format
+msgid ""
+"One track could not be transferred because your iPod is full. Either delete "
+"some tracks or otherwise create space on the iPod before ejecting the iPod "
+"again."
+msgid_plural ""
+"%d tracks could not be transferred because your iPod is full. Either delete "
+"some tracks or otherwise create space on the iPod before ejecting the iPod "
+"again."
+msgstr[0] ""
+"Un morceau n'a pas pu être transféré car le iPod est plein. Éliminez "
+"quelques morceaux ou faites de la place avant de l'éjecter de nouveau."
+msgstr[1] ""
+"%d morceaux n'ont pas pu être transféré car le iPod est plein. Éliminez "
+"quelques morceaux ou faites de la place avant de l'éjecter de nouveau."
+
+#: ../src/file_itunesdb.c:1852
+#, c-format
+msgid ""
+"You did not import the existing iTunesDB ('%s'). This is most likely "
+"incorrect and will result in the loss of the existing database.\n"
+"\n"
+"Press 'OK' if you want to proceed anyhow or 'Cancel' to skip storing. If you "
+"cancel, you can import the existing database before calling this function "
+"again.\n"
+msgstr ""
+"Vous n'avez pas importé la base iTunesDB (« %s ») existante. C'est souvent "
+"une erreur et cela impliquera la perte de la base existante.\n"
+"\n"
+"Appuyer sur «OK» pour continuer ou «Annuler» pour interrompre. Si vous "
+"annulez, vous pouvez importer la base existante avant d'appeler de nouveau "
+"cette fonction.\n"
+
+#: ../src/file_itunesdb.c:1887
+msgid ""
+"iPod directory structure must be present before synching to the iPod can be "
+"performed.\n"
+msgstr ""
+"Les répertoires systèmes de l'iPod doivent exister avant de pouvoir "
+"synchroniser l'iPod.\n"
+
+#: ../src/file_itunesdb.c:1896
+msgid "Some tracks could not be deleted from the iPod. Export aborted!"
+msgstr "Des morceaux ne peuvent pas être supprimés de l'iPod. Export annulé !"
+
+#: ../src/file_itunesdb.c:1914
+#, c-format
+msgid "Now writing database '%s'. Please wait..."
+msgstr "Écriture de la base « %s ». Veuillez patienter …"
+
+#: ../src/file_itunesdb.c:1963
+#, c-format
+msgid "Extended information file not deleted: '%s'"
+msgstr "Fichier d'infos étendues non supprimé : « %s »"
+
+#: ../src/file_itunesdb.c:2070
+#, c-format
+msgid "%s: Database saved"
+msgstr "%s : Base de l'iPod sauvegardée"
+
+#: ../src/file_itunesdb.c:2074
+#, c-format
+msgid "%s: Changes saved"
+msgstr "%s : Modifications sauvegardées"
+
+#: ../src/fileselection.c:129
+msgid "Successfully added files"
+msgstr "Les fichiers ont bien été ajoutés"
+
+#: ../src/fileselection.c:131
+msgid "Some files were not added successfully"
+msgstr "Echec de l'ajout de quelques fichiers"
+
+#: ../src/fileselection.c:164 ../src/fileselection.c:305
+#: ../src/fileselection.c:792
+msgid "Please select a playlist or repository before adding tracks."
+msgstr "Choisir une liste de lecture ou un dépôt avant d'ajouter des morceaux."
+
+#: ../src/fileselection.c:175 ../src/fileselection.c:314
+#: ../src/fileselection.c:803
+msgid "Please load the iPod before adding tracks."
+msgstr "Charger le iPod avant d'ajouter des morceaux."
+
+#: ../src/fileselection.c:185
+#, c-format
+msgid "Add files to '%s'"
+msgstr "Ajoute des fichiers à « %s »"
+
+#: ../src/fileselection.c:189
+#, c-format
+msgid "Add files to '%s/%s'"
+msgstr "Ajoute des fichiers à « %s/%s »"
+
+#. Create window title
+#: ../src/fileselection.c:322
+#, c-format
+msgid "Add playlist files to '%s'"
+msgstr "Ajouter les fichiers de liste de lecture à « %s »"
+
+#. Create the file chooser, and handle the response
+#: ../src/fileselection.c:378
+msgid "Set Cover"
+msgstr "Modifier la pochette"
+
+#: ../src/fileselection.c:816
+#, c-format
+msgid "Add directories to '%s'"
+msgstr "Ajouter les dossier à « %s »"
+
+#: ../src/fileselection.c:820
+#, c-format
+msgid "Add directories to '%s/%s'"
+msgstr "Ajouter les dossiers à « %s/%s »"
+
+#: ../src/fileselection.c:1097
+msgid "Ok"
+msgstr "Ok"
+
+#: ../src/fileselection.c:1106
+msgid "Cancel"
+msgstr "Annuler"
+
+#: ../src/flacfile.c:62
+#, c-format
+msgid "'%s' does not appear to be an FLAC audio file.\n"
+msgstr "« %s » n'est pas un fichier audio FLAC.\n"
+
+#: ../src/flacfile.c:78
+#, c-format
+msgid "Error retrieving tags for '%s'.\n"
+msgstr "Échec de la récupération des attributs de « %s ».\n"
+
+#: ../src/flacfile.c:165
+#, c-format
+msgid ""
+"Import of '%s' failed: FLAC not supported without the FLAC library. You must "
+"compile the gtkpod source together with the FLAC library.\n"
+msgstr ""
+"Échec de l'import de « %s » : pas de support des formats FLAC. Vous devez "
+"compiler gtkpod avec la bibliothèque FLAC.\n"
+
+#: ../src/flacfile.c:171
+#, c-format
+msgid ""
+"FLAC metadata update for '%s' failed: FLAC not supported without the FLAC "
+"library. You must compile the gtkpod source together with the FLAC library.\n"
+msgstr ""
+"Échec de la mise à jour des données FLAC pour « %s » : pas de support des "
+"formats FLAC. Vous devez compiler gtkpod avec la bibliothèque FLAC.\n"
+
+#: ../src/getopt.c:681
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s : option « %s » ambiguë\n"
+
+#: ../src/getopt.c:706
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s : l'option « --%s » n'autorise pas d'argument\n"
+
+#: ../src/getopt.c:711
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s : l'option « %c%s » n'autorise pas d'argument\n"
+
+#: ../src/getopt.c:729 ../src/getopt.c:902
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s : l'option « %s » nécessite un argument\n"
+
+#. --option
+#: ../src/getopt.c:758
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s : option « --%s » non reconnue\n"
+
+#. +option or -option
+#: ../src/getopt.c:762
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s : option « %c%s » non reconnue\n"
+
+#. 1003.2 specifies the format of this message.
+#: ../src/getopt.c:788
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s : option -- %c interdite\n"
+
+#: ../src/getopt.c:791
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s : option -- %c non valide\n"
+
+#. 1003.2 specifies the format of this message.
+#: ../src/getopt.c:821 ../src/getopt.c:951
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s : l'option -- %c nécessite un argument\n"
+
+#: ../src/getopt.c:868
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s : l'option « -W %s » est ambiguë\n"
+
+#: ../src/getopt.c:886
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s : l'option « -W %s » n'autorise pas d'argument\n"
+
+#: ../src/info.c:383
+msgid "n/c"
+msgstr "n/d"
+
+#: ../src/info.c:388 ../src/info.c:838
+msgid "offline"
+msgstr "déconnecté"
+
+#: ../src/info.c:486
+#, c-format
+msgid " P:%d T:%d/%d"
+msgstr "L :%d M :%d/%d"
+
+#: ../src/info.c:780
+msgid "B"
+msgstr "o"
+
+#: ../src/info.c:780
+msgid "kB"
+msgstr "ko"
+
+#: ../src/info.c:780
+msgid "TB"
+msgstr "To"
+
+#: ../src/info.c:823
+#, c-format
+msgid " %s Free"
+msgstr " %s de libre"
+
+#: ../src/info.c:828
+#, c-format
+msgid " %s Pending"
+msgstr " %s en cours"
+
+#: ../src/info.c:833
+msgid " disconnected"
+msgstr "déconnecté"
+
+#: ../src/info.c:884
+msgid "No database or playlist selected"
+msgstr "Aucune base de donnée ou liste de lecture sélectionnée"
+
+#: ../src/info.c:889
+msgid "No tracks selected"
+msgstr "Aucun morceau sélectionné"
+
+#: ../src/info.c:894
+msgid "No playlist selected"
+msgstr "Aucune liste de lecture sélectionnée"
+
+#: ../src/info.c:899
+msgid "No iPod or iPod playlist selected"
+msgstr "Aucun iPod ou liste de lecture sélectionné(e)"
+
+#. Strings used several times
+#: ../src/ipod_init.c:48
+msgid "Select or enter your model"
+msgstr "Choisir ou entrer le modèle"
+
+#: ../src/ipod_init.c:79 ../src/repository.c:546 ../src/repository.c:2369
+msgid "Select mountpoint"
+msgstr "Point de montage de l'iPod :"
+
+#: ../src/ipod_init.c:359
+#, c-format
+msgid "Error initialising iPod: %s\n"
+msgstr "Erreur d'initialisation du iPod : %s\n"
+
+#: ../src/ipod_init.c:366
+msgid "Error initialising iPod, unknown error\n"
+msgstr "Erreur d'initialisation du iPod, erreur inconnue\n"
+
+#: ../src/ipod_init.c:422
+#, c-format
+msgid "<b>Please select your iPod model at </b><i>%s</i>"
+msgstr "<b>Sélectionnez le modèle de votre iPod dans</b><i>%s</i>"
+
+#: ../src/ipod_init.c:463
+msgid ""
+"Could not determine the model you selected -- this could be a bug or "
+"incompatibilty in the GTK+ or glade library.\n"
+"\n"
+msgstr ""
+"Impossible de détecter le modèle sélectionné. Ceci peut être du à une erreur "
+"ou une incompatibilité dans GTK+ ou GLADE.\n"
+"\n"
+
+#: ../src/misc.c:70
+#, fuzzy
+msgid ""
+"© 2002 - 2007\n"
+"Jorg Schuler (jcsjcs at users dot sourceforge dot net)\n"
+"Corey Donohoe (atmos at atmos dot org)\n"
+msgstr ""
+"© 2002 - 2007\n"
+"Jorg Schuler (jcsjcs at users dot sourceforge dot net)\n"
+"Corey Donohoe (atmos at atmos dot org)\n"
+"\n"
+"\n"
+
+#: ../src/misc.c:74
+#, fuzzy
+msgid ""
+"Patches were supplied by the following people (list may be incomplete -- "
+"please contact me)\n"
+msgstr ""
+"Les personnes suivantes ont fournis des corrections ou évolutions (liste "
+"peut-être incomplète - veuillez me contacter)\n"
+"\n"
+
+#: ../src/misc.c:75
+#, fuzzy
+msgid "Ramesh Dharan: Multi-Edit (edit tags of several tracks in one run)"
+msgstr ""
+"Ramesh Dharan : « Édition multiple » (édition des attributs de plusieurs "
+"fichiers en même temps)\n"
+
+#: ../src/misc.c:76
+#, fuzzy
+msgid "Hiroshi Kawashima: Japanese charset autodetection feature"
+msgstr ""
+"Hiroshi Kawashima : détection automatique du type de jeu de caractères "
+"japonais\n"
+
+#: ../src/misc.c:77
+#, fuzzy
+msgid "Adrian Ulrich: porting of playlist code from mktunes.pl to itunesdb.c"
+msgstr ""
+"Adrian Ulrich : portage du code de liste de lecture à partir de mktunes.pl\n"
+
+#: ../src/misc.c:78
+#, fuzzy
+msgid ""
+"Walter Bell: correct handling of DND URIs with escaped characters and/or cr/"
+"newlines at the end"
+msgstr ""
+"Walter Bell : correction de la manipulation des URIs avec des caractères "
+"d'échappement\n"
+
+#: ../src/misc.c:79
+#, fuzzy
+msgid "Sam Clegg: user defined filenames when exporting tracks from the iPod"
+msgstr ""
+"Sam Clegg : définition par un masque des noms de fichier à l'export de "
+"morceaux\n"
+
+#: ../src/misc.c:80
+#, fuzzy
+msgid "Chris Cutler: automatic creation of various playlist types"
+msgstr "Chris Cutler : création automatique de divers listes de lecture\n"
+
+#: ../src/misc.c:81
+#, fuzzy
+msgid ""
+"Graeme Wilford: reading and writing of the 'Composer' ID3 tags, progress "
+"dialogue during sync"
+msgstr ""
+"Graeme Wilford : lecture et écriture des attributs  « Compositeur », barre "
+"de progression durant les synchro.\n"
+
+#: ../src/misc.c:82
+#, fuzzy
+msgid ""
+"Edward Matteucci: debugging, special playlist creation, most of the volume "
+"normalizing code"
+msgstr ""
+"Edward Matteucci : mise au point, création de liste de lectures, majeure "
+"partie de la normalisation du volume\n"
+
+#: ../src/misc.c:83
+#, fuzzy
+msgid "Jens Lautenbach: some optical improvements"
+msgstr "Jens Lautenbach : améliorations esthétiques de l'interface\n"
+
+#: ../src/misc.c:84
+#, fuzzy
+msgid "Alex Tribble: iPod eject patch"
+msgstr "Alex Tribble : éjection de l'iPod\n"
+
+#: ../src/misc.c:85
+#, fuzzy
+msgid "Yaroslav Halchenko: Orphaned and dangling tracks handling"
+msgstr ""
+"Yaroslav Halchenko : gestion des fichiers orphelins et morceaux fictifs\n"
+
+#: ../src/misc.c:86
+#, fuzzy
+msgid ""
+"Andrew Huntwork: Filename case sensitivity fix and various other bugfixes"
+msgstr ""
+"Andrew Huntwork : gestion de la casse des noms de fichier et correctifs\n"
+
+#: ../src/misc.c:87
+#, fuzzy
+msgid ""
+"Ero Carrera: Filename validation and quick sync when copying tracks from the "
+"iPod"
+msgstr ""
+"Ero Carrera : Validation du nom de fichier et synchro. rapide lors de la "
+"copie de l'iPod\n"
+
+#: ../src/misc.c:88
+#, fuzzy
+msgid "Jens Taprogge: Support for LAME's replay gain tag to normalize volume"
+msgstr ""
+"Jens Taprogge : Support de l'attribut « replay gain » de LAME pour "
+"normaliser le volume\n"
+
+#: ../src/misc.c:89
+#, fuzzy
+msgid "Armando Atienza: Support with external playcounts"
+msgstr "Armando Atienza : Suppport pour les compteurs de lecture externes\n"
+
+#: ../src/misc.c:90
+#, fuzzy
+msgid "D.L. Sharp: Support for m4b files (bookmarkable AAC files)"
+msgstr "D.L. Sharp : Support des fichiers m4b\n"
+
+#: ../src/misc.c:91
+#, fuzzy
+msgid "Jim Hall: Decent INSTALL file"
+msgstr "Jim Hall : Fichier INSTALL décent\n"
+
+#: ../src/misc.c:92
+#, fuzzy
+msgid ""
+"Juergen Helmers, Markus Gaugusch: Conversion scripts to sync calendar/"
+"contacts to the iPod"
+msgstr ""
+"Juergen Helmers, Markus Gaugusch : Scripts de conversion pour le calendrier/"
+"contacts\n"
+
+#. J"urgen!
+#: ../src/misc.c:93
+#, fuzzy
+msgid "Flavio Stanchina: bugfixes"
+msgstr "Flavio Stanchina : correction de bogues\n"
+
+#: ../src/misc.c:94
+#, fuzzy
+msgid ""
+"Chris Micacchi: when sorting ignore 'the' and similar at the beginning of "
+"the title"
+msgstr "Chris Micacchi : lors du tri, gestion de 'the' au début du titre\n"
+
+#: ../src/misc.c:95
+#, fuzzy
+msgid "Steve Jay: use statvfs() instead of df (better portability, faster)"
+msgstr "Steve Jay : utilisation de statvfs pour une meilleure portabilité\n"
+
+#: ../src/misc.c:97
+#, fuzzy
+msgid ""
+"Christoph Kunz: address compatibility issues when writing id3v2.4 type mp3 "
+"tags"
+msgstr "Christoph Kunz : compatibilité des adresses pour attributs id3v2.4\n"
+
+#: ../src/misc.c:99
+#, fuzzy
+msgid ""
+"James Liggett:\n"
+"replacement of old GTK file selection dialogs with new GTK filechooser "
+"dialogs\n"
+"refactored user preferences system."
+msgstr ""
+"James Ligget :\n"
+"     remplacement de l'ancien dialogue GTK de sélection de fichiers par le "
+"nouveau\n"
+"     refonte de la gestion des préférences.\n"
+
+#: ../src/misc.c:103
+#, fuzzy
+msgid "Daniel Kercher: sync scripts for abook and webcalendar"
+msgstr "Daniel Kercher : scripts de synchronisation abook et webcalendar\n"
+
+#: ../src/misc.c:105
+#, fuzzy
+msgid "Clinton Gormley: sync scripts for thunderbird"
+msgstr "Clinton Gormley : scripts de synchronisation pour thunderbird\n"
+
+#: ../src/misc.c:107
+#, fuzzy
+msgid "Sebastien Beridot: sync script for ldif addressbook format"
+msgstr "Sebastien Beridot : script de synchronisation pour le format ldif\n"
+
+#: ../src/misc.c:109
+#, fuzzy
+msgid "Sebastian Scherer: sync script for kNotes"
+msgstr "Sebastian Scherer : script de synchronisation pour kNotes\n"
+
+#: ../src/misc.c:111
+#, fuzzy
+msgid "Nick Piper: sync script for Palm, type-ahead search"
+msgstr "Nick Piper: script de synchronisation pour Palm\n"
+
+#: ../src/misc.c:113
+#, fuzzy
+msgid "Uwe Hermann: help with support for iPod Video"
+msgstr "Uwe Hermann: aide pour le support de l'iPod Vidéo\n"
+
+#: ../src/misc.c:115
+#, fuzzy
+msgid ""
+"Iain Benson: support for compilation tag in mp3 files and separate display "
+"of compilations in the sort tab."
+msgstr ""
+"Iain Benson: support pour les attributs de compilation dans les fichiers MP3 "
+"et l'affichage séparé des compilations dans la zone de tri.\n"
+
+#: ../src/misc.c:116
+#, fuzzy
+msgid ""
+"Nicolas Chariot: icons of buttons\n"
+"\n"
+msgstr ""
+"Nicolas Chariot: icônes des boutons\n"
+"\n"
+"\n"
+
+#: ../src/misc.c:118
+#, fuzzy
+msgid "This program borrows code from the following projects:"
+msgstr "Ce programme emprunte du code aux projets suivants :\n"
+
+#: ../src/misc.c:119
+#, fuzzy
+msgid ""
+"gnutools: (mktunes.pl, ported to C) reading and writing of iTunesDB  (http://"
+"www.gnu.org/software/gnupod/)"
+msgstr ""
+"    gnutools : (mktunes.pl porté en C) pour la lecture et écriture de "
+"iTunesDB (http://www.gnu.org/software/gnupod/)\n"
+
+#: ../src/misc.c:120
+#, fuzzy
+msgid ""
+"iPod.cpp, iPod.h by Samuel Wood (sam dot wood at gmail dot com): some code "
+"for smart playlists is based on his C++-classes."
+msgstr ""
+"    iPod.cpp, iPod.h par Samuel Wood (sam dot wood at gamil dot com) : "
+"certaines parties de code des listes intelligentes sont basées sur ses "
+"classes C++.\n"
+
+#: ../src/misc.c:121
+#, fuzzy
+msgid "mp3info: mp3 playlength detection (http://ibiblio.org/mp3info/)"
+msgstr ""
+"    mp3info : détection de la durée du mp3 (http://ibiblio.org/mp3info/)\n"
+
+#: ../src/misc.c:122
+#, fuzzy
+msgid "xmms: dirbrowser, mp3 playlength detection (http://www.xmms.org)"
+msgstr "    xmms : explorateur, détection de la durée (http://www.xmms.org)\n"
+
+#: ../src/misc.c:124
+#, fuzzy
+msgid "The GUI was created with the help of glade-2 (http://glade.gnome.org/)."
+msgstr ""
+"L'interface utilisateur a été créée à l'aide de glade-2 (http://glade.gnome."
+"org).\n"
+
+#: ../src/misc.c:128
+#, fuzzy
+msgid "French: David Le Brun (david at dyn-ns dot net)"
+msgstr "Français : Eric Lassauge (lassauge at users dot sourceforge dot net)\n"
+
+#: ../src/misc.c:129
+msgid "French: Éric Lassauge (rpmfarm at free dot fr)"
+msgstr ""
+
+#: ../src/misc.c:130
+#, fuzzy
+msgid "German: Jorg Schuler (jcsjcs at users dot sourceforge dot net)"
+msgstr "Allemand : Jorg Schuler (jcsjcs at users dot sourceforge dot net)\n"
+
+#: ../src/misc.c:131
+msgid "German: Kai-Ove"
+msgstr ""
+
+#: ../src/misc.c:132
+#, fuzzy
+msgid "Hebrew: Assaf Gillat (gillata at gmail dot com)"
+msgstr "Hébreu : Assaf Gillat (gillata at gmail dot com)\n"
+
+#: ../src/misc.c:133
+#, fuzzy
+msgid ""
+"Italian: Edward Matteucci (edward_matteucc at users dot sourceforge dot net)"
+msgstr ""
+"Italien : Edward Matteucci (edward_matteucc at users dot sourceforge dot "
+"net)\n"
+
+#: ../src/misc.c:134
+msgid "Italian: Daniele Forsi (dforsi at gmail dot com)"
+msgstr ""
+
+#: ../src/misc.c:135
+#, fuzzy
+msgid "Japanese: Ayako Sano"
+msgstr "Japonais : Ayako Sano\n"
+
+#: ../src/misc.c:136
+#, fuzzy
+msgid "Japanese: Kentaro Fukuchi (fukuchi at users dot sourceforge dot net)"
+msgstr ""
+"Japonais : Kentaro Fukuchi (fukuchi at users dot sourceforge dot net)\n"
+
+#: ../src/misc.c:137
+msgid "Romanian: Alex Eftimie (alexeftimie at gmail dot com)"
+msgstr ""
+
+#: ../src/misc.c:138
+msgid "Spanish: Alejandro Lamas Daviña (alejandro.lamas at ific dot uv dot es)"
+msgstr ""
+
+#: ../src/misc.c:139
+#, fuzzy
+msgid "Swedish: Stefan Asserhall (stefan.asserhall at comhem dot se)"
+msgstr "Suèdois : Stefan Asserhall (stefan asserhall at comhem dot se)\n"
+
+#: ../src/misc.c:144
+#, fuzzy
+msgid ""
+"This program is free software; you can redistribute it and/or\n"
+"modify it under the terms of the GNU General Public License as\n"
+"published by the Free Software Foundation; either version 2 of the\n"
+"License, or (at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful, but\n"
+"WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See\n"
+"the GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public\n"
+"License along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA\n"
+"02111-1307, USA."
+msgstr ""
+"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.\n"
+"\n"
+"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.\n"
+"\n"
+"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., 59 Temple "
+"Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"\n"
+
+#: ../src/misc.c:159
+#, fuzzy
+msgid ""
+"© 2002-2007\n"
+"Jorg Schuler <jcsjcs at users.sourceforge.net>\n"
+"Corey Donohoe <atmos at atmos.org>"
+msgstr ""
+"© 2002 - 2007\n"
+"Jorg Schuler (jcsjcs at users dot sourceforge dot net)\n"
+"Corey Donohoe (atmos at atmos dot org)\n"
+"\n"
+"\n"
+
+#: ../src/misc.c:167
+#, fuzzy
+msgid "Cross-platform multilingual interface to Apple's iPod™"
+msgstr ""
+"gtkpod Version %s : Interface multilingue et multi-plateforme pour l'iPod® "
+"d'Apple."
+
+#: ../src/misc.c:934
+#, c-format
+msgid "Could not process '%s' (no filename available)"
+msgstr "Impossible de traiter « %s » (pas de nom de fichier disponible)"
+
+#: ../src/misc.c:1088
+#, c-format
+msgid "Unknown token '%%%c' in template '%s'"
+msgstr "Paramètre « %%%c » inconnu dans le modèle « %s »"
+
+#: ../src/misc.c:1171
+#, c-format
+msgid "Template ('%s') does not match file type '%s'\n"
+msgstr "Le modèle (« %s ») ne correspond pas au type de fichier « %s »\n"
+
+#: ../src/misc.c:1257
+#, c-format
+msgid "Error creating %s: %s\n"
+msgstr "Erreur à la création de « %s » : %s\n"
+
+#: ../src/misc.c:1691
+#, c-format
+msgid ""
+"Writing preferences file '%s' failed (%s).\n"
+"\n"
+msgstr ""
+"Échec de l'enregistrement du fichier de préférences « %s » (%s).\n"
+"\n"
+
+#: ../src/misc.c:1693
+msgid "unspecified error"
+msgstr "Erreur non spécifiée"
+
+#: ../src/misc.c:1701
+#, c-format
+msgid ""
+"Writing preferences to the iPod (%s) failed: could not get path to Control "
+"Directory.\n"
+"\n"
+msgstr ""
+"Échec de l'écriture des préférences dans le iPod (%s°) : impossible de "
+"trouver le répertoire « Control ».\n"
+"\n"
+
+#. title
+#: ../src/misc_confirm.c:71
+msgid "The following has occurred:"
+msgstr "L'erreur suivante est survenue  :"
+
+#: ../src/misc_confirm.c:122
+msgid ""
+"Are you sure you want to delete the following track completely from your "
+"iPod? The number of playlists this track is a member of is indicated in "
+"parentheses."
+msgid_plural ""
+"Are you sure you want to delete the following tracks completely from your "
+"iPod? The number of playlists the tracks are member of is indicated in "
+"parentheses."
+msgstr[0] ""
+"Êtes-vous sûr de vouloir supprimer le morceau suivant de votre iPod ? Le "
+"nombre de listes dont ce morceau fait partie est indiqué entre parenthèses."
+msgstr[1] ""
+"Êtes-vous sûr de vouloir supprimer les morceaux suivants de votre iPod ? Le "
+"nombre de listes dont ces morceaux font partie est indiqué entre parenthèses."
+
+#: ../src/misc_confirm.c:126
+msgid "Delete Track Completely from iPod?"
+msgid_plural "Delete Tracks Completely from iPod?"
+msgstr[0] "Suppression d'un morceau de l'iPod ?"
+msgstr[1] "Suppression de %d morceaux de l'iPod ?"
+
+#: ../src/misc_confirm.c:137 ../src/misc_confirm.c:178
+#, c-format
+msgid ""
+"Are you sure you want to remove the following track from the playlist \"%s\"?"
+msgid_plural ""
+"Are you sure you want to remove the following tracks from the playlist \"%s"
+"\"?"
+msgstr[0] ""
+"Êtes-vous sûr de vouloir supprimer le morceau suivant de la liste « %s » ?"
+msgstr[1] ""
+"Êtes-vous sûr de vouloir supprimer les morceaux suivants de la liste « %s » ?"
+
+#: ../src/misc_confirm.c:141 ../src/misc_confirm.c:182
+msgid "Remove Track From Playlist?"
+msgid_plural "Remove Tracks From Playlist?"
+msgstr[0] "Supprimer le morceau de la liste de lecture ?"
+msgstr[1] "Supprimer les morceaux de la liste de lecture ?"
+
+#: ../src/misc_confirm.c:163
+msgid ""
+"Are you sure you want to delete the following track completely from your "
+"harddisk? The number of playlists this track is a member of is indicated in "
+"parentheses."
+msgid_plural ""
+"Are you sure you want to delete the following tracks completely from your "
+"harddisk? The number of playlists the tracks are member of is indicated in "
+"parentheses."
+msgstr[0] ""
+"Êtes-vous sûr de vouloir supprimer le morceau suivant de votre disque dur ? "
+"Le nombre de listes dont ce morceau fait partie est indiqué entre "
+"parenthèses."
+msgstr[1] ""
+"Êtes-vous sûr de vouloir supprimer les morceaux suivants de votre disque "
+"durPod ? Le nombre de listes dont ces morceaux font partie est indiqué entre "
+"parenthèses."
+
+#: ../src/misc_confirm.c:167
+msgid "Delete Track from Harddisk?"
+msgid_plural "Delete Tracks from Harddisk?"
+msgstr[0] "Supprimer le morceau du disque dur ?"
+msgstr[1] "Supprimer les morceaux du disque dur ?"
+
+#: ../src/misc_confirm.c:192
+msgid ""
+"Are you sure you want to remove the following track completely from your "
+"local database? The number of playlists this track is a member of is "
+"indicated in parentheses."
+msgid_plural ""
+"Are you sure you want to remove the following tracks completely from your "
+"local database? The number of playlists the tracks are member of is "
+"indicated in parentheses."
+msgstr[0] ""
+"Êtes-vous sûr de vouloir supprimer le morceau suivant de votre base de "
+"données locale  ? Le nombre de listes dont ce morceau fait partie est "
+"indiqué entre parenthèses."
+msgstr[1] ""
+"Êtes-vous sûr de vouloir supprimer les morceaux suivants de votre base de "
+"données locale ? Le nombre de listes dont ces morceaux font partie est "
+"indiqué entre parenthèses."
+
+#: ../src/misc_confirm.c:196
+msgid "Remove Track from Local Database?"
+msgid_plural "Remove Tracks from Local Database?"
+msgstr[0] "Supprimer un morceau de la base de données locale ?"
+msgstr[1] "Supprimer des morceaux de la base de données locale ?"
+
+#: ../src/misc_confirm.c:261
+#, c-format
+msgid "Deleted one track completely from iPod"
+msgid_plural "Deleted %d tracks completely from iPod"
+msgstr[0] "Suppression d'un morceau de l'iPod"
+msgstr[1] "Suppression de %d morceaux de l'iPod"
+
+#: ../src/misc_confirm.c:267 ../src/misc_confirm.c:291
+#, c-format
+msgid "Deleted %d track from playlist '%s'"
+msgid_plural "Deleted %d tracks from playlist '%s'"
+msgstr[0] "%d morceau supprimé de la liste de lecture « %s »"
+msgstr[1] "%d morceaux supprimés de la liste de lecture « %s »"
+
+#: ../src/misc_confirm.c:285
+#, c-format
+msgid "Deleted one track from harddisk"
+msgid_plural "Deleted %d tracks from harddisk"
+msgstr[0] "%d morceau supprimé du disque dur"
+msgstr[1] "%d morceaux supprimés du disque dur"
+
+#: ../src/misc_confirm.c:297
+#, c-format
+msgid "Deleted track from local database"
+msgid_plural "Deleted %d tracks from local database"
+msgstr[0] "1 morceau supprimé de la base de données locale"
+msgstr[1] "%d morceaux supprimés de la base de données locale"
+
+#: ../src/misc_confirm.c:442
+msgid "Cannot remove entry 'All'"
+msgstr "Ne peut supprimer l'entrée « Tous »"
+
+#: ../src/misc_confirm.c:536
+#, c-format
+msgid "Removed all %d tracks from the iPod"
+msgstr "Suppression des %d morceaux de l'iPod"
+
+#: ../src/misc_confirm.c:541
+#, c-format
+msgid "Removed all podcasts from the iPod"
+msgstr "Suppression de tous les podcasts de l'iPod"
+
+#: ../src/misc_confirm.c:550 ../src/misc_confirm.c:624
+#, c-format
+msgid "Deleted playlist '%s' including %d member track"
+msgid_plural "Deleted playlist '%s' including %d member tracks"
+msgstr[0] "Liste de lecture « %s » supprimée avec %d morceau"
+msgstr[1] "Liste de lecture « %s » supprimée avec %d morceaux"
+
+#. first use playlist name
+#: ../src/misc_confirm.c:566 ../src/misc_confirm.c:640
+#, c-format
+msgid "Deleted playlist '%s'"
+msgstr "Liste de lecture « %s » supprimée"
+
+#: ../src/misc_confirm.c:600
+#, c-format
+msgid "Deleted playlist '%s' including %d member track on harddisk"
+msgid_plural "Deleted playlist '%s' including %d member tracks on harddisk"
+msgstr[0] ""
+"Liste de lecture « %s » supprimée avec %d morceau sur le disque dur."
+msgstr[1] ""
+"Liste de lecture « %s » supprimée avec %d morceaux sur le disque dur."
+
+#: ../src/misc_confirm.c:617
+#, c-format
+msgid "Removed all %d tracks from the database"
+msgstr "Suppression des %d morceaux de la base de données"
+
+#: ../src/misc_confirm.c:695
+#, c-format
+msgid "Are you sure you want to remove all tracks from your iPod?"
+msgstr "Êtes-vous sûr de vouloir supprimer tous les morceaux de votre iPod ?"
+
+#: ../src/misc_confirm.c:700
+#, c-format
+msgid "Are you sure you want to remove all podcasts from your iPod?"
+msgstr "Êtes-vous sûr de vouloir supprimer tous les podcasts de votre iPod ?"
+
+#: ../src/misc_confirm.c:708
+#, fuzzy, c-format
+msgid ""
+"Are you sure you want to delete playlist '%s' and the following track "
+"completely from your iPod? The number of playlists this track is a member of "
+"is indicated in parentheses."
+msgid_plural ""
+"Are you sure you want to delete playlist '%s' and the following tracks "
+"completely from your iPod? The number of playlists the tracks are member of "
+"is indicated in parentheses."
+msgstr[0] ""
+"Êtes-vous sûr de vouloir supprimer la liste « %s » et le morceau suivant de "
+"votre iPod ? Le nombre de liste dont ce morceau fait partie est indiqué "
+"entre parenthèses."
+msgstr[1] ""
+"Êtes-vous sûr de vouloir supprimer la liste « %s » et les morceaux suivants "
+"de votre iPod ? Le nombre de liste dont ces morceaux font partie est indiqué "
+"entre parenthèses."
+
+#: ../src/misc_confirm.c:719 ../src/misc_confirm.c:774
+#, c-format
+msgid "Are you sure you want to delete the playlist '%s'?"
+msgstr "Êtes-vous sûr de vouloir supprimer la liste de lecture « %s » ?"
+
+#: ../src/misc_confirm.c:745
+#, c-format
+msgid ""
+"Are you sure you want to delete playlist '%s' and remove the following track "
+"from your harddisk? The number of playlists this track is a member of is "
+"indicated in parentheses."
+msgid_plural ""
+"Are you sure you want to delete playlist '%s' and remove the following "
+"tracks from your harddisk? The number of playlists the tracks are member of "
+"is indicated in parentheses."
+msgstr[0] ""
+"Êtes-vous sûr de vouloir supprimer la liste « %s » et le morceau suivant de "
+"votre disque dur ? Le nombre de liste dont ce morceau fait partie est "
+"indiqué entre parenthèses."
+msgstr[1] ""
+"Êtes-vous sûr de vouloir supprimer la liste « %s » et les morceaux suivants "
+"de votre disque dur ? Le nombre de liste dont ces morceaux font partie est "
+"indiqué entre parenthèses."
+
+#: ../src/misc_confirm.c:753
+#, c-format
+msgid "Are you sure you want to remove all tracks from the database?"
+msgstr ""
+"Êtes-vous sûr de vouloir supprimer tous les morceaux de la base de données ?"
+
+#: ../src/misc_confirm.c:762
+#, c-format
+msgid ""
+"Are you sure you want to delete playlist '%s' and remove the following track "
+"from the database? The number of playlists this track is a member of is "
+"indicated in parentheses."
+msgid_plural ""
+"Are you sure you want to delete playlist '%s' and remove the following "
+"tracks from the database? The number of playlists the tracks are member of "
+"is indicated in parentheses."
+msgstr[0] ""
+"Êtes-vous sûr de vouloir supprimer la liste « %s » et le morceau suivant de "
+"votre base de données ? Le nombre de liste dont ce morceau fait partie est "
+"indiqué entre parenthèses."
+msgstr[1] ""
+"Êtes-vous sûr de vouloir supprimer la liste « %s » et les morceaux suivants "
+"de votre base de données ? Le nombre de liste dont ces morceaux font partie "
+"est indiqué entre parenthèses."
+
+#: ../src/misc_confirm.c:841
+msgid ""
+"Data has been changed and not been saved.\n"
+"OK to exit gtkpod?"
+msgstr ""
+"Des données modifiées n'ont pas été sauvées.\n"
+"Voulez-vous vraiment quitter gtkpod ?"
+
+#: ../src/misc_conversion.c:66
+msgid "File type"
+msgstr "Type de fichier"
+
+#: ../src/misc_conversion.c:67
+msgid "PC File"
+msgstr "Fichier PC"
+
+#: ../src/misc_conversion.c:68
+msgid "iPod File"
+msgstr "Fichier iPod"
+
+#: ../src/misc_conversion.c:69
+msgid "iPod ID"
+msgstr "Id iPod"
+
+#. 10
+#: ../src/misc_conversion.c:70
+msgid "Track Nr (#)"
+msgstr "N° de piste"
+
+#: ../src/misc_conversion.c:71
+msgid "Transferred"
+msgstr "Transféré"
+
+#: ../src/misc_conversion.c:72
+msgid "File Size"
+msgstr "Taille du fichier"
+
+#: ../src/misc_conversion.c:73
+msgid "Play Time"
+msgstr "Durée"
+
+#. 20
+#: ../src/misc_conversion.c:80
+msgid "Date played"
+msgstr "Dernière fois joué"
+
+#: ../src/misc_conversion.c:82
+msgid "Volume"
+msgstr "Volume"
+
+#: ../src/misc_conversion.c:83
+msgid "Soundcheck"
+msgstr "Contrôle du son"
+
+#. 25
+#: ../src/misc_conversion.c:85
+msgid "CD Nr"
+msgstr "N° de CD"
+
+#: ../src/misc_conversion.c:88
+msgid "Category"
+msgstr "Catégorie"
+
+#: ../src/misc_conversion.c:89
+msgid "Description"
+msgstr "Description"
+
+#. 30
+#: ../src/misc_conversion.c:90
+msgid "Podcast URL"
+msgstr "URL du podcast"
+
+#: ../src/misc_conversion.c:91
+msgid "Podcast RSS"
+msgstr "RSS du podcast"
+
+#: ../src/misc_conversion.c:92
+msgid "Subtitle"
+msgstr "Sous-titre"
+
+#: ../src/misc_conversion.c:93
+msgid "Date released"
+msgstr "Date de sortie"
+
+#: ../src/misc_conversion.c:94
+msgid "Checked"
+msgstr "Coché"
+
+#. 35
+#: ../src/misc_conversion.c:95
+msgid "Start time"
+msgstr "Heure de début"
+
+#: ../src/misc_conversion.c:96
+msgid "Stop time"
+msgstr "Heure de fin"
+
+#: ../src/misc_conversion.c:97
+msgid "Remember Playback Position"
+msgstr "Se souvenir de la position de lecture"
+
+#: ../src/misc_conversion.c:98
+msgid "Skip when Shuffling"
+msgstr "Sauter en mode aléatoire"
+
+#: ../src/misc_conversion.c:99
+msgid "Artwork Path"
+msgstr "Chemin de la pochette"
+
+#. 40
+#: ../src/misc_conversion.c:100
+msgid "Media Type"
+msgstr "Type de média"
+
+#: ../src/misc_conversion.c:102
+msgid "TV Episode"
+msgstr "Épisode télé"
+
+#: ../src/misc_conversion.c:103
+msgid "TV Network"
+msgstr "Réseau câblé"
+
+#: ../src/misc_conversion.c:104
+msgid "Season Nr"
+msgstr "N° de saison"
+
+#. 45
+#: ../src/misc_conversion.c:105
+msgid "Episode Nr"
+msgstr "N° d'épisode"
+
+#: ../src/misc_conversion.c:106
+msgid "Album Artist"
+msgstr "Artiste de l'album"
+
+#: ../src/misc_conversion.c:107
+msgid "Sort Artist"
+msgstr "Trier par Artiste"
+
+#: ../src/misc_conversion.c:108
+msgid "Sort Title"
+msgstr "Trier par Titre"
+
+#: ../src/misc_conversion.c:109
+msgid "Sort Album"
+msgstr "Trier par Album"
+
+#. 50
+#: ../src/misc_conversion.c:110
+msgid "Sort Album Artist"
+msgstr "Trier par Artiste de l'album"
+
+#: ../src/misc_conversion.c:111
+msgid "Sort Composer"
+msgstr "Trier par Compositeur"
+
+#: ../src/misc_conversion.c:112
+msgid "Sort TV Show"
+msgstr "Trier les Émissions télé"
+
+#: ../src/misc_conversion.c:113
+msgid "Gapless Track Flag"
+msgstr ""
+
+#: ../src/misc_conversion.c:126
+msgid "Name of file on PC, if available"
+msgstr "Nom du fichier sur le PC, si disponible"
+
+#: ../src/misc_conversion.c:127
+msgid "Name of file on the iPod"
+msgstr "Nom du fichier sur l'iPod"
+
+#. 10
+#: ../src/misc_conversion.c:129
+msgid "Track Nr. and total number of tracks on CD"
+msgstr "N° de morceau et nombre total de morceaux du CD"
+
+#: ../src/misc_conversion.c:130
+msgid "Whether the file has already been transferred to the iPod or not"
+msgstr "Fichier déjà transféré sur l'iPod ou non"
+
+#: ../src/misc_conversion.c:136
+msgid "Beats per minute"
+msgstr "Battement Par Minute"
+
+#: ../src/misc_conversion.c:137
+msgid "Number of times the track has been played"
+msgstr "Nombre de fois où le fichier a été joué"
+
+#: ../src/misc_conversion.c:138
+msgid "Star rating from 0 to 5"
+msgstr "Notation en étoiles de 0 à 5"
+
+#: ../src/misc_conversion.c:139
+msgid "Date and time track has been added"
+msgstr "Date et heure de l'ajout du morceau"
+
+#. 20
+#: ../src/misc_conversion.c:140
+msgid "Date and time track has last been played"
+msgstr "La dernière fois que le fichier a été joué"
+
+#: ../src/misc_conversion.c:141
+msgid "Date and time track has last been modified"
+msgstr "La dernière fois que le fichier a été modifié"
+
+#: ../src/misc_conversion.c:142
+msgid "Manual volume adjust"
+msgstr "Ajustement manuel du volume"
+
+#: ../src/misc_conversion.c:143
+msgid ""
+"Volume adjust in dB (replay gain) -- you need to activate 'soundcheck' on "
+"the iPod"
+msgstr ""
+"Ajustement du volume en dB (replay gain) -- vous devez activer « Contrôle du "
+"son » sur l'iPod"
+
+#. 25
+#: ../src/misc_conversion.c:146
+msgid "CD Nr. and total number of CDS in set"
+msgstr "N° de CD et nombre total de CD"
+
+#: ../src/misc_conversion.c:149
+msgid ""
+"The category (e.g. 'Technology' or 'Music') where the podcast was located."
+msgstr ""
+"La catégorie (par ex. « Technologie » ou « Musique ») où se situe le podcast."
+
+#: ../src/misc_conversion.c:150
+msgid "Accessible by selecting the center button on the iPod."
+msgstr "Accessible en choisissant le bouton central de l'iPod."
+
+#: ../src/misc_conversion.c:154
+msgid "Release date (for podcasts displayed next to the title on the iPod)"
+msgstr "Date de sortie (pour les podcasts affiché à côté du titre sur l'iPod)"
+
+#. 50
+#: ../src/misc_conversion.c:168 ../src/misc_conversion.c:169
+#: ../src/misc_conversion.c:170 ../src/misc_conversion.c:171
+#: ../src/misc_conversion.c:172 ../src/misc_conversion.c:173
+msgid "Used for sorting on the iPod"
+msgstr "Utilisé pour trier sur l'iPod"
+
+#: ../src/misc_conversion.c:735
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the file scheme"
+msgstr "L'URI « %s » n'est pas une URI absolue utilisant le schéma de fichier"
+
+#: ../src/misc_conversion.c:745
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "L'URI de fichier local « %s » ne peut pas inclure un '#'"
+
+#: ../src/misc_conversion.c:762
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "L'URI « %s » est invalide"
+
+#: ../src/misc_conversion.c:774
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Le nom d'hôte de l'URI « %s » est invalide"
+
+#: ../src/misc_conversion.c:790
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "L'URI « %s » contient des caractères d'échappement invalides"
+
+#: ../src/misc_playlist.c:67 ../src/misc_playlist.c:94
+#: ../src/misc_playlist.c:429
+msgid "Please enter a name for the new playlist"
+msgstr "Entrer le nom de la nouvelle liste de lecture"
+
+#: ../src/misc_playlist.c:154
+msgid "AR:"
+msgstr "AR :"
+
+#: ../src/misc_playlist.c:157
+msgid "AL:"
+msgstr "AL :"
+
+#: ../src/misc_playlist.c:160
+msgid "GE:"
+msgstr "GE :"
+
+#: ../src/misc_playlist.c:163
+msgid "CO:"
+msgstr "CO :"
+
+#: ../src/misc_playlist.c:166
+msgid "YE:"
+msgstr "AN :"
+
+#: ../src/misc_playlist.c:194
+msgid "Unknown"
+msgstr "Inconnu"
+
+#: ../src/misc_playlist.c:272
+#, c-format
+msgid "Random (%d)"
+msgstr "Aléatoirement (%d)"
+
+#: ../src/misc_playlist.c:297
+msgid ""
+"Auto Store of track view disabled.\n"
+"\n"
+msgstr ""
+"Mémorisation automatique de la vue désactivée.\n"
+"\n"
+
+#: ../src/misc_playlist.c:356
+msgid "Not Listed"
+msgstr "Jamais écoutés"
+
+#: ../src/misc_playlist.c:406
+#, c-format
+msgid "Created playlist '%s' with %d track."
+msgid_plural "Created playlist '%s' with %d tracks."
+msgstr[0] "Liste de lecture « %s » créée avec %d morceau."
+msgstr[1] "Liste de lecture « %s » créée avec %d morceaux."
+
+#. n==0
+#: ../src/misc_playlist.c:417
+msgid "No tracks available, playlist not created"
+msgstr "Aucun morceau disponible, liste de lecture non créée"
+
+#: ../src/misc_playlist.c:543
+#, c-format
+msgid "Most Listened (%d)"
+msgstr "Les plus écoutés (%d)"
+
+#: ../src/misc_playlist.c:584
+#, c-format
+msgid "Never Listened"
+msgstr "Jamais écoutés"
+
+#: ../src/misc_playlist.c:624
+#, c-format
+msgid "Best Rated (%d)"
+msgstr "Mieux notés (%d)"
+
+#: ../src/misc_playlist.c:666
+msgid "Unrated tracks"
+msgstr "Morceaux non notés"
+
+#: ../src/misc_playlist.c:671
+#, c-format
+msgid "Rated %d"
+msgstr "Notés %d"
+
+#: ../src/misc_playlist.c:714
+#, c-format
+msgid "Recent (%d)"
+msgstr "Récents (%d)"
+
+#: ../src/misc_playlist.c:753
+msgid "Last Time"
+msgstr "Dernière fois"
+
+#: ../src/misc_playlist.c:844
+msgid "Removal of dangling tracks with no files on PC was canceled."
+msgstr ""
+"La suppression des morceaux fictifs sans fichier correspondant sur le PC a "
+"été annulée."
+
+#: ../src/misc_playlist.c:854
+msgid "Handling of dangling tracks with files on PC was canceled."
+msgstr ""
+"La récupération des morceaux fictifs à partir des fichiers du PC a été "
+"annulée."
+
+#: ../src/misc_playlist.c:882
+msgid "Dangling tracks with no files on PC were removed."
+msgstr ""
+"Les morceaux fictifs sans fichier correspondant sur le PC ont été supprimés."
+
+#: ../src/misc_playlist.c:943
+msgid "Dangling tracks with files on PC were handled."
+msgstr ""
+"Les morceaux fictifs avec leur fichier correspondant sur le PC ont été "
+"récupérés."
+
+#: ../src/misc_playlist.c:976
+msgid "Track"
+msgstr "Morceau"
+
+#: ../src/misc_playlist.c:1019
+msgid ""
+"You did not import the existing iTunesDB. This is most likely incorrect and "
+"will result in the loss of the existing database.\n"
+"\n"
+"Press 'OK' if you want to proceed anyhow or 'Cancel' to abort. If you "
+"cancel, you can import the existing database before calling this function "
+"again.\n"
+msgstr ""
+"Vous n'avez pas importé la base iTunesDB existante. C'est souvent une erreur "
+"et cela résultera à la perte de la base déjà existante.\n"
+"\n"
+"Appuyer sur «OK» pour continuer ou «Annuler» pour interrompre. Si vous "
+"annulez, vous pouvez importer la base existante avant d'appeler de nouveau "
+"cette fonction.\n"
+
+#: ../src/misc_playlist.c:1033
+msgid "Creating a tree of known files"
+msgstr "Création de l'arborescence des fichiers reconnus"
+
+#: ../src/misc_playlist.c:1077
+msgid "Checking iPOD files against known files in DB"
+msgstr ""
+"Contrôle des fichiers sur l'iPod par rapport à ceux de la base iTunesDB"
+
+#: ../src/misc_playlist.c:1120
+msgid "Orphaned"
+msgstr "Orphelin"
+
+#: ../src/misc_playlist.c:1147
+#, c-format
+msgid ""
+"The following orphaned file had already been added to the iPod again. It "
+"will be removed with the next sync:\n"
+"%s\n"
+"\n"
+msgstr ""
+"Le fichier orphelin suivant a déjà été ajouté à l'iPod. Il sera supprimé à "
+"la prochaine synchronisation :\n"
+"%s\n"
+"\n"
+
+#: ../src/misc_playlist.c:1175
+#, c-format
+msgid "Found %d orphaned and %d dangling files. Processing..."
+msgstr "%d orphelins et %d morceaux fictifs. Traitement en cours …"
+
+#: ../src/misc_playlist.c:1199
+#, c-format
+msgid ""
+"The following dangling track has a file on PC.\n"
+"Press OK to have them transfered from the file on next Sync, CANCEL to leave "
+"it as is."
+msgid_plural ""
+"The following %d dangling tracks have files on PC.\n"
+"Press OK to have them transfered from the files on next Sync, CANCEL to "
+"leave them as is."
+msgstr[0] ""
+"Le morceau fictif suivant a son fichier correspondant sur le PC.\n"
+"Choisissez OK pour le transférer à la prochaine synchro, Annuler pour "
+"laisser tel quel."
+msgstr[1] ""
+"Les %d morceaux fictifs suivant ont leurs fichiers correspondants sur le "
+"PC.\n"
+"Choisissez OK pour les transférer à la prochaine synchro, Annuler pour "
+"laisser tel quel."
+
+#: ../src/misc_playlist.c:1204
+#, c-format
+msgid ""
+"The following dangling track doesn't have file on PC. \n"
+"Press OK to remove it, CANCEL to leave it as is."
+msgid_plural ""
+"The following %d dangling tracks do not have files on PC. \n"
+"Press OK to remove them, CANCEL to leave them. as is"
+msgstr[0] ""
+"Le morceau fictif suivant n'a pas de fichier correspondant sur le PC.\n"
+"Choisissez OK pour le supprimer, Annuler pour le laisser tel quel."
+msgstr[1] ""
+"Les %d morceaux fictifs suivant n'ont pas de fichier correspondant sur le "
+"PC.\n"
+"Choisissez OK pour les supprimer, Annuler pour les laisser tel quel."
+
+#. we want unique window for each
+#. gboolean modal,
+#: ../src/misc_playlist.c:1211
+msgid "Dangling Tracks"
+msgstr "Morceaux fictifs"
+
+#: ../src/misc_playlist.c:1234
+#, c-format
+msgid "Found %d orphaned and %d dangling files. Done."
+msgstr "Trouvé %d orphelins et %d morceaux fictifs. Fini."
+
+#. update for count == 1, 21, 41 ... and for count == n
+#: ../src/misc_track.c:89
+#, c-format
+msgid "Hashed %d of %d track."
+msgid_plural "Hashed %d of %d tracks."
+msgstr[0] "%d morceau traité sur %d."
+msgstr[1] "%d morceaux traités sur %d."
+
+# y, c-format
+#: ../src/misc_track.c:198
+#, c-format
+msgid "The following duplicate track has been removed."
+msgid_plural "The following %d duplicate tracks have been removed."
+msgstr[0] "Le morceau suivant est en double et a été supprimé."
+msgstr[1] "Les %d morceaux suivants sont en double et ont été supprimés."
+
+#: ../src/misc_track.c:205
+#, c-format
+msgid ""
+"The following duplicate track has not been added to the master play list."
+msgid_plural ""
+"The following %d duplicate tracks have not been added to the master play "
+"list."
+msgstr[0] ""
+"Le morceau (doublon) n'a pas été ajouté à la liste de lecture principale."
+msgstr[1] ""
+"Les %d morceaux (doublons) n'ont pas été ajoutés à la liste de lecture "
+"principale."
+
+#. gint id,
+#. gboolean modal,
+#: ../src/misc_track.c:212
+msgid "Duplicate detection"
+msgstr "Détection de doublon"
+
+#: ../src/misc_track.c:1339
+msgid "Local Database"
+msgstr "Base de données locale"
+
+#. artwork is set
+#: ../src/misc_track.c:1350
+msgid "Embedded or filename was lost"
+msgstr "nom de fichier perdu"
+
+#: ../src/misc_track.c:1354
+msgid "Artwork not set"
+msgstr "Pochette non renseigné"
+
+#: ../src/misc_track.c:1816
+#, c-format
+msgid "Could not find source file for '%s'. Track not copied."
+msgstr "Impossible de trouver le fichier pour « %s ». Morceau pas copié."
+
+#: ../src/misc_track.c:2052
+#, c-format
+msgid "drag and drop: ignored '%s'\n"
+msgstr "Glisser/déposer : « %s » ignoré\n"
+
+#: ../src/mp3file.c:1336
+#, c-format
+msgid "Error setting ID3 field: %s\n"
+msgstr "Erreur en remplissant le champ ID3 : %s\n"
+
+#: ../src/mp3file.c:1360 ../src/mp3file.c:1453 ../src/mp3file.c:1608
+#: ../src/mp3file.c:2733
+#, c-format
+msgid "ERROR while opening file: '%s' (%s).\n"
+msgstr "Erreur à l'ouverture du fichier : « %s » (%s).\n"
+
+#: ../src/mp3file.c:1688
+#, c-format
+msgid "ERROR while writing tag to file: '%s' (%s).\n"
+msgstr "ERREUR à l'écriture de l'attribut dans le fichier : « %s » (%s).\n"
+
+#. Tracks with zero play length are ignored by iPod...
+#: ../src/mp3file.c:2770
+#, c-format
+msgid "File \"%s\" has zero play length. Ignoring.\n"
+msgstr "Le fichier « %s » à une durée de zéro. Ignoré.\n"
+
+#: ../src/mp4file.c:243 ../src/mp4file.c:404
+#, c-format
+msgid "'%s' does not appear to be a mp4 audio or video file.\n"
+msgstr "« %s » n'est pas un fichier audio ou vidéo mp4.\n"
+
+#: ../src/mp4file.c:253 ../src/mp4file.c:414
+#, c-format
+msgid "Could not open '%s' for reading, or file is not an mp4 file.\n"
+msgstr "Ne peut pas lire le fichier « %s » ou n'est pas un fichier mp4.\n"
+
+#: ../src/mp4file.c:529
+#, c-format
+msgid "'%s' does not appear to be a mp4 audio file.\n"
+msgstr "« %s » n'est pas un fichier audio mp4.\n"
+
+#: ../src/mp4file.c:540
+#, c-format
+msgid "Could not open '%s' for writing, or file is not an mp4 file.\n"
+msgstr "Ne peut pas écrire le fichier « %s » ou n'est pas un fichier mp4.\n"
+
+#: ../src/mp4file.c:553
+#, c-format
+msgid ""
+"Import of '%s' failed: m4a/m4p/m4b not supported without the mp4v2 library. "
+"You must compile the gtkpod source together with the mp4v2 library.\n"
+msgstr ""
+"Échec de l'import de « %s » : pas de support des formats m4a/m4p. Vous devez "
+"compiler gtkpod avec la bibliothèque mp4v2.\n"
+
+#: ../src/mp4file.c:559
+#, c-format
+msgid ""
+"m4a/m4p/m4b metadata update for '%s' failed: m4a/m4p/m4b not supported "
+"without the mp4v2 library. You must compile the gtkpod source together with "
+"the mp4v2 library.\n"
+msgstr ""
+"Échec de la mise à jour des données m4a/m4p pour « %s » : pas de support des "
+"formats m4a/m4p. Vous devez compiler gtkpod avec la bibliothèque mp4v2.\n"
+
+#: ../src/mp4file.c:565
+#, c-format
+msgid ""
+"m4a/m4p/m4b soundcheck update for '%s' failed: m4a/m4p/m4b not supported "
+"without the mp4v2 library. You must compile the gtkpod source together with "
+"the mp4v2 library.\n"
+msgstr ""
+"Échec du contrôle du son m4a/m4p pour « %s » : pas de support des formats "
+"m4a/m4p. Vous devez compiler gtkpod avec la bibliothèque mp4v2.\n"
+
+#: ../src/oggfile.c:73
+#, c-format
+msgid "'%s' does not appear to be an ogg audio file.\n"
+msgstr "« %s » n'est pas un fichier audio ogg.\n"
+
+#: ../src/oggfile.c:154
+#, c-format
+msgid ""
+"Import of '%s' failed: ogg not supported without the ogg library. You must "
+"compile the gtkpod source together with the ogg library.\n"
+msgstr ""
+"Échec de l'import de « %s » : pas de support du format ogg. Vous devez "
+"compiler gtkpod avec la bibliothèque ogg.\n"
+
+#: ../src/oggfile.c:160
+#, c-format
+msgid ""
+"ogg metadata update for '%s' failed: ogg not supported without the ogg "
+"library. You must compile the gtkpod source together with the ogg library.\n"
+msgstr ""
+"Échec de la mise à jour des données ogg pour « %s » : pas de support du "
+"format ogg. Vous devez compiler gtkpod avec la bibliothèque ogg.\n"
+
+#: ../src/prefs.c:357
+#, c-format
+msgid "gtkpod version %s usage:\n"
+msgstr "gtkpod version %s utilisation :\n"
+
+#: ../src/prefs.c:358
+msgid "  -h, --help:   display this message\n"
+msgstr "  -h, --help :   affiche ce message\n"
+
+#: ../src/prefs.c:359
+msgid "  -p <file>:    increment playcount for file by one\n"
+msgstr "  -p <fichier> : incrémente le compteur de lecture du fichier\n"
+
+#: ../src/prefs.c:360
+msgid "  --hash <file>:print gtkpod hash for file\n"
+msgstr "  -- hash <fichier> : affiche la valeur de hachage pour les fichiers\n"
+
+#: ../src/prefs.c:361
+msgid "  -m path:      define the mountpoint of your iPod\n"
+msgstr "  -m chemin :    définit le point de montage de votre iPod\n"
+
+#: ../src/prefs.c:362
+msgid "  --mountpoint: same as '-m'.\n"
+msgstr "  --mountpoint : identique à « -m ».\n"
+
+#: ../src/prefs.c:363
+msgid "  -a:           import database automatically after start.\n"
+msgstr ""
+"  -a :           importe les données de l'iPod automatiquement au "
+"démarrage.\n"
+
+#: ../src/prefs.c:364
+msgid "  --auto:       same as '-a'.\n"
+msgstr "  --auto :       identique à « -a ».\n"
+
+#: ../src/prefs.c:561
+#, c-format
+msgid "Couldn't create ~/.gtkpod\n"
+msgstr "Impossible de créer « ~/.gtkpod »\n"
+
+#: ../src/prefs_window.c:133
+msgid "Please select command for 'Play Now'"
+msgstr "Ligne de commande pour « Jouer maintenant »"
+
+#: ../src/prefs_window.c:134
+msgid "Please select command for 'Enqueue'"
+msgstr "Ligne de commande pour « Mettre dans la file d'attente »"
+
+#: ../src/prefs_window.c:135
+msgid "Please select the mp3gain executable"
+msgstr "Chemin de l'exécutable « mp3gain »"
+
+#: ../src/prefs_window.c:136
+msgid "Please select the aacgain executable"
+msgstr "Chemin de l'exécutable « aacgain »"
+
+#: ../src/prefs_window.c:137
+msgid "Select the mserv music root directory"
+msgstr "Sélectionner le répertoire racine de musique mserv"
+
+#: ../src/prefs_window.c:138
+msgid "Select the mserv trackinfo root directory"
+msgstr "Sélectionner le répertoire racine d'infos mserv"
+
+#: ../src/prefs_window.c:139
+msgid "Select the ogg/vorbis converter command"
+msgstr "Choisir la commande pour le convertisseur ogg/vorbis"
+
+#: ../src/prefs_window.c:140
+msgid "Select the flac converter command"
+msgstr "Ligne de commande pour la conversion FLAC"
+
+#: ../src/prefs_window.c:141
+msgid "Select the m4a converter command."
+msgstr "Ligne de commande pour la conversion M4a"
+
+#: ../src/prefs_window.c:142
+msgid "Select the mp3 converter command."
+msgstr "Ligne de commande pour la conversion MP3"
+
+#: ../src/prefs_window.c:143
+msgid "Select the wav converter command."
+msgstr "Ligne de commande pour la conversion Wav"
+
+#: ../src/prefs_window.c:201 ../src/repository.c:662
+#, c-format
+msgid ""
+"<i>Have a look at the scripts provided in '%s'. If you write a new script or "
+"improve an existing one, please send it to jcsjcs at users.sourceforge.net "
+"for inclusion into the next release.</i>"
+msgstr ""
+"<i>Des scripts d'exemple sont présents dans le répertoire « %s ». Si vous "
+"écrivez un nouveau script, veuillez s'il vous plaît l'envoyer à jcsjcs at "
+"users.sourceforge.net afin qu'il soit inclus dans les prochaines versions de "
+"gtkpod.</i>"
+
+#: ../src/prefs_window.c:1205 ../src/prefs_window.c:1223
+msgid "Preferences not updated"
+msgstr "Préférences non mises à jour"
+
+#: ../src/prefs_window.c:1232
+msgid "Preferences applied"
+msgstr "Préférences mises à jour"
+
+#: ../src/repository.c:573 ../src/repository.c:2395
+msgid "Set backup file"
+msgstr "Fichier de sauvegarde"
+
+#: ../src/repository.c:612
+msgid "Select directory for synchronization"
+msgstr "Sélectionner un répertoire pour la synchronisation"
+
+#: ../src/repository.c:638
+msgid "Please select command to sync contacts"
+msgstr "Ligne de commande pour synchroniser les contacts"
+
+#: ../src/repository.c:644
+msgid "Please select command to sync calendar"
+msgstr "Ligne de commande pour synchroniser le calendrier"
+
+#: ../src/repository.c:650
+msgid "Please select command to sync notes"
+msgstr "Ligne de commande pour synchroniser les notes"
+
+#: ../src/repository.c:729
+msgid "Smart playlist updated."
+msgstr "Liste Intelligente mise à jour"
+
+#: ../src/repository.c:1190
+msgid "Podcasts Repository"
+msgstr "Dépot podcasts"
+
+#: ../src/repository.c:1194
+msgid "Local Repository"
+msgstr "Dépot local"
+
+#: ../src/repository.c:1348
+msgid "Master Playlist"
+msgstr "Liste de lecture principale"
+
+#: ../src/repository.c:1352
+msgid "Podcasts Playlist"
+msgstr "Liste de lecture Podcasts"
+
+#: ../src/repository.c:1360
+msgid "Regular Playlist"
+msgstr "Liste de lecture standard"
+
+#: ../src/repository.c:2423
+msgid "Set local repository file"
+msgstr "Fichier de dépot local"
+
+#: ../src/repository.c:2522
+msgid "New Repository"
+msgstr "Nouveau dépot"
+
+#: ../src/sha1.c:186
+msgid "Hashed file is 0 bytes long\n"
+msgstr "Le fichier est vide\n"
+
+#: ../src/sha1.c:239
+#, c-format
+msgid "Could not open '%s' to calculate SHA1 checksum: %s\n"
+msgstr ""
+"Impossible d'ouvrir « %s » pour calculer la somme de contrôle SHA1 : %s\n"
+
+#: ../src/syncdir.c:237
+#, c-format
+msgid "Sync summary for %s/%s\n"
+msgstr "Résumé de synchronisation pour %s/%s\n"
+
+#: ../src/syncdir.c:246
+msgid "The following track has been added or updated:\n"
+msgid_plural "The following tracks have been added or updated:\n"
+msgstr[0] "Le morceau suivant a été mis à jour ou ajouté :\n"
+msgstr[1] "Les morceaux suivants ont été mis à jour ou ajoutés :\n"
+
+#: ../src/syncdir.c:255
+msgid "The following track has been completely removed from the iPod:\n"
+msgid_plural ""
+"The following tracks have been completely removed from the iPod:\n"
+msgstr[0] "Le morceau suivant a été supprimé de l'iPod :\n"
+msgstr[1] "Les morceaux suivants ont été supprimés de l'iPod :\n"
+
+# y, c-format
+#: ../src/syncdir.c:264
+msgid "The following track has been removed from the repository:\n"
+msgid_plural "The following tracks have been removed from the repository:\n"
+msgstr[0] "Le morceau suivant a été supprimé du dépôt :\n"
+msgstr[1] "Les morceaux suivants ont été supprimés du dépôt :\n"
+
+#: ../src/syncdir.c:271
+msgid "The following track has been removed from the playlist:\n"
+msgid_plural "The following tracks have been removed from the playlist:\n"
+msgstr[0] "Le morceau suivant a été supprimé de la liste :\n"
+msgstr[1] "Les morceaux suivants ont été supprimés de la liste :\n"
+
+#: ../src/syncdir.c:277
+msgid "Nothing was changed.\n"
+msgstr "Rien de changé.\n"
+
+#: ../src/syncdir.c:282
+msgid "Sync summary"
+msgstr "Résumé de synchronisation"
+
+#: ../src/tools.c:118
+#, c-format
+msgid ""
+"Could not find '%s'.\n"
+"Please specifiy the exact path in the Tools section of the preference dialog "
+"or install the program if it is not installed on your system.\n"
+"\n"
+msgstr ""
+"Impossible de trouver le fichier « %s ».\n"
+"Veuillez préciser le chemin exact dans l'onglet « Outils » de la fenêtre des "
+"préférences ou installez le programme sur votre système si nécessaire.\n"
+"\n"
+
+#: ../src/tools.c:203
+#, c-format
+msgid ""
+"Execution of '%s' failed.\n"
+"\n"
+msgstr ""
+"Échec de l'exécution de « %s ».\n"
+"\n"
+
+#: ../src/tools.c:248
+#, c-format
+msgid ""
+"Did not normalize '%s'. Set mp3gain path in the Tools section of the "
+"preferences.\n"
+msgstr ""
+"Impossible de normaliser le fichier « %s ».\n"
+"Veuillez donner le chemin exact de mp3gain dans l'onglet « Outils » de la "
+"fenêtre des préférences.\n"
+
+#: ../src/tools.c:258
+#, c-format
+msgid ""
+"Did not normalize '%s'. Set aacgain path in the Tools section of the "
+"preferences.\n"
+msgstr ""
+"Impossible de normaliser le fichier « %s ».\n"
+"Veuillez donner le chemin exact de aacgain dans l'onglet « Outils » de la "
+"fenêtre des préférences.\n"
+
+#: ../src/tools.c:385
+msgid "Normalizing..."
+msgstr "Normalisation …"
+
+#: ../src/tools.c:435
+#, c-format
+msgid "%s - %s"
+msgstr "%s - %s"
+
+#: ../src/tools.c:461
+msgid "Aborting..."
+msgstr "Annulation …"
+
+#: ../src/tools.c:465
+msgid "Will abort after current mp3gain process ends."
+msgstr "S'arrêtera après la fin du traitement courant de mp3gain."
+
+#: ../src/tools.c:491
+#, c-format
+msgid ""
+"'%s-%s' (%s) could not be normalized.\n"
+"\n"
+msgstr ""
+"« %s-%s » (%s) ne peut pas être normalisé.\n"
+"\n"
+
+#: ../src/tools.c:530
+#, c-format
+msgid "Normalized %d of %d tracks."
+msgid_plural "Normalized %d of %d tracks."
+msgstr[0] "%d nouveau morceau normalisé sur %d."
+msgstr[1] "%d nouveaux morceaux normalisés sur %d."
+
+#: ../src/tools.c:633
+msgid ""
+"Please specify the command to be called on the 'Tools' section of the "
+"preferences dialog.\n"
+msgstr ""
+"Veuillez renseigner la commande à appeler dans l'onglet « Outils » de la "
+"fenêtre des préférences.\n"
+
+#: ../src/tools.c:645
+#, c-format
+msgid ""
+"Could not find the command '%s'.\n"
+"\n"
+"Please verify the setting in the 'Tools' section of the preferences dialog.\n"
+"\n"
+msgstr ""
+"Impossible de trouver la commande « %s ».\n"
+"\n"
+"Veuillez contrôler l'onglet « Outils » dans la fenêtre des préférences.\n"
+"\n"
+
+#: ../src/tools.c:687
+#, c-format
+msgid ""
+"'%s' returned the following output:\n"
+"%s\n"
+msgstr ""
+"« %s » a retourné le résultat suivant :\n"
+"%s\n"
+
+#: ../src/tools.c:754
+#, c-format
+msgid "No command set for '%s'"
+msgstr "Aucune commande renseignée pour « %s »"
+
+#: ../src/tools.c:774
+#, c-format
+msgid "Could not find command '%s' specified for '%s'"
+msgstr "Impossible d'exécuter la commande « %s » spécifiée pour « %s »"
+
+#: ../src/wavfile.c:181
+#, c-format
+msgid "%s does not appear to be a supported wav file.\n"
+msgstr "%s ne semble pas être un format wav supporté.\n"
+
+#, fuzzy
+#~ msgid "<b>Resolution:</b>"
+#~ msgstr "<b>Infobulles</b>"
+
+#~ msgid "label"
+#~ msgstr "étiquette"
+
+#~ msgid ""
+#~ "Cannot open '%s' for reading.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Ne peut ouvrir en lecture le fichier « %s ».\n"
+#~ "\n"
+
+#~ msgid "Unable to open '%s' for reading\n"
+#~ msgstr "Impossible d'ouvrir le fichier « %s » en lecture\n"
+
+#~ msgid "Could not open \"iTunesDB.ext\" for reading extended info.\n"
+#~ msgstr ""
+#~ "Ne peut ouvrir le fichier « iTunesDB.ext » pour lire les infos étendues.\n"
+
+#~ msgid "Add _Directory"
+#~ msgstr "Ajouter un _répertoire"
+
+#~ msgid "Dirs"
+#~ msgstr "Répertoires"
+
+#~ msgid "Files"
+#~ msgstr "Fichiers"
+
+#~ msgid "New PL"
+#~ msgstr "Nouvelle liste"
+
+#~ msgid "_About"
+#~ msgstr "A _propos"
+
+#~ msgid "Download Cover"
+#~ msgstr "Télécharger la pochette"
+
+#~ msgid "Find _New"
+#~ msgstr "Trouver des _Nouveaux"
+
+#~ msgid "Set Cover Art from _Web"
+#~ msgstr "Pochette depuis le _Web"
+
+#~ msgid "_Previous"
+#~ msgstr "_Précédent"
+
+#~ msgid "Find Cover on Web"
+#~ msgstr "Chercher la pochette sur le web"
+
+#, fuzzy
+#~ msgid "Failed to retrieve any images"
+#~ msgstr "Impossible d'écrire la pochette : « %s »\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "This function is not available. You must compile the gtkpod source "
+#~ "together with the curl library."
+#~ msgstr ""
+#~ "Échec de l'import de « %s » : pas de support du format ogg. Vous devez "
+#~ "compiler gtkpod avec la bibliothèque ogg.\n"

Added: trunk/po/he.po
===================================================================
--- trunk/po/he.po	                        (rev 0)
+++ trunk/po/he.po	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,5284 @@
+# translation of gtkpod.po to HEBREW
+# This file is distributed under the same license as the gtkpod package
+# Assaf Gillat <gillata at gmail.com>, 2005/7.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gtkpod\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-12-13 18:36-0500\n"
+"PO-Revision-Date: 2007-12-16 22:15+0200\n"
+"Last-Translator: Assaf Gillat <gillata at gmail.com>\n"
+"Language-Team: HEBREW <kde-il at yahoogroups.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: KBabel 1.9.1\n"
+"X-Poedit-Language: Hebrew\n"
+"X-Poedit-Country: ISRAEL\n"
+
+#: ../data/gtkpod.desktop.in.h:1
+msgid "GtkPod"
+msgstr "GtkPod"
+
+#: ../data/gtkpod.desktop.in.h:2
+msgid "Manage music and video on an Apple iPod"
+msgstr "ניהול מוסיקה ווידאו על נגן ה־iPod של Apple"
+
+#: ../data/gtkpod.desktop.in.h:3
+msgid "iPod Manager"
+msgstr "מנהל ה־iPod"
+
+#: ../data/gtkpod.glade.h:1
+msgid " "
+msgstr " "
+
+#: ../data/gtkpod.glade.h:2
+msgid "    "
+msgstr "    "
+
+#: ../data/gtkpod.glade.h:3
+msgid "     "
+msgstr "     "
+
+#: ../data/gtkpod.glade.h:4
+msgid "      "
+msgstr "      "
+
+#: ../data/gtkpod.glade.h:5
+msgid "   Sort by:"
+msgstr "   מיין על פי:"
+
+#: ../data/gtkpod.glade.h:6
+msgid " <= cts <= "
+msgstr " <= cts <= "
+
+#: ../data/gtkpod.glade.h:7
+msgid " Logic: "
+msgstr " לוגיקה: "
+
+#: ../data/gtkpod.glade.h:9
+#, no-c-format
+msgid "%A"
+msgstr "%A"
+
+#: ../data/gtkpod.glade.h:10
+msgid "'DD/MM/YYYY HH:MM < d < DD/MM/YYYY HH:MM' or similar. Press 'enter' when finished."
+msgstr "תבנית 'DD/MM/YYYY HH:MM < d < DD/MM/YYYY HH:MM' או דומה. לחץ 'enter' בסיום."
+
+#: ../data/gtkpod.glade.h:11
+msgid "'aacgain' executable:"
+msgstr "קובץ ריצה של 'aacgain':"
+
+#: ../data/gtkpod.glade.h:12
+msgid "'mp3gain' executable:"
+msgstr "קובץ ריצה של 'mp3gain':"
+
+#: ../data/gtkpod.glade.h:13
+msgid "(Checked)"
+msgstr "(מסומן)"
+
+#: ../data/gtkpod.glade.h:14
+msgid "...as icons"
+msgstr "...בתור סמלים"
+
+#: ../data/gtkpod.glade.h:15
+msgid "...as text"
+msgstr "...בתור טקסט"
+
+#: ../data/gtkpod.glade.h:16
+msgid "...both as icons and text"
+msgstr "...ביחד גם סמלים וגם טקסט"
+
+#: ../data/gtkpod.glade.h:17
+msgid "...entry 'All' in sort tab..."
+msgstr "...רשומה 'הכל' בכרטיסיית המיון..."
+
+#: ../data/gtkpod.glade.h:18
+msgid "...master playlist"
+msgstr "...רשימת השמעה ראשית"
+
+#: ../data/gtkpod.glade.h:20
+#, no-c-format
+msgid "../%A.jpg"
+msgstr "../%A.jpg"
+
+#: ../data/gtkpod.glade.h:21
+msgid "0"
+msgstr "0"
+
+#: ../data/gtkpod.glade.h:22
+msgid "1"
+msgstr "1"
+
+#: ../data/gtkpod.glade.h:23
+msgid "2"
+msgstr "2"
+
+#: ../data/gtkpod.glade.h:24
+msgid "3"
+msgstr "3"
+
+#: ../data/gtkpod.glade.h:25
+msgid "4"
+msgstr "4"
+
+#: ../data/gtkpod.glade.h:26
+msgid "5"
+msgstr "5"
+
+#: ../data/gtkpod.glade.h:27
+msgid ":"
+msgstr ":"
+
+#: ../data/gtkpod.glade.h:28
+msgid "<"
+msgstr "<"
+
+#: ../data/gtkpod.glade.h:29
+msgid "<b>Account Information</b>"
+msgstr "<b>מידע חשבון</b>"
+
+#: ../data/gtkpod.glade.h:30
+msgid "<b>Adding/Updating/Syncing</b>"
+msgstr "<b>הוספה/עדכון/סנכרון</b>"
+
+#: ../data/gtkpod.glade.h:31
+msgid "<b>Audioscrobbler</b>"
+msgstr "<b>Audioscrobbler</b>"
+
+#: ../data/gtkpod.glade.h:32
+msgid "<b>Auto-Generated Playlists</b>"
+msgstr "<b>יצירה אוטומטית של רשימות השמעה</b>"
+
+#: ../data/gtkpod.glade.h:33
+msgid "<b>Automatically select...</b>"
+msgstr "<b>בחירה אוטומטית...</b>"
+
+#: ../data/gtkpod.glade.h:34
+msgid "<b>Calendar/Contacts/Notes</b>"
+msgstr "<b>יומן/אנשי קשר/תזכורות</b>"
+
+#: ../data/gtkpod.glade.h:35
+msgid "<b>Coverart</b>"
+msgstr "<b>עטיפות</b>"
+
+#: ../data/gtkpod.glade.h:36
+msgid "<b>Delete Confirmation</b>"
+msgstr "<b>ווידוא מחיקה</b>"
+
+#: ../data/gtkpod.glade.h:37
+msgid "<b>Examples</b>"
+msgstr "<b>דוגמאות</b>"
+
+#: ../data/gtkpod.glade.h:38
+msgid "<b>Ignore Frequent Words</b>"
+msgstr "<b>התעלם ממילים תכופות</b>"
+
+#: ../data/gtkpod.glade.h:39
+msgid "<b>Misc</b>"
+msgstr "<b>אחר</b>"
+
+#: ../data/gtkpod.glade.h:40
+msgid "<b>Mountpoint and individual repository/playlist options</b>"
+msgstr "<b>אפשרויות עגינה ומאגר/רשימת ניגון פרטנית</b>"
+
+#: ../data/gtkpod.glade.h:41
+msgid "<b>On-the-fly Conversion</b>"
+msgstr "<b>המרה על המקום</b>"
+
+#: ../data/gtkpod.glade.h:42
+msgid "<b>Play</b>"
+msgstr "<b>נגן</b>"
+
+#: ../data/gtkpod.glade.h:43
+msgid "<b>Playlists</b>"
+msgstr "<b>רשימות השמעה</b>"
+
+#: ../data/gtkpod.glade.h:44
+msgid "<b>Please select mountpoint and your iPod model</b>"
+msgstr "<b>אנא בחר נקודת עגינה ואת הדגם של ה־iPod</b>"
+
+#: ../data/gtkpod.glade.h:45
+msgid "<b>Repositories</b>"
+msgstr "<b>מאגרים</b>"
+
+#: ../data/gtkpod.glade.h:46
+msgid "<b>Sort Order</b>"
+msgstr "<b>סדר מיון</b>"
+
+#: ../data/gtkpod.glade.h:47
+msgid "<b>Sort Tabs</b>"
+msgstr "<b>כרטיסיות מיון</b>"
+
+#: ../data/gtkpod.glade.h:48
+msgid "<b>Sync</b>"
+msgstr "<b>סנכרון</b>"
+
+#: ../data/gtkpod.glade.h:49
+msgid "<b>Synchronization</b>"
+msgstr "<b>סנכרון</b>"
+
+#: ../data/gtkpod.glade.h:50
+msgid "<b>Tag Reading</b>"
+msgstr "<b>קריאת תגיות</b>"
+
+#: ../data/gtkpod.glade.h:51
+msgid "<b>Toolbar</b>"
+msgstr "<b>סרגל כלים</b>"
+
+#: ../data/gtkpod.glade.h:52
+msgid "<b>Tooltips</b>"
+msgstr "<b>תוויות מידע</b>"
+
+#: ../data/gtkpod.glade.h:53
+msgid "<b>Track Attributes</b>"
+msgstr "<b>מאפייני רצועה</b>"
+
+#: ../data/gtkpod.glade.h:54
+msgid "<b>Track Editing</b>"
+msgstr "<b>עריכת רצועות</b>"
+
+#: ../data/gtkpod.glade.h:55
+msgid "<b>Volume Normalization</b>"
+msgstr "<b>נרמול עוצמת קול</b>"
+
+#: ../data/gtkpod.glade.h:56
+msgid "<b>mserv</b>"
+msgstr "<b>mserv</b>"
+
+#: ../data/gtkpod.glade.h:57
+msgid ">"
+msgstr ">"
+
+#: ../data/gtkpod.glade.h:58
+msgid "About gtkpod"
+msgstr "אודות gtkpod"
+
+#: ../data/gtkpod.glade.h:59
+msgid "Add Directories Recursively"
+msgstr "הוספת תיקיות רקורסיבית"
+
+#: ../data/gtkpod.glade.h:60
+msgid "Add Files"
+msgstr "הוספת קבצים"
+
+#: ../data/gtkpod.glade.h:61
+msgid "Add Files or Directories"
+msgstr "הוספת קבצים או תיקיות"
+
+#: ../data/gtkpod.glade.h:62
+msgid "Add Fol_der"
+msgstr "הוספת _תיקייה"
+
+#: ../data/gtkpod.glade.h:63
+msgid "Add Folder"
+msgstr "הוספת תיקייה"
+
+#: ../data/gtkpod.glade.h:64
+msgid "Add Image_s"
+msgstr "הוסף _תמונות"
+
+#: ../data/gtkpod.glade.h:65
+msgid "Add Images from a Directory"
+msgstr "הוספת תמונות מתיקייה"
+
+#: ../data/gtkpod.glade.h:66
+msgid "Add Playlist"
+msgstr "הוספת רשימות השמעה"
+
+#: ../data/gtkpod.glade.h:67
+msgid "Add _Files"
+msgstr "הוספת _קבצים"
+
+#: ../data/gtkpod.glade.h:68
+msgid "Add _Playlist"
+msgstr "הוספת _רשימות השמעה"
+
+#: ../data/gtkpod.glade.h:69
+msgid "Add coverart from file using the following template"
+msgstr "הוסף עטיפה מתוך קובץ תוך שימוש בתבנית הבאה"
+
+#: ../data/gtkpod.glade.h:70
+msgid "Add directories recursively"
+msgstr "הוספת תיקיות בצורה רקורסיבית"
+
+#: ../data/gtkpod.glade.h:71
+msgid "Add new repository/iPod"
+msgstr "הוסף מאגר/iPod חדש"
+
+#: ../data/gtkpod.glade.h:72
+msgid "Add playlist from file"
+msgstr "הוספת רשימת השמעה מקובץ"
+
+#: ../data/gtkpod.glade.h:73
+#: ../src/display_sorttabs.c:3247
+#: ../src/display_tracks.c:2103
+msgid "Added"
+msgstr "הוספו"
+
+#: ../data/gtkpod.glade.h:74
+msgid "Advanced Sorting Options"
+msgstr "אפשרויות מיון מתקדמות"
+
+#. 0
+#: ../data/gtkpod.glade.h:75
+#: ../src/display_sorttabs.c:2982
+#: ../src/display_spl.c:84
+#: ../src/misc_conversion.c:60
+msgid "Album"
+msgstr "כותר"
+
+#: ../data/gtkpod.glade.h:76
+msgid "Album Art"
+msgstr "התמונות של האלבום"
+
+#: ../data/gtkpod.glade.h:77
+msgid "All (AND)"
+msgstr "וגם (הכל)"
+
+#: ../data/gtkpod.glade.h:78
+msgid "All Tracks Never Listened To"
+msgstr "כל הרצועות שמעולם לא השמיעו אותן"
+
+#: ../data/gtkpod.glade.h:79
+msgid "All Tracks Played Since Last Time"
+msgstr "כל הרצועות שהושמעו מאז הפעם האחרונה"
+
+#: ../data/gtkpod.glade.h:80
+msgid "All Tracks not Listed in any Playlist"
+msgstr "כל הרצועות שלא מופיעות באף רשימת השמעה"
+
+#: ../data/gtkpod.glade.h:81
+msgid "Also include tracks never played in \"Best Rated\" playlist"
+msgstr "כלול גם רצועות שלעולם לא נוגנו ברשימת השמעה \"הדירוג הכי גבוה\""
+
+#: ../data/gtkpod.glade.h:82
+msgid "Always write ID3v2.4 tags (only applies to MP3)"
+msgstr "כתוב תמיד תגיות ID3v2.4 (תקף רק ל-MP3)"
+
+#: ../data/gtkpod.glade.h:83
+msgid "Any (OR)"
+msgstr "או (כל אחד)"
+
+#: ../data/gtkpod.glade.h:84
+#: ../src/display_sorttabs.c:2979
+#: ../src/display_spl.c:85
+#: ../src/misc_conversion.c:61
+msgid "Artist"
+msgstr "אמן"
+
+#: ../data/gtkpod.glade.h:85
+msgid "Artwork Preview"
+msgstr "תצוגה מקדימה של התמונות"
+
+#: ../data/gtkpod.glade.h:86
+msgid ""
+"As a last resort set the following tags to the\n"
+"filename if they are (still) empty:"
+msgstr ""
+"בתור אפשרות אחרונה קבע את התגיות לשם הקובץ\n"
+"אם הן (עדיין) ריקות:"
+
+#: ../data/gtkpod.glade.h:88
+msgid "Ascending"
+msgstr "עולה"
+
+#: ../data/gtkpod.glade.h:89
+msgid "Auto Store"
+msgstr "שמירה אוטומטית"
+
+#: ../data/gtkpod.glade.h:90
+msgid "Automatically start displaying tracks that match the criteria entered above. If not selected, you must press 'Display' to start displaying."
+msgstr "הצג אוטומטית רצועות שמתאימות לקריטריונים המוכנסים למעלה. אם אפשרות זו לא נבחרה, חובה עליך ללחוץ 'תצוגה' על מנת להראות את הרצועות."
+
+#: ../data/gtkpod.glade.h:91
+msgid "Available:"
+msgstr "זמין:"
+
+#: ../data/gtkpod.glade.h:92
+msgid "Before removing playlists or tracks from a playlist"
+msgstr "לפני הסרת רשימות השמעה או רצועות מרשימת השמעה"
+
+#: ../data/gtkpod.glade.h:93
+msgid "Before removing tracks from the harddisk"
+msgstr "לפני הסרת רצועות מהדיסק הקשיח"
+
+#: ../data/gtkpod.glade.h:94
+msgid "Before removing tracks from the iPod"
+msgstr "לפני הסרת רצועות מה-iPod"
+
+#: ../data/gtkpod.glade.h:95
+msgid "Before removing tracks from the local database"
+msgstr "לפני הסרת רצועות ממסד הנתונים המקומי"
+
+#: ../data/gtkpod.glade.h:96
+msgid "Best Rated Tracks"
+msgstr "הרצועות המדורגות בראש"
+
+#: ../data/gtkpod.glade.h:97
+msgid "Browse"
+msgstr "סייר"
+
+#: ../data/gtkpod.glade.h:98
+msgid "Cache directory:"
+msgstr "תיקיית מטמון"
+
+#: ../data/gtkpod.glade.h:99
+msgid "Calendar"
+msgstr "יומן"
+
+#: ../data/gtkpod.glade.h:100
+msgid "Calendar sync command:"
+msgstr "פקודת סנכרון ליומן:"
+
+#: ../data/gtkpod.glade.h:101
+msgid "Call automatically when synchronizing iTunesDB"
+msgstr "קרא אוטומטית בזמן סנכרון iTunesDB"
+
+#: ../data/gtkpod.glade.h:102
+msgid "Category: "
+msgstr "קטגוריה:"
+
+#: ../data/gtkpod.glade.h:103
+msgid ""
+"Change all tracks\n"
+"simultaneously"
+msgstr ""
+"שנה את כל הרצועות\n"
+"בבת אחת"
+
+#: ../data/gtkpod.glade.h:105
+msgid ""
+"Check before removing photos from a photo album whether\n"
+"they should be deleted from the Photo Database."
+msgstr ""
+"בדוק לפני הסרת תמונות מאלבום התמונות האם\n"
+"הם צריכים להמחק ממסד הנתונים של התמונות."
+
+#: ../data/gtkpod.glade.h:107
+msgid "Check for existing files when copying from iPod."
+msgstr "בדוק קבצים קיימים בזמן העתקה מה-iPod."
+
+#: ../data/gtkpod.glade.h:108
+msgid "Command for 'Enqueue':"
+msgstr "פקודה עבור 'הכנס לתור':"
+
+#: ../data/gtkpod.glade.h:109
+msgid "Command for 'Play now':"
+msgstr "פקודה עבור 'נגן עכשיו':"
+
+#. 5
+#: ../data/gtkpod.glade.h:110
+#: ../src/display_spl.c:97
+#: ../src/misc_conversion.c:65
+msgid "Composer"
+msgstr "יוצר"
+
+#: ../data/gtkpod.glade.h:111
+msgid "Confirm before removing tracks from the iPod or repository"
+msgstr "אשר לפני הסרת רצועות מה-iPod או המאגר"
+
+#: ../data/gtkpod.glade.h:112
+msgid ""
+"Confirm before removing tracks from the iPod or repository\n"
+"when syncing playlists"
+msgstr ""
+"אשר לפני הסרת רצועות מה־iPod או המאגר\n"
+"בזמן סנכרון רשימות ההשמעה"
+
+#: ../data/gtkpod.glade.h:114
+msgid "Confirm lists of directories"
+msgstr "וודא רשימה של תיקיות"
+
+#: ../data/gtkpod.glade.h:115
+msgid "Contacts sync command:"
+msgstr "פקודת סנכרון לאנשי קשר:"
+
+#: ../data/gtkpod.glade.h:116
+msgid "Containing Displayed Tracks"
+msgstr "המכילה רצועות נראות"
+
+#: ../data/gtkpod.glade.h:117
+msgid "Containing Selected Tracks"
+msgstr "המכילה רצועות נבחרות"
+
+#: ../data/gtkpod.glade.h:118
+msgid "Conversion Progress Display"
+msgstr "תצוגת התקדמות עבור המרות"
+
+#: ../data/gtkpod.glade.h:119
+msgid "Cover"
+msgstr "עטיפה"
+
+#: ../data/gtkpod.glade.h:120
+msgid "Create New Playlist"
+msgstr "יצירת רשימת השמעה חדשה"
+
+#: ../data/gtkpod.glade.h:121
+msgid "Create Repository"
+msgstr "צור מאגר"
+
+#: ../data/gtkpod.glade.h:122
+msgid "Create _Playlist File"
+msgstr "יצירת קובץ _רשימת השמעה"
+
+#: ../data/gtkpod.glade.h:123
+msgid "Credits"
+msgstr "קרדיט"
+
+#: ../data/gtkpod.glade.h:124
+msgid "Currently only rating is supported."
+msgstr "נכון לעכשיו רק המדרוג נתמך."
+
+#: ../data/gtkpod.glade.h:125
+msgid "Delete repository"
+msgstr "מחק מהמאגר"
+
+#: ../data/gtkpod.glade.h:126
+msgid ""
+"Delete tracks that are no longer present from the\n"
+"iPod or repository"
+msgstr "מחק רצועות שכבר לא קיימות מה־iPod או המאגר"
+
+#: ../data/gtkpod.glade.h:128
+msgid "Deleted tracks"
+msgstr "רצועות נמחקות"
+
+#: ../data/gtkpod.glade.h:129
+msgid "Descending"
+msgstr "יורד"
+
+#: ../data/gtkpod.glade.h:130
+msgid "Details"
+msgstr "פרטים"
+
+#: ../data/gtkpod.glade.h:132
+#, no-c-format
+msgid "Determines how the string for the info field should be constructed, e.g '%a/%A/%T - %t.mp3' or '%o'.  You can separate several templates by semicolons -- gtkpod will determine which one to use by the filename extension given. Artist: %a, album: %A, composer: %c, title: %t, genre: %G, track nr: %T, CD nr: %C, year: %Y, original filename (requires extended information file): %o, the character '%': %%."
+msgstr ""
+"קובע איך מחרוזת המידע תבנה, לדוגמה:\n"
+"'%a/% A/%T - %t.mp3' or '%ס'\n"
+"אתה יכול להפריד מספר תבניות על ידי נקודה־פסיק. היישום gtkpod יקבע באיזה מהם להשתמש על ידי הסיומת הניתנת.\n"
+"אמן: a%, כותר: A%, יוצר: c%, שם הרצועה: t%, סגנון: G%, מספר רצועה: T%, מספר תקליטור: C%, שנה: Y%, שם מקורי (דרוש מידע מורחב): o%, הסימן '%': %%."
+
+#: ../data/gtkpod.glade.h:134
+#, no-c-format
+msgid "Determines the filename of tracks you copy from the iPod, e.g '%a/%A/%T - %t.mp3' or '%o'.  You can separate several patterns by semicolons -- gtkpod will determine which one to use by the filename extension given. Artist: %a, album: %A, composer: %c, title: %t, genre: %G, track nr: %T, CD nr: %C, year: %Y, original filename (requires extended information file): %o, current playlist: %p, the character '%': %%."
+msgstr ""
+"קובע את שם הרצועה שאותה תעתיק מה-iPod. לדוגמה:\n"
+"'%a/%A/%T - %t.mp3' or '%o'.\n"
+"אתה יכול לציין מספר תבניות מופרדות על ידי נקודה־פסיק. היישום gtkpod יקבע באיזה יעשה שימוש על ידי הסיומת הניתנת.\n"
+"אמן: a%, כותר: A%, יוצר: c%, שם הרצועה: t%, סגנון: G%, מספר רצועה: T%, מספר תקליטור: C%, שנה: Y%, שם מקורי (דרוש מידע מורחב): o%, רשימת ההשמעה הנוכחית: p%, הסימן '%': %%."
+
+#: ../data/gtkpod.glade.h:136
+#, no-c-format
+msgid "Determines the name of the file with the cover art. You can separate several patterns by semicolons which will be tried in order. Artist: %a, album: %A, composer: %c, title: %t, genre: %G, track nr: %T, CD nr: %C, year: %Y, original filename (requires extended information file): %o, original filename without file extension: %O, current playlist: %p, the character '%': %%."
+msgstr "קובע את שם הקובץ עם העטיפה. אתה יכול לציין מספר תבניות מופרדות על ידי פסיקים, שיבוצעו לפי הסדר.אמן: a%, כותר: A%, יוצר: c%, שם הרצועה: t%, סגנון: G%, מספר רצועה: T%, מספר תקליטור: C%, שנה: Y%, שם מקורי (דרוש מידע מורחב): o%, שם מקורי ללא סיומת: %O, רשימת ההשמעה הנוכחית: p%, הסימן '%': %%."
+
+#: ../data/gtkpod.glade.h:137
+msgid "Directories to sync with are determined from the filenames of the tracks in the playlist."
+msgstr "התיקיות לסנכרון נקבעות לפי שמות הקבצים של הרצועות ברשימת ההשמעה."
+
+#: ../data/gtkpod.glade.h:138
+msgid "Display a list of tracks that could actually be updated."
+msgstr "הצג רשימה של רצועות שאפשר לעדכן אותן."
+
+#: ../data/gtkpod.glade.h:139
+msgid "Display a list of tracks that could not be updated."
+msgstr "הצג רשימה של רצועות שאי אפשר לעדכן אותן."
+
+#: ../data/gtkpod.glade.h:140
+msgid "Display conversion log"
+msgstr "הצג יומן המרות"
+
+#: ../data/gtkpod.glade.h:141
+msgid "Display info about detected duplicates"
+msgstr "הצג מידע אודות כפילויות מזוהות"
+
+#: ../data/gtkpod.glade.h:142
+msgid "Display info about non-updated tracks"
+msgstr "הצג מידע על רצועות שלא עודכנו בזמן סנכרון תיקיות"
+
+#: ../data/gtkpod.glade.h:143
+msgid "Display info about updated tracks"
+msgstr "הצג מידע אודות רצועות מעודכנות"
+
+#: ../data/gtkpod.glade.h:144
+msgid "Display messages and warnings at startup"
+msgstr "הראה הודעות ואזהרות בתחילת התוכנית"
+
+#: ../data/gtkpod.glade.h:145
+msgid "Display the list of duplicates that have been detected after adding files."
+msgstr "הצג את רשימת הכפילויות שזוהו אחרי הוספת הקבצים."
+
+#: ../data/gtkpod.glade.h:146
+msgid "Display toolbar..."
+msgstr "הראה סרגל כלים..."
+
+#: ../data/gtkpod.glade.h:147
+msgid "Display tooltips in main window"
+msgstr "הצג תוויות מידע בחלון הראשי"
+
+#: ../data/gtkpod.glade.h:148
+msgid "Display tooltips in prefs window"
+msgstr "הצג תוויות מידע בחלון האפשרויות"
+
+#: ../data/gtkpod.glade.h:149
+msgid "Display tracks that match the criteria entered above."
+msgstr "הצג רצועות המתאימות לקריטריונים המוכנסים למעלה."
+
+#: ../data/gtkpod.glade.h:150
+msgid ""
+"Displayed\n"
+"Tracks"
+msgstr ""
+"רצועות\n"
+"מוצגות"
+
+#: ../data/gtkpod.glade.h:152
+msgid "Displayed:"
+msgstr "מוצגים:"
+
+#: ../data/gtkpod.glade.h:153
+msgid "Don't allow file duplication"
+msgstr "אל תרשה כפילויות של קבצים"
+
+#: ../data/gtkpod.glade.h:154
+msgid "Don't automatically sync on startup"
+msgstr "אל תסנכרן אוטומטית בתחילת התוכנית"
+
+#: ../data/gtkpod.glade.h:155
+msgid "Duplicate Recognition is based on a (modified) sha1 hash over the file."
+msgstr "זיהוי כפילויות מתבסס על חישוב קוד ערבוב sha1 על הקובץ."
+
+#: ../data/gtkpod.glade.h:156
+msgid "Edit Repository/iPod Options"
+msgstr "ערוך מאגר/אפשרויות iPod"
+
+#: ../data/gtkpod.glade.h:157
+#: ../src/context_menus.c:662
+msgid "Edit Smart Playlist"
+msgstr "ערוך רשימת השמעה חכמה"
+
+#: ../data/gtkpod.glade.h:158
+#: ../src/context_menus.c:749
+msgid "Edit Track Details"
+msgstr "ערוך פרטי רצועה"
+
+#: ../data/gtkpod.glade.h:159
+msgid "Edit _Preferences"
+msgstr "עריכת _העדפות"
+
+#: ../data/gtkpod.glade.h:160
+msgid "Effective free space"
+msgstr "מקום פנוי אפקטיבי"
+
+#: ../data/gtkpod.glade.h:161
+msgid "Empty Playlist"
+msgstr "רשימת השמעה ריקה"
+
+#: ../data/gtkpod.glade.h:162
+msgid "Exclude file mask(s)"
+msgstr "אל תכלול מסכה(ות) קבצים"
+
+#: ../data/gtkpod.glade.h:163
+msgid "Export can be continued at a later time if canceled."
+msgstr "אפשר להמשיך את היצוא בזמן מאוחר יותר, אם בוטל."
+
+#: ../data/gtkpod.glade.h:164
+msgid "File size"
+msgstr "גודל קובץ"
+
+#: ../data/gtkpod.glade.h:165
+msgid "File size (deleted)"
+msgstr "גודל קובץ (נמחק)"
+
+#: ../data/gtkpod.glade.h:166
+msgid "File size (non-transferred)"
+msgstr "גודל קובץ (לא-מועבר)"
+
+#: ../data/gtkpod.glade.h:167
+msgid "Filename Format: "
+msgstr "תבנית הקובץ:"
+
+#: ../data/gtkpod.glade.h:168
+msgid "Find orphan files (files with no track info in DB) and dangling tracks (tracks with no corresponding files on iPod)"
+msgstr "מצא קבצים יתומים (קבצים ללא מידע רצועה במסד הנתונים) ורצועות מתנדנדות (רצועות ללא קבצים מתאימים על ה-iPod)"
+
+#: ../data/gtkpod.glade.h:169
+msgid "First try <i>folder.jpg</i>, then <i>&lt;artist&gt;.jpg</i>"
+msgstr "תחילה נסה את <i>folder.jpg</i>, ואחר כך את <i>&lt;artist&gt;.jpg</i>"
+
+#: ../data/gtkpod.glade.h:170
+msgid "Flac with :"
+msgstr "סוג Flac עם :"
+
+#: ../data/gtkpod.glade.h:172
+#, no-c-format
+msgid "For example, 'xmms %s' will clear xmms' current playlist, add the selected tracks and start playing."
+msgstr "לדוגמא, 'xmms %s' ינקה את רשימת ההשמעה הנוכחית של xmms, יוסיף את הרצועות הנבחרות ויתחיל לנגן."
+
+#: ../data/gtkpod.glade.h:174
+#, no-c-format
+msgid "For example, 'xmms -e %s' will append (enqueue) the selected tracks to xmms' current playlist."
+msgstr "לדוגמא, 'xmms -e %s' יוסיף את הרצועות הנבחרות לרשימת ההשמעה הנוכחית ב-xmms."
+
+#: ../data/gtkpod.glade.h:175
+#: ../src/display_sorttabs.c:2985
+#: ../src/display_spl.c:89
+#: ../src/misc_conversion.c:63
+msgid "Genre"
+msgstr "סגנון"
+
+#: ../data/gtkpod.glade.h:176
+msgid "Group artists on compilation CDs"
+msgstr "קבץ אמנים בתקליטורי שיצרת"
+
+#: ../data/gtkpod.glade.h:177
+msgid "Highly recommended for faster import when taking advantage of the duplication recognition. Also, having the PC filenames allows writing changed ID3 tags to disk, and even to reconstruct your iPod's contents in case of file system corruption (change the \"transferred=\" entries in your backuped database)."
+msgstr "מומלץ מאוד לייבוא מהיר יותר ,כאשר מנצלים את מנגנון זיהוי הכפילויות. בנוסף, על ידי כך שקיים מידע שם הקובץ של הקבצים על ה-PC זה מאפשר כתיבת של תגיות ה-ID3 לדיסק הקשיח, ואפילו בניה מחדש של תוכן ה-iPod במקרה של בעיה במערכת הקבצים (שנה את שדה ה-\"הועבר\" במסד הנתונים המגובה)."
+
+#: ../data/gtkpod.glade.h:178
+#: ../src/context_menus.c:685
+#: ../src/context_menus.c:703
+#: ../src/context_menus.c:820
+msgid "I'm sure"
+msgstr "אני בטוח"
+
+#: ../data/gtkpod.glade.h:179
+msgid "If available, the local copy of the track is referenced in the playlist. Otherwise the file on the iPod is used."
+msgstr "אם זמין, העותק המקומי של הרצועה יקושר מרשימת ההשמעה. אחרת נשתמש בקובץ על ה-iPod."
+
+#: ../data/gtkpod.glade.h:180
+msgid "If both options are selected, embedded APIC data takes precedence."
+msgstr "אם שתי האפשרויות נבחרו, מידע מוכל בתוך ה־APIC יהיה בעל עדיפות ראשונה."
+
+#: ../data/gtkpod.glade.h:181
+msgid "If checked, sorting will be case sensitive. Please note that case sensitive sorting will not work well with most charsets."
+msgstr "אם יסומן, המיון יבחין בין אותיות קטנות לגדולות. שים לב שהבחנה זאת לא תעבוד היטב ברוב ערכות התווים."
+
+#: ../data/gtkpod.glade.h:182
+msgid "If the filename (full path) of an existing track matches that of a track to be added, this option allows you to update the information about the existing track rather than just skipping the track altogether. No update will take place if the file hasn't changed and you have selected the 'Don't allow file duplication' option above."
+msgstr "אם הקובץ (נתיב מלא) של רצועה קיימת תואם את זה של רצועה להוספה, אפשרות זאת מאפשרת לך לעדכן את המידע על הרצועה הקיימת במקום רק לדלג על הרצועה בכלל. שום עדכון לא יתבצע אם הקובץ לא השתנה ובחרת באפשרות לא לאפשר כפילות בקבצים למעלה."
+
+#: ../data/gtkpod.glade.h:183
+msgid "If you check this, gtkpod will descend into subdirectories recursively."
+msgstr "אם תסמן אופציה זו, gtkpod יכנס לתוך תיקיות משנה רקורסיבית."
+
+#: ../data/gtkpod.glade.h:184
+msgid "If you check this, information (cover art and meta information) changed for this track will be copied to all other selected tracks as well. Use with care."
+msgstr "אם תסמן את זה, שינויים במידע (עטיפה ומידע מטה) עבור רצועה זאת יועתקו אל כל הרצועות הנבחרות גם כן. השתמש בזהירות."
+
+#: ../data/gtkpod.glade.h:185
+msgid "If you don't select the master playlist automatically, the initial database import is much faster because the display dosn't have to be updated."
+msgstr "אם לא תבחר את רשימת ההשמעה הראשית אוטומטית, יבוא מסד הנתונים הראשוני יהיה יותר מהיר בעקבות כך שהתצוגה לא תהיה חייבת להתעדכן."
+
+#: ../data/gtkpod.glade.h:186
+msgid "If you select several tracks in the track list and edit a tag of the first track, the tags in the other tracks are updated as well."
+msgstr "אם אתה בוחר מספר רצועות ברשימת הרצועות ועורך תגית של הרצועה הראשונה, התגיות ברצועות הממוינות מתעדכנות גם כן."
+
+#: ../data/gtkpod.glade.h:187
+msgid "Ignore these words when at the beginning of the following fields:"
+msgstr "התעלם ממילים אלו כאשר הן מופיעות בתחילת השדות הבאים:"
+
+#: ../data/gtkpod.glade.h:188
+msgid "In order to save the displayed track order to the iPod choose 'Save Displayed Track Order' from the 'Edit' menu or select 'Auto Store' below."
+msgstr "על מנת לשמור את סדר הרצועות הנראות אל ה-iPod בחר 'שמור סדר רצועות נראות' מתפריט ה-'עריכה' או בחר 'שמירה אוטומטית' למטה."
+
+#: ../data/gtkpod.glade.h:189
+msgid "Initialize iPod"
+msgstr "אתחל iPod"
+
+#: ../data/gtkpod.glade.h:190
+msgid ""
+"Insert before\n"
+"Insert after"
+msgstr ""
+"הכנס לפני\n"
+"הכנס אחרי"
+
+#: ../data/gtkpod.glade.h:192
+msgid "Keeps all compilation CDs grouped together in the artists sort tab."
+msgstr "שמור את כל תקליטורי היצירות מקובצים ביחד בתוך כרטיסיות המיון של האמנים."
+
+#: ../data/gtkpod.glade.h:193
+msgid "Live _updating"
+msgstr "עדכון _חי"
+
+#: ../data/gtkpod.glade.h:194
+msgid "Load iPod(s)"
+msgstr "טען iPod(ים)"
+
+#: ../data/gtkpod.glade.h:195
+msgid "Lower Margin"
+msgstr "שוליים תחתונים"
+
+#: ../data/gtkpod.glade.h:196
+msgid "M4A with :"
+msgstr "סוג M4A עם :"
+
+#: ../data/gtkpod.glade.h:197
+msgid "MP3 with :"
+msgstr "סוג MP3 עם :"
+
+#: ../data/gtkpod.glade.h:198
+msgid "Match al_l of the following"
+msgstr "התאם את _כל הבאים"
+
+#: ../data/gtkpod.glade.h:199
+msgid "Match an_y of the following"
+msgstr "התאם _כל אחד מן הבאים"
+
+#: ../data/gtkpod.glade.h:200
+msgid "Match only _checked tracks"
+msgstr "התאם רק רצועות _מסומנות"
+
+#: ../data/gtkpod.glade.h:201
+msgid "Maximum number of background threads:"
+msgstr "המספר המירבי עבור התהליכים ברקע:"
+
+#: ../data/gtkpod.glade.h:202
+msgid "Maximum size of cache directory (in GB):"
+msgstr "הגודל המירבי עבור מטמון התיקיות (ב־GB):"
+
+#: ../data/gtkpod.glade.h:203
+msgid "Model:"
+msgstr "דגם:"
+
+#: ../data/gtkpod.glade.h:204
+#: ../src/display_tracks.c:2100
+msgid "Modified"
+msgstr "שונה"
+
+#: ../data/gtkpod.glade.h:205
+msgid "Most Recently Played Tracks"
+msgstr "הרצועות שהושמעו הכי לאחרונה"
+
+#: ../data/gtkpod.glade.h:206
+msgid "Move selected attributes to the displayed list"
+msgstr "העבר את המאפיינים הנבחרים לרשימה המוצגת"
+
+#: ../data/gtkpod.glade.h:207
+msgid "Music Root:"
+msgstr "שורש המוזיקה:"
+
+#: ../data/gtkpod.glade.h:208
+msgid "Music files can have images embedded in the APIC tag. Currently this is only supported for MP3 files."
+msgstr "קבצי מוסיקה יכולים להכיל תמונות בתוך תווית ה־APIC. כרגע זה רק נתמך על ידי קבצי MP3."
+
+#: ../data/gtkpod.glade.h:209
+msgid "Never show this dialogue again"
+msgstr "אל תראה חלון דו-שיח זה בעתיד"
+
+#: ../data/gtkpod.glade.h:210
+#: ../src/display_spl.c:1719
+#: ../src/misc_playlist.c:66
+#: ../src/misc_playlist.c:68
+#: ../src/misc_playlist.c:93
+#: ../src/misc_playlist.c:95
+#: ../src/misc_playlist.c:428
+#: ../src/misc_playlist.c:430
+msgid "New Playlist"
+msgstr "רשימת השמעה חדשה"
+
+#: ../data/gtkpod.glade.h:211
+msgid "No lower margin"
+msgstr "ללא שוליים תחתונים"
+
+#: ../data/gtkpod.glade.h:212
+msgid "No upper margin"
+msgstr "ללא שוליים עליונים"
+
+#: ../data/gtkpod.glade.h:213
+msgid "Non-transferred tracks"
+msgstr "רצועות לא מועברות"
+
+#: ../data/gtkpod.glade.h:214
+msgid "None"
+msgstr "ללא"
+
+#: ../data/gtkpod.glade.h:215
+msgid "Normally the charset specified when first importing the track will be used for the filename. If you set this option you can set a different charset with the charset selector (Preferences/'Adding/Updating/Syncing'). Note: the charset info is stored in the extended information file (see Preferences/'Writing of the iTunesDB'). Tracks imported before V0.51 will have no charset stored. Instead the charset specified will be used."
+msgstr "באופן רגיל ערכת התווים המצוינת כאשר מייבאים לראשונה את הרצועות תהיה זו שיעשה בה שימוש לעדכן את שם הקובץ. אם סמנת אפשרות זו תוכל לבחור ערכת תווים אחרת בעזרת בוחר ערכת התווים (העדפות 'הוספה/עדכון/סנכרון'). הערה: מידע ערכת התווים נשמר במידע המורחב (ראה העדפות כתיבה ל-iTunesDB). רצועות שיובאו לפני גרסה 0.51 לא תהיה להם ערכת תווים שמורה. במקום זאת ערכת התווים המצוינת למעלה תהיה זו שנשתמש בה."
+
+#: ../data/gtkpod.glade.h:216
+msgid "Normally the charset specified when first importing the track will be used to update the track information. If you have chosen a wrong charset when first importing a track and want to correct it using the 'Update Track' function, you must check this option. Note: the charset info is stored in the extended information file (see 'Writing of iTunesDB' below) and tracks imported before V0.51 will have no charset stored. Instead the charset specified above will be used then."
+msgstr "באופן רגיל ערכת התווים המצוינת כאשר מייבאים לראשונה את הרצועות תהיה זו שיעשה בה שימוש לעדכן את מידע הרצועה. אם בחרת ערכת תווים שגויה כאשר ייבאת לראשונה את הרצועה וברצונך לתקן זאת בעזרת 'עדכן רצועה', אתה תהיה חייב לסמן את האפשרות הזאת. הערה: מידע ערכת התווים נשמר במידע המורחב (ראה : כתיבה ל-iTunesDB למטה) ורצועות שיובאו לפני גרסה 0.51 לא תהיה להם ערכת תווים שמורה. במקום זאת ערכת התווים המצוינת למעלה תהיה זו שנשתמש בה אז."
+
+#: ../data/gtkpod.glade.h:217
+msgid "Normally the charset specified when first importing the track will be used to write the tags. If you have chosen a wrong charset when first importing a track, you should select this option along with the correct charset.  Note: uses the extended information file to store the charset information (see 'Writing of the iTunesDB' on the 'Input/Output' page) and tracks imported before V0.51 will have no charset stored -- the charset specified on the 'Input/Output' page will be used."
+msgstr "בדרך כלל יעשה שימוש בערכת התווים המצוינת בזמן ייבוא הרצועה לשם כתיבת התגיות. אם בחרת ערכת תווים שגויה בזמן ייבוא רצועה, אתה יכול לבחור אפשרות זו ביחד עם ערכת התווים הנכונה. הערה: משתמש בקובץ המידע המורחב לשמור את מידע ערכת התווים (ראה 'כתיבת iTunesDB' בעמוד קלט/פלט) ורצועות שיובאו לפני גרסה 0.51 לא תהייה להן ערכה שמורה -- הערכה המצוינת בעמוד קלט/פלט יעשה בה שימוש."
+
+#: ../data/gtkpod.glade.h:218
+msgid ""
+"Normally, if a track is no longer present in the sync directory, it will be removed from the playlist, but not from the iPod or local repository.\n"
+"If this option is checked, tracks will be completely removed from the iPod or local repository, unless the track is a member of other playlists as well.\n"
+"NOTE: if you sync with the master playlist, you must check this option if you want tracks to be removed, because removing from the master playlist means removing from the iPod."
+msgstr ""
+"בצורה נורמלית, אם רצועה כבר לא קיימת בתיקיית הסנכרון, היא תוסר מרשימת הניגון, אבל לא מה־iPod או המאגר המקומי.\n"
+"אם אפשרות זו מסומנת, הרצועות יוסרו לגמרי מה־iPod או המאגר המקומי, אלא אם כן הרצועה מופיעה ברשימת השמעה אחרת בנוסף.\n"
+"הערה: אם תסנכרן את רשימת ההשמעה הראשית, אתה חייב לסמן את אפשרות זו אם תרצה שהרצועות יוסרו, בגלל שהסרה מהרשימה הראשית משמעותה הסרה מה־iPod."
+
+#: ../data/gtkpod.glade.h:221
+msgid "Notes sync command:"
+msgstr "פקודת סנכרון לפתקאות (notes):"
+
+#: ../data/gtkpod.glade.h:222
+msgid "Number of playlists"
+msgstr "מספר רשימות ההשמעה"
+
+#: ../data/gtkpod.glade.h:223
+msgid "Number of tracks"
+msgstr "מספר רצועות"
+
+#: ../data/gtkpod.glade.h:224
+msgid "Number of tracks in generated playlists:"
+msgstr "מספר הרצועות ברשימת השמעה:"
+
+#: ../data/gtkpod.glade.h:225
+msgid "Number of tracks in the generated playlists 'Most Often Listened', 'Best Rated' and 'Most Recently Played'. Choose '0' for 'no limit'."
+msgstr "מספר הרצועות ברשימות ההשמעה הנוצרות 'המושמעים ביותר', 'הדירוג הכי גבוה' ו-'נוגנו הכי לאחרונה'. בחר '0' עבור 'ללא מגבלה'."
+
+#: ../data/gtkpod.glade.h:226
+msgid "Ogg with :"
+msgstr "סוג Ogg עם :"
+
+#: ../data/gtkpod.glade.h:227
+msgid "On startup automatically sync with playlist directories"
+msgstr "בתחילה התכנית סנכרן אוטומטית עם תיקיות רשימות ההשמעה"
+
+#: ../data/gtkpod.glade.h:228
+msgid "On startup automatically sync with the following directory"
+msgstr "בתחילת התוכנית סנכרן אוטומטית עם התיקייה הבאה"
+
+#: ../data/gtkpod.glade.h:229
+msgid "On startup automatically update (Live Playlist)"
+msgstr "בתחילת התוכנית עדכ אוטומטית (רשימת השמעה חיה)"
+
+#: ../data/gtkpod.glade.h:230
+msgid "One for each Album"
+msgstr "אחת לכל כותר"
+
+#: ../data/gtkpod.glade.h:231
+msgid "One for each Artist"
+msgstr "אחת לכל אמן"
+
+#: ../data/gtkpod.glade.h:232
+msgid "One for each Composer"
+msgstr "אחת לכל יוצר"
+
+#: ../data/gtkpod.glade.h:233
+msgid "One for each Genre"
+msgstr "אחת לכל סגנון"
+
+#: ../data/gtkpod.glade.h:234
+msgid "One for each Rating"
+msgstr "אחת לכל מדרוג"
+
+#: ../data/gtkpod.glade.h:235
+msgid "One for each Year"
+msgstr "אחת לכל שנה"
+
+#: ../data/gtkpod.glade.h:236
+msgid "Overwrite tags that are already set"
+msgstr "שכתב תגיות שכבר כתובות"
+
+#: ../data/gtkpod.glade.h:237
+msgid "Password:"
+msgstr "סיסמה:"
+
+#: ../data/gtkpod.glade.h:238
+msgid "Path:"
+msgstr "נתיב:"
+
+#: ../data/gtkpod.glade.h:239
+msgid "Photo Window"
+msgstr "חלון תמונות"
+
+#: ../data/gtkpod.glade.h:240
+#: ../src/display_spl.c:94
+msgid "Play time"
+msgstr "זמן השמעה"
+
+#: ../data/gtkpod.glade.h:241
+#: ../src/display_spl.c:98
+#: ../src/misc_conversion.c:77
+msgid "Playcount"
+msgstr "מספור השמעות"
+
+#: ../data/gtkpod.glade.h:242
+#: ../src/display_tracks.c:2097
+msgid "Played"
+msgstr "הושמע"
+
+#: ../data/gtkpod.glade.h:243
+msgid "Playlist name:"
+msgstr "שם רשימת ההשמעה:"
+
+#: ../data/gtkpod.glade.h:244
+msgid "Playlist type:"
+msgstr "סוג רשימת ההשמעה:"
+
+#: ../data/gtkpod.glade.h:245
+#: ../src/display_playlists.c:2258
+msgid "Playlists"
+msgstr "רשימות השמעה"
+
+#: ../data/gtkpod.glade.h:246
+msgid "Please refer to the notice below."
+msgstr "הסתכל בבקשה בהודעה למטה."
+
+#: ../data/gtkpod.glade.h:247
+msgid "Please specify a time interval"
+msgstr "אנא ציין מרווח זמן"
+
+#: ../data/gtkpod.glade.h:248
+msgid "Preferences"
+msgstr "הגדרות"
+
+#: ../data/gtkpod.glade.h:249
+msgid "Progress Information"
+msgstr "מידע התקדמות"
+
+#: ../data/gtkpod.glade.h:250
+msgid "R_ename Album"
+msgstr "_שנה שם לאלבום"
+
+#: ../data/gtkpod.glade.h:251
+msgid "Random Playlist from Displayed Tracks"
+msgstr "רשימת השמעה אקראית מהרצועות הנראות"
+
+#: ../data/gtkpod.glade.h:252
+msgid "Randomize Current Playlist"
+msgstr "יצירת רשימת השמעה אקראית"
+
+#: ../data/gtkpod.glade.h:253
+#: ../src/display_spl.c:101
+#: ../src/misc_conversion.c:78
+msgid "Rating"
+msgstr "מדרוג"
+
+#: ../data/gtkpod.glade.h:254
+msgid "Read coverart from embedded APIC data"
+msgstr "קרא תמונת עטיפה מתוך מידע ה־APIC"
+
+#: ../data/gtkpod.glade.h:255
+msgid "Read tags from file contents (e.g. ID3 tags in MP3 files)"
+msgstr "קרא תגיות מתוכן הקובץ (כלומר תגיות ID3 של קבצי MP3)"
+
+#: ../data/gtkpod.glade.h:256
+msgid "Remove selected attributes from the displayed list"
+msgstr "הסר את המאפיינים הנבחרים מהרשימה המוצגת"
+
+#: ../data/gtkpod.glade.h:257
+msgid "Repository Options"
+msgstr "אפשרויות מאגר"
+
+#: ../data/gtkpod.glade.h:258
+msgid "Repository name:"
+msgstr "שם המאגר:"
+
+#: ../data/gtkpod.glade.h:259
+msgid "Repository type:"
+msgstr "סוג מאגר:"
+
+#: ../data/gtkpod.glade.h:260
+msgid "Root directory of mserv database (trackinfo root)."
+msgstr "תיקיית שורש או מסד נתונים mserv (השורש של trackinfo)."
+
+#: ../data/gtkpod.glade.h:261
+msgid "Rules"
+msgstr "חוקים"
+
+#: ../data/gtkpod.glade.h:262
+#: ../src/context_menus.c:804
+msgid "Save Changes"
+msgstr "שמור שינויים"
+
+#: ../data/gtkpod.glade.h:263
+msgid "Scrobble Tracks?"
+msgstr "שלח רצועות?"
+
+#: ../data/gtkpod.glade.h:264
+msgid "Select '-1' for no upper limit."
+msgstr "בחר '-1' עבור ביטול גבול עליון."
+
+#: ../data/gtkpod.glade.h:265
+msgid "Select '0' for no lower limit."
+msgstr "בחר '0' עבור ביטול גבול תחתון."
+
+#: ../data/gtkpod.glade.h:266
+msgid ""
+"Selected\n"
+"Playlist"
+msgstr ""
+"רשימות השמעה\n"
+"נבחרות"
+
+#: ../data/gtkpod.glade.h:268
+msgid ""
+"Selected\n"
+"Tracks"
+msgstr ""
+"רצועות\n"
+"נבחרות"
+
+#: ../data/gtkpod.glade.h:270
+msgid "Selected Filter Tab Entry from Database"
+msgstr "נבחרה רשומת כרטיסיית מסנן ממסד הנתונים"
+
+#: ../data/gtkpod.glade.h:271
+msgid "Selected Filter Tab Entry from Hard Disk"
+msgstr "נבחרה רשומת כרטיסיית מסנן מהדיסק הקשיח"
+
+#: ../data/gtkpod.glade.h:272
+msgid "Selected Filter Tab Entry from Playlist"
+msgstr "נבחרה רשומת כרטיסיית מסנן מרשימת ההשמעה"
+
+#: ../data/gtkpod.glade.h:273
+msgid "Selected Filter Tab Entry from iPod"
+msgstr "נבחרה רשומת כרטיסיית מסנן מה־iPod"
+
+#: ../data/gtkpod.glade.h:274
+msgid "Selected Playlist Including Tracks from Database"
+msgstr "נבחרה רשימת השמעה כולל רצועות ממסד הנתונים"
+
+#: ../data/gtkpod.glade.h:275
+msgid "Selected Playlist Including Tracks from Hard Disk"
+msgstr "נבחרה רשימת השמעה כולל רצועות מהדיסק הקשיח"
+
+#: ../data/gtkpod.glade.h:276
+msgid "Selected Playlist Including Tracks from iPod"
+msgstr "נבחרה רשימת השמעה כולל רצועות מה־iPod"
+
+#: ../data/gtkpod.glade.h:277
+msgid "Selected Tab _Entry"
+msgstr "רשומות _כרטיסיה נבחרות"
+
+#: ../data/gtkpod.glade.h:278
+msgid "Selected Tracks from Database"
+msgstr "הרצועות הנבחרות ממסד הנתונים"
+
+#: ../data/gtkpod.glade.h:279
+msgid "Selected Tracks from Hard Disk"
+msgstr "הרצועות הנבחרות מהדיסק הקשיח"
+
+#: ../data/gtkpod.glade.h:280
+msgid "Selected Tracks from Playlist"
+msgstr "הרצועות הנבחרות מרשימות הניגון"
+
+#: ../data/gtkpod.glade.h:281
+msgid "Selected Tracks from iPod"
+msgstr "הרצועות הנבחרות מה־iPod"
+
+#: ../data/gtkpod.glade.h:282
+msgid "Selected _Playlist"
+msgstr "_רשימות השמעה נבחרות"
+
+#: ../data/gtkpod.glade.h:283
+msgid "Selected _Tracks"
+msgstr "ר_צועות נבחרות"
+
+#: ../data/gtkpod.glade.h:284
+msgid "Selected playlist"
+msgstr "רשימות השמעה נבחרות"
+
+#: ../data/gtkpod.glade.h:285
+msgid "Semicolon separated list of file exclusion masks, e.g. '*.mp3'"
+msgstr "רשימת מופרדת נקודה־פסיק של מסכות שלילה, לדוגמה: \"*.mp3"
+
+#: ../data/gtkpod.glade.h:286
+msgid "Set Cover Art from _File"
+msgstr "קבע עטיפה מתוך _קובץ"
+
+#: ../data/gtkpod.glade.h:287
+msgid "Set mountpoint or edit repository options"
+msgstr "קבע נקודות עגינה או ערוך אפשרויות מאגר"
+
+#: ../data/gtkpod.glade.h:288
+msgid "Set options for Calendar/Contacts/Notes"
+msgstr "קבע אפשרויות עבור יומן/אנשי קשר/תזכורות"
+
+#: ../data/gtkpod.glade.h:289
+msgid "Set this to 'aacgain -q -k' to use the 'Normalize volume' functionality in the Tools Menu. If this is set, missing normalization data for .m4a and .m4b files will be calculated and written to your music file using this command."
+msgstr "קבע את זה ל־'aacgain -q -k' על מנת להשתמש ב'נרמול עוצת קול' בתפריט הכלים. אם זה סומן, מידע נרמול מקבצי m4a ו m4b יחושב ויכתב לקבצי המוזיקה שלך תוך שימוש בפקודה הזאת."
+
+#: ../data/gtkpod.glade.h:290
+msgid "Set this to 'mp3gain -q -k' to use the 'Normalize volume' functionality in the Tools Menu. If this is set, missing normalization data for mp3 files will be calculated and written to your mp3 file using this command."
+msgstr "קבע את זה ל־'mp3gain -q -k' על מנת להשתמש ב'נרמול עוצת קול' בתפריט הכלים. אם זה סומן, מידע נרמול מקבצי mp3 יחושב ויכתב לקבצי המוזיקה שלך תוך שימוש בפקודה הזאת."
+
+#: ../data/gtkpod.glade.h:291
+msgid "Set this to your last.fm password"
+msgstr "הכנס כאן את הסיסמה שלך עבור last.fm"
+
+#: ../data/gtkpod.glade.h:292
+msgid "Set this to your last.fm username"
+msgstr "הכנס כאן את שם המשתמש שלך עבור last.fm"
+
+#: ../data/gtkpod.glade.h:293
+msgid "Set to 0 to effectively disable caching (a maximum of one track will be cached at a time)."
+msgstr "קבע ל־0 על מנת לבטל שימוש במטמון (מקסימום של רצועה אחת תהיה במטמון ביחידת זמן אחת)."
+
+#: ../data/gtkpod.glade.h:294
+msgid "Set to 0 to use as many background threads as CPUs are available on your system."
+msgstr "קבע ל־0 על מנת להשתמש בכמה שיותר תהליכים ברקע שקיימים עבור המעבד על המחשב שלך."
+
+#: ../data/gtkpod.glade.h:295
+msgid "Show information about problems when accessing mserv"
+msgstr "הצג מידע על בעיות בגישה ל-mserv"
+
+#: ../data/gtkpod.glade.h:296
+msgid "Show summary of sync result"
+msgstr "הצג סיכום של תוצאות סינכרון"
+
+#: ../data/gtkpod.glade.h:297
+#: ../src/misc_playlist.c:96
+#: ../src/repository.c:1356
+msgid "Smart Playlist"
+msgstr "רשימת השמעה חכמה"
+
+#: ../data/gtkpod.glade.h:298
+msgid "Sort tracks according to: "
+msgstr "מיין רצועות לפי:"
+
+#: ../data/gtkpod.glade.h:299
+msgid "Sorting Options"
+msgstr "אפשרויות מיון"
+
+#: ../data/gtkpod.glade.h:300
+msgid "Sorting case sensitive"
+msgstr "מיון עם תלות בגודל (case)"
+
+#: ../data/gtkpod.glade.h:301
+msgid "Sorttab: "
+msgstr "כרטיסייה מיון:"
+
+#: ../data/gtkpod.glade.h:302
+msgid "Sorttabs"
+msgstr "כרטיסיות מיון"
+
+#: ../data/gtkpod.glade.h:303
+msgid "Source:"
+msgstr "מקור:"
+
+#: ../data/gtkpod.glade.h:305
+#, no-c-format
+msgid "Specify exact path including command line options. '%i' will be replaced with the mount point of the iPod."
+msgstr "מציין נתיב מלא כולל אפשרויות שורת פקודה. המחרוזת '%i' תוחלף עם נקודת העגינה של ה-iPod."
+
+#: ../data/gtkpod.glade.h:306
+msgid "Specify interval"
+msgstr "ציין מרווח"
+
+#: ../data/gtkpod.glade.h:307
+msgid "Start display automatically"
+msgstr "התחל תצוגה אוטומטית"
+
+#: ../data/gtkpod.glade.h:308
+msgid "Synchronise Contacts, Calendar and Notes"
+msgstr "סנכרן אנשי קשר, יומן ופתקים"
+
+#: ../data/gtkpod.glade.h:309
+msgid "Synchronize All"
+msgstr "סנכרן הכל"
+
+#: ../data/gtkpod.glade.h:310
+msgid "Synchronize Calendar"
+msgstr "סנכרן יומן"
+
+#: ../data/gtkpod.glade.h:311
+msgid "Synchronize Contacts"
+msgstr "סנכרן אנשי קשר"
+
+#: ../data/gtkpod.glade.h:312
+msgid "Synchronize Notes"
+msgstr "סנכרן פתקים"
+
+#: ../data/gtkpod.glade.h:313
+msgid "Template for info field: "
+msgstr "תבנית עבור שדה המידע:"
+
+#: ../data/gtkpod.glade.h:314
+msgid "The local copy of the track is referenced in the playlist. If the track is not available locally, an error message is displayed."
+msgstr "העותק המקומי של הרצועה יקושר מרשימת ההשמעה. אם הרצועה לא זמינה מקומית, תוצג הודעת שגיאה."
+
+#: ../data/gtkpod.glade.h:315
+msgid "The output of the background conversion scripts is copied below. Each page of the notebook corresponds to one background thread."
+msgstr "תוצר הפלט של תסריט ההמרה ברקע יועתק למטה. כל דף של המחברת תואם לתהליך רקע אחד."
+
+#: ../data/gtkpod.glade.h:316
+msgid "The tags are written to the files on your harddrive and on the iPod (if available)."
+msgstr "התגיות נכתבות לקבצים על הדיסק הקשיח ועל ה-iPod (אם זמין)."
+
+#: ../data/gtkpod.glade.h:317
+msgid "The track on the iPod is referenced in the playlist file."
+msgstr "הרצועה על ה-iPod מקושרת בקובץ רשימת ההשמעה."
+
+#: ../data/gtkpod.glade.h:318
+msgid "This is the same option as in 'Edit/Delete Confirmation'"
+msgstr "זוהי אופציה זהה לזו שב- 'עריכה/ווידוא מחיקה'"
+
+#: ../data/gtkpod.glade.h:319
+msgid "This is the way to go, but maybe not all programs support it yet. ID3v2.4 uses unicode to store the tags, so you won't have to worry about charsets any more. gtkpod will use UTF8 encoding as this will not increase the size of pure ASCII tags. ID3v2.2/4 tags will also be written if they are already present in the file to write to."
+msgstr "זוהי הדרך הנכונה, אך אולי לא כל התכניות תומכות בזה עדיין. הסימנייה ID3v2.4 משתמשת ב־unicode לשמור על התגיות, על מנת שלא נצטרך לדאוג לגבי ערכות תווים. gtkpod ישתמש ב־UTF8 כי זה לא יגדיל את הגודל של תגיות ASCII טהורות. תגיות ID3V2.2/4 יכתבו גם אם הן כבר קיימות בקובץ שכותבים עליו."
+
+#: ../data/gtkpod.glade.h:320
+msgid "This option will be re-activated when you upgrade gtkpod."
+msgstr "האפשרות הזאת תופעל מחדש בזמן שדרוג gtkpod."
+
+#: ../data/gtkpod.glade.h:321
+msgid "Time:"
+msgstr "זמן:"
+
+#: ../data/gtkpod.glade.h:322
+#: ../src/display_sorttabs.c:2991
+#: ../src/display_spl.c:83
+#: ../src/misc_conversion.c:62
+msgid "Title"
+msgstr "שם הרצועה"
+
+#: ../data/gtkpod.glade.h:323
+msgid ""
+"Total\n"
+"(iPod)"
+msgstr ""
+"סך הכל\n"
+"(iPod)"
+
+#: ../data/gtkpod.glade.h:325
+msgid ""
+"Total\n"
+"(local)"
+msgstr ""
+"סך הכל\n"
+"(מקומי)"
+
+#: ../data/gtkpod.glade.h:327
+msgid "Tracks"
+msgstr "רצועות"
+
+#: ../data/gtkpod.glade.h:328
+msgid "Tracks Most Often Listened To"
+msgstr "הרצועות שהכי מאזינים להן"
+
+#: ../data/gtkpod.glade.h:329
+msgid "Tracks can be transferred in the background as soon as they are added to an iPod repository. Otherwise they will be transferred when ejecting the contents of the iPod completely unchanged until then."
+msgstr "רצועות יכולות להיות מועברות ברקע ברגע שהם מוספות למאגר ה־iPod. אחרת הן יועברו בזמן הניתוק של ה־iPod, וישארו ללא שינוי עד אז."
+
+#: ../data/gtkpod.glade.h:330
+msgid "Tracks in Selected Tab _Entry"
+msgstr "רצועות ב_רשומות כרטיסיות נבחרות"
+
+#: ../data/gtkpod.glade.h:331
+msgid "Tracks in Selected _Playlist"
+msgstr "רצועות ב_רשימות השמעה נבחרות"
+
+#: ../data/gtkpod.glade.h:332
+msgid "Transfer tracks to the iPod in the background"
+msgstr "העבר רצועות אל ה־iPod ברקע"
+
+#: ../data/gtkpod.glade.h:333
+msgid "Translators"
+msgstr "מתרגמים"
+
+#: ../data/gtkpod.glade.h:334
+msgid "Try to load contents of all connected iPods. For each iPod a separate repository must be set up."
+msgstr "מנסה לטעון תוכן של כל ה־iPod-ים המחוברים. עבור כל iPod חייב להיות מוקם מאגר נפרד."
+
+#: ../data/gtkpod.glade.h:335
+msgid "Undo _Track"
+msgstr "בטל _רצועה"
+
+#: ../data/gtkpod.glade.h:336
+msgid "Update _mserv Data from File"
+msgstr "עדכון _נתוני mserv מקובץ"
+
+#: ../data/gtkpod.glade.h:337
+msgid "Update/Sync all playlists now"
+msgstr "עדכן/סנכרן את כל רשימות ההשמעה עכשיו"
+
+#: ../data/gtkpod.glade.h:338
+msgid "Update/Sync playlist now"
+msgstr "עדכן/סנכרן את רשימת הניגון עכשיו"
+
+#: ../data/gtkpod.glade.h:339
+msgid "Upper margin"
+msgstr "שוליים עליונים"
+
+#: ../data/gtkpod.glade.h:340
+msgid "Use 'Multi-Edit' also for title field"
+msgstr "השתמש ב-'עריכה מרובה' גם עבור שדה שם הרצועה"
+
+#: ../data/gtkpod.glade.h:341
+msgid "Use 'Multi-Edit' for tracks selections"
+msgstr "השתמש ב-'עריכה מרובה' עבור בחירת רצועות"
+
+#: ../data/gtkpod.glade.h:342
+msgid "Use <i>&lt;Album&gt;.jpg</i> in the parent directory"
+msgstr "השתמש ב־ <i>&lt;Album&gt;.jpg</i> בתוך תיקיית האב"
+
+#: ../data/gtkpod.glade.h:343
+msgid "Use <i>&lt;Album&gt;.jpg</i>, <i>&lt;Album&gt;.png</i>..."
+msgstr "רשימת מופרדת נקודה־פסיק של מסכות שלילה, לדוגמה: \"*.mp3"
+
+#: ../data/gtkpod.glade.h:344
+msgid "Use <i>folder.jpg</i> as cover art."
+msgstr "השתמש ב <i>folder.jpg</i> בתור עטיפה."
+
+#: ../data/gtkpod.glade.h:345
+msgid "Use <i>folder.jpg</i>, <i>folder.png</i>..."
+msgstr "השתמש ב־ <i>folder.jpg</i>, <i>folder.png</i>..."
+
+#: ../data/gtkpod.glade.h:346
+msgid "Use mserv database to fill additional information"
+msgstr "השתמש במסד נתונים של mserv על מנת למלא מידע נוסף"
+
+#: ../data/gtkpod.glade.h:347
+msgid ""
+"Use selected charset (Preferences/'Adding/Updating/ Syncing')\n"
+"for this filename."
+msgstr ""
+"השתמש בערכת התווים הנבחרת (אפשרויות/'הוספה/עדכון/סנכרון')\n"
+"עבור הקובץ הזה."
+
+#: ../data/gtkpod.glade.h:349
+msgid ""
+"Use selected encoding (on the 'General' page)\n"
+"when writing tags"
+msgstr ""
+"השתמש בערכת תווים הנבחרת (בעמוד 'כללי')\n"
+"בזמן כתיבת התגיות"
+
+#: ../data/gtkpod.glade.h:351
+msgid "Use selected encoding also when updating or syncing tracks"
+msgstr "השתמש בערכת תווים נבחרת גם בזמן עדכון או סנכרון רצועות"
+
+#: ../data/gtkpod.glade.h:352
+msgid "Use this template to parse filename for tag information:"
+msgstr "השתמש בתבנית הזאת על מנת לנתח את הקובץ למידע תגית:"
+
+#: ../data/gtkpod.glade.h:353
+msgid "Username to be used for mserv database lookup."
+msgstr "שם משתמש הנועד לשימוש במסד הנתונים של mserv."
+
+#: ../data/gtkpod.glade.h:354
+msgid "Username:"
+msgstr "שם משתמש:"
+
+#: ../data/gtkpod.glade.h:355
+msgid "Usually you don't want to set the title of several tracks to the same text. This option might avoid unwanted results (especially since there is no 'undo' yet)."
+msgstr "בדרך כלל אתה לא תרצה לקבוע את שם הרצועה של מספר רצועות לאותו טקסט. אפשרות זאת עלולה למנוע תוצאות לא רצויות (במיוחד שאין עדיין אפשרות 'בטל')"
+
+#: ../data/gtkpod.glade.h:356
+msgid "View Full Size"
+msgstr "הצג בגודל מלא"
+
+#: ../data/gtkpod.glade.h:357
+msgid "WAV with :"
+msgstr "סוג WAV עם :"
+
+#: ../data/gtkpod.glade.h:358
+msgid ""
+"When adding dirs/files, update information of\n"
+"existing tracks with identical filenames"
+msgstr ""
+"בזמן הוספת תיקיות/קבצים, עדכן את המידע על\n"
+"רצועות קיימות עם שמות קבצים זהים"
+
+#: ../data/gtkpod.glade.h:360
+msgid "When copying from iPod no check is performed on whether the destination file exists. Enabling this option will make gtkpod check whether the length of the destination file is the same as the file in the iPod. If so the file is skipped, allowing a quick sync of the iPod's contents."
+msgstr "בזמן ההעתקה מה-iPod לא מתבצעת בדיקה האם קובץ היעד קיים. אפשר אפשרות זו והתכנית תבדוק האם גודלו של קובץ היעד הוא זהה לקובץ שעל ה-iPod. אם כן נדלג על הקובץ, ובכך נאפשר סנכרון מהיר של תוכן ה-iPod."
+
+#: ../data/gtkpod.glade.h:361
+msgid "When syncing playlists"
+msgstr "בזמן סנכרון רשימות השמעה"
+
+#: ../data/gtkpod.glade.h:362
+msgid "Will show a list of tracks removed and a list of tracks newly added or updated."
+msgstr "יראה רשימה של רצועות שהוסרו ורשימות של רצועות שהוספו או עודכנו לאחרונה."
+
+#: ../data/gtkpod.glade.h:363
+msgid "Write ID3 tags to disk when modified in gtkpod"
+msgstr "כתוב תגיות ID3 לדיסק כאשר הן משתנות ב-gtkpod"
+
+#: ../data/gtkpod.glade.h:364
+msgid "Write all changes made to the disk and the iPod(s)."
+msgstr "שמור את כל השינויים שנעשו אל הדיסק ואל ה־iPod-ים."
+
+#: ../data/gtkpod.glade.h:365
+msgid ""
+"Write extended information (PC filenames, SHA1 hashes,\n"
+"encoding...). Recommended."
+msgstr "השתמש ב־ <i>&lt;Album&gt;.jpg</i> בתוך תיקיית האב"
+
+#: ../data/gtkpod.glade.h:367
+msgid "You can also use the table headers, but this allows you to sort according to a column that is not displayed."
+msgstr "אתה גם יכול להשתמש בכותרות הטבלאות, אבל זה יאפשר לך למיין רק לפי העמודה המוצגת."
+
+#: ../data/gtkpod.glade.h:368
+msgid "_About gtkpod"
+msgstr "_אודות gtkpod"
+
+#: ../data/gtkpod.glade.h:369
+msgid "_Add Album"
+msgstr "_הוסף כותר"
+
+#: ../data/gtkpod.glade.h:370
+msgid "_Add Image"
+msgstr "_הוסף תמונה"
+
+#: ../data/gtkpod.glade.h:371
+msgid "_Album"
+msgstr "_כותר"
+
+#: ../data/gtkpod.glade.h:372
+msgid "_All Tracks"
+msgstr "_כל הרצועות"
+
+#: ../data/gtkpod.glade.h:373
+msgid "_Arrange Sort Tabs"
+msgstr "_סדר כרטיסיות מיון"
+
+#: ../data/gtkpod.glade.h:374
+msgid "_Check iPod's Files"
+msgstr "_בדיקת קבצי iPod"
+
+#: ../data/gtkpod.glade.h:375
+msgid "_Conversion Log"
+msgstr "_יומן המרות"
+
+#: ../data/gtkpod.glade.h:376
+msgid "_Create Playlists"
+msgstr "_יצירת רשימות השמעה"
+
+#: ../data/gtkpod.glade.h:377
+msgid "_Create iPod's Directories"
+msgstr "_יצירת תיקיות iPod"
+
+#: ../data/gtkpod.glade.h:378
+msgid "_Delete"
+msgstr "_מחק"
+
+#: ../data/gtkpod.glade.h:379
+msgid "_Display"
+msgstr "_תצוגה"
+
+#: ../data/gtkpod.glade.h:380
+msgid "_Displayed Tracks"
+msgstr "_הראה רצועות"
+
+#: ../data/gtkpod.glade.h:381
+msgid "_Edit"
+msgstr "_עריכה"
+
+#: ../data/gtkpod.glade.h:382
+msgid "_Encoding (ID3, files):"
+msgstr "_ערכת תווים (ID3, קבצים):"
+
+#: ../data/gtkpod.glade.h:383
+msgid "_Enqueue"
+msgstr "_הכנס לתור"
+
+#: ../data/gtkpod.glade.h:384
+msgid "_Export Tracks from Database"
+msgstr "_ייצא רצועות ממסד הנתונים"
+
+#: ../data/gtkpod.glade.h:385
+msgid "_File"
+msgstr "_קובץ"
+
+#: ../data/gtkpod.glade.h:386
+msgid "_General"
+msgstr "_כללי"
+
+#: ../data/gtkpod.glade.h:387
+msgid "_Help"
+msgstr "_עזרה"
+
+#: ../data/gtkpod.glade.h:388
+msgid "_Ignore rules"
+msgstr "_התעלם מחוקים"
+
+#: ../data/gtkpod.glade.h:389
+msgid "_Image"
+msgstr "_תמונה"
+
+#: ../data/gtkpod.glade.h:390
+msgid "_Info Window"
+msgstr "_חלון מידע"
+
+#: ../data/gtkpod.glade.h:391
+msgid "_Last.FM"
+msgstr "_Last.FM"
+
+#: ../data/gtkpod.glade.h:392
+msgid "_Less Sort Tabs"
+msgstr "_פחות כרטיסיות מיון"
+
+#: ../data/gtkpod.glade.h:393
+msgid "_Limit to"
+msgstr "_הגבל ל"
+
+#: ../data/gtkpod.glade.h:394
+msgid "_Load iPod(s)"
+msgstr "_טען iPod"
+
+#: ../data/gtkpod.glade.h:395
+msgid "_Local"
+msgstr "_מקומי"
+
+#: ../data/gtkpod.glade.h:396
+msgid "_M3U"
+msgstr "_M3U"
+
+#: ../data/gtkpod.glade.h:397
+msgid "_Misc."
+msgstr "_אחר"
+
+#: ../data/gtkpod.glade.h:398
+msgid "_More Sort Tabs"
+msgstr "_יותר כרטיסיות מיון"
+
+#: ../data/gtkpod.glade.h:399
+msgid "_Newly Added Tracks"
+msgstr "_רצועות חדשות שהוספו"
+
+#: ../data/gtkpod.glade.h:400
+msgid "_Normalize Volume"
+msgstr "_נרמל עוצמת קול"
+
+#: ../data/gtkpod.glade.h:401
+msgid "_Number of sort tabs:"
+msgstr "_מספר כרטיסיות המיון:"
+
+#: ../data/gtkpod.glade.h:402
+msgid "_PLS"
+msgstr "_PLS"
+
+#: ../data/gtkpod.glade.h:403
+msgid "_Play Now"
+msgstr "_נגן עכשיו"
+
+#: ../data/gtkpod.glade.h:404
+msgid "_Podcasts"
+msgstr "_פודקסטים"
+
+#: ../data/gtkpod.glade.h:405
+msgid "_Prefer Local"
+msgstr "_העדף מקומי"
+
+#: ../data/gtkpod.glade.h:406
+msgid "_Remove Album"
+msgstr "ה_סרת כותר"
+
+#: ../data/gtkpod.glade.h:407
+msgid "_Remove Cover Art"
+msgstr "הצג בגודל מלא"
+
+#: ../data/gtkpod.glade.h:408
+msgid "_Remove Images"
+msgstr "ה_סר תמונות"
+
+#: ../data/gtkpod.glade.h:409
+msgid "_Save Changes"
+msgstr "_שמור שינויים"
+
+#: ../data/gtkpod.glade.h:410
+msgid "_Save Displayed Track Order"
+msgstr "_שמירת סדר רצועות נראות"
+
+#: ../data/gtkpod.glade.h:411
+msgid "_Sorting"
+msgstr "_מיון"
+
+#: ../data/gtkpod.glade.h:412
+msgid "_Synchronize Playlist with Dir(s)"
+msgstr "סנכרן את רשימת ההשמעה עם התיקיה(יות)"
+
+#: ../data/gtkpod.glade.h:413
+msgid "_Toolbar"
+msgstr "_סרגל כלים"
+
+#: ../data/gtkpod.glade.h:414
+msgid "_Tools"
+msgstr "_כלים"
+
+#: ../data/gtkpod.glade.h:415
+msgid "_Tooltips"
+msgstr "_תוויות מידע"
+
+#: ../data/gtkpod.glade.h:416
+msgid "_Track Info"
+msgstr "_מידע רצועה"
+
+#: ../data/gtkpod.glade.h:417
+msgid "_Undo All"
+msgstr "_בטל הכל"
+
+#: ../data/gtkpod.glade.h:418
+msgid "_Update Tracks from File"
+msgstr "_סנכרון רצועות מקובץ"
+
+#: ../data/gtkpod.glade.h:419
+msgid "_Video"
+msgstr "_וידאו"
+
+#: ../data/gtkpod.glade.h:420
+msgid "_View"
+msgstr "_תצוגה"
+
+#: ../data/gtkpod.glade.h:421
+msgid "_iPod"
+msgstr "_iPod"
+
+#: ../data/gtkpod.glade.h:423
+#, no-c-format
+msgid "artist: %a, album: %A, composer: %c, title: %t, genre: %G, track nr: %T, CD nr: %C, year: %Y, skip data: %*, the character '%': %%. You can separate several templates by a ';'. The first one matching the filename will be used. Example: '%a - %A/%T %t.mp3;%t.wav'."
+msgstr ""
+"אמן: a%, כותר: A%, יוצר: c%, שם הרצועה: t%, סגנון: G%, מספר רצועה: T%, מספר תקליטור: C%, שנה: Y%, מידע דילוג: *%, האות '%': %%.\n"
+"אפשר להפריד בין מספר תבניות על ידי ';'. הראשון שיתאים לקובץ יבחר. לדוגמה:\n"
+" '%a - %A/%T %t.mp3;%t.wav'."
+
+#: ../data/gtkpod.glade.h:424
+msgid "folder"
+msgstr "תיקיה"
+
+#: ../data/gtkpod.glade.h:425
+msgid "folder.jpg"
+msgstr "folder.jpg"
+
+#: ../data/gtkpod.glade.h:427
+#, no-c-format
+msgid "folder.jpg;%a.jpg"
+msgstr "folder.jpg;%a.jpg"
+
+#: ../data/gtkpod.glade.h:428
+msgid "gtkpod"
+msgstr "gtkpod"
+
+#: ../data/gtkpod.glade.h:429
+msgid "gtkpod Info"
+msgstr "מידע gtkpod"
+
+#: ../data/gtkpod.glade.h:430
+msgid "gtkpod expects the ID3 tags and the filenames to be in the encoding specified here. You can change it for consecutive 'Add Files' and 'Add Dirs' operation. 'System Charset' is the charset used by your current locale."
+msgstr "היישום gtkpod מצפה שהתגיות של הID3 והקבצים יהיו בקידוד המצוין כאן. תוכל לשנות זאת בשביל פעולות עוקבות של 'הוספת קבצים' ו 'הוספת תיקיות'. 'ערכת התווים של המערכת' היא ערכת התווים בשימוש עבור הלוקל הנוכחי שלך."
+
+#: ../data/gtkpod.glade.h:431
+msgid "gtkpod options"
+msgstr "אפשרויות ה-gtkpod"
+
+#. These are the items for the 'Repository type' combo in the 'Create Repository' dialog. Keep the three items in order!
+#: ../data/gtkpod.glade.h:433
+msgid ""
+"iPod\n"
+"Local Repository (Standard)\n"
+"Local Repository (Podcasts)\n"
+msgstr ""
+"iPod\n"
+"מאגר מקומי (סטנדרטי)\n"
+"מאגר מקומי (פודקסטים)\n"
+
+#: ../data/gtkpod.glade.h:437
+msgid "iPod mountpoint:"
+msgstr "נקודת העגינה של ה-iPod:"
+
+#: ../data/gtkpod.glade.h:438
+msgid "iTunesDB backup:"
+msgstr "גיבוי ה־iTunesDB:"
+
+#: ../data/gtkpod.glade.h:439
+msgid "mserv Root:"
+msgstr "שורש ה-mserv:"
+
+#: ../data/gtkpod.glade.h:440
+msgid "mserv database lookup will be done for music in this directory."
+msgstr "החיפוש במסד הנתונים mserv יתבצע בתיקייה זאת עבור מוזיקה."
+
+#: ../data/gtkpod.glade.h:441
+#: ../src/details.c:1347
+msgid "n/a"
+msgstr "ל/ז"
+
+#: ../data/gtkpod.glade.h:442
+msgid "special_sorttab -- Don't translate!"
+msgstr "special_sorttab -- Don't translate!"
+
+#: ../src/autodetection.c:310
+msgid "Could not initialize GnomeVFS\n"
+msgstr "אי אפשר לאתחל את GnomeVFS\n"
+
+#: ../src/autodetection.c:397
+#, c-format
+msgid ""
+"Newly mounted iPod at '%s' could not be loaded into gtkpod.\n"
+"\n"
+msgstr ""
+"אי אפשר לטעון את ה־iPod החדש '%s' שעוגן לתוך gtkpod.\n"
+"\n"
+
+#: ../src/autodetection.c:403
+#, c-format
+msgid ""
+"Newly mounted iPod at '%s' appears to be already loaded!\n"
+"\n"
+msgstr ""
+"ה־iPod החדש העגון ב־'%s' כבר עדיין טעון!\n"
+"\n"
+
+#: ../src/autodetection.c:416
+msgid "New iPod"
+msgstr "מכשיר iPod חדש"
+
+#: ../src/charset.c:53
+msgid "Arabic (IBM-864)"
+msgstr "ערבית (IBM-864)"
+
+#: ../src/charset.c:54
+msgid "Arabic (ISO-8859-6)"
+msgstr "ערבית (ISO-8859-6)"
+
+#: ../src/charset.c:55
+msgid "Arabic (Windows-1256)"
+msgstr "ערבית (Windows-1256)"
+
+#: ../src/charset.c:56
+msgid "Baltic (ISO-8859-13)"
+msgstr "בלטית (ISO-8859-13)"
+
+#: ../src/charset.c:57
+msgid "Baltic (ISO-8859-4)"
+msgstr "בלטית (ISO-8859-4)"
+
+#: ../src/charset.c:58
+msgid "Baltic (Windows-1257)"
+msgstr "בלטית (Windows-1257)"
+
+#: ../src/charset.c:59
+msgid "Celtic (ISO-8859-14)"
+msgstr "קלטית (ISO-8859-14)"
+
+#: ../src/charset.c:60
+msgid "Central European (IBM-852)"
+msgstr "מרכז אירופאי (IBM-852)"
+
+#: ../src/charset.c:61
+msgid "Central European (ISO-8859-2)"
+msgstr "מרכז אירופאי (ISO-8859-2)"
+
+#: ../src/charset.c:62
+msgid "Central European (Windows-1250)"
+msgstr "מרכז אירופאי (Windows-1250)"
+
+#: ../src/charset.c:63
+msgid "Chinese Simplified (GB18030)"
+msgstr "סינית מופשטת (GB18030)"
+
+#: ../src/charset.c:64
+msgid "Chinese Simplified (GB2312)"
+msgstr "סינית מופשטת (GB2312)"
+
+#: ../src/charset.c:65
+msgid "Chinese Traditional (Big5)"
+msgstr "סינית מסורתית (Big5)"
+
+#: ../src/charset.c:66
+msgid "Chinese Traditional (Big5-HKSCS)"
+msgstr "סינית מסורתית (Big5-HKSCS)"
+
+#: ../src/charset.c:67
+msgid "Cyrillic (IBM-855)"
+msgstr "קירילית (IBM-855)"
+
+#: ../src/charset.c:68
+msgid "Cyrillic (ISO-8859-5)"
+msgstr "קירילית (ISO-8859-5)"
+
+#: ../src/charset.c:69
+msgid "Cyrillic (ISO-IR-111)"
+msgstr "קירילית (ISO-IR-111)"
+
+#: ../src/charset.c:70
+msgid "Cyrillic (KOI8-R)"
+msgstr "קירילית (KOI8-R)"
+
+#: ../src/charset.c:71
+msgid "Cyrillic (Windows-1251)"
+msgstr "קירילית (Windows-1251)"
+
+#: ../src/charset.c:72
+msgid "Cyrillic/Russian (CP-866)"
+msgstr "קירילית/רוסית (CP-866)"
+
+#: ../src/charset.c:73
+msgid "Cyrillic/Ukrainian (KOI8-U)"
+msgstr "קירילית/אוקראינית (KOI8-U)"
+
+#: ../src/charset.c:74
+msgid "English (US-ASCII)"
+msgstr "אנגלית (US-ASCII)"
+
+#: ../src/charset.c:75
+msgid "Greek (ISO-8859-7)"
+msgstr "יוונית (ISO-8859-7)"
+
+#: ../src/charset.c:76
+msgid "Greek (Windows-1253)"
+msgstr "יוונית (Windows-1253)"
+
+#: ../src/charset.c:77
+msgid "Hebrew (IBM-862)"
+msgstr "עברית (IBM-862)"
+
+#: ../src/charset.c:78
+msgid "Hebrew (Windows-1255)"
+msgstr "עברית (Windows-1255)"
+
+#: ../src/charset.c:79
+msgid "Japanese (automatic detection)"
+msgstr "יפנית (זיהוי אוטומטי)"
+
+#: ../src/charset.c:80
+msgid "Japanese (EUC-JP)"
+msgstr "יפנית (EUC-JP)"
+
+#: ../src/charset.c:81
+msgid "Japanese (ISO-2022-JP)"
+msgstr "יפנית (ISO-2022-JP)"
+
+#: ../src/charset.c:82
+msgid "Japanese (Shift_JIS)"
+msgstr "יפנית (Shift_JIS)"
+
+#: ../src/charset.c:83
+msgid "Korean (EUC-KR)"
+msgstr "קוריאנית (EUC-KR)"
+
+#: ../src/charset.c:84
+msgid "Nordic (ISO-8859-10)"
+msgstr "נורדית (ISO-8859-10)"
+
+#: ../src/charset.c:85
+msgid "South European (ISO-8859-3)"
+msgstr "דרום אירופאי (ISO-8859-3)"
+
+#: ../src/charset.c:86
+msgid "Thai (TIS-620)"
+msgstr "תאילנדית (TIS-620)"
+
+#: ../src/charset.c:87
+msgid "Turkish (IBM-857)"
+msgstr "טורקית (IBM-857)"
+
+#: ../src/charset.c:88
+msgid "Turkish (ISO-8859-9)"
+msgstr "טורקית (ISO-8859-9)"
+
+#: ../src/charset.c:89
+msgid "Turkish (Windows-1254)"
+msgstr "טורקית (Windows-1254)"
+
+#: ../src/charset.c:90
+msgid "Unicode (UTF-7)"
+msgstr "יוניקוד (UTF-7)"
+
+#: ../src/charset.c:91
+msgid "Unicode (UTF-8)"
+msgstr "יוניקוד (UTF-8)"
+
+#: ../src/charset.c:92
+msgid "Unicode (UTF-16BE)"
+msgstr "יוניקוד (UTF-16BE)"
+
+#: ../src/charset.c:93
+msgid "Unicode (UTF-16LE)"
+msgstr "יוניקוד (UTF-16LE)"
+
+#: ../src/charset.c:94
+msgid "Unicode (UTF-32BE)"
+msgstr "יוניקוד (UTF-32BE)"
+
+#: ../src/charset.c:95
+msgid "Unicode (UTF-32LE)"
+msgstr "יוניקוד (UTF-32LE)"
+
+#: ../src/charset.c:96
+msgid "Vietnamese (VISCII)"
+msgstr "וייטנאמית (VISCII)"
+
+#: ../src/charset.c:97
+msgid "Vietnamese (Windows-1258)"
+msgstr "וייטנאמית (Windows-1258)"
+
+#: ../src/charset.c:98
+msgid "Visual Hebrew (ISO-8859-8)"
+msgstr "עברית ויזואלית (ISO-8859-8)"
+
+#: ../src/charset.c:99
+msgid "Western (IBM-850)"
+msgstr "מערבי (IBM-850)"
+
+#: ../src/charset.c:100
+msgid "Western (ISO-8859-1)"
+msgstr "מערבי (ISO-8859-1)"
+
+#: ../src/charset.c:101
+msgid "Western (ISO-8859-15)"
+msgstr "מערבי (ISO-8859-15)"
+
+#: ../src/charset.c:102
+msgid "Western (Windows-1252)"
+msgstr "מערבי (Windows-1252)"
+
+#. sanity!
+#. check for "System Charset" and return NULL
+#: ../src/charset.c:160
+#: ../src/charset.c:170
+#: ../src/charset.c:223
+msgid "System Charset"
+msgstr "ערכת התווים של המערכת"
+
+#. we are not the first instance of gtkpod -- the socket is
+#. already being used, so we pass
+#: ../src/clientserver.c:214
+msgid "Another instance of gtkpod was detected. Playcount server not started.\n"
+msgstr "עותק ריצה נוסף של gtkpod נמצא. שרת ספירה לא יופעל.\n"
+
+#: ../src/confirmation.c:377
+msgid "Confirmation Dialogue"
+msgstr "תיבת דו שיח לאישור"
+
+#: ../src/context_menus.c:362
+#, c-format
+msgid "Copied \"%s\" playlist to %s"
+msgstr "הועתקה רשימת השמעה '%s' אל '%s'."
+
+#: ../src/context_menus.c:401
+#, c-format
+msgid "Copied %d track to '%s'"
+msgid_plural "Copied %d tracks to '%s'"
+msgstr[0] "הועתקה %d רצועה אל '%s'."
+msgstr[1] "הועתקו %d רצועות אל '%s'."
+
+#: ../src/context_menus.c:429
+#, c-format
+msgid "Copied '%s' playlist to '%s' in '%s'"
+msgstr "הועתקה רצועת השמעה '%s' אל '%s' בתוך '%s'."
+
+#: ../src/context_menus.c:462
+#, c-format
+msgid "Copied %d track to '%s' in '%s'"
+msgid_plural "Copied %d tracks to %s in '%s'"
+msgstr[0] "הועתקה %d רצועה אל '%s' בתוך '%s'"
+msgstr[1] "הועתקו %d רצועות אל '%s' בתוך '%s'"
+
+#: ../src/context_menus.c:622
+#: ../src/tools.c:854
+msgid "Play Now"
+msgstr "נגן עכשיו"
+
+#: ../src/context_menus.c:628
+#: ../src/tools.c:867
+msgid "Enqueue"
+msgstr "הכנס לתור"
+
+#: ../src/context_menus.c:634
+msgid "Copy Tracks to Filesystem"
+msgstr "העתק רצועות אל מערכת הקבצים"
+
+#: ../src/context_menus.c:641
+#: ../src/file_export.c:1085
+msgid "Create Playlist File"
+msgstr "יצירת קובץ רשימת השמעה"
+
+#: ../src/context_menus.c:648
+msgid "Create new Playlist"
+msgstr "יצירת רשימת השמעה חדשה"
+
+#: ../src/context_menus.c:655
+msgid "Update Tracks from File"
+msgstr "עדכן רצועות מקובץ"
+
+#: ../src/context_menus.c:669
+msgid "Sync Playlist with Dir(s)"
+msgstr "סנכרן את רשימת ההשמעה עם התיקיה(יות)"
+
+#: ../src/context_menus.c:679
+msgid "Remove All Tracks from iPod"
+msgstr "מחק את כל הרצועות מה-iPod"
+
+#: ../src/context_menus.c:697
+msgid "Remove All Podcasts from iPod"
+msgstr "מחק את כל הפודקסטים מה-iPod"
+
+#: ../src/context_menus.c:712
+msgid "Delete Including Tracks"
+msgstr "מחק כולל רצועות"
+
+#: ../src/context_menus.c:720
+msgid "Delete But Keep Tracks"
+msgstr "מחק אבל שמור רצועות"
+
+#: ../src/context_menus.c:728
+msgid "Edit iPod Properties"
+msgstr "ערוך מאפייני iPod"
+
+#: ../src/context_menus.c:735
+msgid "Edit Repository Properties"
+msgstr "ערוך מאפייני מאגר"
+
+#: ../src/context_menus.c:742
+msgid "Edit Playlist Properties"
+msgstr "ערוך מאפייני רשימת השמעה"
+
+#: ../src/context_menus.c:770
+msgid "View Full Size Artwork"
+msgstr "הצג תמונות בגודל מלא"
+
+#: ../src/context_menus.c:777
+msgid "Select Cover From File"
+msgstr "בחירת עטיפה מקובץ"
+
+#: ../src/context_menus.c:790
+msgid "Load iPod"
+msgstr "טען iPod"
+
+#: ../src/context_menus.c:797
+msgid "Eject iPod"
+msgstr "נתק iPod"
+
+#: ../src/context_menus.c:814
+msgid "Remove All Tracks from Database"
+msgstr "מחק את כל הרצועות ממסד הנתונים"
+
+#: ../src/context_menus.c:829
+msgid "Delete Including Tracks (Harddisk)"
+msgstr "מחק כולל רצועות (דיסק קשיח)"
+
+#: ../src/context_menus.c:837
+msgid "Delete Including Tracks (Database)"
+msgstr "מחק כולל רצועות (מסד נתונים)"
+
+#: ../src/context_menus.c:845
+msgid "Delete From iPod"
+msgstr "מחק מה-iPod"
+
+#: ../src/context_menus.c:853
+msgid "Delete From Playlist"
+msgstr "מחק מרשימת ההשמעה"
+
+#: ../src/context_menus.c:861
+msgid "Delete From Harddisk"
+msgstr "מחק מהדיסק הקשיח"
+
+#: ../src/context_menus.c:869
+msgid "Delete From Database"
+msgstr "מחק ממסד הנתונים"
+
+#: ../src/context_menus.c:877
+msgid "Alphabetize"
+msgstr "סדר אלפאבתי"
+
+#: ../src/context_menus.c:895
+msgid "Remove Album"
+msgstr "הסרת כותר"
+
+#: ../src/context_menus.c:905
+msgid "Remove Photo"
+msgstr "הסרת תמונה"
+
+#: ../src/context_menus.c:922
+msgid "Rename Album"
+msgstr "שנה שם אלבום"
+
+#: ../src/context_menus.c:981
+#: ../src/context_menus.c:1030
+msgid "Copy selected playlist to..."
+msgstr "העתק רשימות השמעה נבחרות אל..."
+
+#: ../src/context_menus.c:1083
+msgid "Copy selected track(s) to..."
+msgstr "העתק רצועה/ות נבחרת/ות אל..."
+
+#: ../src/date_parser.l:269
+#, c-format
+msgid "Date format error: unrecognized character: '%s'\n"
+msgstr "פורמט תאריך שגוי: תו לא מזוהה: '%s'\n"
+
+#: ../src/details.c:82
+msgid "Audio/Video"
+msgstr "שמע/וידאו"
+
+#: ../src/details.c:83
+msgid "Audio"
+msgstr "שמע"
+
+#: ../src/details.c:84
+msgid "Video"
+msgstr "וידאו"
+
+#: ../src/details.c:85
+msgid "Podcast"
+msgstr "פודקסט"
+
+#: ../src/details.c:86
+msgid "Video Podcast"
+msgstr "פודקסט וידאו"
+
+#: ../src/details.c:87
+msgid "Audiobook"
+msgstr "ספר שמע"
+
+#: ../src/details.c:88
+#: ../src/display_spl.c:209
+#: ../src/display_spl.c:218
+msgid "Music Video"
+msgstr "וידאו מוזיקה"
+
+#: ../src/details.c:89
+#: ../src/display_spl.c:107
+#: ../src/display_spl.c:210
+#: ../src/display_spl.c:219
+#: ../src/misc_conversion.c:101
+msgid "TV Show"
+msgstr "תוכנית טלויזיה"
+
+#: ../src/details.c:90
+msgid "TV Show & Music Video"
+msgstr "תוכנית טלויזיה & וידאו מוזיקה"
+
+#: ../src/details.c:836
+#, c-format
+msgid "%s (image data corrupted or unreadable)"
+msgstr "(מידע תמונה הושחת או לא קריא) %s"
+
+#: ../src/details.c:973
+#, c-format
+msgid "Please report unknown mediatype %x\n"
+msgstr "אנא דווח על מדיות לא ידועות %x\n"
+
+#: ../src/details.c:1418
+msgid "<b>n/a</b>"
+msgstr "<b>לא זמין</b>"
+
+#: ../src/details.c:1906
+#, c-format
+msgid "Error occurred dropping an image onto the details window: %s\n"
+msgstr "תקלה אירעה בעת הורדת תמונה אל חלון הפרטים: %s\n"
+
+#: ../src/details.c:1952
+#: ../src/display_coverart.c:2128
+msgid "Successfully set new coverart for selected tracks"
+msgstr "תמונת עטיפה חדשה עבור הרצועה הנבחרת נקבעה בהצלחה"
+
+#: ../src/display.c:490
+#, c-format
+msgid "<b>Image Dimensions: %s</b>"
+msgstr "<b>גודל התמונה:: %s</b>"
+
+#: ../src/display.c:744
+msgid "Edit selected entry of which sort tab?"
+msgstr "מאיזה כרטיסיית מיון לערוך את הרשומה הנבחרת?"
+
+#. no entry selected
+#: ../src/display.c:751
+#: ../src/misc_confirm.c:435
+#: ../src/misc_track.c:2138
+msgid "No entry selected."
+msgstr "לא נבחרה רשומה."
+
+#: ../src/display.c:910
+#: ../src/display.c:1230
+#: ../src/display.c:1286
+#: ../src/display.c:1340
+#: ../src/display.c:1395
+#: ../src/display.c:1656
+#, c-format
+msgid "No entry selected in Sort Tab %d"
+msgstr "לא נבחרה רשומה בכרטיסיית מיון %d"
+
+#: ../src/display.c:949
+msgid "Remove entry of which sort tab from database?"
+msgstr "הסר רשומה מאיזה כרטיסיית מיון במסד הנתונים?"
+
+#: ../src/display.c:957
+msgid "Remove tracks in selected entry of which filter tab from the iPod?"
+msgstr "באיזה כרטיסיית מיון של רשומה נבחרת להסיר רצועות מה־iPod?"
+
+#: ../src/display.c:979
+msgid "Remove tracks in selected entry of which filter tab from the harddisk?"
+msgstr "באיזה כרטיסיית מיון של רשומה נבחרת להסיר רצועות מהדיסק הקשיח?"
+
+#: ../src/display.c:1009
+msgid "Remove tracks in selected entry of which filter tab from playlist?"
+msgstr "באיזה כרטיסיית מיון של רשומה נבחרת להסיר רצועות מרשימת ההשמעה?"
+
+#: ../src/display.c:1036
+#: ../src/display.c:1074
+#, c-format
+msgid ""
+"iPod at '%s' is not loaded.\n"
+"Please load it first."
+msgstr ""
+"ה־iPod ב־'%s' לא טעון.\n"
+"אנא טען אותו תחילה."
+
+#: ../src/display.c:1111
+#: ../src/display.c:1138
+msgid "Update selected entry of which sort tab?"
+msgstr "באיזה כרטיסיית מיון של רשומה נבחרת לעדכן?"
+
+#: ../src/display.c:1224
+msgid "Export selected entry of which sort tab?"
+msgstr "באיזה כרטיסיית מיון של רשומה נבחרת לייצא?"
+
+#: ../src/display.c:1280
+msgid "Create playlist file from selected entry of which sort tab?"
+msgstr "באיזה כרטיסיית מיון של רשומה נבחרת ליצור קובץ רשימת השמעה?"
+
+#: ../src/display.c:1334
+msgid "Play tracks in selected entry of which sort tab?"
+msgstr "באיזה כרטיסיית מיון של רשומה נבחרת לנגן רצועות?"
+
+#: ../src/display.c:1389
+msgid "Enqueue tracks in selected entry of which sort tab?"
+msgstr "באיזה כרטיסיית מיון של רשומה נבחרת להוסיף רצועות לתור?"
+
+#: ../src/display.c:1646
+msgid "Normalize tracks in selected entry of which sort tab?"
+msgstr "באיזה כרטיסיית מיון של רשומה נבחרת לנרמל רצועות?"
+
+#: ../src/display_coverart.c:1713
+msgid "Failed to remove the album from the album hash store."
+msgstr "נכשלה ההסרה של האלבום מתוך מקום האיכסון של האלבומים."
+
+#: ../src/display_coverart.c:2098
+#, c-format
+msgid "Error occurred dropping an image onto the coverart display: %s\n"
+msgstr "תקלה אירעה בעת הורדת תמונה אל חלון העטיפות: %s\n"
+
+#: ../src/display_itdb.c:376
+#, c-format
+msgid "Failed to set cover art: '%s'\n"
+msgstr "כשלון בקביעת עטיפה: '%s'\n"
+
+#: ../src/display_itdb.c:858
+#: ../src/display_itdb.c:991
+msgid "Local"
+msgstr "מקומי"
+
+#. add podcast playlist
+#: ../src/display_itdb.c:866
+#: ../src/display_itdb.c:989
+#: ../src/display_itdb.c:1025
+msgid "Podcasts"
+msgstr "פודקסטים"
+
+#: ../src/display_itdb.c:875
+#: ../src/display_itdb.c:993
+#: ../src/repository.c:1186
+msgid "iPod"
+msgstr "iPod"
+
+#: ../src/display_itdb.c:1084
+#, c-format
+msgid "Increased playcount for '%s'"
+msgstr "הועלתה ספירת השמעות עבור '%s'"
+
+#: ../src/display_photo.c:163
+#, c-format
+msgid "Error reading iPod photo database (%s).\n"
+msgstr "תקלה בזמן קריאת מסד הנתונים של התמונות (%s) על ה־iPod.\n"
+
+#: ../src/display_photo.c:168
+msgid "Error reading iPod photo database.\n"
+msgstr "תקלה בזמן קריאת מסד הנתונים של התמונות על ה־iPod.\n"
+
+#: ../src/display_photo.c:238
+msgid "Could not access the iPod's photo database."
+msgstr "אי אפשר לגשת אל מסד הנתונים של התמונות ב־iPod."
+
+#: ../src/display_photo.c:441
+msgid "Photo Albums"
+msgstr "אלבומי תמונות"
+
+#: ../src/display_photo.c:451
+#: ../src/display_photo.c:1685
+msgid "<Unnamed>"
+msgstr "<ללא שם>"
+
+#: ../src/display_photo.c:939
+msgid "The Photo Library album cannot be removed"
+msgstr "אי אפשר היה להסיר את אלבום ספריית התמונות"
+
+#: ../src/display_photo.c:961
+msgid "Do you want to remove the album's photos too?"
+msgstr "האם אתה בטוח שאתה רוצה להסיר את כל אלבומי התמונות גם כן?"
+
+#: ../src/display_photo.c:967
+msgid "Yes. Do Not Display Again"
+msgstr "כן. אל תציג שנית"
+
+#: ../src/display_photo.c:1038
+msgid ""
+"This will remove the photo selection from the selected album.\n"
+" Do you want to delete them from the database as well?"
+msgstr ""
+"זה יסיר את בחירת התמונה מהאלבום הנבחר.\n"
+" האם ברצונך למחוק את מסד הנתונים גם כן?"
+
+#: ../src/display_photo.c:1053
+msgid "This will delete the photo selection from the Photo Library and all albums. Are you sure?"
+msgstr "פעולה זו תמחק את בחירת התמונות מספריית התמונות וכל האלבומים. האם אתה בטוח?"
+
+#: ../src/display_photo.c:1128
+msgid "New Photo Album Name"
+msgstr "שם אלבום תמונות חדש"
+
+#: ../src/display_photo.c:1129
+msgid "Please enter a new name for the photo album"
+msgstr "הכנס בבקשה את השם של אלבום התמונות"
+
+#: ../src/display_photo.c:1141
+#: ../src/display_photo.c:1223
+msgid "An album with that name already exists."
+msgstr "אלבום בשם זה כבר קיים."
+
+#: ../src/display_photo.c:1210
+msgid "New Photo Album"
+msgstr "אלבום תמונות חדש"
+
+#: ../src/display_photo.c:1211
+msgid "Please enter a name for the new photo album"
+msgstr "הכנס בבקשה את השם של אלבום התמונות החדש"
+
+#: ../src/display_photo.c:1232
+msgid "The new album failed to be created."
+msgstr "כשלון ביצירת האלבום החדש."
+
+#: ../src/display_photo.c:1256
+msgid "Add Image to iPod"
+msgstr "הוסף תמונה ל־iPod"
+
+#. Open a dialog directory chooser window
+#: ../src/display_photo.c:1311
+msgid "Add a Directory of Images to the iPod. Select the Directory."
+msgstr "הוספת תיקיית תמונות אל ה־iPod. בחר את התיקייה."
+
+#: ../src/display_photo.c:1699
+#, c-format
+msgid "<No members>\n"
+msgstr "<ללא חברים>\n"
+
+#. give a notice on the statusbar -- otherwise the user
+#. * will never know why the drag is not possible
+#: ../src/display_playlists.c:516
+#: ../src/display_playlists.c:558
+msgid "Error: drag from iPod not possible in offline mode."
+msgstr "שגיאה: גרירה מה-iPod היא לא אפשרית במצב לא מקוון."
+
+#: ../src/display_playlists.c:585
+#: ../src/display_tracks.c:286
+#, c-format
+msgid "Copied one track"
+msgid_plural "Copied %d tracks"
+msgstr[0] "רצועה אחת הועתקה"
+msgstr[1] "הועתקו %d רצועות"
+
+#: ../src/display_playlists.c:865
+#: ../src/display_playlists.c:877
+msgid "Can't reorder sorted treeview."
+msgstr "אי אפשר לסדר מחדש עץ ממוין."
+
+#: ../src/display_playlists.c:954
+#, c-format
+msgid ""
+"This DND type (%d) is not (yet) supported. If you feel implementing this would be useful, please contact the author.\n"
+"\n"
+msgstr ""
+"פעולת הגרור & שחרר הזאת (%d) (עדיין) לא נתמכת. אם אתה מרגיש שמימושה יהיה ראוי, צור קשר עם המחבר.\n"
+"\n"
+
+#. no existing photo playlist found so add one
+#. * either itdb had no children or none of them
+#. * were of the photo type.
+#.
+#: ../src/display_playlists.c:1569
+msgid "Photos"
+msgstr "תמונות"
+
+#: ../src/display_sorttabs.c:473
+msgid "'Played' condition ignored because of error."
+msgstr "התעלמות ממצב 'הושמע' עקב תקלה"
+
+#: ../src/display_sorttabs.c:476
+msgid "'Modified' condition ignored because of error."
+msgstr "התעלמות ממצב 'שונה' עקב תקלה"
+
+#: ../src/display_sorttabs.c:479
+msgid "'Added' condition ignored because of error."
+msgstr "התעלמות ממצב 'הוספה' עקב תקלה"
+
+#: ../src/display_sorttabs.c:1562
+#: ../src/misc_conversion.c:59
+msgid "All"
+msgstr "הכל"
+
+#: ../src/display_sorttabs.c:1588
+msgid "Compilations"
+msgstr "יצירות"
+
+#: ../src/display_sorttabs.c:2988
+msgid "Comp."
+msgstr "יצירה"
+
+#: ../src/display_sorttabs.c:2994
+#: ../src/display_spl.c:88
+#: ../src/display_tracks.c:2109
+#: ../src/misc_conversion.c:84
+msgid "Year"
+msgstr "שנה"
+
+#: ../src/display_sorttabs.c:2997
+msgid "Special"
+msgstr "מיוחד"
+
+#: ../src/display_sorttabs.c:3245
+msgid "Last Played"
+msgstr "הושמע לאחרונה"
+
+#: ../src/display_sorttabs.c:3246
+msgid "Last Modified"
+msgstr "שונה לאחרונה"
+
+#: ../src/display_spl.c:64
+msgid "days"
+msgstr "ימים"
+
+#: ../src/display_spl.c:65
+msgid "weeks"
+msgstr "שבועות"
+
+#: ../src/display_spl.c:66
+msgid "months"
+msgstr "חודשים"
+
+#: ../src/display_spl.c:73
+msgid "kbps"
+msgstr "קס\"ש"
+
+#: ../src/display_spl.c:74
+msgid "Hz"
+msgstr "הרץ"
+
+#: ../src/display_spl.c:75
+#: ../src/display_spl.c:179
+#: ../src/info.c:780
+msgid "MB"
+msgstr "מ\"ב"
+
+#: ../src/display_spl.c:76
+msgid "secs"
+msgstr "שניות"
+
+#: ../src/display_spl.c:86
+#: ../src/misc_conversion.c:74
+msgid "Bitrate"
+msgstr "קצב סיביות"
+
+#. 15
+#: ../src/display_spl.c:87
+#: ../src/misc_conversion.c:75
+msgid "Samplerate"
+msgstr "קצב דגימה"
+
+#: ../src/display_spl.c:90
+msgid "Kind"
+msgstr "סוג"
+
+#: ../src/display_spl.c:91
+#: ../src/misc_conversion.c:81
+msgid "Date modified"
+msgstr "תאריך שינוי"
+
+#: ../src/display_spl.c:92
+msgid "Track number"
+msgstr "מספר רצועה"
+
+#: ../src/display_spl.c:93
+msgid "Size"
+msgstr "גודל"
+
+#: ../src/display_spl.c:95
+#: ../src/misc_conversion.c:64
+msgid "Comment"
+msgstr "הערה"
+
+#: ../src/display_spl.c:96
+#: ../src/misc_conversion.c:79
+msgid "Date added"
+msgstr "תאריך הוספה"
+
+#: ../src/display_spl.c:99
+msgid "Last played"
+msgstr "הושמע לאחרונה"
+
+#: ../src/display_spl.c:100
+msgid "Disc number"
+msgstr "מספר דיסק"
+
+#: ../src/display_spl.c:102
+#: ../src/misc_conversion.c:87
+msgid "Compilation"
+msgstr "יצירה"
+
+#: ../src/display_spl.c:103
+#: ../src/misc_conversion.c:76
+msgid "BPM"
+msgstr "BPM"
+
+#: ../src/display_spl.c:104
+#: ../src/misc_conversion.c:86
+msgid "Grouping"
+msgstr "קיבוץ"
+
+#: ../src/display_spl.c:105
+msgid "Playlist"
+msgstr "רשימת השמעה"
+
+#: ../src/display_spl.c:106
+msgid "Video Kind"
+msgstr "מסוג וידאו"
+
+#: ../src/display_spl.c:108
+msgid "Season number"
+msgstr "מספר חלק"
+
+#: ../src/display_spl.c:109
+msgid "Skip count"
+msgstr "מספור דילוגים"
+
+#: ../src/display_spl.c:110
+msgid "Last skipped"
+msgstr "האחרון שדילגת עליו"
+
+#: ../src/display_spl.c:111
+msgid "Album artist"
+msgstr "כותר אמן"
+
+#: ../src/display_spl.c:117
+msgid "contains"
+msgstr "מכיל"
+
+#: ../src/display_spl.c:118
+msgid "does not contain"
+msgstr "לא מכיל"
+
+#: ../src/display_spl.c:119
+#: ../src/display_spl.c:128
+#: ../src/display_spl.c:138
+#: ../src/display_spl.c:157
+#: ../src/display_spl.c:164
+msgid "is"
+msgstr "קיים"
+
+#: ../src/display_spl.c:120
+#: ../src/display_spl.c:129
+#: ../src/display_spl.c:139
+#: ../src/display_spl.c:158
+#: ../src/display_spl.c:165
+msgid "is not"
+msgstr "לא קיים"
+
+#: ../src/display_spl.c:121
+msgid "starts with"
+msgstr "מתחיל ב-"
+
+#: ../src/display_spl.c:122
+msgid "ends with"
+msgstr "מסתיים ב-"
+
+#: ../src/display_spl.c:130
+msgid "is greater than"
+msgstr "גדול מ-"
+
+#: ../src/display_spl.c:131
+msgid "is less than"
+msgstr "קטן מ-"
+
+#: ../src/display_spl.c:132
+#: ../src/display_spl.c:144
+msgid "is in the range"
+msgstr "בטווח "
+
+#: ../src/display_spl.c:140
+msgid "is after"
+msgstr "אחרי"
+
+#: ../src/display_spl.c:141
+msgid "is before"
+msgstr "לפני"
+
+#: ../src/display_spl.c:142
+msgid "in the last"
+msgstr "אחרון"
+
+#: ../src/display_spl.c:143
+msgid "not in the last"
+msgstr "לא אחרון"
+
+#: ../src/display_spl.c:150
+msgid "is set"
+msgstr "מקובע"
+
+#: ../src/display_spl.c:151
+msgid "is not set"
+msgstr "לא מקובע"
+
+#: ../src/display_spl.c:171
+msgid "Not supported"
+msgstr "לא נתמך"
+
+#: ../src/display_spl.c:178
+msgid "minutes"
+msgstr "דקות"
+
+#: ../src/display_spl.c:180
+msgid "tracks"
+msgstr "רצועות"
+
+#: ../src/display_spl.c:181
+msgid "hours"
+msgstr "שעות"
+
+#: ../src/display_spl.c:182
+#: ../src/info.c:780
+msgid "GB"
+msgstr "ג\"ב"
+
+#: ../src/display_spl.c:189
+msgid "random order"
+msgstr "סדר אקראי"
+
+#: ../src/display_spl.c:190
+msgid "title"
+msgstr "שם הרצועה"
+
+#: ../src/display_spl.c:191
+msgid "album"
+msgstr "כותר"
+
+#: ../src/display_spl.c:192
+msgid "artist"
+msgstr "אמן"
+
+#: ../src/display_spl.c:193
+msgid "genre"
+msgstr "סגנון"
+
+#: ../src/display_spl.c:194
+msgid "most recently added"
+msgstr "הוספו לאחרונה"
+
+#: ../src/display_spl.c:195
+msgid "least recently added"
+msgstr "לא הוספו לאחרונה"
+
+#: ../src/display_spl.c:196
+msgid "most often played"
+msgstr "מושמע בתכיפות גבוהה"
+
+#: ../src/display_spl.c:197
+msgid "least often played"
+msgstr "מושמע בתכיפות נמוכה"
+
+#: ../src/display_spl.c:198
+msgid "most recently played"
+msgstr "הושמע לאחרונה"
+
+#: ../src/display_spl.c:199
+msgid "least recently played"
+msgstr "לא הושמע לאחרונה"
+
+#: ../src/display_spl.c:200
+msgid "highest rating"
+msgstr "מדרוג גבוה ביותר"
+
+#: ../src/display_spl.c:201
+msgid "lowest rating"
+msgstr "מדרוג נמוך ביותר"
+
+#: ../src/display_spl.c:208
+#: ../src/display_spl.c:217
+msgid "Movie"
+msgstr "סרט"
+
+#: ../src/display_spl.c:1192
+#: ../src/display_spl.c:1207
+msgid "to"
+msgstr "אל "
+
+#: ../src/display_spl.c:1485
+msgid "-"
+msgstr "-"
+
+#: ../src/display_spl.c:1500
+msgid "+"
+msgstr "+"
+
+#: ../src/display_tracks.c:281
+#, c-format
+msgid "Moved one track"
+msgid_plural "Moved %d tracks"
+msgstr[0] "רצועה אחת הועברה"
+msgstr[1] "הועברו %d רצועות"
+
+#: ../src/display_tracks.c:1810
+#, c-format
+msgid ""
+"Cannot unsort track view because of a bug in the GTK lib you are using (%d.%d.%d < 2.5.4). Once you sort the track view, you cannot go back to the unsorted state.\n"
+"\n"
+msgstr ""
+"אי אפשר לבטל מיון של תצוגת העץ עקב באג בספרית ה-GTK הנמצאת בשימוש (%d.%d.%d < 2.5.4). ברגע שמיינת את תוגת העץ, אי אפשר לחזור חזרה למצב הלא ממוין.\n"
+"\n"
+
+#: ../src/display_tracks.c:2069
+msgid "Rtng"
+msgstr "מדרוג"
+
+#: ../src/display_tracks.c:2072
+msgid "#"
+msgstr "#"
+
+#: ../src/display_tracks.c:2075
+msgid "CD"
+msgstr "דיסק שמע"
+
+#: ../src/display_tracks.c:2078
+msgid "ID"
+msgstr "מזהה"
+
+#: ../src/display_tracks.c:2081
+msgid "Trnsfrd"
+msgstr "העברה"
+
+#: ../src/display_tracks.c:2085
+msgid "Cmpl"
+msgstr "יצירה"
+
+#: ../src/display_tracks.c:2091
+msgid "Time"
+msgstr "זמן"
+
+#: ../src/display_tracks.c:2094
+msgid "Plycnt"
+msgstr "ספירת שמע"
+
+#: ../src/display_tracks.c:2106
+msgid "Released"
+msgstr "שוחרר"
+
+#: ../src/display_tracks.c:2112
+msgid "Vol."
+msgstr "עוצמה"
+
+#: ../src/display_tracks.c:2115
+msgid "Sndchk."
+msgstr "בדיקת קול"
+
+#: ../src/fetchcover.c:358
+msgid "Coverart file already exists"
+msgstr "קובץ עטיפה כבר קיים"
+
+#: ../src/fetchcover.c:371
+#, c-format
+msgid ""
+"The picture file %s already exists.\n"
+"This may be associated with other music files in the directory.\n"
+"\n"
+"-  Clicking Yes will overwrite the existing file, possibly associating\n"
+"   other music files in the same directory with this coverart file.\n"
+"-  Clicking No will save the file with a unique file name.\n"
+"-  Clicking Cancel will abort the fetchcover operation."
+msgstr ""
+"קובץ התמונה %s כבר קיים.\n"
+"הוא עשוי להיות מקושר עם קובץ מוזיקה אחר בתיקייה זו.\n"
+"\n"
+"- לחיצה על \"כן\" תדרוס את הקובץ הקיים, ועלולה לקשר קבצי מוזיקה אחרים בתיקייה זו אם קובץ עטיפה זה.\n"
+"- לחיצה על \"לא\" תשמור את הקובץ עם שם ייחודי./n- לחיצה על \"בטל\" תבטל את פעולה הבאת העטיפה."
+
+#: ../src/file.c:236
+#, c-format
+msgid ""
+"'%s' is a directory, not a playlist file.\n"
+"\n"
+msgstr ""
+"'%s' הוא תיקייה, לא קובץ רשימת השמעה.\n"
+"\n"
+
+#: ../src/file.c:266
+#, c-format
+msgid ""
+"'%s' is a not a known playlist file.\n"
+"\n"
+msgstr ""
+"'%s' הוא לא קובץ רשימת השמעה מוכר.\n"
+"\n"
+
+#: ../src/file.c:283
+#: ../src/file_export.c:217
+#: ../src/oggfile.c:62
+#: ../src/wavfile.c:107
+#, c-format
+msgid "Could not open '%s' for reading.\n"
+msgstr "לא מסוגל לפתוח את '%s' לכתיבה.\n"
+
+#: ../src/file.c:369
+#, c-format
+msgid "Skipping '%s' because it is a directory.\n"
+msgstr "מדלג על '%s' בגלל שהוא תיקייה.\n"
+
+#: ../src/file.c:374
+#, c-format
+msgid "Skipping '%s' to avoid adding playlist file recursively\n"
+msgstr "מדלג על '%s' על מנת להתחמק מהוספת קובץ רשימת השמעה רקורסיבי\n"
+
+#: ../src/file.c:629
+#, c-format
+msgid "Unknown token '%s' in template '%s'\n"
+msgstr "הסימן '%s' בתבנית '%s' לא ידוע\n"
+
+#: ../src/file.c:923
+#, c-format
+msgid "Local filename not valid (%s)"
+msgstr "שם קובץ מקומי לא תקין (%s)"
+
+#: ../src/file.c:982
+#, c-format
+msgid "No information found for user '%s' in '%s'"
+msgstr "לא קיים מידע למשתמש '%s' ב- '%s'"
+
+#: ../src/file.c:991
+#, c-format
+msgid "mserv data file (%s) not available for track (%s)"
+msgstr "מידע קובץ mserv (%s) לא זמין עבור רצועה (%s)"
+
+#: ../src/file.c:999
+#, c-format
+msgid "Track (%s) not in mserv music root directory (%s)"
+msgstr "הרצועה (%s) לא קיימת בתיקיית השורש של mserv (%s)"
+
+#: ../src/file.c:1123
+#, c-format
+msgid "The following track could not be processed (file does not exist): '%s'\n"
+msgstr "אי אפשר לעבד את הרצועה הבאה (הקובץ לא קיים): '%s'\n"
+
+#: ../src/file.c:1209
+#, c-format
+msgid "The following track could not be processed (filetype unknown): '%s'\n"
+msgstr "אי אפשר לעבד את הרצועה הבאה (סוג קובץ לא ידוע): '%s'\n"
+
+#: ../src/file.c:1307
+#, c-format
+msgid "The following track could not be processed (filetype is known but analysis failed): '%s'\n"
+msgstr "אי אפשר לעבד את הרצועה הבאה (סוג קובץ ידוע, אך הבדיקה נכשלה): '%s'\n"
+
+#: ../src/file.c:1337
+#: ../src/file.c:1391
+msgid "Nothing to update"
+msgstr "אין מה לעדכן"
+
+#: ../src/file.c:1358
+#, c-format
+msgid "Updating %s"
+msgstr "מעדכן %s"
+
+#: ../src/file.c:1372
+msgid "Updated selected tracks with info from file."
+msgstr "מעדכן רצועות נבחרות עם מידע מקובץ."
+
+#: ../src/file.c:1406
+#, c-format
+msgid "Retrieving mserv data %s"
+msgstr "מאחזר נתוני mserv %s"
+
+#: ../src/file.c:1411
+msgid "no filename available"
+msgstr "קובץ לא קיים"
+
+#: ../src/file.c:1416
+msgid "Updated selected tracks with data from mserv."
+msgstr "עודכנו רצועות נבחרות עם נתונים מ-mserv"
+
+#: ../src/file.c:1437
+#, c-format
+msgid "The following track could not be updated"
+msgid_plural "The following %d tracks could not be updated"
+msgstr[0] "הרצועה הבאה איננה יכולה להתעדכן"
+msgstr[1] "%d הרצועות הבאות אינן יכולות להתעדכן"
+
+#. gint id,
+#. gboolean modal,
+#: ../src/file.c:1443
+msgid "Failed Track Update"
+msgstr "עדכון רצועה נכשל"
+
+#: ../src/file.c:1501
+#, c-format
+msgid "The following track has been updated"
+msgid_plural "The following %d tracks have been updated"
+msgstr[0] "עודכנה הרצועה הבאה"
+msgstr[1] "עודכנו %d הרצועות הבאות"
+
+#. gint id,
+#. gboolean modal,
+#: ../src/file.c:1507
+msgid "Successful Track Update"
+msgstr "הרצועה עודכנה בהצלחה"
+
+#: ../src/file.c:1566
+#, c-format
+msgid "No mserv information could be retrieved for the following track"
+msgid_plural "No mserv information could be retrieved for the following %d tracks"
+msgstr[0] "לא ניתן להשיג מידע mserv מהרצועה הבאה"
+msgstr[1] "לא ניתן להשיג מידע mserv מ-%d הרצועות הבאות"
+
+#. gint id,
+#. gboolean modal,
+#: ../src/file.c:1572
+msgid "mserv data retrieval problem"
+msgstr "בעיה בהשגת מידע מ-mserv"
+
+#: ../src/file.c:1661
+msgid "no local filename available, file on the iPod will be used instead"
+msgstr "קובץ מקומי לא זמין, יעשה שימוש בקובץ על ה־iPod"
+
+#: ../src/file.c:1667
+msgid "no local filename available and copy on iPod cannot be found"
+msgstr "קובץ מקומי לא זמין ועותק על ה־iPod גם כן לא זמין"
+
+#: ../src/file.c:1671
+#: ../src/file.c:1689
+msgid "no local filename available"
+msgstr "קובץ מקומי לא זמין"
+
+#: ../src/file.c:1679
+msgid "local file could not be found, file on the iPod will be used instead"
+msgstr "קובץ מקומי לא קיים, יעשה שימוש בקובץ על ה־iPod"
+
+#: ../src/file.c:1685
+msgid "local file as well as copy on the iPod cannot be found"
+msgstr "לא נמצא קובץ מקומי וגם העותק על ה־iPod לא נמצא"
+
+#. update not successful -- log this track for later display
+#: ../src/file.c:1788
+msgid "update failed (format not supported?)"
+msgstr "העדכון נכשל (התבנית לא נתמכת?)"
+
+#: ../src/file.c:1873
+#: ../src/misc_playlist.c:916
+#, c-format
+msgid "Processing '%s'..."
+msgstr "מעבד '%s'..."
+
+#: ../src/file.c:1879
+#, c-format
+msgid "Skipping '%s' because it matches exclude masks.\n"
+msgstr "מדלג על '%s' בגלל שהוא תואם למסכת אי ההכללה.\n"
+
+#: ../src/file.c:1999
+#: ../src/misc_track.c:1773
+#: ../src/misc_track.c:1878
+#, c-format
+msgid ""
+"Podcast already present: '%s'\n"
+"\n"
+msgstr ""
+"הפודקסט כבר קיים: '%s'\n"
+"\n"
+
+#: ../src/file.c:2064
+#, c-format
+msgid ""
+"Writing to video files not yet supported (%s).\n"
+"\n"
+msgstr ""
+"כתיבת קבצי וידאו עדיין לא נתמך (%s).\n"
+"\n"
+
+#: ../src/file.c:2116
+#: ../src/file.c:2130
+#, c-format
+msgid "Couldn't change tags of file: %s\n"
+msgstr "לא מסוגל לשנות תג של קובץ: %s\n"
+
+#: ../src/file.c:2232
+#, c-format
+msgid "Could not open '%s' for reading and writing.\n"
+msgstr "אי אפשר לפתוח את '%s' לקריאה וכתיבה.\n"
+
+#: ../src/file.c:2239
+#, c-format
+msgid "Could not obtain lock on '%s'.\n"
+msgstr "אי אשפר להשיג נעילה על '%s'.\n"
+
+#. error!
+#: ../src/file.c:2256
+#: ../src/file.c:2265
+#: ../src/file.c:2276
+#: ../src/file.c:2286
+#, c-format
+msgid "Malformed line in '%s': %s\n"
+msgstr "שורה לא תקינה ב '%s' : %s\n"
+
+#. gint id,
+#. gboolean modal,
+#: ../src/file.c:2315
+msgid "Remove offline playcounts?"
+msgstr "הסר מספור השמעות לא מקוון?"
+
+#. title
+#: ../src/file.c:2316
+msgid "Some tracks played offline could not be found in the iTunesDB. Press 'OK' to remove them from the offline playcount file, 'Cancel' to keep them."
+msgstr "אי אפשר לאתר מספר רצועות שנוגנו בצורה לא מקוונת ב-iTunesDB. לחץ על 'אישור' להסיר אותן ממספור ההשמעה הלא מקוון, ועל 'ביטול' להשאיר אותן."
+
+#: ../src/file.c:2333
+#, c-format
+msgid "Error writing to '%s'.\n"
+msgstr "תקלה בכתיבה ל-'%s'.\n"
+
+#: ../src/file.c:2390
+#: ../src/tools.c:270
+#, c-format
+msgid ""
+"Normalization failed: file type not supported (%s).\n"
+"\n"
+msgstr ""
+"נרמול נכשל: סוג קובץ לא נתמך(%s).\n"
+"\n"
+
+#: ../src/file.c:2406
+#: ../src/tools.c:287
+#, c-format
+msgid ""
+"Normalization failed: file not available (%s).\n"
+"\n"
+msgstr ""
+"נרמול נכשל: קובץ לא קיים (%s).\n"
+"\n"
+
+#: ../src/file_convert.c:316
+msgid "Summary status of conversion processes"
+msgstr "סיכום עבור תהליך ההמרה"
+
+#: ../src/file_convert.c:564
+msgid "active"
+msgstr "פעיל"
+
+#: ../src/file_convert.c:569
+msgid "inactive"
+msgstr "לא פעיל"
+
+#: ../src/file_convert.c:580
+#, c-format
+msgid "Active threads: %d. Scheduled tracks: %d."
+msgstr "תהליכים פעילים: %d. רצועות מתוזמנות: %d."
+
+#: ../src/file_convert.c:1071
+#, c-format
+msgid "Original filename not available for '%s.'\n"
+msgstr "קובץ מקורי לא זמין עבור '%s'.\n"
+
+#: ../src/file_convert.c:1086
+#, c-format
+msgid "Filename '%s' is no longer valid for '%s'.\n"
+msgstr "הקובץ '%s' כבר לא זמין עבור '%s'.\n"
+
+#: ../src/file_convert.c:1137
+msgid "Ogg Vorbis"
+msgstr "Ogg Vorbis"
+
+#: ../src/file_convert.c:1143
+msgid "FLAC"
+msgstr "FLAC"
+
+#: ../src/file_convert.c:1198
+#, c-format
+msgid ""
+"Files of type '%s' are not supported by the iPod. Please go to the Preferences to set up and turn on a suitable conversion script for '%s'.\n"
+"\n"
+msgstr ""
+"קבצים מסוג '%s' לא נתמכים על ידי ה־iPod. אנא גש אל ההגדרות והגדר תסריט המרה מתאים עבור '%s'.\n"
+"\n"
+
+#: ../src/file_convert.c:1284
+msgid "No information available"
+msgstr "לא קיים מידע"
+
+#: ../src/file_convert.c:1323
+#, c-format
+msgid "Could not create '%s'. Filetype conversion will not work.\n"
+msgstr "אי אפשר ליצור את '%s'. המרת סוג קובץ לא תצליח.\n"
+
+#: ../src/file_convert.c:1641
+#: ../src/file_convert.c:3049
+#, c-format
+msgid ""
+"Transfer of '%s' failed. %s\n"
+"\n"
+msgstr ""
+"ההעברה של '%s' נכשלה. %s\n"
+"\n"
+
+#: ../src/file_convert.c:2047
+#: ../src/file_convert.c:2325
+#, c-format
+msgid ""
+"Conversion of '%s' failed: '%s'.\n"
+"\n"
+msgstr ""
+"ההמרה של '%s' נכשלה: '%s'\n"
+"\n"
+
+#: ../src/file_convert.c:2062
+#, c-format
+msgid ""
+"Conversion of '%s' failed: '%s %s' returned exit status %d.\n"
+"\n"
+msgstr ""
+"ההמרה של '%s' נכשלה: '%s %s' החזיר ערך יציאה %d.\n"
+"\n"
+
+#: ../src/file_convert.c:2091
+#, c-format
+msgid ""
+"Conversion of '%s' failed: '\"%s\" %s' did not return filename extension as expected.\n"
+"\n"
+msgstr ""
+"ההמרה של '%s' נכשלה: '%s %s' לא החזיר סיומת קובץ כצפוי.\n"
+"\n"
+
+#: ../src/file_convert.c:2167
+#, c-format
+msgid ""
+"Conversion of '%s' failed: Could not access original file '%s' (%s).\n"
+"\n"
+msgstr ""
+"ההמרה של '%s' נכשלה: לא ניתן לגשת אל הקובץ המקורי '%s (%s)'.\n"
+"\n"
+
+#: ../src/file_convert.c:2222
+#, c-format
+msgid ""
+"Conversion of '%s' failed: Could not create directory '%s'.\n"
+"\n"
+msgstr ""
+"ההמרה של '%s' נכשלה: לא ניתן ליצור תיקייה '%s'.\n"
+"\n"
+
+#: ../src/file_convert.c:2356
+#, c-format
+msgid ""
+"Conversion of '%s' failed: '%s' returned exit status %d.\n"
+"\n"
+msgstr ""
+"ההמרה של '%s' נכשלה: '%s' החזיר ערך יציאה %d.\n"
+"\n"
+
+#: ../src/file_convert.c:2395
+#, c-format
+msgid ""
+"Conversion of '%s' failed: could not stat the converted file '%s'.\n"
+"\n"
+msgstr ""
+"ההמרה של '%s' נכשלה: לא ניתן היה להציג נתונים על הקובץ המומר '%s'.\n"
+"\n"
+
+#: ../src/file_export.c:182
+#, c-format
+msgid "Skipping existing file with same length: '%s'\n"
+msgstr "מדלג על קובץ קיים עם אורך זהה: '%s'\n"
+
+#: ../src/file_export.c:190
+#, c-format
+msgid "Overwriting existing file: '%s'\n"
+msgstr "כותב על קובץ קיים: '%s'\n"
+
+#: ../src/file_export.c:207
+#, c-format
+msgid "Error copying '%s' to '%s': Permission Error (%s)\n"
+msgstr "תקלה בהעתקת '%s' ל '%s': תקלת הרשאות (%s)\n"
+
+#: ../src/file_export.c:209
+#, c-format
+msgid "Error copying '%s' to '%s' (%s)\n"
+msgstr "תקלה בהעתקת '%s' ל '%s' (%s)\n"
+
+#: ../src/file_export.c:327
+#, c-format
+msgid "Could find file for '%s' on the iPod\n"
+msgstr "אי אפשר למצוא את הקובץ '%s' על ה-iPod\n"
+
+#. create the dialog window
+#: ../src/file_export.c:395
+#: ../src/tools.c:360
+msgid "Information"
+msgstr "מידע"
+
+#: ../src/file_export.c:406
+#: ../src/tools.c:372
+msgid "Press button to abort."
+msgstr "לביטול לחץ על הכפתור."
+
+#: ../src/file_export.c:419
+msgid "copying..."
+msgstr "מעתיק..."
+
+#: ../src/file_export.c:476
+#, c-format
+msgid "Failed to write '%s-%s'\n"
+msgstr "כישלון בכתיבה ל '%s-%s'\n"
+
+#: ../src/file_export.c:489
+#, c-format
+msgid "Copied %d of %d track."
+msgid_plural "Copied %d of %d tracks."
+msgstr[0] "הועתק %d מתוך %d רצועה."
+msgstr[1] "הועתקו %d מתוך %d רצועות."
+
+#: ../src/file_export.c:505
+#: ../src/tools.c:518
+#, c-format
+msgid "%d%% (%d:%02d:%02d left)"
+msgstr "%d%% (%d:%02d:%02d נותרו)"
+
+#: ../src/file_export.c:514
+msgid "Some tracks were not copied."
+msgstr "מספר רצועות לא הועתקו."
+
+#: ../src/file_export.c:579
+msgid "Export from iPod database not possible in offline mode."
+msgstr "יצוא ממסד הנתונים של ה-iPod הוא לא אפשרי במצב לא מקוון."
+
+#: ../src/file_export.c:587
+msgid "Select Export Destination Directory"
+msgstr "בחר נתיב תיקיית יצוא"
+
+#: ../src/file_export.c:736
+msgid "Drag from iPod database not possible in offline mode."
+msgstr "גרירה ממסד הנתונים של ה-iPod היא לא אפשרית במצב לא מקוון."
+
+#: ../src/file_export.c:770
+msgid "The following tracks have to be copied to your harddisk"
+msgstr "הרצועות הבאות צריכות להיות מועתקות לכונן הקשיח שלך"
+
+#: ../src/file_export.c:815
+msgid ""
+"Some tracks were not copied to your harddisk. Only the copied tracks will be included in the current drag and drop operation.\n"
+"\n"
+msgstr ""
+"מספר רצועות לא הועתקו לדיסק הקשיח שלך. רק הרצועות המועתקות יכללו בפעולת הגרור & שחרר הנוכחית.\n"
+"\n"
+
+#: ../src/file_export.c:1010
+#, c-format
+msgid ""
+"No valid filename for: %s\n"
+"\n"
+msgstr ""
+"קובץ לא תקין עבור: %s\n"
+"\n"
+
+#: ../src/file_export.c:1026
+#, c-format
+msgid "Created playlist with one track."
+msgid_plural "Created playlist with %d tracks."
+msgstr[0] "נוצרה רשימת השמעה עם רצועה אחת."
+msgstr[1] "נוצרה רשימת השמעה עם %d רצועות."
+
+#: ../src/file_export.c:1031
+#, c-format
+msgid ""
+"Could not open '%s' for writing (%s).\n"
+"\n"
+msgstr ""
+"אי אפשר לפתוח את '%s' לכתיבה (%s).\n"
+"\n"
+
+#: ../src/file_itunesdb.c:129
+#, c-format
+msgid "Matching SHA1 checksum for file %d/%d"
+msgstr "מתאים בדיקות סכומים SHA1 עבור קובץ %d/%d"
+
+#: ../src/file_itunesdb.c:236
+#, c-format
+msgid "Could not open \"%s\" for reading extended info.\n"
+msgstr "אי אפשר לפתוח \"%s\" לקריאת מידע מורחב.\n"
+
+#: ../src/file_itunesdb.c:243
+msgid "Could not create hash value from itunesdb\n"
+msgstr "אי אפשר ליצור ערך ערבוב עבור itunesdb\n"
+
+#: ../src/file_itunesdb.c:259
+#, c-format
+msgid "Error while reading extended info: %s\n"
+msgstr "תקלה בזמן קריאת מידע מורחב: %s\n"
+
+#: ../src/file_itunesdb.c:276
+#, c-format
+msgid ""
+"iTunesDB '%s' does not match checksum in extended information file '%s'\n"
+"gtkpod will try to match the information using SHA1 checksums. This may take a long time.\n"
+"\n"
+msgstr ""
+"סכום הביקורת (checksum) של iTunesDB '%s' לא תואם את הסכום בקובץ המידע המורחב '%s'\n"
+"היישום gtkpod ינסה להתאים את המידע תוך שימוש בחישובי סכומים של SHA1. זה עלול לקחת זה רב.\n"
+"\n"
+
+#: ../src/file_itunesdb.c:288
+#, c-format
+msgid ""
+"%s:\n"
+"Expected \"itunesdb_hash=\" but got:\"%s\"\n"
+msgstr ""
+"%s:\n"
+"מצפים ל \"itunesdb_hash=\" אבל קיבלנו:\"%s\"\n"
+
+#: ../src/file_itunesdb.c:348
+#, c-format
+msgid ""
+"%s:\n"
+"Format error: %s\n"
+msgstr ""
+"%s:\n"
+"תקלת פורמט: %s\n"
+
+#: ../src/file_itunesdb.c:393
+msgid ""
+"No SHA1 checksums on individual tracks are available.\n"
+"\n"
+"To avoid this situation in the future either switch on duplicate detection (will provide SHA1 checksums) or avoid using the iPod with programs other than gtkpod.\n"
+"\n"
+msgstr ""
+"אי אפשר להסיר את הקובץ: '%s'\n"
+"\n"
+
+#: ../src/file_itunesdb.c:457
+msgid ""
+"Extended info will not be used. If you have non-transferred tracks,\n"
+"these will be lost.\n"
+msgstr ""
+"מידע מורחב לא יהיה בשימוש. אם יש לך רצועות שלא הועברו,\n"
+"הן ילכו לאיבוד.\n"
+
+#: ../src/file_itunesdb.c:465
+msgid "Offline iPod database successfully imported"
+msgstr "מסד נתונים לא מקוון של iPod יובא בהצלחה."
+
+#: ../src/file_itunesdb.c:468
+msgid "Local database successfully imported"
+msgstr "מסד נתונים מקומי יובא בהצלחה"
+
+#: ../src/file_itunesdb.c:476
+#, c-format
+msgid ""
+"Offline iPod database import failed: '%s'\n"
+"\n"
+msgstr ""
+"כישלון ביבוא מסד נתונים לא מקוון של iPod: '%s'\n"
+"\n"
+
+#: ../src/file_itunesdb.c:480
+#, c-format
+msgid ""
+"Local database import failed: '%s'\n"
+"\n"
+msgstr ""
+"כישלון ביבוא מסד נתונים מקומי: '%s'\n"
+"\n"
+
+#: ../src/file_itunesdb.c:487
+msgid ""
+"Offline iPod database import failed: \n"
+"\n"
+msgstr ""
+"כישלון ביבוא מסד נתונים לא מקוון של iPod: \n"
+"\n"
+
+#: ../src/file_itunesdb.c:490
+msgid ""
+"Local database import failed: \n"
+"\n"
+msgstr ""
+"כישלון ביבוא מסד נתונים מקומי: \n"
+"\n"
+
+#: ../src/file_itunesdb.c:497
+#, c-format
+msgid ""
+"'%s' does not exist. Import aborted.\n"
+"\n"
+msgstr ""
+"יבוא בוטל. לא קיים '%s'\n"
+"\n"
+
+#: ../src/file_itunesdb.c:520
+msgid "Extended info will not be used.\n"
+msgstr "מידע מורחב לא יהיה בשימוש.\n"
+
+#: ../src/file_itunesdb.c:527
+msgid "iPod Database Successfully Imported"
+msgstr "מסד נתונים של iPod יובא בהצלחה."
+
+#: ../src/file_itunesdb.c:534
+#, c-format
+msgid ""
+"iPod Database Import Failed: '%s'\n"
+"\n"
+msgstr ""
+"כישלון ביבוא מסד נתונים של iPod: '%s'\n"
+"\n"
+
+#: ../src/file_itunesdb.c:540
+msgid ""
+"iPod Database Import Failed.\n"
+"\n"
+msgstr ""
+"כישלון ביבוא מסד נתונים של iPod: \n"
+"\n"
+
+#: ../src/file_itunesdb.c:549
+#, c-format
+msgid ""
+"'%s' (or similar) does not exist. Import aborted.\n"
+"\n"
+msgstr ""
+"ה־'%s' לא קיים. היבוא בוטל.\n"
+"\n"
+
+#: ../src/file_itunesdb.c:865
+#, c-format
+msgid ""
+"Could not find iPod directory structure at '%s'.\n"
+"If you are sure that the iPod is properly mounted at '%s', gtkpod can create the directory structure for you.\n"
+"\n"
+"Do you want to create the directory structure now?\n"
+msgstr ""
+"אי אפשר היה למצוא מבנה תיקיות של iPod ב־'%s'.\n"
+"אם אתה בטוח שה־iPod שלך מעוגן בצורה תקינה ב־'%s', היישום gtkpod יכול ליצור עבורך את מבנה התיקיות.\n"
+"\n"
+"האם אתה רוצה ליצור את מבנה התיקיות עכשיו?\n"
+
+#: ../src/file_itunesdb.c:1180
+#, c-format
+msgid "Could not open \"%s\" for writing extended info.\n"
+msgstr "אי אפשר לפתוח \"%s\" לכתיבת מידע מורחב.\n"
+
+#: ../src/file_itunesdb.c:1195
+msgid "Aborted writing of extended info.\n"
+msgstr "כתיבת מידע מורחב בוטלה.\n"
+
+#: ../src/file_itunesdb.c:1397
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: ../src/file_itunesdb.c:1411
+#, c-format
+msgid "%d%% (%d/%d  %d:%02d:%02d left)"
+msgstr "%d%% (%d/%d  %d:%02d:%02d נותרו)"
+
+#: ../src/file_itunesdb.c:1463
+msgid "Status: Deleting File"
+msgstr "מצב: מוחק קובץ"
+
+#: ../src/file_itunesdb.c:1524
+#, c-format
+msgid ""
+"Could not remove the following file: '%s'\n"
+"\n"
+msgstr ""
+"אי אפשר להסיר את הקובץ: '%s'\n"
+"\n"
+
+#: ../src/file_itunesdb.c:1632
+msgid ""
+"The following track could not be converted successfully:\n"
+"\n"
+msgid_plural ""
+"The following tracks could not be converted successfully:\n"
+"\n"
+msgstr[0] ""
+"לא היה ניתן להמיר את הרצועה הבאה בהצלחה:\n"
+"\n"
+msgstr[1] ""
+"לא היה ניתן להמיר את הרצועות הבאות בהצלחה:\n"
+"\n"
+
+#: ../src/file_itunesdb.c:1642
+msgid ""
+"The following track could not be transferred successfully:\n"
+"\n"
+msgid_plural ""
+"The following tracks could not be transferred successfully:\n"
+"\n"
+msgstr[0] ""
+"לא היה ניתן להעביר את הרצועה הבאה בהצלחה:\n"
+"\n"
+msgstr[1] ""
+"לא היה ניתן להעביר את הרצועות הבאות בהצלחה:\n"
+"\n"
+
+#. ID
+#. modal,
+#. gint id,
+#. gboolean modal,
+#: ../src/file_itunesdb.c:1651
+#: ../src/misc_confirm.c:70
+msgid "Warning"
+msgstr "אזהרה"
+
+#. title
+#: ../src/file_itunesdb.c:1652
+msgid "The iPod could not be ejected. Please fix the problems mentioned below and then eject the iPod again. Pressing 'OK' will re-schedule the failed tracks for conversion and transfer."
+msgstr "תמונות"
+
+#: ../src/file_itunesdb.c:1715
+#, c-format
+msgid "Status: Copying track"
+msgstr "מצב: מעתיק רצועה"
+
+#: ../src/file_itunesdb.c:1721
+#, c-format
+msgid "Status: Waiting for conversion to complete"
+msgstr "מצב: ממתין לסיום ההמרה"
+
+#: ../src/file_itunesdb.c:1725
+#, c-format
+msgid "Status: Finished transfer"
+msgstr "מצב: העברה הסתיימה"
+
+#: ../src/file_itunesdb.c:1770
+#, c-format
+msgid "One track could not be transferred because your iPod is full. Either delete some tracks or otherwise create space on the iPod before ejecting the iPod again."
+msgid_plural "%d tracks could not be transferred because your iPod is full. Either delete some tracks or otherwise create space on the iPod before ejecting the iPod again."
+msgstr[0] "אי אפשר להעביר רצועה אחת בעקבות זה שה־iPod שלך מלא. מחק מספר רצועות או לחילופין פנה מקום על ה־iPod לפני שתנתק את ה־iPod שוב."
+msgstr[1] "אי אפשר להעביר %d רצועות בעקבות זה שה־iPod שלך מלא. מחק מספר רצועות או לחילופין פנה מקום על ה־iPod לפני שתנתק את ה־iPod שוב."
+
+#: ../src/file_itunesdb.c:1852
+#, c-format
+msgid ""
+"You did not import the existing iTunesDB ('%s'). This is most likely incorrect and will result in the loss of the existing database.\n"
+"\n"
+"Press 'OK' if you want to proceed anyhow or 'Cancel' to skip storing. If you cancel, you can import the existing database before calling this function again.\n"
+msgstr ""
+"לא ייבאת את iTunesDB הקיים ('%s'). זה קרוב לוודאי לא תקין ויביא לאיבוד של המסד הנתונים הקיים.\n"
+"\n"
+"לחץ אישור אם תרצה להמשיך בכל זאת או ביטול לדלג על השמירה. אם תבטל, תוכל לייבא את מסד הנתונים הקיים לפני קריאה לפונקציה זו שוב.\n"
+
+#: ../src/file_itunesdb.c:1887
+msgid "iPod directory structure must be present before synching to the iPod can be performed.\n"
+msgstr "מבנה התיקיות של ה-iPod חייב להיות זמין לפני סנכרון ה-iPod.\n"
+
+#: ../src/file_itunesdb.c:1896
+msgid "Some tracks could not be deleted from the iPod. Export aborted!"
+msgstr "מספר רצועות לא יכלו להימחק מה-iPod. יצוא בוטל!"
+
+#: ../src/file_itunesdb.c:1914
+#, c-format
+msgid "Now writing database '%s'. Please wait..."
+msgstr "כותב כעת מסד נתונים '%s'. אנא המתן..."
+
+#: ../src/file_itunesdb.c:1963
+#, c-format
+msgid "Extended information file not deleted: '%s'"
+msgstr "קובץ מידע מורחב לא נמחק: '%s'"
+
+#: ../src/file_itunesdb.c:2070
+#, c-format
+msgid "%s: Database saved"
+msgstr "מסד נתונים של iPod נשמר :%s"
+
+#: ../src/file_itunesdb.c:2074
+#, c-format
+msgid "%s: Changes saved"
+msgstr "%s: שינויים נשמרו"
+
+#: ../src/fileselection.c:129
+msgid "Successfully added files"
+msgstr "קבצים הוספו בהצלחה"
+
+#: ../src/fileselection.c:131
+msgid "Some files were not added successfully"
+msgstr "מספר קבצים לא הוספו בהצלחה"
+
+#: ../src/fileselection.c:164
+#: ../src/fileselection.c:305
+#: ../src/fileselection.c:792
+msgid "Please select a playlist or repository before adding tracks."
+msgstr "אנא בחר רשימת השמעה או מאגר לפני הוספת רצועות."
+
+#: ../src/fileselection.c:175
+#: ../src/fileselection.c:314
+#: ../src/fileselection.c:803
+msgid "Please load the iPod before adding tracks."
+msgstr "אנא טען את ה־iPod לפני הוספת רצועות."
+
+#: ../src/fileselection.c:185
+#, c-format
+msgid "Add files to '%s'"
+msgstr "הוספת קבצים אל '%s'"
+
+#: ../src/fileselection.c:189
+#, c-format
+msgid "Add files to '%s/%s'"
+msgstr "הוסף קבצים אל '%s/%s'"
+
+#. Create window title
+#: ../src/fileselection.c:322
+#, c-format
+msgid "Add playlist files to '%s'"
+msgstr "הוספת קבצי רשימות ניגון אל '%s'"
+
+#. Create the file chooser, and handle the response
+#: ../src/fileselection.c:378
+msgid "Set Cover"
+msgstr "קבע עטיפה"
+
+#: ../src/fileselection.c:816
+#, c-format
+msgid "Add directories to '%s'"
+msgstr "הוספת תיקיות אל '%s'"
+
+#: ../src/fileselection.c:820
+#, c-format
+msgid "Add directories to '%s/%s'"
+msgstr "הוספת תיקיות אל '%s%s'"
+
+#: ../src/fileselection.c:1097
+msgid "Ok"
+msgstr "אישור"
+
+#: ../src/fileselection.c:1106
+msgid "Cancel"
+msgstr "ביטול"
+
+#: ../src/flacfile.c:62
+#, c-format
+msgid "'%s' does not appear to be an FLAC audio file.\n"
+msgstr "הקובץ '%s' הוא כנראה לא קובץ שמע מסוג FLAC.\n"
+
+#: ../src/flacfile.c:78
+#, c-format
+msgid "Error retrieving tags for '%s'.\n"
+msgstr "תקלה באחזור התגיות עבור '%s'.\n"
+
+#: ../src/flacfile.c:165
+#, c-format
+msgid "Import of '%s' failed: FLAC not supported without the FLAC library. You must compile the gtkpod source together with the FLAC library.\n"
+msgstr "הייבוא של '%s' נכשל: FLAC לא נתמך ללא הספריה של FLAC. אתה חייב להדר את קוד המקור gtkpod ביחד עם הספריה של FLAC.\n"
+
+#: ../src/flacfile.c:171
+#, c-format
+msgid "FLAC metadata update for '%s' failed: FLAC not supported without the FLAC library. You must compile the gtkpod source together with the FLAC library.\n"
+msgstr "עדכון מטא-מידע של FLAC עבור '%s' נכשל: הסוג FLAC לא נתמך ללא הספריה FLAC. אתה חייב להדר את קוד המקור של gtkpod ביחד עם ספריית FLAC.\n"
+
+#: ../src/getopt.c:681
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: אפשרות '%s' היא דו משמעית\n"
+
+#: ../src/getopt.c:706
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: אפשרות '--%s' לא מאפשרת ארגומנט\n"
+
+#: ../src/getopt.c:711
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: אפשרות '%c%s' לא מאפשרת ארגומנט\n"
+
+#: ../src/getopt.c:729
+#: ../src/getopt.c:902
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: אפשרות '%s' דורשת ארגומנט\n"
+
+#. --option
+#: ../src/getopt.c:758
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: אפשרות '--%s' לא מזוהה\n"
+
+#. +option or -option
+#: ../src/getopt.c:762
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: אפשרות '%c%s' לא מזוהה\n"
+
+#. 1003.2 specifies the format of this message.
+#: ../src/getopt.c:788
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: אפשרות --%c לא חוקית\n"
+
+#: ../src/getopt.c:791
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: אפשרות --%c לא תקינה\n"
+
+#. 1003.2 specifies the format of this message.
+#: ../src/getopt.c:821
+#: ../src/getopt.c:951
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: אפשרות דורשת ארגומנט -- %c\n"
+
+#: ../src/getopt.c:868
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: אפשרות `-W %s' היא דו משמעית\n"
+
+#: ../src/getopt.c:886
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: אפשרות`-W %s' אינה מאפשרת ארגומנט\n"
+
+#: ../src/info.c:383
+msgid "n/c"
+msgstr "n/c"
+
+#: ../src/info.c:388
+#: ../src/info.c:838
+msgid "offline"
+msgstr "לא מקוון"
+
+#: ../src/info.c:486
+#, c-format
+msgid " P:%d T:%d/%d"
+msgstr " P:%d T:%d/%d"
+
+#: ../src/info.c:780
+msgid "B"
+msgstr "בתים"
+
+#: ../src/info.c:780
+msgid "kB"
+msgstr "ק\"ב"
+
+#: ../src/info.c:780
+msgid "TB"
+msgstr "ט\"ב"
+
+#: ../src/info.c:823
+#, c-format
+msgid " %s Free"
+msgstr " %s זמין"
+
+#: ../src/info.c:828
+#, c-format
+msgid " %s Pending"
+msgstr " %s ממתין"
+
+#: ../src/info.c:833
+msgid " disconnected"
+msgstr " מנותק"
+
+#: ../src/info.c:884
+msgid "No database or playlist selected"
+msgstr "לא נבחרו מסד נתונים את רשימת השמעה"
+
+#: ../src/info.c:889
+msgid "No tracks selected"
+msgstr "לא נבחרו רצועות"
+
+#: ../src/info.c:894
+msgid "No playlist selected"
+msgstr "לא נבחרה רשימת השמעה"
+
+#: ../src/info.c:899
+msgid "No iPod or iPod playlist selected"
+msgstr "לא נבחר iPod או לא נבחרה רשימת השמעה של iPod"
+
+#. Strings used several times
+#: ../src/ipod_init.c:48
+msgid "Select or enter your model"
+msgstr "בחר או הכנס את הדגם שלך"
+
+#: ../src/ipod_init.c:79
+#: ../src/repository.c:546
+#: ../src/repository.c:2369
+msgid "Select mountpoint"
+msgstr "בחר נקודת עגינה"
+
+#: ../src/ipod_init.c:359
+#, c-format
+msgid "Error initialising iPod: %s\n"
+msgstr "תקלה באתחול ה־iPod: %s\n"
+
+#: ../src/ipod_init.c:366
+msgid "Error initialising iPod, unknown error\n"
+msgstr "תקלה באתחול ה־iPod, תקלה בלתי ידועה\n"
+
+#: ../src/ipod_init.c:422
+#, c-format
+msgid "<b>Please select your iPod model at </b><i>%s</i>"
+msgstr "<b>אנא בחר את המודל של ה־iPod שלך ב־</b><i>%s</i>"
+
+#: ../src/ipod_init.c:463
+msgid ""
+"Could not determine the model you selected -- this could be a bug or incompatibilty in the GTK+ or glade library.\n"
+"\n"
+msgstr ""
+"אי אפשר לקבוע את הדגם שאתה משתמש בו -- זה יכול לנבוע כתוצאה מבאג או אי התאמה ב־GTK+ או ספריית glade.\n"
+"\n"
+
+#: ../src/misc.c:70
+msgid ""
+"© 2002 - 2007\n"
+"Jorg Schuler (jcsjcs at users dot sourceforge dot net)\n"
+"Corey Donohoe (atmos at atmos dot org)\n"
+msgstr ""
+"© 2002 - 2007\n"
+"Jorg Schuler (jcsjcs at users dot sourceforge dot net)\n"
+"Corey Donohoe (atmos at atmos dot org)\n"
+
+#: ../src/misc.c:74
+msgid "Patches were supplied by the following people (list may be incomplete -- please contact me)\n"
+msgstr "טלאים סופקו על ידי האנשים הבאים (הרשימה עלולה להיות לא מושלמת -- אנא צרו איתי קשר)\n"
+
+#: ../src/misc.c:75
+msgid "Ramesh Dharan: Multi-Edit (edit tags of several tracks in one run)"
+msgstr "Ramesh Dharan: Multi-Edit (edit tags of several tracks in one run)"
+
+#: ../src/misc.c:76
+msgid "Hiroshi Kawashima: Japanese charset autodetection feature"
+msgstr "Hiroshi Kawashima: Japanese charset autodetection feature"
+
+#: ../src/misc.c:77
+msgid "Adrian Ulrich: porting of playlist code from mktunes.pl to itunesdb.c"
+msgstr "Adrian Ulrich: porting of playlist code from mktunes.pl to itunesdb.c"
+
+#: ../src/misc.c:78
+msgid "Walter Bell: correct handling of DND URIs with escaped characters and/or cr/newlines at the end"
+msgstr "Walter Bell: correct handling of DND URIs with escaped characters and/or cr/newlines at the end"
+
+#: ../src/misc.c:79
+msgid "Sam Clegg: user defined filenames when exporting tracks from the iPod"
+msgstr "Sam Clegg: user defined filenames when exporting tracks from the iPod"
+
+#: ../src/misc.c:80
+msgid "Chris Cutler: automatic creation of various playlist types"
+msgstr "Chris Cutler: automatic creation of various playlist types"
+
+#: ../src/misc.c:81
+msgid "Graeme Wilford: reading and writing of the 'Composer' ID3 tags, progress dialogue during sync"
+msgstr "Graeme Wilford: reading and writing of the 'Composer' ID3 tags, progress dialogue during sync"
+
+#: ../src/misc.c:82
+msgid "Edward Matteucci: debugging, special playlist creation, most of the volume normalizing code"
+msgstr "Edward Matteucci: debugging, special playlist creation, most of the volume normalizing code"
+
+#: ../src/misc.c:83
+msgid "Jens Lautenbach: some optical improvements"
+msgstr "Jens Lautenbach: some optical improvements"
+
+#: ../src/misc.c:84
+msgid "Alex Tribble: iPod eject patch"
+msgstr "Alex Tribble: iPod eject patch"
+
+#: ../src/misc.c:85
+msgid "Yaroslav Halchenko: Orphaned and dangling tracks handling"
+msgstr "Yaroslav Halchenko: Orphaned and dangling tracks handling"
+
+#: ../src/misc.c:86
+msgid "Andrew Huntwork: Filename case sensitivity fix and various other bugfixes"
+msgstr "Andrew Huntwork: Filename case sensitivity fix and various other bugfixes"
+
+#: ../src/misc.c:87
+msgid "Ero Carrera: Filename validation and quick sync when copying tracks from the iPod"
+msgstr "Ero Carrera: Filename validation and quick sync when copying tracks from the iPod"
+
+#: ../src/misc.c:88
+msgid "Jens Taprogge: Support for LAME's replay gain tag to normalize volume"
+msgstr "Jens Taprogge: Support for LAME's replay gain tag to normalize volume"
+
+#: ../src/misc.c:89
+msgid "Armando Atienza: Support with external playcounts"
+msgstr "Armando Atienza: Support with external playcounts"
+
+#: ../src/misc.c:90
+msgid "D.L. Sharp: Support for m4b files (bookmarkable AAC files)"
+msgstr "D.L. Sharp: Support for m4b files (bookmarkable AAC files)"
+
+#: ../src/misc.c:91
+msgid "Jim Hall: Decent INSTALL file"
+msgstr "Jim Hall: Decent INSTALL file"
+
+#: ../src/misc.c:92
+msgid "Juergen Helmers, Markus Gaugusch: Conversion scripts to sync calendar/contacts to the iPod"
+msgstr "Juergen Helmers, Markus Gaugusch: Conversion scripts to sync calendar/contacts to the iPod"
+
+#. J"urgen!
+#: ../src/misc.c:93
+msgid "Flavio Stanchina: bugfixes"
+msgstr "Flavio Stanchina: bugfixes"
+
+#: ../src/misc.c:94
+msgid "Chris Micacchi: when sorting ignore 'the' and similar at the beginning of the title"
+msgstr "Chris Micacchi: when sorting ignore 'the' and similar at the beginning of the title"
+
+#: ../src/misc.c:95
+msgid "Steve Jay: use statvfs() instead of df (better portability, faster)"
+msgstr "Steve Jay: use statvfs() instead of df (better portability, faster)"
+
+#: ../src/misc.c:97
+msgid "Christoph Kunz: address compatibility issues when writing id3v2.4 type mp3 tags"
+msgstr "Christoph Kunz: address compatibility issues when writing id3v2.4 type mp3 tags"
+
+#: ../src/misc.c:99
+msgid ""
+"James Liggett:\n"
+"replacement of old GTK file selection dialogs with new GTK filechooser dialogs\n"
+"refactored user preferences system."
+msgstr ""
+"James Liggett:\n"
+"replacement of old GTK file selection dialogs with new GTK filechooser dialogs\n"
+"refactored user preferences system."
+
+#: ../src/misc.c:103
+msgid "Daniel Kercher: sync scripts for abook and webcalendar"
+msgstr "Daniel Kercher: sync scripts for abook and webcalendar"
+
+#: ../src/misc.c:105
+msgid "Clinton Gormley: sync scripts for thunderbird"
+msgstr "Clinton Gormley: sync scripts for thunderbird"
+
+#: ../src/misc.c:107
+msgid "Sebastien Beridot: sync script for ldif addressbook format"
+msgstr "Sebastien Beridot: sync script for ldif addressbook format"
+
+#: ../src/misc.c:109
+msgid "Sebastian Scherer: sync script for kNotes"
+msgstr "Sebastian Scherer: sync script for kNotes"
+
+#: ../src/misc.c:111
+msgid "Nick Piper: sync script for Palm, type-ahead search"
+msgstr "Nick Piper: sync script for Palm, type-ahead search"
+
+#: ../src/misc.c:113
+msgid "Uwe Hermann: help with support for iPod Video"
+msgstr "Uwe Hermann: help with support for iPod Video"
+
+#: ../src/misc.c:115
+msgid "Iain Benson: support for compilation tag in mp3 files and separate display of compilations in the sort tab."
+msgstr "Iain Benson: support for compilation tag in mp3 files and separate display of compilations in the sort tab."
+
+#: ../src/misc.c:116
+msgid ""
+"Nicolas Chariot: icons of buttons\n"
+"\n"
+msgstr ""
+"Nicolas Chariot: icons of buttons\n"
+"\n"
+
+#: ../src/misc.c:118
+msgid "This program borrows code from the following projects:"
+msgstr "התוכנה שואלת קוד מהפרוייקטים הבאים:"
+
+#: ../src/misc.c:119
+msgid "gnutools: (mktunes.pl, ported to C) reading and writing of iTunesDB  (http://www.gnu.org/software/gnupod/)"
+msgstr "gnutools: (mktunes.pl, ported to C) reading and writing of iTunesDB  (http://www.gnu.org/software/gnupod/)"
+
+#: ../src/misc.c:120
+msgid "iPod.cpp, iPod.h by Samuel Wood (sam dot wood at gmail dot com): some code for smart playlists is based on his C++-classes."
+msgstr "iPod.cpp, iPod.h by Samuel Wood (sam dot wood at gmail dot com): some code for smart playlists is based on his C++-classes."
+
+#: ../src/misc.c:121
+msgid "mp3info: mp3 playlength detection (http://ibiblio.org/mp3info/)"
+msgstr "mp3info: mp3 playlength detection (http://ibiblio.org/mp3info/)"
+
+#: ../src/misc.c:122
+msgid "xmms: dirbrowser, mp3 playlength detection (http://www.xmms.org)"
+msgstr "xmms: dirbrowser, mp3 playlength detection (http://www.xmms.org)"
+
+#: ../src/misc.c:124
+msgid "The GUI was created with the help of glade-2 (http://glade.gnome.org/)."
+msgstr "ה־GUI יוצר בעזרת glade-2, ראה: (http://glade.gnome.org)."
+
+#: ../src/misc.c:128
+msgid "French: David Le Brun (david at dyn-ns dot net)"
+msgstr "צרפתית: David Le Brun (david at dyn-ns dot net)"
+
+#: ../src/misc.c:129
+msgid "French: Éric Lassauge (rpmfarm at free dot fr)"
+msgstr "צרפתית: Éric Lassauge (rpmfarm at free dot fr)"
+
+#: ../src/misc.c:130
+msgid "German: Jorg Schuler (jcsjcs at users dot sourceforge dot net)"
+msgstr "גרמנית: Jorg Schuler (jcsjcs at users dot sourceforge dot net)"
+
+#: ../src/misc.c:131
+msgid "German: Kai-Ove"
+msgstr "גרמנית: Kai-Ove"
+
+#: ../src/misc.c:132
+msgid "Hebrew: Assaf Gillat (gillata at gmail dot com)"
+msgstr "עברית: אסף גילת (gillata at gmail dot com)"
+
+#: ../src/misc.c:133
+msgid "Italian: Edward Matteucci (edward_matteucc at users dot sourceforge dot net)"
+msgstr "איטלקית: Edward Matteucci (edward_matteucc at users dot sourceforge dot net)"
+
+#: ../src/misc.c:134
+msgid "Italian: Daniele Forsi (dforsi at gmail dot com)"
+msgstr "איטלקית: Daniele Forsi (dforsi at gmail dot com)"
+
+#: ../src/misc.c:135
+msgid "Japanese: Ayako Sano"
+msgstr "יפנית: Ayako Sano"
+
+#: ../src/misc.c:136
+msgid "Japanese: Kentaro Fukuchi (fukuchi at users dot sourceforge dot net)"
+msgstr "יפנית: Kentaro Fukuchi (fukuchi at users dot sourceforge dot net)"
+
+#: ../src/misc.c:137
+msgid "Romanian: Alex Eftimie (alexeftimie at gmail dot com)"
+msgstr "רומנית: Alex Eftimie (alexeftimie at gmail dot com)"
+
+#: ../src/misc.c:138
+msgid "Spanish: Alejandro Lamas Daviña (alejandro.lamas at ific dot uv dot es)"
+msgstr "ספרדית: Alejandro Lamas Daviña (alejandro.lamas at ific dot uv dot es)"
+
+#: ../src/misc.c:139
+msgid "Swedish: Stefan Asserhall (stefan.asserhall at comhem dot se)"
+msgstr "שוודית: Stefan Asserhall (stefan.asserhall at comhem dot se)"
+
+#: ../src/misc.c:144
+msgid ""
+"This program is free software; you can redistribute it and/or\n"
+"modify it under the terms of the GNU General Public License as\n"
+"published by the Free Software Foundation; either version 2 of the\n"
+"License, or (at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful, but\n"
+"WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See\n"
+"the GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public\n"
+"License along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA\n"
+"02111-1307, USA."
+msgstr ""
+
+#: ../src/misc.c:159
+msgid ""
+"© 2002-2007\n"
+"Jorg Schuler <jcsjcs at users.sourceforge.net>\n"
+"Corey Donohoe <atmos at atmos.org>"
+msgstr ""
+"© 2002-2007\n"
+"Jorg Schuler <jcsjcs at users.sourceforge.net>\n"
+"Corey Donohoe <atmos at atmos.org>"
+
+#: ../src/misc.c:167
+msgid "Cross-platform multilingual interface to Apple's iPod™"
+msgstr "ממשק חוצה-פלטפורמות רב-שפות עבור iPod™ של אפל."
+
+#: ../src/misc.c:934
+#, c-format
+msgid "Could not process '%s' (no filename available)"
+msgstr "אי אפשר לעבד את '%s' (קובץ לא זמין)"
+
+#: ../src/misc.c:1088
+#, c-format
+msgid "Unknown token '%%%c' in template '%s'"
+msgstr "אסימון לא ידוע '%%%c' בתבנית '%s'"
+
+#: ../src/misc.c:1171
+#, c-format
+msgid "Template ('%s') does not match file type '%s'\n"
+msgstr "התבנית ('%s') לא מתאימה לסוג הקובץ '%s'\n"
+
+#: ../src/misc.c:1257
+#, c-format
+msgid "Error creating %s: %s\n"
+msgstr "תקלה ביצירת %s: %s\n"
+
+#: ../src/misc.c:1691
+#, c-format
+msgid ""
+"Writing preferences file '%s' failed (%s).\n"
+"\n"
+msgstr ""
+"כתיבת קובץ הגדרות '%s' נכשלה (%s).\n"
+"\n"
+
+#: ../src/misc.c:1693
+msgid "unspecified error"
+msgstr "תקלה לא מוגדרת"
+
+#: ../src/misc.c:1701
+#, c-format
+msgid ""
+"Writing preferences to the iPod (%s) failed: could not get path to Control Directory.\n"
+"\n"
+msgstr ""
+"כתיבת ההעדפות אל ה־iPod (%s) נכשלו: אי אפשר היה להשיג נתיב אל תיקיית הבקרה.\n"
+"\n"
+
+#. title
+#: ../src/misc_confirm.c:71
+msgid "The following has occurred:"
+msgstr "אירע האירוע הבא:"
+
+#: ../src/misc_confirm.c:122
+msgid "Are you sure you want to delete the following track completely from your iPod? The number of playlists this track is a member of is indicated in parentheses."
+msgid_plural "Are you sure you want to delete the following tracks completely from your iPod? The number of playlists the tracks are member of is indicated in parentheses."
+msgstr[0] "האם אתה בטוח שברצונך למחוק את הרצועה הבאה לגמרי מה-iPod? מספר רשימות ההשמעה שהרצועה הזו חברה בהן מצוינת בסוגריים."
+msgstr[1] "האם אתה בטוח שברצונך למחוק את הרצועות הבאות לגמרי מה-iPod? מספר רשימות ההשמעה שהרצועות האלו חברות בהן מצוינות בסוגריים."
+
+#: ../src/misc_confirm.c:126
+msgid "Delete Track Completely from iPod?"
+msgid_plural "Delete Tracks Completely from iPod?"
+msgstr[0] "מחק את הרצועה לגמרי מה-iPod?"
+msgstr[1] "מחק את הרצועות לגמרי מה-iPod?"
+
+#: ../src/misc_confirm.c:137
+#: ../src/misc_confirm.c:178
+#, c-format
+msgid "Are you sure you want to remove the following track from the playlist \"%s\"?"
+msgid_plural "Are you sure you want to remove the following tracks from the playlist \"%s\"?"
+msgstr[0] "האם אתה בטוח שברצונך להסיר את הרצועה הבאה מרשימת ההשמעה \"%s\"?"
+msgstr[1] "האם אתה בטוח שברצונך להסיר את הרצועות הבאות מרשימת ההשמעה \"%s\"?"
+
+#: ../src/misc_confirm.c:141
+#: ../src/misc_confirm.c:182
+msgid "Remove Track From Playlist?"
+msgid_plural "Remove Tracks From Playlist?"
+msgstr[0] "הסר את הרצועה מרשימת ההשמעה?"
+msgstr[1] "הסר את הרצועות מרשימת ההשמעה?"
+
+#: ../src/misc_confirm.c:163
+msgid "Are you sure you want to delete the following track completely from your harddisk? The number of playlists this track is a member of is indicated in parentheses."
+msgid_plural "Are you sure you want to delete the following tracks completely from your harddisk? The number of playlists the tracks are member of is indicated in parentheses."
+msgstr[0] "האם אתה בטוח שברצונך למחוק את הרצועה הבאה לגמרי מהדיסק הקשיח? מספר רשימות ההשמעה שהרצועה הזו חברה בהן מצוינות בסוגריים."
+msgstr[1] "האם אתה בטוח שברצונך למחוק את הרצועות הבאות לגמרי מהדיסק הקשיח? מספר רשימות ההשמעה שהרצועות האלו חברות בהן מצוינות בסוגריים."
+
+#: ../src/misc_confirm.c:167
+msgid "Delete Track from Harddisk?"
+msgid_plural "Delete Tracks from Harddisk?"
+msgstr[0] "מחק את הרצועה מהדיסק הקשיח?"
+msgstr[1] "מחק את הרצועות מהדיסק הקשיח?"
+
+#: ../src/misc_confirm.c:192
+msgid "Are you sure you want to remove the following track completely from your local database? The number of playlists this track is a member of is indicated in parentheses."
+msgid_plural "Are you sure you want to remove the following tracks completely from your local database? The number of playlists the tracks are member of is indicated in parentheses."
+msgstr[0] "האם אתה בטוח שברצונך למחוק את הרצועה הבאה לגמרי ממסד הנתונים המקומי? מספר רשימות ההשמעה שהרצועה הזו חברה בהן מצוינות בסוגריים."
+msgstr[1] "האם אתה בטוח שברצונך למחוק את הרצועות הבאות לגמרי ממסד הנתונים המקומי? מספר רשימות ההשמעה שהרצועות האלו חברות בהן מצוינות בסוגריים."
+
+#: ../src/misc_confirm.c:196
+msgid "Remove Track from Local Database?"
+msgid_plural "Remove Tracks from Local Database?"
+msgstr[0] "הסר את הרצועה ממסד הנתונים המקומי?"
+msgstr[1] "הסר את הרצועות ממסד הנתונים המקומי?"
+
+#: ../src/misc_confirm.c:261
+#, c-format
+msgid "Deleted one track completely from iPod"
+msgid_plural "Deleted %d tracks completely from iPod"
+msgstr[0] "הרצועה נמחקה לגמרי מה-iPod"
+msgstr[1] "הרצועות %d נמחקו לגמרי מה-iPod"
+
+#: ../src/misc_confirm.c:267
+#: ../src/misc_confirm.c:291
+#, c-format
+msgid "Deleted %d track from playlist '%s'"
+msgid_plural "Deleted %d tracks from playlist '%s'"
+msgstr[0] "נמחקה %d רצועה מרשימת ההשמעה '%s'"
+msgstr[1] "נמחקו %d רצועות מרשימת ההשמעה '%s'"
+
+#: ../src/misc_confirm.c:285
+#, c-format
+msgid "Deleted one track from harddisk"
+msgid_plural "Deleted %d tracks from harddisk"
+msgstr[0] "נמחקה רצועה אחת מהדיסק הקשיח"
+msgstr[1] "נמחקו %d רצועות מהדיסק הקשיח"
+
+#: ../src/misc_confirm.c:297
+#, c-format
+msgid "Deleted track from local database"
+msgid_plural "Deleted %d tracks from local database"
+msgstr[0] "נמחקה רצועה ממסד הנתונים המקומי"
+msgstr[1] "נמחקו %d רצועות ממסד הנתונים המקומי"
+
+#: ../src/misc_confirm.c:442
+msgid "Cannot remove entry 'All'"
+msgstr "לא מסוגל להסיר רשומה 'הכל'"
+
+#: ../src/misc_confirm.c:536
+#, c-format
+msgid "Removed all %d tracks from the iPod"
+msgstr "הוסרו כל %d הרצועות מה-iPod"
+
+#: ../src/misc_confirm.c:541
+#, c-format
+msgid "Removed all podcasts from the iPod"
+msgstr "הוסרו כל הפודקסטים מה-iPod"
+
+#: ../src/misc_confirm.c:550
+#: ../src/misc_confirm.c:624
+#, c-format
+msgid "Deleted playlist '%s' including %d member track"
+msgid_plural "Deleted playlist '%s' including %d member tracks"
+msgstr[0] "נמחקה רשימת השמעה '%s' כולל רצועה %d"
+msgstr[1] "נמחקה רשימת השמעה '%s' כולל %d רצועות"
+
+#. first use playlist name
+#: ../src/misc_confirm.c:566
+#: ../src/misc_confirm.c:640
+#, c-format
+msgid "Deleted playlist '%s'"
+msgstr "נמחקה רשומה '%s'"
+
+#: ../src/misc_confirm.c:600
+#, c-format
+msgid "Deleted playlist '%s' including %d member track on harddisk"
+msgid_plural "Deleted playlist '%s' including %d member tracks on harddisk"
+msgstr[0] "נמחקה רשימת השמעה '%s' כולל רצועה %d מהדיסק הקשיח"
+msgstr[1] "נמחקה רשימת השמעה '%s' כולל %d רצועות מהדיסק הקשיח"
+
+#: ../src/misc_confirm.c:617
+#, c-format
+msgid "Removed all %d tracks from the database"
+msgstr "הסר את כל %d הרצועות ממסד הנתונים"
+
+#: ../src/misc_confirm.c:695
+#, c-format
+msgid "Are you sure you want to remove all tracks from your iPod?"
+msgstr "האם אתה בטוח שאתה רוצה להסיר את כל הרצועות מה-iPod?"
+
+#: ../src/misc_confirm.c:700
+#, c-format
+msgid "Are you sure you want to remove all podcasts from your iPod?"
+msgstr "האם אתה בטוח שאתה רוצה להסיר את כל הפודקסטים מה-iPod שלך?"
+
+#: ../src/misc_confirm.c:708
+#, c-format
+msgid "Are you sure you want to delete playlist '%s' and the following track completely from your iPod? The number of playlists this track is a member of is indicated in parentheses."
+msgid_plural "Are you sure you want to delete playlist '%s' and the following tracks completely from your iPod? The number of playlists the tracks are member of is indicated in parentheses."
+msgstr[0] "האם אתה בטוח שברצונך למחוק את רשימת ההשמעה '%s' ואת הרצועה הבאה לגמרי מה-iPod? מספר רשימות ההשמעה שהרצועה הזו חברה בהן מצוינות בסוגריים."
+msgstr[1] "האם אתה בטוח שברצונך למחוק את רשימת ההשמעה '%s' ואת הרצועות הבאות לגמרי מה-iPod? מספר רשימות ההשמעה שהרצועות האלו חברות בהן מצוינות בסוגריים."
+
+#: ../src/misc_confirm.c:719
+#: ../src/misc_confirm.c:774
+#, c-format
+msgid "Are you sure you want to delete the playlist '%s'?"
+msgstr "האם אתה בטח שאתה רוצה למחוק את רשימת ההשמעה '%s'?"
+
+#: ../src/misc_confirm.c:745
+#, c-format
+msgid "Are you sure you want to delete playlist '%s' and remove the following track from your harddisk? The number of playlists this track is a member of is indicated in parentheses."
+msgid_plural "Are you sure you want to delete playlist '%s' and remove the following tracks from your harddisk? The number of playlists the tracks are member of is indicated in parentheses."
+msgstr[0] "האם אתה בטוח שברצונך למחוק את רשימת ההשמעה '%s' ואת הרצועה הבאה לגמרי מהדיסק הקשיח? מספר רשימות ההשמעה שהרצועה הזו חברה בהן מצוינות בסוגריים."
+msgstr[1] "האם אתה בטוח שברצונך למחוק את רשימת ההשמעה '%s' ואת הרצועות הבאות לגמרי מהדיסק הקשיח? מספר רשימות ההשמעה שהרצועות האלו חברות בהן מצוינות בסוגריים."
+
+#: ../src/misc_confirm.c:753
+#, c-format
+msgid "Are you sure you want to remove all tracks from the database?"
+msgstr "האם אתה בטוח שאתה רוצה להסיר את כל הרצועות ממסד הנתונים?"
+
+#: ../src/misc_confirm.c:762
+#, c-format
+msgid "Are you sure you want to delete playlist '%s' and remove the following track from the database? The number of playlists this track is a member of is indicated in parentheses."
+msgid_plural "Are you sure you want to delete playlist '%s' and remove the following tracks from the database? The number of playlists the tracks are member of is indicated in parentheses."
+msgstr[0] "האם אתה בטוח שברצונך למחוק את רשימת ההשמעה '%s' ואת הרצועה הבאה לגמרי ממסד הנתונים? מספר רשימות ההשמעה שהרצועה הזו חברה בהן מצוינות בסוגריים."
+msgstr[1] "האם אתה בטוח שברצונך למחוק את רשימת ההשמעה '%s' ואת הרצועות הבאות לגמרי ממסד הנתונים? מספר רשימות ההשמעה שהרצועות האלו חברות בהן מצוינות בסוגריים."
+
+#: ../src/misc_confirm.c:841
+msgid ""
+"Data has been changed and not been saved.\n"
+"OK to exit gtkpod?"
+msgstr ""
+"המידע שונה ולא נשמר.\n"
+"האם לצאת מ-gtkpod?"
+
+#: ../src/misc_conversion.c:66
+msgid "File type"
+msgstr "סוג קובץ"
+
+#: ../src/misc_conversion.c:67
+msgid "PC File"
+msgstr "קובץ PC"
+
+#: ../src/misc_conversion.c:68
+msgid "iPod File"
+msgstr "קובץ iPod"
+
+#: ../src/misc_conversion.c:69
+msgid "iPod ID"
+msgstr "מזהה iPod"
+
+#. 10
+#: ../src/misc_conversion.c:70
+msgid "Track Nr (#)"
+msgstr "מספר רצועה (#)"
+
+#: ../src/misc_conversion.c:71
+msgid "Transferred"
+msgstr "הועבר"
+
+#: ../src/misc_conversion.c:72
+msgid "File Size"
+msgstr "גודל קובץ"
+
+#: ../src/misc_conversion.c:73
+msgid "Play Time"
+msgstr "זמן השמעה"
+
+#. 20
+#: ../src/misc_conversion.c:80
+msgid "Date played"
+msgstr "תאריך השמעה"
+
+#: ../src/misc_conversion.c:82
+msgid "Volume"
+msgstr "עוצמת קול"
+
+#: ../src/misc_conversion.c:83
+msgid "Soundcheck"
+msgstr "בדיקת קול"
+
+#. 25
+#: ../src/misc_conversion.c:85
+msgid "CD Nr"
+msgstr "מזהה דיסק שמע"
+
+#: ../src/misc_conversion.c:88
+msgid "Category"
+msgstr "קטגוריה"
+
+#: ../src/misc_conversion.c:89
+msgid "Description"
+msgstr "מאפיינים"
+
+#. 30
+#: ../src/misc_conversion.c:90
+msgid "Podcast URL"
+msgstr "כתובת ה־URL של הפודקסט"
+
+#: ../src/misc_conversion.c:91
+msgid "Podcast RSS"
+msgstr "ה־RSS של הפודקסט"
+
+#: ../src/misc_conversion.c:92
+msgid "Subtitle"
+msgstr "כתובית"
+
+#: ../src/misc_conversion.c:93
+msgid "Date released"
+msgstr "תאריך שחרור"
+
+#: ../src/misc_conversion.c:94
+msgid "Checked"
+msgstr "מסומן"
+
+#. 35
+#: ../src/misc_conversion.c:95
+msgid "Start time"
+msgstr "זמן התחלה"
+
+#: ../src/misc_conversion.c:96
+msgid "Stop time"
+msgstr "זמן סיום"
+
+#: ../src/misc_conversion.c:97
+msgid "Remember Playback Position"
+msgstr "שמור את מיקום ההשמעה"
+
+#: ../src/misc_conversion.c:98
+msgid "Skip when Shuffling"
+msgstr "דלג בזמן ערבוב"
+
+#: ../src/misc_conversion.c:99
+msgid "Artwork Path"
+msgstr "נתיב לתמונות (עבודות האמנות)"
+
+#. 40
+#: ../src/misc_conversion.c:100
+msgid "Media Type"
+msgstr "סוג מדיה"
+
+#: ../src/misc_conversion.c:102
+msgid "TV Episode"
+msgstr "פרק מסדרת טלויזיה"
+
+#: ../src/misc_conversion.c:103
+msgid "TV Network"
+msgstr "רשת שידור"
+
+#: ../src/misc_conversion.c:104
+msgid "Season Nr"
+msgstr "מספר עונה"
+
+#. 45
+#: ../src/misc_conversion.c:105
+msgid "Episode Nr"
+msgstr "מספר פרק"
+
+#: ../src/misc_conversion.c:106
+msgid "Album Artist"
+msgstr "מיין לפי כותר"
+
+#: ../src/misc_conversion.c:107
+msgid "Sort Artist"
+msgstr "מיין לפי אמן"
+
+#: ../src/misc_conversion.c:108
+msgid "Sort Title"
+msgstr "מיין לפי שם"
+
+#: ../src/misc_conversion.c:109
+msgid "Sort Album"
+msgstr "מיין לפי כותר"
+
+#. 50
+#: ../src/misc_conversion.c:110
+msgid "Sort Album Artist"
+msgstr "מיין לפי כותר אמן"
+
+#: ../src/misc_conversion.c:111
+msgid "Sort Composer"
+msgstr "מיין לפי יוצר"
+
+#: ../src/misc_conversion.c:112
+msgid "Sort TV Show"
+msgstr "מיין לפי תוכנית טלויזיה"
+
+#: ../src/misc_conversion.c:113
+msgid "Gapless Track Flag"
+msgstr "דגל רצועה ללא מרווח"
+
+#: ../src/misc_conversion.c:126
+msgid "Name of file on PC, if available"
+msgstr "שם הקובץ על ה-PC, אם קיים"
+
+#: ../src/misc_conversion.c:127
+msgid "Name of file on the iPod"
+msgstr "שם הקובץ על ה-iPod"
+
+#. 10
+#: ../src/misc_conversion.c:129
+msgid "Track Nr. and total number of tracks on CD"
+msgstr "מספר רצועה וסך כל מספר הרצועות על דיסק השמע"
+
+#: ../src/misc_conversion.c:130
+msgid "Whether the file has already been transferred to the iPod or not"
+msgstr "האם הקובץ הועבר כבר אל ה-iPod או לא"
+
+#: ../src/misc_conversion.c:136
+msgid "Beats per minute"
+msgstr "דפקים לדקה"
+
+#: ../src/misc_conversion.c:137
+msgid "Number of times the track has been played"
+msgstr "מספר הפעמים שהרצועה הושמעה"
+
+#: ../src/misc_conversion.c:138
+msgid "Star rating from 0 to 5"
+msgstr "דירוג כוכבים החל מ 0 עד 5"
+
+#: ../src/misc_conversion.c:139
+msgid "Date and time track has been added"
+msgstr "תאריך ושעה שהרצועה הוספה"
+
+#. 20
+#: ../src/misc_conversion.c:140
+msgid "Date and time track has last been played"
+msgstr "תאריך ושעה שהרצועה הושמעה לאחרונה"
+
+#: ../src/misc_conversion.c:141
+msgid "Date and time track has last been modified"
+msgstr "תאריך ושעה שהרצועה שונתה לאחרונה"
+
+#: ../src/misc_conversion.c:142
+msgid "Manual volume adjust"
+msgstr "שינוי עוצמת קול ידנית"
+
+#: ../src/misc_conversion.c:143
+msgid "Volume adjust in dB (replay gain) -- you need to activate 'soundcheck' on the iPod"
+msgstr "תיקון עוצמת קול בדציבלים (הגבר השמעה) -- צריך להפעיל 'soundcheck' על ה-iPod"
+
+#. 25
+#: ../src/misc_conversion.c:146
+msgid "CD Nr. and total number of CDS in set"
+msgstr "מספר דיסק שמע וסך כל דיסקי השמע בקבוצה"
+
+#: ../src/misc_conversion.c:149
+msgid "The category (e.g. 'Technology' or 'Music') where the podcast was located."
+msgstr "הקטגוריה (לדוגמה \"טכנולוגיה\" או מוזיקה) שבה הפודקסט מוקם."
+
+#: ../src/misc_conversion.c:150
+msgid "Accessible by selecting the center button on the iPod."
+msgstr "זמין על ידי לחיצה על הכפתור המרכזי של ה־iPod."
+
+#: ../src/misc_conversion.c:154
+msgid "Release date (for podcasts displayed next to the title on the iPod)"
+msgstr "זמן שחרור (עבור פודקסטים מוצג ליד הכותרת ב־iPod)"
+
+#. 50
+#: ../src/misc_conversion.c:168
+#: ../src/misc_conversion.c:169
+#: ../src/misc_conversion.c:170
+#: ../src/misc_conversion.c:171
+#: ../src/misc_conversion.c:172
+#: ../src/misc_conversion.c:173
+msgid "Used for sorting on the iPod"
+msgstr "משמש למיון ב-iPod"
+
+#: ../src/misc_conversion.c:735
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the file scheme"
+msgstr "הנתיב '%s' הוא נתיב לא מוחלט המשתמש בתבנית הקובץ"
+
+#: ../src/misc_conversion.c:745
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "שם הקובץ המקומי בנתיב '%s' לא יכול לכלול '#'"
+
+#: ../src/misc_conversion.c:762
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "הנתיב '%s' הוא לא חוקי"
+
+#: ../src/misc_conversion.c:774
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "שם השרת של הנתיב '%s' הוא לא חוקי."
+
+#: ../src/misc_conversion.c:790
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "הנתיב URI '%s' מכיל תווים לא חוקיים"
+
+#: ../src/misc_playlist.c:67
+#: ../src/misc_playlist.c:94
+#: ../src/misc_playlist.c:429
+msgid "Please enter a name for the new playlist"
+msgstr "הכנס בבקשה את השם של רשימת ההשמעה החדשה"
+
+#: ../src/misc_playlist.c:154
+msgid "AR:"
+msgstr "ביצוע:"
+
+#: ../src/misc_playlist.c:157
+msgid "AL:"
+msgstr "כותר:"
+
+#: ../src/misc_playlist.c:160
+msgid "GE:"
+msgstr "סוג:"
+
+#: ../src/misc_playlist.c:163
+msgid "CO:"
+msgstr "מחבר:"
+
+#: ../src/misc_playlist.c:166
+msgid "YE:"
+msgstr "שנה:"
+
+#: ../src/misc_playlist.c:194
+msgid "Unknown"
+msgstr "לא ידוע"
+
+#: ../src/misc_playlist.c:272
+#, c-format
+msgid "Random (%d)"
+msgstr "אקראי (%d)"
+
+#: ../src/misc_playlist.c:297
+msgid ""
+"Auto Store of track view disabled.\n"
+"\n"
+msgstr ""
+"שמירה אוטומטית של תצוגת הרצועות בוטלה.\n"
+"\n"
+
+#: ../src/misc_playlist.c:356
+msgid "Not Listed"
+msgstr "לא רשום"
+
+#: ../src/misc_playlist.c:406
+#, c-format
+msgid "Created playlist '%s' with %d track."
+msgid_plural "Created playlist '%s' with %d tracks."
+msgstr[0] "נוצרה רשימת השמעה '%s' עם רצועה %d."
+msgstr[1] "נוצרה רשימת השמעה '%s' עם %d רצועות."
+
+#. n==0
+#: ../src/misc_playlist.c:417
+msgid "No tracks available, playlist not created"
+msgstr "רצועות לא זמינות, לא נוצרה רשימת השמעה"
+
+#: ../src/misc_playlist.c:543
+#, c-format
+msgid "Most Listened (%d)"
+msgstr "הכי הרבה הושמע (%d)"
+
+#: ../src/misc_playlist.c:584
+#, c-format
+msgid "Never Listened"
+msgstr "לא הושמע אף פעם"
+
+#: ../src/misc_playlist.c:624
+#, c-format
+msgid "Best Rated (%d)"
+msgstr "דורג הכי טוב (%d)"
+
+#: ../src/misc_playlist.c:666
+msgid "Unrated tracks"
+msgstr "רצועות לא דורגו"
+
+#: ../src/misc_playlist.c:671
+#, c-format
+msgid "Rated %d"
+msgstr "דורגו %d"
+
+#: ../src/misc_playlist.c:714
+#, c-format
+msgid "Recent (%d)"
+msgstr "לאחרונה (%d)"
+
+#: ../src/misc_playlist.c:753
+msgid "Last Time"
+msgstr "בפעם האחרונה"
+
+#: ../src/misc_playlist.c:844
+msgid "Removal of dangling tracks with no files on PC was canceled."
+msgstr "הסרה של רצועות מתנדנדות ללא קבצים על ה-PC בוטלה."
+
+#: ../src/misc_playlist.c:854
+msgid "Handling of dangling tracks with files on PC was canceled."
+msgstr "טיפול ברצועות מתנדנדות ללא קבצים על ה-PC בוטל."
+
+#: ../src/misc_playlist.c:882
+msgid "Dangling tracks with no files on PC were removed."
+msgstr "רצועות מתנדנדות ללא קבצים על ה-PC הוסרו."
+
+#: ../src/misc_playlist.c:943
+msgid "Dangling tracks with files on PC were handled."
+msgstr "רצועות מתנדנדות עם קבצים על ה-PC טופלו."
+
+#: ../src/misc_playlist.c:976
+msgid "Track"
+msgstr "רצועה"
+
+#: ../src/misc_playlist.c:1019
+msgid ""
+"You did not import the existing iTunesDB. This is most likely incorrect and will result in the loss of the existing database.\n"
+"\n"
+"Press 'OK' if you want to proceed anyhow or 'Cancel' to abort. If you cancel, you can import the existing database before calling this function again.\n"
+msgstr ""
+"אתה לא ייבאת את ה-iTunesDB הקיים. זה כנראה לא תקין ויגרום לאיבוד של מסד הנתונים הקיים.\n"
+"\n"
+"לחץ 'אישור' על מנת להמשיך כרגיל או 'ביטול' לביטול. אם אתה תבטל, אתה תוכל לייבא את מסד הנתונים הקיים לפני קריאה לפעולה זו שוב.\n"
+
+#: ../src/misc_playlist.c:1033
+msgid "Creating a tree of known files"
+msgstr "יוצר עץ של קבצים ידועים"
+
+#: ../src/misc_playlist.c:1077
+msgid "Checking iPOD files against known files in DB"
+msgstr "בודק קבצים על ה-iPod כנגד קבצים ידועים במסד הנתונים"
+
+#: ../src/misc_playlist.c:1120
+msgid "Orphaned"
+msgstr "יתום"
+
+#: ../src/misc_playlist.c:1147
+#, c-format
+msgid ""
+"The following orphaned file had already been added to the iPod again. It will be removed with the next sync:\n"
+"%s\n"
+"\n"
+msgstr ""
+"הקובץ היתום הבא כבר הוסף ל-iPod שוב. הוא יוסר בסנכרון הבא:\n"
+"%s\n"
+"\n"
+
+#: ../src/misc_playlist.c:1175
+#, c-format
+msgid "Found %d orphaned and %d dangling files. Processing..."
+msgstr "נמצאו %d קבצים יתומים ו-%d קבצים מתנדנדים. מעבד..."
+
+#: ../src/misc_playlist.c:1199
+#, c-format
+msgid ""
+"The following dangling track has a file on PC.\n"
+"Press OK to have them transfered from the file on next Sync, CANCEL to leave it as is."
+msgid_plural ""
+"The following %d dangling tracks have files on PC.\n"
+"Press OK to have them transfered from the files on next Sync, CANCEL to leave them as is."
+msgstr[0] ""
+"הרצועה המתנדנדת הבאה היא בעלת קובץ על ה-PC\n"
+"לחץ אישור להעביר אותה מהקובץ בסנכרון הבא, וביטול לעזוב את זה כמו שזה."
+msgstr[1] ""
+"הרצועות המתנדנדות (%d) הבאות הן בעלות קבצים על ה-PC\n"
+"לחץ אישור להעביר אותן מהקבצים בסנכרון הבא, וביטול לעזוב את זה כמו שזה."
+
+#: ../src/misc_playlist.c:1204
+#, c-format
+msgid ""
+"The following dangling track doesn't have file on PC. \n"
+"Press OK to remove it, CANCEL to leave it as is."
+msgid_plural ""
+"The following %d dangling tracks do not have files on PC. \n"
+"Press OK to remove them, CANCEL to leave them. as is"
+msgstr[0] ""
+"הרצועה המתנדנדת הבאה היא ללא קובץ על ה-PC. \n"
+"לחץ אישור על מנת למחוק אותה, ביטול על מנת להשאירה כמו שהיא."
+msgstr[1] ""
+"הרצועות המתנדנדות הבאות (%d) הן ללא קבצים על ה-PC. \n"
+"לחץ אישור על מנת למחוק אותן, ביטול על מנת להשאירן כמו שהן."
+
+#. we want unique window for each
+#. gboolean modal,
+#: ../src/misc_playlist.c:1211
+msgid "Dangling Tracks"
+msgstr "רצועות מתנדנדות"
+
+#: ../src/misc_playlist.c:1234
+#, c-format
+msgid "Found %d orphaned and %d dangling files. Done."
+msgstr "נמצאו %d קבצים יתומים ו-%d קבצים מתנדנדים. בוצע."
+
+#. update for count == 1, 21, 41 ... and for count == n
+#: ../src/misc_track.c:89
+#, c-format
+msgid "Hashed %d of %d track."
+msgid_plural "Hashed %d of %d tracks."
+msgstr[0] "בוצע ערבוב של %d מתוך %d רצועה."
+msgstr[1] "בוצע ערבוב של %d מתוך %d רצועות."
+
+#: ../src/misc_track.c:198
+#, c-format
+msgid "The following duplicate track has been removed."
+msgid_plural "The following %d duplicate tracks have been removed."
+msgstr[0] "הוסרה הרצועה הכפולה הבאה."
+msgstr[1] "הוסרו %d מן הרצועות הכפולות הבאות."
+
+#: ../src/misc_track.c:205
+#, c-format
+msgid "The following duplicate track has not been added to the master play list."
+msgid_plural "The following %d duplicate tracks have not been added to the master play list."
+msgstr[0] "הרצועה הכפולה הבאה לא הוספה לרשימת ההשמעה הראשית."
+msgstr[1] "הרצועות הכפולות (%d) הבאות לא הוספו לרשימת ההשמעה הראשית."
+
+#. gint id,
+#. gboolean modal,
+#: ../src/misc_track.c:212
+msgid "Duplicate detection"
+msgstr "זיהוי כפילויות"
+
+#: ../src/misc_track.c:1339
+msgid "Local Database"
+msgstr "מסד נתונים מקומי"
+
+#. artwork is set
+#: ../src/misc_track.c:1350
+msgid "Embedded or filename was lost"
+msgstr "מוטבע או ששם הקובץ אבד"
+
+#: ../src/misc_track.c:1354
+msgid "Artwork not set"
+msgstr "לא נקבעו תמונות"
+
+#: ../src/misc_track.c:1816
+#, c-format
+msgid "Could not find source file for '%s'. Track not copied."
+msgstr "אי אפשר למצוא את הקובץ עבור '%s'. הרצועה לא הועתקה."
+
+#: ../src/misc_track.c:2052
+#, c-format
+msgid "drag and drop: ignored '%s'\n"
+msgstr "גרור ושחרר: התעלמות מ '%s'\n"
+
+#: ../src/mp3file.c:1336
+#, c-format
+msgid "Error setting ID3 field: %s\n"
+msgstr "שגיאה בקביעת שדה ID3: %s\n"
+
+#: ../src/mp3file.c:1360
+#: ../src/mp3file.c:1453
+#: ../src/mp3file.c:1608
+#: ../src/mp3file.c:2733
+#, c-format
+msgid "ERROR while opening file: '%s' (%s).\n"
+msgstr "שגיאה בזמן פתיחת קובץ: '%s' (%s).\n"
+
+#: ../src/mp3file.c:1688
+#, c-format
+msgid "ERROR while writing tag to file: '%s' (%s).\n"
+msgstr "שגיאה בזמן כתיבת תג לקובץ: '%s' (%s).\n"
+
+#. Tracks with zero play length are ignored by iPod...
+#: ../src/mp3file.c:2770
+#, c-format
+msgid "File \"%s\" has zero play length. Ignoring.\n"
+msgstr "הקובץ \"%s\" בעל זמן אפס. מתעלם.\n"
+
+#: ../src/mp4file.c:243
+#: ../src/mp4file.c:404
+#, c-format
+msgid "'%s' does not appear to be a mp4 audio or video file.\n"
+msgstr "הקובץ '%s' הוא כנראה לא קובץ שמע או וידאו מסוד mp4.\n"
+
+#: ../src/mp4file.c:253
+#: ../src/mp4file.c:414
+#, c-format
+msgid "Could not open '%s' for reading, or file is not an mp4 file.\n"
+msgstr "אי אפשר לפתוח את '%s' לקריאה, או הקובץ הוא לא קובץ שמע mp4.\n"
+
+#: ../src/mp4file.c:529
+#, c-format
+msgid "'%s' does not appear to be a mp4 audio file.\n"
+msgstr "הקובץ '%s' הוא כנראה לא קובץ שמע mp4.\n"
+
+#: ../src/mp4file.c:540
+#, c-format
+msgid "Could not open '%s' for writing, or file is not an mp4 file.\n"
+msgstr "אי אפשר לפתוח את '%s' לכתיבה, או הקובץ הוא לא קובץ שמע mp4.\n"
+
+#: ../src/mp4file.c:553
+#, c-format
+msgid "Import of '%s' failed: m4a/m4p/m4b not supported without the mp4v2 library. You must compile the gtkpod source together with the mp4v2 library.\n"
+msgstr "הייבוא של '%s' נכשל: m4a/m4p/m4b לא נתמך ללא הספריה mp4v2. אתה חייב להדר את קוד המקור gtkpod ביחד עם הספריה mp4v2.\n"
+
+#: ../src/mp4file.c:559
+#, c-format
+msgid "m4a/m4p/m4b metadata update for '%s' failed: m4a/m4p/m4b not supported without the mp4v2 library. You must compile the gtkpod source together with the mp4v2 library.\n"
+msgstr "עדכון מטא-מידע של m4a/m4p/m4b עבור '%s' נכשל: הסוגים m4a/m4p/m4b לא נתמכים ללא הספריה mp4v2. אתה חייב להדר את קוד המקור של gtkpod ביחד עם ספריית mp4v2.\n"
+
+#: ../src/mp4file.c:565
+#, c-format
+msgid "m4a/m4p/m4b soundcheck update for '%s' failed: m4a/m4p/m4b not supported without the mp4v2 library. You must compile the gtkpod source together with the mp4v2 library.\n"
+msgstr "עדכון מידע קול של m4a/m4p/m4b עבור '%s' נכשל: הסוגים m4a/m4p/m4b לא נתמכים ללא הספריה mp4v2. אתה חייב להדר את קוד המקור של gtkpod ביחד עם ספריית mp4v2.\n"
+
+#: ../src/oggfile.c:73
+#, c-format
+msgid "'%s' does not appear to be an ogg audio file.\n"
+msgstr "הקובץ '%s' הוא כנראה לא קובץ שמע מסוג ogg.\n"
+
+#: ../src/oggfile.c:154
+#, c-format
+msgid "Import of '%s' failed: ogg not supported without the ogg library. You must compile the gtkpod source together with the ogg library.\n"
+msgstr "הייבוא של '%s' נכשל: ogg לא נתמך ללא הספריה של ogg. אתה חייב להדר את קוד המקור gtkpod ביחד עם הספריה של ogg.\n"
+
+#: ../src/oggfile.c:160
+#, c-format
+msgid "ogg metadata update for '%s' failed: ogg not supported without the ogg library. You must compile the gtkpod source together with the ogg library.\n"
+msgstr "עדכון מטא-מידע של ogg עבור '%s' נכשל: הסוג ogg לא נתמך ללא הספריה ogg. אתה חייב להדר את קוד המקור של gtkpod ביחד עם ספריית ogg.\n"
+
+#: ../src/prefs.c:357
+#, c-format
+msgid "gtkpod version %s usage:\n"
+msgstr "גרסה %s של gtkpod, שימוש:\n"
+
+#: ../src/prefs.c:358
+msgid "  -h, --help:   display this message\n"
+msgstr "  -h, --help:   display this message\n"
+
+#: ../src/prefs.c:359
+msgid "  -p <file>:    increment playcount for file by one\n"
+msgstr "  -p <file>:    increment playcount for file by one\n"
+
+#: ../src/prefs.c:360
+msgid "  --hash <file>:print gtkpod hash for file\n"
+msgstr "  --hash <file>:print gtkpod hash for file\n"
+
+#: ../src/prefs.c:361
+msgid "  -m path:      define the mountpoint of your iPod\n"
+msgstr "  -m path:      define the mountpoint of your iPod\n"
+
+#: ../src/prefs.c:362
+msgid "  --mountpoint: same as '-m'.\n"
+msgstr "  --mountpoint: same as '-m'.\n"
+
+#: ../src/prefs.c:363
+msgid "  -a:           import database automatically after start.\n"
+msgstr "  -a:           import database automatically after start.\n"
+
+#: ../src/prefs.c:364
+msgid "  --auto:       same as '-a'.\n"
+msgstr "  --auto:       same as '-a'.\n"
+
+#: ../src/prefs.c:561
+#, c-format
+msgid "Couldn't create ~/.gtkpod\n"
+msgstr "אי אפשר ליצור את  ~/.gtkpod\n"
+
+#: ../src/prefs_window.c:133
+msgid "Please select command for 'Play Now'"
+msgstr "בחר בבקשה פקודה ל 'נגן עכשיו'"
+
+#: ../src/prefs_window.c:134
+msgid "Please select command for 'Enqueue'"
+msgstr "בחר בבקשה פקודה ל 'הכנס לתור'"
+
+#: ../src/prefs_window.c:135
+msgid "Please select the mp3gain executable"
+msgstr "בחר בבקשה את קובץ ההרצה ל-mp3gain"
+
+#: ../src/prefs_window.c:136
+msgid "Please select the aacgain executable"
+msgstr "בחר בבקשה את קובץ ההרצה ל־aacgain"
+
+#: ../src/prefs_window.c:137
+msgid "Select the mserv music root directory"
+msgstr "בחר את תיקיית השורש ל mserv music"
+
+#: ../src/prefs_window.c:138
+msgid "Select the mserv trackinfo root directory"
+msgstr "בחר את תיקיית השורש ל mserv trackinfo"
+
+#: ../src/prefs_window.c:139
+msgid "Select the ogg/vorbis converter command"
+msgstr "בחר את פקודת ההמרה של ogg/vorbis"
+
+#: ../src/prefs_window.c:140
+msgid "Select the flac converter command"
+msgstr "בחר את פקודת ההמרה של flac"
+
+#: ../src/prefs_window.c:141
+msgid "Select the m4a converter command."
+msgstr "בחר את פקודת ההמרה של m4a"
+
+#: ../src/prefs_window.c:142
+msgid "Select the mp3 converter command."
+msgstr "בחר את פקודת ההמרה של mp3"
+
+#: ../src/prefs_window.c:143
+msgid "Select the wav converter command."
+msgstr "בחר את פקודת ההמרה של wav"
+
+#: ../src/prefs_window.c:201
+#: ../src/repository.c:662
+#, c-format
+msgid "<i>Have a look at the scripts provided in '%s'. If you write a new script or improve an existing one, please send it to jcsjcs at users.sourceforge.net for inclusion into the next release.</i>"
+msgstr "<i>הסתכל על קבצי האצווה המופיעים ב-'%s'. אם תכתוב קובץ אצווה חדש או תשפר אחד קיים, שלח אותו בבקשה אל jcsjcs ב- users.sourceforge.net להכללה בגרסה הבאה.</i>"
+
+#: ../src/prefs_window.c:1205
+#: ../src/prefs_window.c:1223
+msgid "Preferences not updated"
+msgstr "העדפות לא עודכנו"
+
+#: ../src/prefs_window.c:1232
+msgid "Preferences applied"
+msgstr "העדפות עודכנו"
+
+#: ../src/repository.c:573
+#: ../src/repository.c:2395
+msgid "Set backup file"
+msgstr "קבע קובץ גיבוי"
+
+#: ../src/repository.c:612
+msgid "Select directory for synchronization"
+msgstr "בחר תיקייה עבור הסנכרון"
+
+#: ../src/repository.c:638
+msgid "Please select command to sync contacts"
+msgstr "בחר בבקשה פקודה לסנכרון אנשי קשר"
+
+#: ../src/repository.c:644
+msgid "Please select command to sync calendar"
+msgstr "בחר בבקשה פקודה לסנכרון יומן"
+
+#: ../src/repository.c:650
+msgid "Please select command to sync notes"
+msgstr "בחר בבקשה פקודה לסנכרון תזכורות"
+
+#: ../src/repository.c:729
+msgid "Smart playlist updated."
+msgstr "רשימת השמעה חכמה עודכנה."
+
+#: ../src/repository.c:1190
+msgid "Podcasts Repository"
+msgstr "מאגר פודקסטים"
+
+#: ../src/repository.c:1194
+msgid "Local Repository"
+msgstr "מאגר מקומי"
+
+#: ../src/repository.c:1348
+msgid "Master Playlist"
+msgstr "רשימת השמעה ראשית"
+
+#: ../src/repository.c:1352
+msgid "Podcasts Playlist"
+msgstr "רשימות השמעה של פודקסטים"
+
+#: ../src/repository.c:1360
+msgid "Regular Playlist"
+msgstr "רשימת השמעה רגילות"
+
+#: ../src/repository.c:2423
+msgid "Set local repository file"
+msgstr "קבע קובץ מאגר מקומי"
+
+#: ../src/repository.c:2522
+msgid "New Repository"
+msgstr "מאגר חדש"
+
+#: ../src/sha1.c:186
+msgid "Hashed file is 0 bytes long\n"
+msgstr "קובץ מעורבב (Hashed) בעל גודל של 0\n"
+
+#: ../src/sha1.c:239
+#, c-format
+msgid "Could not open '%s' to calculate SHA1 checksum: %s\n"
+msgstr "לא יכול לפתוח את '%s' על מנת לחשב סכומי ביקורת: %s\n"
+
+#: ../src/syncdir.c:237
+#, c-format
+msgid "Sync summary for %s/%s\n"
+msgstr "סיכום סנכרון עבור %s/%s\n"
+
+#: ../src/syncdir.c:246
+msgid "The following track has been added or updated:\n"
+msgid_plural "The following tracks have been added or updated:\n"
+msgstr[0] "הרצועה הבאה עודכנה או התווספה:\n"
+msgstr[1] "הרצועות הבאות עודכנו או התווספו:\n"
+
+#: ../src/syncdir.c:255
+msgid "The following track has been completely removed from the iPod:\n"
+msgid_plural "The following tracks have been completely removed from the iPod:\n"
+msgstr[0] "הרצועה הבאה הוסרה לחלוטין מה־iPod:\n"
+msgstr[1] "הרצועות הבאות הוסרו לחלוטין מה־iPod:\n"
+
+#: ../src/syncdir.c:264
+msgid "The following track has been removed from the repository:\n"
+msgid_plural "The following tracks have been removed from the repository:\n"
+msgstr[0] "הרצועה הבאה הוסרה מהמאגר:\n"
+msgstr[1] "הרצועות הבאות הוסרו מהמאגר:\n"
+
+#: ../src/syncdir.c:271
+msgid "The following track has been removed from the playlist:\n"
+msgid_plural "The following tracks have been removed from the playlist:\n"
+msgstr[0] "הרצועה הבאה הוסרה מרשימת ההשמעה:\n"
+msgstr[1] "הרצועות הבאות הוסרו מרשימת ההשמעה:\n"
+
+#: ../src/syncdir.c:277
+msgid "Nothing was changed.\n"
+msgstr "כלום לא השתנה.\n"
+
+#: ../src/syncdir.c:282
+msgid "Sync summary"
+msgstr "סיכום הסנכרון"
+
+#: ../src/tools.c:118
+#, c-format
+msgid ""
+"Could not find '%s'.\n"
+"Please specifiy the exact path in the Tools section of the preference dialog or install the program if it is not installed on your system.\n"
+"\n"
+msgstr ""
+"לא מסוגל למצוא את '%s'.\n"
+"  אנא ציין את הנתיב המדוייק בחלק 'כלים' של חלון דו-שיח ההעדפות או התקן את התכנית אם היא לא מותקנת על המערכת שלך.\n"
+"\n"
+
+#: ../src/tools.c:203
+#, c-format
+msgid ""
+"Execution of '%s' failed.\n"
+"\n"
+msgstr ""
+"הביצוע של '%s' נכשל.\n"
+"\n"
+
+#: ../src/tools.c:248
+#, c-format
+msgid "Did not normalize '%s'. Set mp3gain path in the Tools section of the preferences.\n"
+msgstr "לא בוצע נרמול עבור '%s'.אנא קבע את הנתיב של mp3gain בחלק 'כלים' של חלון דו-שיח ההעדפות.\n"
+
+#: ../src/tools.c:258
+#, c-format
+msgid "Did not normalize '%s'. Set aacgain path in the Tools section of the preferences.\n"
+msgstr "לא בוצע נרמול עבור '%s'.אנא קבע את הנתיב של aacgain בחלק 'כלים' של חלון דו-שיח ההעדפות.\n"
+
+#: ../src/tools.c:385
+msgid "Normalizing..."
+msgstr "מנרמל..."
+
+#: ../src/tools.c:435
+#, c-format
+msgid "%s - %s"
+msgstr "%s - %s"
+
+#: ../src/tools.c:461
+msgid "Aborting..."
+msgstr "מבטל..."
+
+#: ../src/tools.c:465
+msgid "Will abort after current mp3gain process ends."
+msgstr "יבוטל אחרי שתהליך mp3gain יסתיים."
+
+#: ../src/tools.c:491
+#, c-format
+msgid ""
+"'%s-%s' (%s) could not be normalized.\n"
+"\n"
+msgstr ""
+"אי אפשר לנרמל את '%s-%s' (%s)\n"
+"\n"
+
+#: ../src/tools.c:530
+#, c-format
+msgid "Normalized %d of %d tracks."
+msgid_plural "Normalized %d of %d tracks."
+msgstr[0] "נורמלו %d מתוך %d רצועות."
+msgstr[1] "נורמלו %d מתוך %d רצועות."
+
+#: ../src/tools.c:633
+msgid "Please specify the command to be called on the 'Tools' section of the preferences dialog.\n"
+msgstr "אנא ציין את הפקודה שיקראו לה בחלק 'כלים' בחלון הדו-שיח העדפות.\n"
+
+#: ../src/tools.c:645
+#, c-format
+msgid ""
+"Could not find the command '%s'.\n"
+"\n"
+"Please verify the setting in the 'Tools' section of the preferences dialog.\n"
+"\n"
+msgstr ""
+"לא מסוגל למצוא את הפקודה '%s'.\n"
+"\n"
+"אנא בדוק את ההגדרות בחלק 'כלים' של חלון דו-שיח ההעדפות.\n"
+"\n"
+
+#: ../src/tools.c:687
+#, c-format
+msgid ""
+"'%s' returned the following output:\n"
+"%s\n"
+msgstr ""
+"האובייקט '%s' החזיר את הפלט הבא:\n"
+"%s\n"
+
+#: ../src/tools.c:754
+#, c-format
+msgid "No command set for '%s'"
+msgstr "אין רשימת פקודות ל-'%s'"
+
+#: ../src/tools.c:774
+#, c-format
+msgid "Could not find command '%s' specified for '%s'"
+msgstr "לא מסוגל למצוא פקודה '%s' אשר צוינה עבור '%s'"
+
+#: ../src/wavfile.c:181
+#, c-format
+msgid "%s does not appear to be a supported wav file.\n"
+msgstr "הקובץ %s הוא כנראה לא קובץ wav נתמך.\n"
+

Added: trunk/po/it.po
===================================================================
--- trunk/po/it.po	                        (rev 0)
+++ trunk/po/it.po	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,5809 @@
+# Italian language translation for gtkpod.
+# Copyright (C) 2003 Edward Matteucci
+# Copyright (C) 2007 Daniele Forsi
+# This file is distributed under the same license as the gtkpod package.
+#
+#
+# Edward Matteucci <edward.matteucci at libero.it>, 2003, 2005.
+# Daniele Forsi <dforsi at gmail.com>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: it\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-12-13 18:36-0500\n"
+"PO-Revision-Date: 2007-12-13 14:55+0100\n"
+"Last-Translator: Daniele Forsi <dforsi at gmail.com>\n"
+"Language-Team: Italian <tp at lists.linux.it>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: ../data/gtkpod.desktop.in.h:1
+msgid "GtkPod"
+msgstr "GtkPod"
+
+#: ../data/gtkpod.desktop.in.h:2
+msgid "Manage music and video on an Apple iPod"
+msgstr "Gestisci musica e video negli iPod Apple"
+
+#: ../data/gtkpod.desktop.in.h:3
+msgid "iPod Manager"
+msgstr "Gestore di iPod"
+
+#: ../data/gtkpod.glade.h:1
+msgid " "
+msgstr " "
+
+#: ../data/gtkpod.glade.h:2
+msgid "    "
+msgstr "    "
+
+#: ../data/gtkpod.glade.h:3
+msgid "     "
+msgstr "     "
+
+#: ../data/gtkpod.glade.h:4
+msgid "      "
+msgstr "      "
+
+#: ../data/gtkpod.glade.h:5
+msgid "   Sort by:"
+msgstr "   Ordina per:"
+
+#: ../data/gtkpod.glade.h:6
+msgid " <= cts <= "
+msgstr " <= cts <= "
+
+#: ../data/gtkpod.glade.h:7
+msgid " Logic: "
+msgstr " Logica: "
+
+#: ../data/gtkpod.glade.h:9
+#, no-c-format
+msgid "%A"
+msgstr "%A"
+
+#: ../data/gtkpod.glade.h:10
+msgid ""
+"'DD/MM/YYYY HH:MM < d < DD/MM/YYYY HH:MM' or similar. Press 'enter' when "
+"finished."
+msgstr ""
+"«DD/MM/YYYY HH:MM < d < DD/MM/YYYY HH:MM» o simile. Premere «Invio» alla "
+"fine."
+
+#: ../data/gtkpod.glade.h:11
+msgid "'aacgain' executable:"
+msgstr "Eseguibile «aacgain»:"
+
+#: ../data/gtkpod.glade.h:12
+msgid "'mp3gain' executable:"
+msgstr "Eseguibile «mp3gain»:"
+
+#: ../data/gtkpod.glade.h:13
+msgid "(Checked)"
+msgstr "(selezionato)"
+
+#: ../data/gtkpod.glade.h:14
+msgid "...as icons"
+msgstr "...con icone"
+
+#: ../data/gtkpod.glade.h:15
+msgid "...as text"
+msgstr "...con testo"
+
+#: ../data/gtkpod.glade.h:16
+msgid "...both as icons and text"
+msgstr "...con icone e testo"
+
+#: ../data/gtkpod.glade.h:17
+msgid "...entry 'All' in sort tab..."
+msgstr "...la voce «Tutti» nella scheda di ordinamento..."
+
+#: ../data/gtkpod.glade.h:18
+msgid "...master playlist"
+msgstr "...la playlist principale"
+
+#: ../data/gtkpod.glade.h:20
+#, no-c-format
+msgid "../%A.jpg"
+msgstr "../%A.jpg"
+
+#: ../data/gtkpod.glade.h:21
+msgid "0"
+msgstr "0"
+
+#: ../data/gtkpod.glade.h:22
+msgid "1"
+msgstr "1"
+
+#: ../data/gtkpod.glade.h:23
+msgid "2"
+msgstr "2"
+
+#: ../data/gtkpod.glade.h:24
+msgid "3"
+msgstr "3"
+
+#: ../data/gtkpod.glade.h:25
+msgid "4"
+msgstr "4"
+
+#: ../data/gtkpod.glade.h:26
+msgid "5"
+msgstr "5"
+
+#: ../data/gtkpod.glade.h:27
+msgid ":"
+msgstr ":"
+
+#: ../data/gtkpod.glade.h:28
+msgid "<"
+msgstr "<"
+
+#: ../data/gtkpod.glade.h:29
+msgid "<b>Account Information</b>"
+msgstr "<b>Informazioni sull'account</b>"
+
+#: ../data/gtkpod.glade.h:30
+msgid "<b>Adding/Updating/Syncing</b>"
+msgstr "<b>Aggiungi/Aggiorna/Sincronizza</b>"
+
+#: ../data/gtkpod.glade.h:31
+msgid "<b>Audioscrobbler</b>"
+msgstr "<b>Audioscrobbler</b>"
+
+#: ../data/gtkpod.glade.h:32
+msgid "<b>Auto-Generated Playlists</b>"
+msgstr "<b>Playlist generate automaticamente</b>"
+
+#: ../data/gtkpod.glade.h:33
+msgid "<b>Automatically select...</b>"
+msgstr "<b>Seleziona automaticamente...</b>"
+
+#: ../data/gtkpod.glade.h:34
+msgid "<b>Calendar/Contacts/Notes</b>"
+msgstr "<b>Calendario/Contatti/Note</b>"
+
+#: ../data/gtkpod.glade.h:35
+msgid "<b>Coverart</b>"
+msgstr "<b>Copertina</b>"
+
+#: ../data/gtkpod.glade.h:36
+msgid "<b>Delete Confirmation</b>"
+msgstr "<b>Conferma l'eliminazione</b>"
+
+#: ../data/gtkpod.glade.h:37
+msgid "<b>Examples</b>"
+msgstr "<b>Esempi</b>"
+
+#: ../data/gtkpod.glade.h:38
+msgid "<b>Ignore Frequent Words</b>"
+msgstr "<b>Ignora parole frequenti</b>"
+
+#: ../data/gtkpod.glade.h:39
+msgid "<b>Misc</b>"
+msgstr "<b>Miscellanea</b>"
+
+#: ../data/gtkpod.glade.h:40
+msgid "<b>Mountpoint and individual repository/playlist options</b>"
+msgstr "<b>Punto di mount e opzioni individuali per archivio e playlist</b>"
+
+#: ../data/gtkpod.glade.h:41
+msgid "<b>On-the-fly Conversion</b>"
+msgstr "<b>Conversione al volo</b>"
+
+#: ../data/gtkpod.glade.h:42
+msgid "<b>Play</b>"
+msgstr "<b>Riproduzione</b>"
+
+#: ../data/gtkpod.glade.h:43
+msgid "<b>Playlists</b>"
+msgstr "<b>Playlist</b>"
+
+#: ../data/gtkpod.glade.h:44
+msgid "<b>Please select mountpoint and your iPod model</b>"
+msgstr "<b>Scegliere il punto di mount e il modello di iPod</b>"
+
+#: ../data/gtkpod.glade.h:45
+msgid "<b>Repositories</b>"
+msgstr "<b>Archivi</b>"
+
+#: ../data/gtkpod.glade.h:46
+msgid "<b>Sort Order</b>"
+msgstr "<b>Tipo di ordinamento</b>"
+
+#: ../data/gtkpod.glade.h:47
+msgid "<b>Sort Tabs</b>"
+msgstr "<b>Schede di ordinamento</b>"
+
+#: ../data/gtkpod.glade.h:48
+msgid "<b>Sync</b>"
+msgstr "<b>Sincronizza</b>"
+
+#: ../data/gtkpod.glade.h:49
+msgid "<b>Synchronization</b>"
+msgstr "<b>Sincronizzazione</b>"
+
+#: ../data/gtkpod.glade.h:50
+msgid "<b>Tag Reading</b>"
+msgstr "<b>Lettura delle etichette</b>"
+
+#: ../data/gtkpod.glade.h:51
+msgid "<b>Toolbar</b>"
+msgstr "<b>Barra degli strumenti</b>"
+
+#: ../data/gtkpod.glade.h:52
+msgid "<b>Tooltips</b>"
+msgstr "<b>Suggerimenti</b>"
+
+#: ../data/gtkpod.glade.h:53
+msgid "<b>Track Attributes</b>"
+msgstr "<b>Attributi della traccia</b>"
+
+#: ../data/gtkpod.glade.h:54
+msgid "<b>Track Editing</b>"
+msgstr "<b>Modifica della traccia</b>"
+
+#: ../data/gtkpod.glade.h:55
+msgid "<b>Volume Normalization</b>"
+msgstr "<b>Normalizzazione del volume</b>"
+
+#: ../data/gtkpod.glade.h:56
+msgid "<b>mserv</b>"
+msgstr "<b>mserv</b>"
+
+#: ../data/gtkpod.glade.h:57
+msgid ">"
+msgstr ">"
+
+#: ../data/gtkpod.glade.h:58
+msgid "About gtkpod"
+msgstr "Informazioni su gtkpod"
+
+#: ../data/gtkpod.glade.h:59
+msgid "Add Directories Recursively"
+msgstr "Aggiunge directory ricorsivamente"
+
+#: ../data/gtkpod.glade.h:60
+msgid "Add Files"
+msgstr "Aggiungi file"
+
+#: ../data/gtkpod.glade.h:61
+msgid "Add Files or Directories"
+msgstr "Aggiunge un file o una directory"
+
+#: ../data/gtkpod.glade.h:62
+msgid "Add Fol_der"
+msgstr "Aggiungi _cartella"
+
+#: ../data/gtkpod.glade.h:63
+msgid "Add Folder"
+msgstr "Aggiungi cartella"
+
+#: ../data/gtkpod.glade.h:64
+msgid "Add Image_s"
+msgstr "Aggiungi _immagini"
+
+#: ../data/gtkpod.glade.h:65
+msgid "Add Images from a Directory"
+msgstr "Aggiunge immagini da una directory"
+
+#: ../data/gtkpod.glade.h:66
+msgid "Add Playlist"
+msgstr "Aggiungi playlist"
+
+#: ../data/gtkpod.glade.h:67
+msgid "Add _Files"
+msgstr "Aggiungi _file"
+
+#: ../data/gtkpod.glade.h:68
+msgid "Add _Playlist"
+msgstr "Aggiungi _playlist"
+
+#: ../data/gtkpod.glade.h:69
+msgid "Add coverart from file using the following template"
+msgstr "Aggiungi la copertina da un file usando il seguente modello"
+
+#: ../data/gtkpod.glade.h:70
+msgid "Add directories recursively"
+msgstr "Aggiungi le directory ricorsivamente"
+
+#: ../data/gtkpod.glade.h:71
+msgid "Add new repository/iPod"
+msgstr "Aggiungi un nuovo archivio o iPod"
+
+#: ../data/gtkpod.glade.h:72
+msgid "Add playlist from file"
+msgstr "Aggiunge una playlist da un file"
+
+#: ../data/gtkpod.glade.h:73 ../src/display_sorttabs.c:3247
+#: ../src/display_tracks.c:2103
+msgid "Added"
+msgstr "Aggiunto"
+
+#: ../data/gtkpod.glade.h:74
+msgid "Advanced Sorting Options"
+msgstr "Opzioni avanzate di ordinamento"
+
+#. 0
+#: ../data/gtkpod.glade.h:75 ../src/display_sorttabs.c:2982
+#: ../src/display_spl.c:84 ../src/misc_conversion.c:60
+msgid "Album"
+msgstr "Album"
+
+#: ../data/gtkpod.glade.h:76
+msgid "Album Art"
+msgstr "Copertina dell'album"
+
+#: ../data/gtkpod.glade.h:77
+msgid "All (AND)"
+msgstr "Tutti (AND)"
+
+#: ../data/gtkpod.glade.h:78
+msgid "All Tracks Never Listened To"
+msgstr "Tutte le tracce mai ascoltate"
+
+#: ../data/gtkpod.glade.h:79
+msgid "All Tracks Played Since Last Time"
+msgstr "Tutte le tracce riprodotte dall'ultima volta"
+
+#: ../data/gtkpod.glade.h:80
+msgid "All Tracks not Listed in any Playlist"
+msgstr "Tutte le tracce non contenute in una playlist"
+
+#: ../data/gtkpod.glade.h:81
+msgid "Also include tracks never played in \"Best Rated\" playlist"
+msgstr "Includi le tracce mai ascoltate nella playlist «Voti migliori»"
+
+#: ../data/gtkpod.glade.h:82
+msgid "Always write ID3v2.4 tags (only applies to MP3)"
+msgstr "Scrivi sempre le etichette ID3v2.4 (vale solo per gli MP3)"
+
+#: ../data/gtkpod.glade.h:83
+msgid "Any (OR)"
+msgstr "Qualsiasi (OR)"
+
+#: ../data/gtkpod.glade.h:84 ../src/display_sorttabs.c:2979
+#: ../src/display_spl.c:85 ../src/misc_conversion.c:61
+msgid "Artist"
+msgstr "Artista"
+
+#: ../data/gtkpod.glade.h:85
+msgid "Artwork Preview"
+msgstr "Anteprima artwork"
+
+#: ../data/gtkpod.glade.h:86
+msgid ""
+"As a last resort set the following tags to the\n"
+"filename if they are (still) empty:"
+msgstr ""
+"Come ultimo tentativo riempi le etichette seguenti con\n"
+"il nome del file se sono (ancora) vuote:"
+
+#: ../data/gtkpod.glade.h:88
+msgid "Ascending"
+msgstr "Crescente"
+
+#: ../data/gtkpod.glade.h:89
+msgid "Auto Store"
+msgstr "Salvataggio automatico"
+
+#: ../data/gtkpod.glade.h:90
+msgid ""
+"Automatically start displaying tracks that match the criteria entered above. "
+"If not selected, you must press 'Display' to start displaying."
+msgstr ""
+"Visualizza automaticamente le tracce che corrispondono ai criteri inseriti "
+"sopra. Se non selezionato, si deve premere «Mostra» per attivare la "
+"visualizzazione."
+
+#: ../data/gtkpod.glade.h:91
+msgid "Available:"
+msgstr "Disponibili:"
+
+#: ../data/gtkpod.glade.h:92
+msgid "Before removing playlists or tracks from a playlist"
+msgstr "Prima di rimuovere le playlist o le tracce da una playlist"
+
+#: ../data/gtkpod.glade.h:93
+msgid "Before removing tracks from the harddisk"
+msgstr "Prima di rimuovere le tracce dal disco fisso"
+
+#: ../data/gtkpod.glade.h:94
+msgid "Before removing tracks from the iPod"
+msgstr "Prima di rimuovere le tracce dall'iPod"
+
+#: ../data/gtkpod.glade.h:95
+msgid "Before removing tracks from the local database"
+msgstr "Prima di rimuovere le tracce dal database locale"
+
+#: ../data/gtkpod.glade.h:96
+msgid "Best Rated Tracks"
+msgstr "Tracce con il voto migliore"
+
+#: ../data/gtkpod.glade.h:97
+msgid "Browse"
+msgstr "Sfoglia"
+
+#: ../data/gtkpod.glade.h:98
+msgid "Cache directory:"
+msgstr "Directory per la cache:"
+
+#: ../data/gtkpod.glade.h:99
+msgid "Calendar"
+msgstr "Calendario"
+
+#: ../data/gtkpod.glade.h:100
+msgid "Calendar sync command:"
+msgstr "Comando per sincronizzare il calendario:"
+
+#: ../data/gtkpod.glade.h:101
+msgid "Call automatically when synchronizing iTunesDB"
+msgstr "Chiama automaticamente mentre sincronizzi iTunesDB"
+
+#: ../data/gtkpod.glade.h:102
+msgid "Category: "
+msgstr "Categoria: "
+
+#: ../data/gtkpod.glade.h:103
+msgid ""
+"Change all tracks\n"
+"simultaneously"
+msgstr ""
+"Cambia tutte le tracce\n"
+"simultaneamente"
+
+#: ../data/gtkpod.glade.h:105
+msgid ""
+"Check before removing photos from a photo album whether\n"
+"they should be deleted from the Photo Database."
+msgstr ""
+"Controlla prima di rimuovere le foto da un album se\n"
+"debbano essere eliminate dal Photo Database."
+
+#: ../data/gtkpod.glade.h:107
+msgid "Check for existing files when copying from iPod."
+msgstr "Controlla se i file esistono durante la copia dall'iPod."
+
+#: ../data/gtkpod.glade.h:108
+msgid "Command for 'Enqueue':"
+msgstr "Comando per «Metti in coda»:"
+
+#: ../data/gtkpod.glade.h:109
+msgid "Command for 'Play now':"
+msgstr "Comando per «Riproduci ora»:"
+
+#. 5
+#: ../data/gtkpod.glade.h:110 ../src/display_spl.c:97
+#: ../src/misc_conversion.c:65
+msgid "Composer"
+msgstr "Compositore"
+
+#: ../data/gtkpod.glade.h:111
+msgid "Confirm before removing tracks from the iPod or repository"
+msgstr "Chiedi conferma prima di rimuovere le tracce dall'iPod o dall'archivio"
+
+#: ../data/gtkpod.glade.h:112
+msgid ""
+"Confirm before removing tracks from the iPod or repository\n"
+"when syncing playlists"
+msgstr ""
+"Chiedi conferma prima di rimuovere le tracce dall'iPod o dall'archivio\n"
+"durante la sincronizzazione delle playlist"
+
+#: ../data/gtkpod.glade.h:114
+msgid "Confirm lists of directories"
+msgstr "Conferma la lista delle directory"
+
+#: ../data/gtkpod.glade.h:115
+msgid "Contacts sync command:"
+msgstr "Comando per sincronizzare i contatti:"
+
+#: ../data/gtkpod.glade.h:116
+msgid "Containing Displayed Tracks"
+msgstr "Contenente le tracce visualizzate"
+
+#: ../data/gtkpod.glade.h:117
+msgid "Containing Selected Tracks"
+msgstr "Contenente le tracce selezionate"
+
+#: ../data/gtkpod.glade.h:118
+msgid "Conversion Progress Display"
+msgstr "Visualizzazione dell'avanzamento della conversione"
+
+#: ../data/gtkpod.glade.h:119
+msgid "Cover"
+msgstr "Copertina"
+
+#: ../data/gtkpod.glade.h:120
+msgid "Create New Playlist"
+msgstr "Crea una nuova playlist"
+
+#: ../data/gtkpod.glade.h:121
+msgid "Create Repository"
+msgstr "Crea archivio"
+
+#: ../data/gtkpod.glade.h:122
+msgid "Create _Playlist File"
+msgstr "Crea un file di _playlist"
+
+#: ../data/gtkpod.glade.h:123
+msgid "Credits"
+msgstr "Riconoscimenti"
+
+#: ../data/gtkpod.glade.h:124
+msgid "Currently only rating is supported."
+msgstr "Attualmente solo il voto è supportato."
+
+#: ../data/gtkpod.glade.h:125
+msgid "Delete repository"
+msgstr "Elimina l'archivio"
+
+#: ../data/gtkpod.glade.h:126
+msgid ""
+"Delete tracks that are no longer present from the\n"
+"iPod or repository"
+msgstr ""
+"Elimina dall'iPod o dall'archivio\n"
+"le tracce che non sono più presenti"
+
+#: ../data/gtkpod.glade.h:128
+msgid "Deleted tracks"
+msgstr "Tracce eliminate"
+
+#: ../data/gtkpod.glade.h:129
+msgid "Descending"
+msgstr "Decrescente"
+
+#: ../data/gtkpod.glade.h:130
+msgid "Details"
+msgstr "Dettagli"
+
+#: ../data/gtkpod.glade.h:132
+#, no-c-format
+msgid ""
+"Determines how the string for the info field should be constructed, e.g '%a/%"
+"A/%T - %t.mp3' or '%o'.  You can separate several templates by semicolons -- "
+"gtkpod will determine which one to use by the filename extension given. "
+"Artist: %a, album: %A, composer: %c, title: %t, genre: %G, track nr: %T, CD "
+"nr: %C, year: %Y, original filename (requires extended information file): %"
+"o, the character '%': %%."
+msgstr ""
+"Determina come costruire la stringa per il campo di informazioni. es. «%a/%A/"
+"%T - %t.mp3» o «%o». Si possono separare diversi modelli con punto e virgola "
+"-- gtkopd determinerà quale usare a seconda dell'estensione data al file. "
+"Artista: %a, album: %A, compositore: %c, titolo: %t, genere: %G, numero "
+"traccia: %T, numero CD: %C, anno: %Y, nome file originale (necessita del "
+"file con le informazioni estese): %o, il carattere «%»: %%."
+
+#: ../data/gtkpod.glade.h:134
+#, no-c-format
+msgid ""
+"Determines the filename of tracks you copy from the iPod, e.g '%a/%A/%T - %t."
+"mp3' or '%o'.  You can separate several patterns by semicolons -- gtkpod "
+"will determine which one to use by the filename extension given. Artist: %a, "
+"album: %A, composer: %c, title: %t, genre: %G, track nr: %T, CD nr: %C, "
+"year: %Y, original filename (requires extended information file): %o, "
+"current playlist: %p, the character '%': %%."
+msgstr ""
+"Determina il nome del file delle tracce copiate dall'iPod, es. «%a/%A/%T -%t."
+"mp3» o «%o». Si possono separare diversi modelli con punto e virgola -- "
+"gtkopd determinerà quale usare a seconda dell'estensione data al file. "
+"Artista: %a, album: %A, compositore: %c, titolo: %t, genere: %G, numero "
+"traccia: %T, numero CD: %C, anno: %Y, nome del file originale (necessita del "
+"file con le informazioni estese): %o, playlist attuale: %p, il carattere "
+"«%»: %%."
+
+#: ../data/gtkpod.glade.h:136
+#, no-c-format
+msgid ""
+"Determines the name of the file with the cover art. You can separate several "
+"patterns by semicolons which will be tried in order. Artist: %a, album: %A, "
+"composer: %c, title: %t, genre: %G, track nr: %T, CD nr: %C, year: %Y, "
+"original filename (requires extended information file): %o, original "
+"filename without file extension: %O, current playlist: %p, the character "
+"'%': %%."
+msgstr ""
+"Determina il nome del file con la copertina. Si possono separare diversi "
+"modelli con punto e virgola che verranno provati nell'ordine. Artista: %a, "
+"album: %A, compositore: %c, titolo: %t, genere: %G, numero traccia: %T, "
+"numero CD: %C, anno: %Y, nome del file originale (necessita del file con le "
+"informazioni estese): %o, nome del file originale senza estensione: %O, "
+"playlist attuale: %p, il carattere «%»: %%."
+
+#: ../data/gtkpod.glade.h:137
+msgid ""
+"Directories to sync with are determined from the filenames of the tracks in "
+"the playlist."
+msgstr ""
+"Le directory da sincronizzare sono determinate a partire dal nome dei file "
+"delle tracce nella playlist."
+
+#: ../data/gtkpod.glade.h:138
+msgid "Display a list of tracks that could actually be updated."
+msgstr "Mostra una lista di tracce che sono state veramente aggiornate."
+
+#: ../data/gtkpod.glade.h:139
+msgid "Display a list of tracks that could not be updated."
+msgstr "Mostra una lista di tracce che non è stato possibile aggiornare."
+
+#: ../data/gtkpod.glade.h:140
+msgid "Display conversion log"
+msgstr "Mostra il registro della conversione"
+
+#: ../data/gtkpod.glade.h:141
+msgid "Display info about detected duplicates"
+msgstr "Mostra informazioni sui duplicati individuati"
+
+#: ../data/gtkpod.glade.h:142
+msgid "Display info about non-updated tracks"
+msgstr "Mostra informazioni sulle tracce non aggiornate"
+
+#: ../data/gtkpod.glade.h:143
+msgid "Display info about updated tracks"
+msgstr "Mostra informazioni sulle tracce aggiornate"
+
+#: ../data/gtkpod.glade.h:144
+msgid "Display messages and warnings at startup"
+msgstr "Mostra messaggi e avvertimenti all'avvio"
+
+#: ../data/gtkpod.glade.h:145
+msgid ""
+"Display the list of duplicates that have been detected after adding files."
+msgstr ""
+"Mostra la lista dei duplicati che sono stati individuati dopo l'aggiunta dei "
+"file."
+
+#: ../data/gtkpod.glade.h:146
+msgid "Display toolbar..."
+msgstr "Mostra la barra degli strumenti..."
+
+#: ../data/gtkpod.glade.h:147
+msgid "Display tooltips in main window"
+msgstr "Mostra i suggerimenti nella finestra principale"
+
+#: ../data/gtkpod.glade.h:148
+msgid "Display tooltips in prefs window"
+msgstr "Mostra i suggerimenti nella finestra delle preferenze"
+
+#: ../data/gtkpod.glade.h:149
+msgid "Display tracks that match the criteria entered above."
+msgstr "Mostra le tracce che corrispondono ai criteri inseriti sopra."
+
+#: ../data/gtkpod.glade.h:150
+msgid ""
+"Displayed\n"
+"Tracks"
+msgstr ""
+"Tracce\n"
+"visualizzate"
+
+#: ../data/gtkpod.glade.h:152
+msgid "Displayed:"
+msgstr "Visualizzati:"
+
+#: ../data/gtkpod.glade.h:153
+msgid "Don't allow file duplication"
+msgstr "Non permettere i file duplicati"
+
+#: ../data/gtkpod.glade.h:154
+msgid "Don't automatically sync on startup"
+msgstr "Non sincronizzare automaticamente all'avvio"
+
+#: ../data/gtkpod.glade.h:155
+msgid "Duplicate Recognition is based on a (modified) sha1 hash over the file."
+msgstr ""
+"Il riconoscimento dei file duplicati è basato su un hash sha1 (modificato) "
+"sul file."
+
+#: ../data/gtkpod.glade.h:156
+msgid "Edit Repository/iPod Options"
+msgstr "Modifica le opzioni dell'archivio e dell'iPod"
+
+#: ../data/gtkpod.glade.h:157 ../src/context_menus.c:662
+msgid "Edit Smart Playlist"
+msgstr "Modifica la playlist intelligente"
+
+#: ../data/gtkpod.glade.h:158 ../src/context_menus.c:749
+msgid "Edit Track Details"
+msgstr "Modifica i dettagli della traccia"
+
+#: ../data/gtkpod.glade.h:159
+msgid "Edit _Preferences"
+msgstr "Modifica le _preferenze"
+
+#: ../data/gtkpod.glade.h:160
+msgid "Effective free space"
+msgstr "Spazio libero effettivo"
+
+#: ../data/gtkpod.glade.h:161
+msgid "Empty Playlist"
+msgstr "Playlist vuota"
+
+#: ../data/gtkpod.glade.h:162
+msgid "Exclude file mask(s)"
+msgstr "Maschera per i file da escludere"
+
+#: ../data/gtkpod.glade.h:163
+msgid "Export can be continued at a later time if canceled."
+msgstr "Se annullata, l'esportazione può essere ripresa in seguito."
+
+#: ../data/gtkpod.glade.h:164
+msgid "File size"
+msgstr "Dimensione file"
+
+#: ../data/gtkpod.glade.h:165
+msgid "File size (deleted)"
+msgstr "Dimensione dei file (eliminati)"
+
+#: ../data/gtkpod.glade.h:166
+msgid "File size (non-transferred)"
+msgstr "Dimensione dei file (non trasferiti)"
+
+#: ../data/gtkpod.glade.h:167
+msgid "Filename Format: "
+msgstr "Formato del nome del file: "
+
+#: ../data/gtkpod.glade.h:168
+msgid ""
+"Find orphan files (files with no track info in DB) and dangling tracks "
+"(tracks with no corresponding files on iPod)"
+msgstr ""
+"Trova i file orfani (file senza informazioni sulla traccia nel DB) e tracce "
+"fantasma (tracce senza file corrispondenti sull'iPod)"
+
+#: ../data/gtkpod.glade.h:169
+msgid "First try <i>folder.jpg</i>, then <i>&lt;artist&gt;.jpg</i>"
+msgstr "Prima prova <i>folder.jpg</i>, poi <i>&lt;artista&gt;.jpg</i>"
+
+#: ../data/gtkpod.glade.h:170
+msgid "Flac with :"
+msgstr "Flac con :"
+
+#: ../data/gtkpod.glade.h:172
+#, no-c-format
+msgid ""
+"For example, 'xmms %s' will clear xmms' current playlist, add the selected "
+"tracks and start playing."
+msgstr ""
+"Per esempio, «xmms %s» cancellerà la playlist attuale di xmms, aggiungerà la "
+"traccia selezionata e comincerà a suonarla."
+
+#: ../data/gtkpod.glade.h:174
+#, no-c-format
+msgid ""
+"For example, 'xmms -e %s' will append (enqueue) the selected tracks to xmms' "
+"current playlist."
+msgstr ""
+"Per esempio, «xmms -e %s» appenderà (in coda) la traccia selezionata alla "
+"playlist corrente di xmms."
+
+#: ../data/gtkpod.glade.h:175 ../src/display_sorttabs.c:2985
+#: ../src/display_spl.c:89 ../src/misc_conversion.c:63
+msgid "Genre"
+msgstr "Genere"
+
+#: ../data/gtkpod.glade.h:176
+msgid "Group artists on compilation CDs"
+msgstr "Raggruppa gli artisti nei CD di compilation"
+
+#: ../data/gtkpod.glade.h:177
+msgid ""
+"Highly recommended for faster import when taking advantage of the "
+"duplication recognition. Also, having the PC filenames allows writing "
+"changed ID3 tags to disk, and even to reconstruct your iPod's contents in "
+"case of file system corruption (change the \"transferred=\" entries in your "
+"backuped database)."
+msgstr ""
+"È altamente consigliato per importazioni più veloci se si usa il "
+"riconoscimento dei duplicati. Inoltre, avere il nome del file sul PC "
+"permette di scrivere sul disco le etichette ID3 cambiate e perfino di "
+"ricostruire il contenuto dell'iPod nel caso di corruzione del filesystem "
+"(cambiare le voci «transferred=» nel backup del database)."
+
+#: ../data/gtkpod.glade.h:178 ../src/context_menus.c:685
+#: ../src/context_menus.c:703 ../src/context_menus.c:820
+msgid "I'm sure"
+msgstr "Sono sicuro"
+
+#: ../data/gtkpod.glade.h:179
+msgid ""
+"If available, the local copy of the track is referenced in the playlist. "
+"Otherwise the file on the iPod is used."
+msgstr ""
+"Se disponibile, la playlist fa riferimento alla copia locale della traccia. "
+"Altrimenti è usato il file sul iPod."
+
+#: ../data/gtkpod.glade.h:180
+msgid "If both options are selected, embedded APIC data takes precedence."
+msgstr ""
+"Se entrambe le opzioni sono selezionate, i dati APIC incorporati hanno la "
+"precedenza."
+
+#: ../data/gtkpod.glade.h:181
+msgid ""
+"If checked, sorting will be case sensitive. Please note that case sensitive "
+"sorting will not work well with most charsets."
+msgstr ""
+"Se selezionata, l'ordinamento sarà sensibile alle maiuscole. Nota: "
+"l'ordinamento sensibile alle maiuscole non funziona bene con la maggior "
+"parte delle codifiche."
+
+#: ../data/gtkpod.glade.h:182
+msgid ""
+"If the filename (full path) of an existing track matches that of a track to "
+"be added, this option allows you to update the information about the "
+"existing track rather than just skipping the track altogether. No update "
+"will take place if the file hasn't changed and you have selected the 'Don't "
+"allow file duplication' option above."
+msgstr ""
+"Se il nome del file (percorso completo) di una traccia esistente corrisponde "
+"a quella di una traccia che deve essere aggiunta, questa opzione permette di "
+"aggiornare le informazioni della traccia esistente piuttosto che ignorare "
+"del tutto la traccia. Nessun aggiornamento avrà luogo se il file non è "
+"cambiato e l'opzione precedente «Non permettere i file duplicati» è "
+"selezionata."
+
+#: ../data/gtkpod.glade.h:183
+msgid "If you check this, gtkpod will descend into subdirectories recursively."
+msgstr "Selezionando questo, gtkpod discenderà nelle directory ricorsivamente."
+
+#: ../data/gtkpod.glade.h:184
+msgid ""
+"If you check this, information (cover art and meta information) changed for "
+"this track will be copied to all other selected tracks as well. Use with "
+"care."
+msgstr ""
+"Se si seleziona questa casella, le informazioni (copertina e meta "
+"informazioni) cambiate per questa traccia saranno copiate anche in tutte le "
+"altre tracce selezionate. Usare con cautela."
+
+#: ../data/gtkpod.glade.h:185
+msgid ""
+"If you don't select the master playlist automatically, the initial database "
+"import is much faster because the display dosn't have to be updated."
+msgstr ""
+"Se non si seleziona automaticamente la playlist principale, l'importazione "
+"iniziale del database sarà molto più veloce perché non verrà aggiornata "
+"l'interfaccia."
+
+#: ../data/gtkpod.glade.h:186
+msgid ""
+"If you select several tracks in the track list and edit a tag of the first "
+"track, the tags in the other tracks are updated as well."
+msgstr ""
+"Se si selezionano diverse tracce nella lista delle tracce e si modifica "
+"un'etichetta della prima traccia, saranno aggiornate anche le etichette "
+"delle altre tracce."
+
+#: ../data/gtkpod.glade.h:187
+msgid "Ignore these words when at the beginning of the following fields:"
+msgstr "Ignorare queste parole quando sono all'inizio dei campi seguenti:"
+
+#: ../data/gtkpod.glade.h:188
+msgid ""
+"In order to save the displayed track order to the iPod choose 'Save "
+"Displayed Track Order' from the 'Edit' menu or select 'Auto Store' below."
+msgstr ""
+"Per memorizzare sull'iPod l'ordine delle tracce come visualizzato scegliere "
+"«Salva l'ordine visualizzato delle tracce» dal menù «Modifica» o selezionare "
+"«Salvataggio automatico» sotto."
+
+#: ../data/gtkpod.glade.h:189
+msgid "Initialize iPod"
+msgstr "Inizializza l'iPod"
+
+#: ../data/gtkpod.glade.h:190
+msgid ""
+"Insert before\n"
+"Insert after"
+msgstr ""
+"Inserisci prima\n"
+"Inserisci dopo"
+
+#: ../data/gtkpod.glade.h:192
+msgid "Keeps all compilation CDs grouped together in the artists sort tab."
+msgstr ""
+"Mantiene raggruppati tutti i CD di compilation nelle schede di ordinamento "
+"degli artisti."
+
+#: ../data/gtkpod.glade.h:193
+msgid "Live _updating"
+msgstr "Aggiornamento contin_uo"
+
+#: ../data/gtkpod.glade.h:194
+msgid "Load iPod(s)"
+msgstr "Leggi gli iPod"
+
+#: ../data/gtkpod.glade.h:195
+msgid "Lower Margin"
+msgstr "Limite inferiore"
+
+#: ../data/gtkpod.glade.h:196
+msgid "M4A with :"
+msgstr "M4A con :"
+
+#: ../data/gtkpod.glade.h:197
+msgid "MP3 with :"
+msgstr "MP3 con :"
+
+#: ../data/gtkpod.glade.h:198
+msgid "Match al_l of the following"
+msgstr "Verifica _tutti i seguenti"
+
+#: ../data/gtkpod.glade.h:199
+msgid "Match an_y of the following"
+msgstr "Verifica _uno qualsiasi dei seguenti"
+
+#: ../data/gtkpod.glade.h:200
+msgid "Match only _checked tracks"
+msgstr "Confronta solo le tracce _selezionate"
+
+#: ../data/gtkpod.glade.h:201
+msgid "Maximum number of background threads:"
+msgstr "Numero massimo di thread sullo sfondo:"
+
+#: ../data/gtkpod.glade.h:202
+msgid "Maximum size of cache directory (in GB):"
+msgstr "Dimensione massima della directory della cache (in GB):"
+
+#: ../data/gtkpod.glade.h:203
+msgid "Model:"
+msgstr "Modello:"
+
+#: ../data/gtkpod.glade.h:204 ../src/display_tracks.c:2100
+msgid "Modified"
+msgstr "Modificato"
+
+#: ../data/gtkpod.glade.h:205
+msgid "Most Recently Played Tracks"
+msgstr "Tracce riprodotte più recentemente"
+
+#: ../data/gtkpod.glade.h:206
+msgid "Move selected attributes to the displayed list"
+msgstr "Sposta gli attributi selezionati nella lista di quelli visualizzati"
+
+#: ../data/gtkpod.glade.h:207
+msgid "Music Root:"
+msgstr "Radice della musica:"
+
+#: ../data/gtkpod.glade.h:208
+msgid ""
+"Music files can have images embedded in the APIC tag. Currently this is only "
+"supported for MP3 files."
+msgstr ""
+"I file musicali possono avere delle immagini incorporate nell'etichetta "
+"APIC. Attualmente questo è supportato solo per i file MP3."
+
+#: ../data/gtkpod.glade.h:209
+msgid "Never show this dialogue again"
+msgstr "Non mostrare più questa finestra di dialogo"
+
+#: ../data/gtkpod.glade.h:210 ../src/display_spl.c:1719
+#: ../src/misc_playlist.c:66 ../src/misc_playlist.c:68
+#: ../src/misc_playlist.c:93 ../src/misc_playlist.c:95
+#: ../src/misc_playlist.c:428 ../src/misc_playlist.c:430
+msgid "New Playlist"
+msgstr "Nuova playlist"
+
+#: ../data/gtkpod.glade.h:211
+msgid "No lower margin"
+msgstr "Nessun limite inferiore"
+
+#: ../data/gtkpod.glade.h:212
+msgid "No upper margin"
+msgstr "Nessun limite superiore"
+
+#: ../data/gtkpod.glade.h:213
+msgid "Non-transferred tracks"
+msgstr "Tracce non trasferite"
+
+#: ../data/gtkpod.glade.h:214
+msgid "None"
+msgstr "Nessuno"
+
+#: ../data/gtkpod.glade.h:215
+msgid ""
+"Normally the charset specified when first importing the track will be used "
+"for the filename. If you set this option you can set a different charset "
+"with the charset selector (Preferences/'Adding/Updating/Syncing'). Note: the "
+"charset info is stored in the extended information file (see "
+"Preferences/'Writing of the iTunesDB'). Tracks imported before V0.51 will "
+"have no charset stored. Instead the charset specified will be used."
+msgstr ""
+"Normalmente la codifica specificata la prima volta che si importa una "
+"traccia viene utilizzata per il nome del file. Se si sceglie questa opzione "
+"si può impostare una codifica differente con il selettore delle codifiche "
+"(Preferenze/«Aggiungi/Aggiorna/Sincronizza»). Nota: la codifica è "
+"memorizzata nel file con le informazioni estese (vedere "
+"Preferenze/«Scrittura di iTunesDB»). Le tracce importate prima della V0.51 "
+"non avranno alcuna codifica memorizzata. Verrà usata invece la codifica "
+"specificata."
+
+#: ../data/gtkpod.glade.h:216
+msgid ""
+"Normally the charset specified when first importing the track will be used "
+"to update the track information. If you have chosen a wrong charset when "
+"first importing a track and want to correct it using the 'Update Track' "
+"function, you must check this option. Note: the charset info is stored in "
+"the extended information file (see 'Writing of iTunesDB' below) and tracks "
+"imported before V0.51 will have no charset stored. Instead the charset "
+"specified above will be used then."
+msgstr ""
+"Normalmente la codifica specificata al momento di importare la traccia verrà "
+"usata per aggiornare le informazioni sulla traccia. Se si è scelta la "
+"codifica sbagliata al momento della prima importazione di una traccia e si "
+"vuole correggerla usando la funzione «Aggiorna traccia», si deve selezionare "
+"questa opzione. Nota: le informazioni sulla codifica sono memorizzate nel "
+"file con le informazioni estese (vedere «Scrittura di iTunesDB» sotto) e le "
+"tracce importate prima della V0.51 non avranno una codifica memorizzata. "
+"Verrà usata invece la codifica specificata qui sopra."
+
+#: ../data/gtkpod.glade.h:217
+msgid ""
+"Normally the charset specified when first importing the track will be used "
+"to write the tags. If you have chosen a wrong charset when first importing a "
+"track, you should select this option along with the correct charset.  Note: "
+"uses the extended information file to store the charset information (see "
+"'Writing of the iTunesDB' on the 'Input/Output' page) and tracks imported "
+"before V0.51 will have no charset stored -- the charset specified on the "
+"'Input/Output' page will be used."
+msgstr ""
+"Normalmente la codifica specificata al momento di importare la traccia verrà "
+"usata per scrivere l'etichetta. Se si è scelta la codifica sbagliata al "
+"momento della prima importazione, si deve selezionare questa opzione insieme "
+"alla codifica giusta. Nota: le informazioni sulla codifica sono memorizzate "
+"nel file con le informazioni estese (vedere «Scrittura di iTunesDB» nella "
+"pagina «Input/Output») e le tracce importate prima della V0.51 non avranno "
+"una codifica memorizzata, verrà usata la codifica specificata nella nella "
+"pagina «Input/Output»."
+
+#: ../data/gtkpod.glade.h:218
+msgid ""
+"Normally, if a track is no longer present in the sync directory, it will be "
+"removed from the playlist, but not from the iPod or local repository.\n"
+"If this option is checked, tracks will be completely removed from the iPod "
+"or local repository, unless the track is a member of other playlists as "
+"well.\n"
+"NOTE: if you sync with the master playlist, you must check this option if "
+"you want tracks to be removed, because removing from the master playlist "
+"means removing from the iPod."
+msgstr ""
+"Normalmente, se una traccia non è più presente nella directory di "
+"sincronizzazione, verrà rimossa dalla playlist, ma non dall'archivio "
+"dell'iPod o da quello locale.\n"
+"Se questa opzione è selezionata, le tracce saranno rimosse completamente "
+"dall'archivio dell'iPod o da quello locale, a meno che la traccia non faccia "
+"parte anche di altre playlist.\n"
+"NOTA: se si sincronizza con la playlist principale, si deve selezionare "
+"questa opzione se si vuole che le tracce siano rimosse perché rimuovere "
+"dalla playlist principale significa rimuovere dall'iPod."
+
+#: ../data/gtkpod.glade.h:221
+msgid "Notes sync command:"
+msgstr "Comando per sincronizzare le note:"
+
+#: ../data/gtkpod.glade.h:222
+msgid "Number of playlists"
+msgstr "Numero di playlist"
+
+#: ../data/gtkpod.glade.h:223
+msgid "Number of tracks"
+msgstr "Numero di tracce"
+
+#: ../data/gtkpod.glade.h:224
+msgid "Number of tracks in generated playlists:"
+msgstr "Numero di tracce nelle playlist generate:"
+
+#: ../data/gtkpod.glade.h:225
+msgid ""
+"Number of tracks in the generated playlists 'Most Often Listened', 'Best "
+"Rated' and 'Most Recently Played'. Choose '0' for 'no limit'."
+msgstr ""
+"Numero delle tracce nelle playlist generate «Ascoltate più spesso», «Voti "
+"migliori» e «Riprodotte più recentemente». Scegliere «0» per «nessun limite»."
+
+#: ../data/gtkpod.glade.h:226
+msgid "Ogg with :"
+msgstr "Ogg con :"
+
+#: ../data/gtkpod.glade.h:227
+msgid "On startup automatically sync with playlist directories"
+msgstr "All'avvio sincronizza automaticamente con le directory delle playlist"
+
+#: ../data/gtkpod.glade.h:228
+msgid "On startup automatically sync with the following directory"
+msgstr "All'avvio sincronizza automaticamente con la seguente directory"
+
+#: ../data/gtkpod.glade.h:229
+msgid "On startup automatically update (Live Playlist)"
+msgstr "All'avvio aggiorna automaticamente (Live Playlist)"
+
+#: ../data/gtkpod.glade.h:230
+msgid "One for each Album"
+msgstr "Una per ogni album"
+
+#: ../data/gtkpod.glade.h:231
+msgid "One for each Artist"
+msgstr "Una per ogni artista"
+
+#: ../data/gtkpod.glade.h:232
+msgid "One for each Composer"
+msgstr "Una per ogni compositore"
+
+#: ../data/gtkpod.glade.h:233
+msgid "One for each Genre"
+msgstr "Una per ogni genere"
+
+#: ../data/gtkpod.glade.h:234
+msgid "One for each Rating"
+msgstr "Una per ogni voto"
+
+#: ../data/gtkpod.glade.h:235
+msgid "One for each Year"
+msgstr "Una per ogni anno"
+
+#: ../data/gtkpod.glade.h:236
+msgid "Overwrite tags that are already set"
+msgstr "Sovrascrivi le etichette che sono già impostate"
+
+#: ../data/gtkpod.glade.h:237
+msgid "Password:"
+msgstr "Password:"
+
+#: ../data/gtkpod.glade.h:238
+msgid "Path:"
+msgstr "Percorso:"
+
+#: ../data/gtkpod.glade.h:239
+msgid "Photo Window"
+msgstr "Finestra delle foto"
+
+#: ../data/gtkpod.glade.h:240 ../src/display_spl.c:94
+msgid "Play time"
+msgstr "Durata"
+
+#: ../data/gtkpod.glade.h:241 ../src/display_spl.c:98
+#: ../src/misc_conversion.c:77
+msgid "Playcount"
+msgstr "Contatore riproduzioni"
+
+#: ../data/gtkpod.glade.h:242 ../src/display_tracks.c:2097
+msgid "Played"
+msgstr "Riprodotto"
+
+#: ../data/gtkpod.glade.h:243
+msgid "Playlist name:"
+msgstr "Nome della playlist:"
+
+#: ../data/gtkpod.glade.h:244
+msgid "Playlist type:"
+msgstr "Tipo di playlist:"
+
+#: ../data/gtkpod.glade.h:245 ../src/display_playlists.c:2258
+msgid "Playlists"
+msgstr "Playlist"
+
+#: ../data/gtkpod.glade.h:246
+msgid "Please refer to the notice below."
+msgstr "Consultare l'avviso seguente."
+
+#: ../data/gtkpod.glade.h:247
+msgid "Please specify a time interval"
+msgstr "Specificare un intervallo di tempo"
+
+#: ../data/gtkpod.glade.h:248
+msgid "Preferences"
+msgstr "Preferenze"
+
+#: ../data/gtkpod.glade.h:249
+msgid "Progress Information"
+msgstr "Informazioni sull'avanzamento"
+
+#: ../data/gtkpod.glade.h:250
+msgid "R_ename Album"
+msgstr "R_inomina album"
+
+#: ../data/gtkpod.glade.h:251
+msgid "Random Playlist from Displayed Tracks"
+msgstr "Playlist casuale dalle tracce mostrate"
+
+#: ../data/gtkpod.glade.h:252
+msgid "Randomize Current Playlist"
+msgstr "Rendi casuale la playlist corrente"
+
+#: ../data/gtkpod.glade.h:253 ../src/display_spl.c:101
+#: ../src/misc_conversion.c:78
+msgid "Rating"
+msgstr "Voto"
+
+#: ../data/gtkpod.glade.h:254
+msgid "Read coverart from embedded APIC data"
+msgstr "Leggi la copertina dai dati APIC incorporati"
+
+#: ../data/gtkpod.glade.h:255
+msgid "Read tags from file contents (e.g. ID3 tags in MP3 files)"
+msgstr ""
+"Leggi le etichette dal contenuto del file (es. etichette ID3 nei file MP3)"
+
+#: ../data/gtkpod.glade.h:256
+msgid "Remove selected attributes from the displayed list"
+msgstr "Rimuove gli attributi selezionati dalla lista di quelli visualizzati"
+
+#: ../data/gtkpod.glade.h:257
+msgid "Repository Options"
+msgstr "Opzioni dell'archivio"
+
+#: ../data/gtkpod.glade.h:258
+msgid "Repository name:"
+msgstr "Nome dell'archivio:"
+
+#: ../data/gtkpod.glade.h:259
+msgid "Repository type:"
+msgstr "Tipo di archivio:"
+
+#: ../data/gtkpod.glade.h:260
+msgid "Root directory of mserv database (trackinfo root)."
+msgstr "Directory radice del database mserv (radice di trackinfo)."
+
+#: ../data/gtkpod.glade.h:261
+msgid "Rules"
+msgstr "Regole"
+
+#: ../data/gtkpod.glade.h:262 ../src/context_menus.c:804
+msgid "Save Changes"
+msgstr "Salva le modifiche"
+
+#: ../data/gtkpod.glade.h:263
+msgid "Scrobble Tracks?"
+msgstr "Invia le tracce a Audioscrobbler?"
+
+#: ../data/gtkpod.glade.h:264
+msgid "Select '-1' for no upper limit."
+msgstr "Scegliere «-1» per nessun limite superiore."
+
+#: ../data/gtkpod.glade.h:265
+msgid "Select '0' for no lower limit."
+msgstr "Scegliere «0» per nessun limite inferiore."
+
+#: ../data/gtkpod.glade.h:266
+msgid ""
+"Selected\n"
+"Playlist"
+msgstr ""
+"Playlist\n"
+"selezionata"
+
+#: ../data/gtkpod.glade.h:268
+msgid ""
+"Selected\n"
+"Tracks"
+msgstr ""
+"Tracce\n"
+"selezionate"
+
+#: ../data/gtkpod.glade.h:270
+msgid "Selected Filter Tab Entry from Database"
+msgstr "Voce selezionata nella scheda di filtro dal database"
+
+#: ../data/gtkpod.glade.h:271
+msgid "Selected Filter Tab Entry from Hard Disk"
+msgstr "Voce selezionata nella scheda di filtro dal disco fisso"
+
+#: ../data/gtkpod.glade.h:272
+msgid "Selected Filter Tab Entry from Playlist"
+msgstr "Voce selezionata nella scheda di filtro dalla playlist"
+
+#: ../data/gtkpod.glade.h:273
+msgid "Selected Filter Tab Entry from iPod"
+msgstr "Voce selezionata nella scheda di filtro dall'iPod"
+
+#: ../data/gtkpod.glade.h:274
+msgid "Selected Playlist Including Tracks from Database"
+msgstr "Playlist selezionata comprese tracce dal database"
+
+#: ../data/gtkpod.glade.h:275
+msgid "Selected Playlist Including Tracks from Hard Disk"
+msgstr "Playlist selezionata comprese tracce dal disco fisso"
+
+#: ../data/gtkpod.glade.h:276
+msgid "Selected Playlist Including Tracks from iPod"
+msgstr "Playlist selezionata comprese tracce dall'iPod"
+
+#: ../data/gtkpod.glade.h:277
+msgid "Selected Tab _Entry"
+msgstr "Voc_e nella scheda selezionata"
+
+#: ../data/gtkpod.glade.h:278
+msgid "Selected Tracks from Database"
+msgstr "Tracce selezionate dal database"
+
+#: ../data/gtkpod.glade.h:279
+msgid "Selected Tracks from Hard Disk"
+msgstr "Tracce selezionate dal disco fisso"
+
+#: ../data/gtkpod.glade.h:280
+msgid "Selected Tracks from Playlist"
+msgstr "Tracce selezionate dalla playlist"
+
+#: ../data/gtkpod.glade.h:281
+msgid "Selected Tracks from iPod"
+msgstr "Tracce selezionate dall'iPod"
+
+#: ../data/gtkpod.glade.h:282
+msgid "Selected _Playlist"
+msgstr "_Playlist selezionata"
+
+#: ../data/gtkpod.glade.h:283
+msgid "Selected _Tracks"
+msgstr "_Tracce selezionate"
+
+#: ../data/gtkpod.glade.h:284
+msgid "Selected playlist"
+msgstr "Playlist selezionata"
+
+#: ../data/gtkpod.glade.h:285
+msgid "Semicolon separated list of file exclusion masks, e.g. '*.mp3'"
+msgstr ""
+"Lista separata da punto e virgola di maschere per escludere i file, es. «*."
+"mp3»"
+
+#: ../data/gtkpod.glade.h:286
+msgid "Set Cover Art from _File"
+msgstr "Imposta la copertina da un _file"
+
+#: ../data/gtkpod.glade.h:287
+msgid "Set mountpoint or edit repository options"
+msgstr "Imposta il punto di mount o modifica le opzioni dell'archivio"
+
+#: ../data/gtkpod.glade.h:288
+msgid "Set options for Calendar/Contacts/Notes"
+msgstr "Imposta le opzioni per Calendario/Contatti/Note"
+
+#: ../data/gtkpod.glade.h:289
+msgid ""
+"Set this to 'aacgain -q -k' to use the 'Normalize volume' functionality in "
+"the Tools Menu. If this is set, missing normalization data for .m4a and .m4b "
+"files will be calculated and written to your music file using this command."
+msgstr ""
+"Impostare a «aacgain -q -k» per usare la funzionalità «Normalizza volume» "
+"nel menù «Strumenti». Se impostato, i dati mancanti per la normalizzazione "
+"dei file .m4a e .m4b saranno calcolati e scritti nel file musicale usando "
+"questo comando."
+
+#: ../data/gtkpod.glade.h:290
+msgid ""
+"Set this to 'mp3gain -q -k' to use the 'Normalize volume' functionality in "
+"the Tools Menu. If this is set, missing normalization data for mp3 files "
+"will be calculated and written to your mp3 file using this command."
+msgstr ""
+"Impostare a «mp3gain -q -k» per usare la funzionalità «Normalizza volume» "
+"nel menù «Strumenti». Se impostato, i dati mancanti per la normalizzazione "
+"dei file mp3 saranno calcolati e scritti nel file mp3 usando questo comando."
+
+#: ../data/gtkpod.glade.h:291
+msgid "Set this to your last.fm password"
+msgstr "Impostare la propria password su last.fm"
+
+#: ../data/gtkpod.glade.h:292
+msgid "Set this to your last.fm username"
+msgstr "Impostare il proprio nome utente su last.fm"
+
+#: ../data/gtkpod.glade.h:293
+msgid ""
+"Set to 0 to effectively disable caching (a maximum of one track will be "
+"cached at a time)."
+msgstr ""
+"Impostare a 0 per disabilitare la cache (al massimo una traccia per volta "
+"sarà mantenuta nella cache)."
+
+#: ../data/gtkpod.glade.h:294
+msgid ""
+"Set to 0 to use as many background threads as CPUs are available on your "
+"system."
+msgstr ""
+"Impostare a 0 per usare tanti thread sullo sfondo quante sono le CPU "
+"disponibili nel sistema."
+
+#: ../data/gtkpod.glade.h:295
+msgid "Show information about problems when accessing mserv"
+msgstr "Mostra informazioni sui problemi nell'accesso a mserv"
+
+#: ../data/gtkpod.glade.h:296
+msgid "Show summary of sync result"
+msgstr "Mostra un riassunto dei risultati della sincronizzazione"
+
+#: ../data/gtkpod.glade.h:297 ../src/misc_playlist.c:96
+#: ../src/repository.c:1356
+msgid "Smart Playlist"
+msgstr "Playlist intelligente"
+
+#: ../data/gtkpod.glade.h:298
+msgid "Sort tracks according to: "
+msgstr "Ordina le tracce secondo: "
+
+#: ../data/gtkpod.glade.h:299
+msgid "Sorting Options"
+msgstr "Opzioni di ordinamento"
+
+#: ../data/gtkpod.glade.h:300
+msgid "Sorting case sensitive"
+msgstr "Ordinamento sensibile alle maiuscole"
+
+#: ../data/gtkpod.glade.h:301
+msgid "Sorttab: "
+msgstr "Scheda di ordinamento: "
+
+#: ../data/gtkpod.glade.h:302
+msgid "Sorttabs"
+msgstr "Schede di ordinamento"
+
+#: ../data/gtkpod.glade.h:303
+msgid "Source:"
+msgstr "Sorgente:"
+
+#: ../data/gtkpod.glade.h:305
+#, no-c-format
+msgid ""
+"Specify exact path including command line options. '%i' will be replaced "
+"with the mount point of the iPod."
+msgstr ""
+"Specificare il percorso esatto incluse le opzioni della riga di comando. «%"
+"i» verrà sostituito con il punto di mount dell'iPod."
+
+#: ../data/gtkpod.glade.h:306
+msgid "Specify interval"
+msgstr "Specificare l'intervallo"
+
+#: ../data/gtkpod.glade.h:307
+msgid "Start display automatically"
+msgstr "Mostra automaticamente"
+
+#: ../data/gtkpod.glade.h:308
+msgid "Synchronise Contacts, Calendar and Notes"
+msgstr "Sincronizza contatti, calendario e note"
+
+#: ../data/gtkpod.glade.h:309
+msgid "Synchronize All"
+msgstr "Sincronizza tutto"
+
+#: ../data/gtkpod.glade.h:310
+msgid "Synchronize Calendar"
+msgstr "Sincronizza il calendario"
+
+#: ../data/gtkpod.glade.h:311
+msgid "Synchronize Contacts"
+msgstr "Sincronizza i contatti"
+
+#: ../data/gtkpod.glade.h:312
+msgid "Synchronize Notes"
+msgstr "Sincronizza le note"
+
+#: ../data/gtkpod.glade.h:313
+msgid "Template for info field: "
+msgstr "Modello per il campo delle informazioni: "
+
+#: ../data/gtkpod.glade.h:314
+msgid ""
+"The local copy of the track is referenced in the playlist. If the track is "
+"not available locally, an error message is displayed."
+msgstr ""
+"La playlist fa riferimento alla copia locale della traccia. Se la traccia "
+"non è disponibile localmente, verrà mostrato un messaggio di errore."
+
+#: ../data/gtkpod.glade.h:315
+msgid ""
+"The output of the background conversion scripts is copied below. Each page "
+"of the notebook corresponds to one background thread."
+msgstr ""
+"L'output degli script di conversione sullo sfondo è copiato sotto. Ogni "
+"linguetta corrisponde ad un thread sullo sfondo."
+
+#: ../data/gtkpod.glade.h:316
+msgid ""
+"The tags are written to the files on your harddrive and on the iPod (if "
+"available)."
+msgstr ""
+"Le etichette vengono scritte sui file nel disco fisso e sull'iPod (se "
+"disponibile)."
+
+#: ../data/gtkpod.glade.h:317
+msgid "The track on the iPod is referenced in the playlist file."
+msgstr "Il file della playlist fa riferimento alla traccia sull'iPod."
+
+#: ../data/gtkpod.glade.h:318
+msgid "This is the same option as in 'Edit/Delete Confirmation'"
+msgstr ""
+"Questa è la stessa opzione che si trova in «Modifica/Conferma l'eliminazione»"
+
+#: ../data/gtkpod.glade.h:319
+msgid ""
+"This is the way to go, but maybe not all programs support it yet. ID3v2.4 "
+"uses unicode to store the tags, so you won't have to worry about charsets "
+"any more. gtkpod will use UTF8 encoding as this will not increase the size "
+"of pure ASCII tags. ID3v2.2/4 tags will also be written if they are already "
+"present in the file to write to."
+msgstr ""
+"Questa è la strada da seguire, ma non tutti i programmi probabilmente la "
+"supportano già. ID3v2.4 usa unicode per memorizzare le etichette, quindi non "
+"c'è più  bisogno di preoccuparsi delle codifiche. gtkpod userà la codifica "
+"UTF8 perché questa non incrementerà la dimensione delle etichette ASCII "
+"pure. Le etichette ID3v2.2/4 verranno scritte se sono già presenti sul file "
+"su cui si va a scrivere."
+
+#: ../data/gtkpod.glade.h:320
+msgid "This option will be re-activated when you upgrade gtkpod."
+msgstr "Questa opzione verrà riattivata dopo aver aggiornato gtkpod."
+
+#: ../data/gtkpod.glade.h:321
+msgid "Time:"
+msgstr "Ora:"
+
+#: ../data/gtkpod.glade.h:322 ../src/display_sorttabs.c:2991
+#: ../src/display_spl.c:83 ../src/misc_conversion.c:62
+msgid "Title"
+msgstr "Titolo"
+
+#: ../data/gtkpod.glade.h:323
+msgid ""
+"Total\n"
+"(iPod)"
+msgstr ""
+"Totale\n"
+"(iPod)"
+
+#: ../data/gtkpod.glade.h:325
+msgid ""
+"Total\n"
+"(local)"
+msgstr ""
+"Totale\n"
+"(locale)"
+
+#: ../data/gtkpod.glade.h:327
+msgid "Tracks"
+msgstr "Tracce"
+
+#: ../data/gtkpod.glade.h:328
+msgid "Tracks Most Often Listened To"
+msgstr "Tracce ascoltate più spesso"
+
+#: ../data/gtkpod.glade.h:329
+msgid ""
+"Tracks can be transferred in the background as soon as they are added to an "
+"iPod repository. Otherwise they will be transferred when ejecting the "
+"contents of the iPod completely unchanged until then."
+msgstr ""
+"Le tracce possono essere trasferite sullo sfondo non appena sono aggiunte "
+"all'archivio di un iPod. Altrimenti saranno trasferite al momento "
+"dell'espulsione; il contenuto dell'iPod è completamente intatto fino a quel "
+"momento."
+
+#: ../data/gtkpod.glade.h:330
+msgid "Tracks in Selected Tab _Entry"
+msgstr "Tracce nella scheda s_elezionata"
+
+#: ../data/gtkpod.glade.h:331
+msgid "Tracks in Selected _Playlist"
+msgstr "Tracce nella _playlist selezionata"
+
+#: ../data/gtkpod.glade.h:332
+msgid "Transfer tracks to the iPod in the background"
+msgstr "Trasferisci le tracce all'iPod sullo sfondo"
+
+#: ../data/gtkpod.glade.h:333
+msgid "Translators"
+msgstr "Traduttori"
+
+#: ../data/gtkpod.glade.h:334
+msgid ""
+"Try to load contents of all connected iPods. For each iPod a separate "
+"repository must be set up."
+msgstr ""
+"Tenta di caricare i contenuti di tutti gli iPod connessi. Per ogni iPod deve "
+"essere impostato un archivio separato."
+
+#: ../data/gtkpod.glade.h:335
+msgid "Undo _Track"
+msgstr "Annulla _traccia"
+
+#: ../data/gtkpod.glade.h:336
+msgid "Update _mserv Data from File"
+msgstr "Aggiorna i dati _mserv da file"
+
+#: ../data/gtkpod.glade.h:337
+msgid "Update/Sync all playlists now"
+msgstr "Aggiorna/sincronizza tutte le playlist ora"
+
+#: ../data/gtkpod.glade.h:338
+msgid "Update/Sync playlist now"
+msgstr "Aggiorna/sincronizza la playlist ora"
+
+#: ../data/gtkpod.glade.h:339
+msgid "Upper margin"
+msgstr "Limite superiore"
+
+#: ../data/gtkpod.glade.h:340
+msgid "Use 'Multi-Edit' also for title field"
+msgstr "Usa «Multi-edit» anche per il campo titolo"
+
+#: ../data/gtkpod.glade.h:341
+msgid "Use 'Multi-Edit' for tracks selections"
+msgstr "Usa «Multi-Edit» per la selezione delle tracce"
+
+#: ../data/gtkpod.glade.h:342
+msgid "Use <i>&lt;Album&gt;.jpg</i> in the parent directory"
+msgstr "Usa <i>&lt;Album&gt;.jpg</i> nella directory superiore"
+
+#: ../data/gtkpod.glade.h:343
+msgid "Use <i>&lt;Album&gt;.jpg</i>, <i>&lt;Album&gt;.png</i>..."
+msgstr "Usa <i>&lt;Album&gt;.jpg</i>, <i>&lt;Album&gt;.png</i>..."
+
+#: ../data/gtkpod.glade.h:344
+msgid "Use <i>folder.jpg</i> as cover art."
+msgstr "Usa <i>folder.jpg</i> come copertina."
+
+#: ../data/gtkpod.glade.h:345
+msgid "Use <i>folder.jpg</i>, <i>folder.png</i>..."
+msgstr "Usa <i>folder.jpg</i>, <i>folder.png</i>..."
+
+#: ../data/gtkpod.glade.h:346
+msgid "Use mserv database to fill additional information"
+msgstr "Usa il database mserv per aggiungere ulteriori informazioni"
+
+#: ../data/gtkpod.glade.h:347
+msgid ""
+"Use selected charset (Preferences/'Adding/Updating/ Syncing')\n"
+"for this filename."
+msgstr ""
+"Usare la codifica selezionata (Preferenze/«Aggiungi/Aggiorna/ Sincronizza»)\n"
+" per questo nome di file."
+
+#: ../data/gtkpod.glade.h:349
+msgid ""
+"Use selected encoding (on the 'General' page)\n"
+"when writing tags"
+msgstr ""
+"Usa la codifica selezionata (nella pagina «Generale»)\n"
+"per la scrittura delle etichette"
+
+#: ../data/gtkpod.glade.h:351
+msgid "Use selected encoding also when updating or syncing tracks"
+msgstr ""
+"Usa la codifica selezionata anche durante l'aggiornamento e la "
+"sincronizzazione delle tracce"
+
+#: ../data/gtkpod.glade.h:352
+msgid "Use this template to parse filename for tag information:"
+msgstr ""
+"Usa questa maschera per interpretare il nome del file per informazioni sulle "
+"etichette:"
+
+#: ../data/gtkpod.glade.h:353
+msgid "Username to be used for mserv database lookup."
+msgstr "Nome utente da utilizzare per la consultazione del database mserv."
+
+#: ../data/gtkpod.glade.h:354
+msgid "Username:"
+msgstr "Nome utente:"
+
+#: ../data/gtkpod.glade.h:355
+msgid ""
+"Usually you don't want to set the title of several tracks to the same text. "
+"This option might avoid unwanted results (especially since there is no "
+"'undo' yet)."
+msgstr ""
+"Di solito non è desiderabile usare lo stesso titolo per diverse tracce. "
+"Questa opzione può evitare effetti non voluti (specialmente vista l'assenza "
+"della opzione «Annulla»)."
+
+#: ../data/gtkpod.glade.h:356
+msgid "View Full Size"
+msgstr "Mostra a piena grandezza"
+
+#: ../data/gtkpod.glade.h:357
+msgid "WAV with :"
+msgstr "WAV con :"
+
+#: ../data/gtkpod.glade.h:358
+msgid ""
+"When adding dirs/files, update information of\n"
+"existing tracks with identical filenames"
+msgstr ""
+"Aggiorna le informazioni sulle tracce esistenti con\n"
+"nomi identici durante l'aggiunta di directory e file"
+
+#: ../data/gtkpod.glade.h:360
+msgid ""
+"When copying from iPod no check is performed on whether the destination file "
+"exists. Enabling this option will make gtkpod check whether the length of "
+"the destination file is the same as the file in the iPod. If so the file is "
+"skipped, allowing a quick sync of the iPod's contents."
+msgstr ""
+"Durante la copia dall'iPod non viene controllato se il file di destinazione "
+"esiste. Selezionare questa opzione farà in modo che gtkpod controlli se la "
+"dimensione del file di destinazione è la stessa del file sull'iPod. Se fosse "
+"così il file verrà saltato, permettendo una veloce sincronizzazione del "
+"contenuto dell'iPod."
+
+#: ../data/gtkpod.glade.h:361
+msgid "When syncing playlists"
+msgstr "Durante la sincronizzazione delle playlist"
+
+#: ../data/gtkpod.glade.h:362
+msgid ""
+"Will show a list of tracks removed and a list of tracks newly added or "
+"updated."
+msgstr ""
+"Mostra una lista delle tracce rimosse e una lista di tracce nuove aggiunte o "
+"aggiornate."
+
+#: ../data/gtkpod.glade.h:363
+msgid "Write ID3 tags to disk when modified in gtkpod"
+msgstr "Scrivi le etichette ID3 sul disco quando vengono modificate in gtkpod"
+
+#: ../data/gtkpod.glade.h:364
+msgid "Write all changes made to the disk and the iPod(s)."
+msgstr "Scrive sul disco e sugli iPod tutte le modifiche fatte."
+
+#: ../data/gtkpod.glade.h:365
+msgid ""
+"Write extended information (PC filenames, SHA1 hashes,\n"
+"encoding...). Recommended."
+msgstr ""
+"Scrivi informazioni estese (nome del file sul PC,\n"
+" hash SHA1, codifica). Consigliato."
+
+#: ../data/gtkpod.glade.h:367
+msgid ""
+"You can also use the table headers, but this allows you to sort according to "
+"a column that is not displayed."
+msgstr ""
+"Si possono usare le intestazioni della tabella, ma questo metodo permette "
+"l'ordinamento secondo una colonna non visualizzata."
+
+#: ../data/gtkpod.glade.h:368
+msgid "_About gtkpod"
+msgstr "Informazioni _su gtkpod"
+
+#: ../data/gtkpod.glade.h:369
+msgid "_Add Album"
+msgstr "_Aggiungi album"
+
+#: ../data/gtkpod.glade.h:370
+msgid "_Add Image"
+msgstr "_Aggiungi immagine"
+
+#: ../data/gtkpod.glade.h:371
+msgid "_Album"
+msgstr "_Album"
+
+#: ../data/gtkpod.glade.h:372
+msgid "_All Tracks"
+msgstr "_Tutte le tracce"
+
+#: ../data/gtkpod.glade.h:373
+msgid "_Arrange Sort Tabs"
+msgstr "_Sistema le schede di ordinamento"
+
+#: ../data/gtkpod.glade.h:374
+msgid "_Check iPod's Files"
+msgstr "_Controlla i file dell'iPod"
+
+#: ../data/gtkpod.glade.h:375
+msgid "_Conversion Log"
+msgstr "Registro di _conversione"
+
+#: ../data/gtkpod.glade.h:376
+msgid "_Create Playlists"
+msgstr "_Crea playlist"
+
+#: ../data/gtkpod.glade.h:377
+msgid "_Create iPod's Directories"
+msgstr "_Crea le directory dell'iPod"
+
+#: ../data/gtkpod.glade.h:378
+msgid "_Delete"
+msgstr "_Elimina"
+
+#: ../data/gtkpod.glade.h:379
+msgid "_Display"
+msgstr "_Mostra"
+
+#: ../data/gtkpod.glade.h:380
+msgid "_Displayed Tracks"
+msgstr "_Tracce visualizzate"
+
+#: ../data/gtkpod.glade.h:381
+msgid "_Edit"
+msgstr "_Modifica"
+
+#: ../data/gtkpod.glade.h:382
+msgid "_Encoding (ID3, files):"
+msgstr "_Codifica (ID3, file):"
+
+#: ../data/gtkpod.glade.h:383
+msgid "_Enqueue"
+msgstr "_Metti in coda"
+
+#: ../data/gtkpod.glade.h:384
+msgid "_Export Tracks from Database"
+msgstr "_Esporta le tracce dal database"
+
+#: ../data/gtkpod.glade.h:385
+msgid "_File"
+msgstr "_File"
+
+#: ../data/gtkpod.glade.h:386
+msgid "_General"
+msgstr "_Generale"
+
+#: ../data/gtkpod.glade.h:387
+msgid "_Help"
+msgstr "_Aiuto"
+
+#: ../data/gtkpod.glade.h:388
+msgid "_Ignore rules"
+msgstr "_Ignora le regole"
+
+#: ../data/gtkpod.glade.h:389
+msgid "_Image"
+msgstr "_Immagine"
+
+#: ../data/gtkpod.glade.h:390
+msgid "_Info Window"
+msgstr "_Finestra di informazioni"
+
+#: ../data/gtkpod.glade.h:391
+msgid "_Last.FM"
+msgstr "_Last.FM"
+
+#: ../data/gtkpod.glade.h:392
+msgid "_Less Sort Tabs"
+msgstr "_Meno schede di ordinamento"
+
+#: ../data/gtkpod.glade.h:393
+msgid "_Limit to"
+msgstr "_Limita a"
+
+#: ../data/gtkpod.glade.h:394
+msgid "_Load iPod(s)"
+msgstr "_Leggi gli iPod"
+
+#: ../data/gtkpod.glade.h:395
+msgid "_Local"
+msgstr "_Locale"
+
+#: ../data/gtkpod.glade.h:396
+msgid "_M3U"
+msgstr "_M3U"
+
+#: ../data/gtkpod.glade.h:397
+msgid "_Misc."
+msgstr "_Misc."
+
+#: ../data/gtkpod.glade.h:398
+msgid "_More Sort Tabs"
+msgstr "_Più schede di ordinamento"
+
+#: ../data/gtkpod.glade.h:399
+msgid "_Newly Added Tracks"
+msgstr "_Tracce nuove aggiunte"
+
+#: ../data/gtkpod.glade.h:400
+msgid "_Normalize Volume"
+msgstr "_Normalizza il volume"
+
+#: ../data/gtkpod.glade.h:401
+msgid "_Number of sort tabs:"
+msgstr "_Numero di schede di ordinamento:"
+
+#: ../data/gtkpod.glade.h:402
+msgid "_PLS"
+msgstr "_PLS"
+
+#: ../data/gtkpod.glade.h:403
+msgid "_Play Now"
+msgstr "_Riproduci ora"
+
+#: ../data/gtkpod.glade.h:404
+msgid "_Podcasts"
+msgstr "_Podcast"
+
+#: ../data/gtkpod.glade.h:405
+msgid "_Prefer Local"
+msgstr "_Preferisci locali"
+
+#: ../data/gtkpod.glade.h:406
+msgid "_Remove Album"
+msgstr "_Rimuovi album"
+
+#: ../data/gtkpod.glade.h:407
+msgid "_Remove Cover Art"
+msgstr "_Rimuovi la copertina"
+
+#: ../data/gtkpod.glade.h:408
+msgid "_Remove Images"
+msgstr "_Rimuovi immagini"
+
+#: ../data/gtkpod.glade.h:409
+msgid "_Save Changes"
+msgstr "_Salva le modifiche"
+
+#: ../data/gtkpod.glade.h:410
+msgid "_Save Displayed Track Order"
+msgstr "_Salva l'ordine visualizzato delle tracce"
+
+#: ../data/gtkpod.glade.h:411
+msgid "_Sorting"
+msgstr "_Ordinamento"
+
+#: ../data/gtkpod.glade.h:412
+msgid "_Synchronize Playlist with Dir(s)"
+msgstr "_Sincronizza la playlist con le directory"
+
+#: ../data/gtkpod.glade.h:413
+msgid "_Toolbar"
+msgstr "_Barra degli strumenti"
+
+#: ../data/gtkpod.glade.h:414
+msgid "_Tools"
+msgstr "_Strumenti"
+
+#: ../data/gtkpod.glade.h:415
+msgid "_Tooltips"
+msgstr "_Suggerimenti"
+
+#: ../data/gtkpod.glade.h:416
+msgid "_Track Info"
+msgstr "Informazioni sulla _traccia"
+
+#: ../data/gtkpod.glade.h:417
+msgid "_Undo All"
+msgstr "Ann_ulla tutto"
+
+#: ../data/gtkpod.glade.h:418
+msgid "_Update Tracks from File"
+msgstr "_Aggiorna tracce da file"
+
+#: ../data/gtkpod.glade.h:419
+msgid "_Video"
+msgstr "_Video"
+
+#: ../data/gtkpod.glade.h:420
+msgid "_View"
+msgstr "_Visualizza"
+
+#: ../data/gtkpod.glade.h:421
+msgid "_iPod"
+msgstr "_iPod"
+
+#: ../data/gtkpod.glade.h:423
+#, no-c-format
+msgid ""
+"artist: %a, album: %A, composer: %c, title: %t, genre: %G, track nr: %T, CD "
+"nr: %C, year: %Y, skip data: %*, the character '%': %%. You can separate "
+"several templates by a ';'. The first one matching the filename will be "
+"used. Example: '%a - %A/%T %t.mp3;%t.wav'."
+msgstr ""
+"artista: %a, album: %A, compositore: %c, titolo: %t, genere: %G, numero "
+"traccia: %T, numero CD: %C, anno: %Y, ignora un dato: %*, il carattere «%»: %"
+"%. Si possono separare diversi modelli usando un «;». Verrà usato il primo "
+"corrispondente al nome di un file. Esempio: «%a - %A/%T %t.mp;%t.wav»."
+
+#: ../data/gtkpod.glade.h:424
+msgid "folder"
+msgstr "folder"
+
+#: ../data/gtkpod.glade.h:425
+msgid "folder.jpg"
+msgstr "folder.jpg"
+
+#: ../data/gtkpod.glade.h:427
+#, no-c-format
+msgid "folder.jpg;%a.jpg"
+msgstr "folder.jpg;%a.jpg"
+
+#: ../data/gtkpod.glade.h:428
+msgid "gtkpod"
+msgstr "gtkpod"
+
+#: ../data/gtkpod.glade.h:429
+msgid "gtkpod Info"
+msgstr "Informazioni su gtkpod"
+
+#: ../data/gtkpod.glade.h:430
+msgid ""
+"gtkpod expects the ID3 tags and the filenames to be in the encoding "
+"specified here. You can change it for consecutive 'Add Files' and 'Add Dirs' "
+"operation. 'System Charset' is the charset used by your current locale."
+msgstr ""
+"gtkpod si aspetta che le etichette ID3 e i nomi dei file siano nella stessa "
+"codifica specificata qui. Si può cambiare per i successivi «Aggiungi file» e "
+"«Aggiungi directory». «Codifica di sistema» è la codifica usata dalla "
+"localizzazione attuale."
+
+#: ../data/gtkpod.glade.h:431
+msgid "gtkpod options"
+msgstr "Opzioni di gtkpod"
+
+#. These are the items for the 'Repository type' combo in the 'Create Repository' dialog. Keep the three items in order!
+#: ../data/gtkpod.glade.h:433
+msgid ""
+"iPod\n"
+"Local Repository (Standard)\n"
+"Local Repository (Podcasts)\n"
+msgstr ""
+"iPod\n"
+"Archivio locale (standard)\n"
+"Archivio locale (podcast)\n"
+
+#: ../data/gtkpod.glade.h:437
+msgid "iPod mountpoint:"
+msgstr "Punto di mount dell'iPod:"
+
+#: ../data/gtkpod.glade.h:438
+msgid "iTunesDB backup:"
+msgstr "Copia di iTunesDB:"
+
+#: ../data/gtkpod.glade.h:439
+msgid "mserv Root:"
+msgstr "Radice di mserv:"
+
+#: ../data/gtkpod.glade.h:440
+msgid "mserv database lookup will be done for music in this directory."
+msgstr "Verrà consultato il database mserv per la musica in questa directory."
+
+#: ../data/gtkpod.glade.h:441 ../src/details.c:1347
+msgid "n/a"
+msgstr "n.d."
+
+#: ../data/gtkpod.glade.h:442
+msgid "special_sorttab -- Don't translate!"
+msgstr "special_sorttab -- Don't translate!"
+
+#: ../src/autodetection.c:310
+msgid "Could not initialize GnomeVFS\n"
+msgstr "Impossibile inizializzare GnomeVFS\n"
+
+#: ../src/autodetection.c:397
+#, c-format
+msgid ""
+"Newly mounted iPod at '%s' could not be loaded into gtkpod.\n"
+"\n"
+msgstr ""
+"Non è stato possibile caricare in gtkpod il nuovo iPod montato in «%s».\n"
+"\n"
+
+#: ../src/autodetection.c:403
+#, c-format
+msgid ""
+"Newly mounted iPod at '%s' appears to be already loaded!\n"
+"\n"
+msgstr ""
+"Il nuovo iPod montato in «%s» sembra già caricato.\n"
+"\n"
+
+#: ../src/autodetection.c:416
+msgid "New iPod"
+msgstr "Nuovo iPod"
+
+#: ../src/charset.c:53
+msgid "Arabic (IBM-864)"
+msgstr "Arabo (IBM-864)"
+
+#: ../src/charset.c:54
+msgid "Arabic (ISO-8859-6)"
+msgstr "Arabo (ISO-8859-6)"
+
+#: ../src/charset.c:55
+msgid "Arabic (Windows-1256)"
+msgstr "Arabo (Windows-1256)"
+
+#: ../src/charset.c:56
+msgid "Baltic (ISO-8859-13)"
+msgstr "Baltico (ISO-8859-13)"
+
+#: ../src/charset.c:57
+msgid "Baltic (ISO-8859-4)"
+msgstr "Baltico (ISO-8859-4)"
+
+#: ../src/charset.c:58
+msgid "Baltic (Windows-1257)"
+msgstr "Baltico (Windows-1257)"
+
+#: ../src/charset.c:59
+msgid "Celtic (ISO-8859-14)"
+msgstr "Celtico (ISO-8859-14)"
+
+#: ../src/charset.c:60
+msgid "Central European (IBM-852)"
+msgstr "Europa centrale (IBM-852)"
+
+#: ../src/charset.c:61
+msgid "Central European (ISO-8859-2)"
+msgstr "Europa centrale (ISO-8859-2)"
+
+#: ../src/charset.c:62
+msgid "Central European (Windows-1250)"
+msgstr "Europa centrale (Windows-1250)"
+
+#: ../src/charset.c:63
+msgid "Chinese Simplified (GB18030)"
+msgstr "Cinese semplificato (GB18030)"
+
+#: ../src/charset.c:64
+msgid "Chinese Simplified (GB2312)"
+msgstr "Cinese semplificato (GB2312)"
+
+#: ../src/charset.c:65
+msgid "Chinese Traditional (Big5)"
+msgstr "Cinese tradizionale (Big5)"
+
+#: ../src/charset.c:66
+msgid "Chinese Traditional (Big5-HKSCS)"
+msgstr "Cinese tradizionale (Big5-HKSCS)"
+
+#: ../src/charset.c:67
+msgid "Cyrillic (IBM-855)"
+msgstr "Cirillico (IBM-855)"
+
+#: ../src/charset.c:68
+msgid "Cyrillic (ISO-8859-5)"
+msgstr "Cirillico (ISO-8859-5)"
+
+#: ../src/charset.c:69
+msgid "Cyrillic (ISO-IR-111)"
+msgstr "Cirillico (ISO-IR-111)"
+
+#: ../src/charset.c:70
+msgid "Cyrillic (KOI8-R)"
+msgstr "Cirillico (KOI8-R)"
+
+#: ../src/charset.c:71
+msgid "Cyrillic (Windows-1251)"
+msgstr "Cirillico (Windows-1251)"
+
+#: ../src/charset.c:72
+msgid "Cyrillic/Russian (CP-866)"
+msgstr "Cirillico/Russo (CP-866)"
+
+#: ../src/charset.c:73
+msgid "Cyrillic/Ukrainian (KOI8-U)"
+msgstr "Cirillico/Ucraino (KOI8-U)"
+
+#: ../src/charset.c:74
+msgid "English (US-ASCII)"
+msgstr "Inglese (US-ASCII)"
+
+#: ../src/charset.c:75
+msgid "Greek (ISO-8859-7)"
+msgstr "Greco (ISO-8859-7)"
+
+#: ../src/charset.c:76
+msgid "Greek (Windows-1253)"
+msgstr "Greco (Windows-1253)"
+
+#: ../src/charset.c:77
+msgid "Hebrew (IBM-862)"
+msgstr "Ebraico (IBM-862)"
+
+#: ../src/charset.c:78
+msgid "Hebrew (Windows-1255)"
+msgstr "Ebraico (Windows-1255)"
+
+#: ../src/charset.c:79
+msgid "Japanese (automatic detection)"
+msgstr "Giapponese (automatico)"
+
+#: ../src/charset.c:80
+msgid "Japanese (EUC-JP)"
+msgstr "Giapponese (EUC-JP)"
+
+#: ../src/charset.c:81
+msgid "Japanese (ISO-2022-JP)"
+msgstr "Giapponese (ISO-2022-JP)"
+
+#: ../src/charset.c:82
+msgid "Japanese (Shift_JIS)"
+msgstr "Giapponese (Shift_JIS)"
+
+#: ../src/charset.c:83
+msgid "Korean (EUC-KR)"
+msgstr "Coreano (EUC-KR)"
+
+#: ../src/charset.c:84
+msgid "Nordic (ISO-8859-10)"
+msgstr "Nordico (ISO-8859-10)"
+
+#: ../src/charset.c:85
+msgid "South European (ISO-8859-3)"
+msgstr "Europa del sud (ISO-8859-3)"
+
+#: ../src/charset.c:86
+msgid "Thai (TIS-620)"
+msgstr "Thai (TIS-620)"
+
+#: ../src/charset.c:87
+msgid "Turkish (IBM-857)"
+msgstr "Turco (IBM-857)"
+
+#: ../src/charset.c:88
+msgid "Turkish (ISO-8859-9)"
+msgstr "Turco (ISO-8859-9)"
+
+#: ../src/charset.c:89
+msgid "Turkish (Windows-1254)"
+msgstr "Turco (Windows-1254)"
+
+#: ../src/charset.c:90
+msgid "Unicode (UTF-7)"
+msgstr "Unicode (UTF-7)"
+
+#: ../src/charset.c:91
+msgid "Unicode (UTF-8)"
+msgstr "Unicode (UTF-8)"
+
+#: ../src/charset.c:92
+msgid "Unicode (UTF-16BE)"
+msgstr "Unicode (UTF-16BE)"
+
+#: ../src/charset.c:93
+msgid "Unicode (UTF-16LE)"
+msgstr "Unicode (UTF-16LE)"
+
+#: ../src/charset.c:94
+msgid "Unicode (UTF-32BE)"
+msgstr "Unicode (UTF-32BE)"
+
+#: ../src/charset.c:95
+msgid "Unicode (UTF-32LE)"
+msgstr "Unicode (UTF-32LE)"
+
+#: ../src/charset.c:96
+msgid "Vietnamese (VISCII)"
+msgstr "Vietnamita (VISCII)"
+
+#: ../src/charset.c:97
+msgid "Vietnamese (Windows-1258)"
+msgstr "Vietnamita (Windows-1258)"
+
+#: ../src/charset.c:98
+msgid "Visual Hebrew (ISO-8859-8)"
+msgstr "Ebraico visuale (ISO-8859-8)"
+
+#: ../src/charset.c:99
+msgid "Western (IBM-850)"
+msgstr "Occidentale (IBM-850)"
+
+#: ../src/charset.c:100
+msgid "Western (ISO-8859-1)"
+msgstr "Occidentale (ISO-8859-1)"
+
+#: ../src/charset.c:101
+msgid "Western (ISO-8859-15)"
+msgstr "Occidentale (ISO-8859-15)"
+
+#: ../src/charset.c:102
+msgid "Western (Windows-1252)"
+msgstr "Occidentale (Windows-1252)"
+
+#. sanity!
+#. check for "System Charset" and return NULL
+#: ../src/charset.c:160 ../src/charset.c:170 ../src/charset.c:223
+msgid "System Charset"
+msgstr "Codifica di sistema"
+
+#. we are not the first instance of gtkpod -- the socket is
+#. already being used, so we pass
+#: ../src/clientserver.c:214
+msgid ""
+"Another instance of gtkpod was detected. Playcount server not started.\n"
+msgstr ""
+"È stata rilevata un'altra istanza di gtkpod. Server conta riproduzioni non "
+"avviato.\n"
+
+#: ../src/confirmation.c:377
+msgid "Confirmation Dialogue"
+msgstr "Finestra di dialogo di conferma"
+
+#: ../src/context_menus.c:362
+#, c-format
+msgid "Copied \"%s\" playlist to %s"
+msgstr "Playlist «%s» copiata in %s"
+
+#: ../src/context_menus.c:401
+#, c-format
+msgid "Copied %d track to '%s'"
+msgid_plural "Copied %d tracks to '%s'"
+msgstr[0] "Copiata %d traccia in «%s»"
+msgstr[1] "Copiate %d tracce in «%s»"
+
+#: ../src/context_menus.c:429
+#, c-format
+msgid "Copied '%s' playlist to '%s' in '%s'"
+msgstr "Playlist «%s» copiata su «%s» in «%s»"
+
+#: ../src/context_menus.c:462
+#, c-format
+msgid "Copied %d track to '%s' in '%s'"
+msgid_plural "Copied %d tracks to %s in '%s'"
+msgstr[0] "Copiata %d traccia su «%s» in «%s»"
+msgstr[1] "Copiate %d tracce su «%s» in «%s»"
+
+#: ../src/context_menus.c:622 ../src/tools.c:854
+msgid "Play Now"
+msgstr "Riproduci ora"
+
+#: ../src/context_menus.c:628 ../src/tools.c:867
+msgid "Enqueue"
+msgstr "Metti in coda"
+
+#: ../src/context_menus.c:634
+msgid "Copy Tracks to Filesystem"
+msgstr "Copia le tracce sul filesystem"
+
+#: ../src/context_menus.c:641 ../src/file_export.c:1085
+msgid "Create Playlist File"
+msgstr "Crea un file di playlist"
+
+#: ../src/context_menus.c:648
+msgid "Create new Playlist"
+msgstr "Crea una nuova playlist"
+
+#: ../src/context_menus.c:655
+msgid "Update Tracks from File"
+msgstr "Aggiorna tracce da file"
+
+#: ../src/context_menus.c:669
+msgid "Sync Playlist with Dir(s)"
+msgstr "Sincronizza la playlist con le directory"
+
+#: ../src/context_menus.c:679
+msgid "Remove All Tracks from iPod"
+msgstr "Rimuovi tutte le tracce dall'iPod"
+
+#: ../src/context_menus.c:697
+msgid "Remove All Podcasts from iPod"
+msgstr "Rimuovi tutti i podcast dall'iPod"
+
+#: ../src/context_menus.c:712
+msgid "Delete Including Tracks"
+msgstr "Elimina anche le tracce"
+
+#: ../src/context_menus.c:720
+msgid "Delete But Keep Tracks"
+msgstr "Elimina, ma preserva le tracce"
+
+#: ../src/context_menus.c:728
+msgid "Edit iPod Properties"
+msgstr "Modifica le proprietà dell'iPod"
+
+#: ../src/context_menus.c:735
+msgid "Edit Repository Properties"
+msgstr "Modifica le proprietà dell'archivio"
+
+#: ../src/context_menus.c:742
+msgid "Edit Playlist Properties"
+msgstr "Modifica le proprietà della playlist"
+
+#: ../src/context_menus.c:770
+msgid "View Full Size Artwork"
+msgstr "Mostra l'artwork a piena grandezza"
+
+#: ../src/context_menus.c:777
+msgid "Select Cover From File"
+msgstr "Seleziona copertina da file"
+
+#: ../src/context_menus.c:790
+msgid "Load iPod"
+msgstr "Leggi l'iPod"
+
+#: ../src/context_menus.c:797
+msgid "Eject iPod"
+msgstr "Espelli l'iPod"
+
+#: ../src/context_menus.c:814
+msgid "Remove All Tracks from Database"
+msgstr "Rimuovi tutte le tracce dal database"
+
+#: ../src/context_menus.c:829
+msgid "Delete Including Tracks (Harddisk)"
+msgstr "Elimina anche le tracce (disco fisso)"
+
+#: ../src/context_menus.c:837
+msgid "Delete Including Tracks (Database)"
+msgstr "Elimina anche le tracce (database)"
+
+#: ../src/context_menus.c:845
+msgid "Delete From iPod"
+msgstr "Elimina dall'iPod"
+
+#: ../src/context_menus.c:853
+msgid "Delete From Playlist"
+msgstr "Elimina dalla playlist"
+
+#: ../src/context_menus.c:861
+msgid "Delete From Harddisk"
+msgstr "Elimina dal disco fisso"
+
+#: ../src/context_menus.c:869
+msgid "Delete From Database"
+msgstr "Elimina dal database"
+
+#: ../src/context_menus.c:877
+msgid "Alphabetize"
+msgstr "Ordine alfabetico"
+
+#: ../src/context_menus.c:895
+msgid "Remove Album"
+msgstr "Rimuovi album"
+
+#: ../src/context_menus.c:905
+msgid "Remove Photo"
+msgstr "Rimuovi foto"
+
+#: ../src/context_menus.c:922
+msgid "Rename Album"
+msgstr "Rinomina album"
+
+#: ../src/context_menus.c:981 ../src/context_menus.c:1030
+msgid "Copy selected playlist to..."
+msgstr "Copia la playlist selezionata su..."
+
+#: ../src/context_menus.c:1083
+msgid "Copy selected track(s) to..."
+msgstr "Copia le tracce selezionate su..."
+
+#: ../src/date_parser.l:269
+#, c-format
+msgid "Date format error: unrecognized character: '%s'\n"
+msgstr "Errore nel formato della data: carattere sconosciuto: «%s»\n"
+
+#: ../src/details.c:82
+msgid "Audio/Video"
+msgstr "Audio/Video"
+
+#: ../src/details.c:83
+msgid "Audio"
+msgstr "Audio"
+
+#: ../src/details.c:84
+msgid "Video"
+msgstr "Video"
+
+#: ../src/details.c:85
+msgid "Podcast"
+msgstr "Podcast"
+
+#: ../src/details.c:86
+msgid "Video Podcast"
+msgstr "Podcast video"
+
+#: ../src/details.c:87
+msgid "Audiobook"
+msgstr "Audiolibro"
+
+#: ../src/details.c:88 ../src/display_spl.c:209 ../src/display_spl.c:218
+msgid "Music Video"
+msgstr "Video musicale"
+
+#: ../src/details.c:89 ../src/display_spl.c:107 ../src/display_spl.c:210
+#: ../src/display_spl.c:219 ../src/misc_conversion.c:101
+msgid "TV Show"
+msgstr "Programma TV"
+
+#: ../src/details.c:90
+msgid "TV Show & Music Video"
+msgstr "Programma TV e video musicale"
+
+#: ../src/details.c:836
+#, c-format
+msgid "%s (image data corrupted or unreadable)"
+msgstr "%s (dati dell'immagine corrotti o non leggibili)"
+
+#: ../src/details.c:973
+#, c-format
+msgid "Please report unknown mediatype %x\n"
+msgstr "Segnalare il mediatype sconosciuto %x\n"
+
+#: ../src/details.c:1418
+msgid "<b>n/a</b>"
+msgstr "<b>n/d</b>"
+
+#: ../src/details.c:1906
+#, c-format
+msgid "Error occurred dropping an image onto the details window: %s\n"
+msgstr ""
+"Si è verificato un errore durante il rilascio di un'immagine nella finestra "
+"dei dettagli: %s\n"
+
+#: ../src/details.c:1952 ../src/display_coverart.c:2128
+msgid "Successfully set new coverart for selected tracks"
+msgstr "La copertina per le tracce selezionate è stata impostata con successo"
+
+#: ../src/display.c:490
+#, c-format
+msgid "<b>Image Dimensions: %s</b>"
+msgstr "<b>Dimensioni dell'immagine: %s</b>"
+
+#: ../src/display.c:744
+msgid "Edit selected entry of which sort tab?"
+msgstr "Modificare la voce selezionata di quale scheda di ordinamento?"
+
+#. no entry selected
+#: ../src/display.c:751 ../src/misc_confirm.c:435 ../src/misc_track.c:2138
+msgid "No entry selected."
+msgstr "Nessuna voce selezionata."
+
+#: ../src/display.c:910 ../src/display.c:1230 ../src/display.c:1286
+#: ../src/display.c:1340 ../src/display.c:1395 ../src/display.c:1656
+#, c-format
+msgid "No entry selected in Sort Tab %d"
+msgstr "Nessuna voce selezionata nella scheda di ordinamento %d"
+
+#: ../src/display.c:949
+msgid "Remove entry of which sort tab from database?"
+msgstr "Rimuovere dal database la voce di quale scheda di ordinamento?"
+
+#: ../src/display.c:957
+msgid "Remove tracks in selected entry of which filter tab from the iPod?"
+msgstr ""
+"Rimuovere dall'iPod le tracce nella voce selezionata di quale scheda di "
+"filtro?"
+
+#: ../src/display.c:979
+msgid "Remove tracks in selected entry of which filter tab from the harddisk?"
+msgstr ""
+"Rimuovere dal disco fisso le tracce nella voce selezionata di quale scheda "
+"di filtro?"
+
+#: ../src/display.c:1009
+msgid "Remove tracks in selected entry of which filter tab from playlist?"
+msgstr ""
+"Rimuovere dalla playlist le tracce nella voce selezionata di quale scheda di "
+"filtro?"
+
+#: ../src/display.c:1036 ../src/display.c:1074
+#, c-format
+msgid ""
+"iPod at '%s' is not loaded.\n"
+"Please load it first."
+msgstr ""
+"L'iPod in «%s» non è caricato.\n"
+"Prima è necessario caricarlo."
+
+#: ../src/display.c:1111 ../src/display.c:1138
+msgid "Update selected entry of which sort tab?"
+msgstr "Aggiornare la voce selezionata di quale scheda di ordinamento?"
+
+#: ../src/display.c:1224
+msgid "Export selected entry of which sort tab?"
+msgstr "Esportare la voce selezionata di quale scheda di ordinamento?"
+
+#: ../src/display.c:1280
+msgid "Create playlist file from selected entry of which sort tab?"
+msgstr ""
+"Creare la playlist dalle voci selezionate di quale scheda di ordinamento?"
+
+#: ../src/display.c:1334
+msgid "Play tracks in selected entry of which sort tab?"
+msgstr ""
+"Riprodurre le tracce nella voce selezionata di quale scheda di ordinamento?"
+
+#: ../src/display.c:1389
+msgid "Enqueue tracks in selected entry of which sort tab?"
+msgstr ""
+"Mettere in coda le tracce nella voce selezionata di quale scheda di "
+"ordinamento?"
+
+#: ../src/display.c:1646
+msgid "Normalize tracks in selected entry of which sort tab?"
+msgstr ""
+"Normalizzare le tracce nella voce selezionata di quale scheda di ordinamento?"
+
+#: ../src/display_coverart.c:1713
+msgid "Failed to remove the album from the album hash store."
+msgstr "Impossibile rimuovere l'album dall'archivio degli hash degli album."
+
+#: ../src/display_coverart.c:2098
+#, c-format
+msgid "Error occurred dropping an image onto the coverart display: %s\n"
+msgstr ""
+"Si è verificato un errore durante il rilascio di un'immagine sulla "
+"visualizzazione della copertina: %s\n"
+
+#: ../src/display_itdb.c:376
+#, c-format
+msgid "Failed to set cover art: '%s'\n"
+msgstr "Impossibile impostare la copertina: «%s»\n"
+
+#: ../src/display_itdb.c:858 ../src/display_itdb.c:991
+msgid "Local"
+msgstr "Locale"
+
+#. add podcast playlist
+#: ../src/display_itdb.c:866 ../src/display_itdb.c:989
+#: ../src/display_itdb.c:1025
+msgid "Podcasts"
+msgstr "Podcast"
+
+#: ../src/display_itdb.c:875 ../src/display_itdb.c:993
+#: ../src/repository.c:1186
+msgid "iPod"
+msgstr "iPod"
+
+#: ../src/display_itdb.c:1084
+#, c-format
+msgid "Increased playcount for '%s'"
+msgstr "Incrementato conta-riproduzione per «%s»"
+
+#: ../src/display_photo.c:163
+#, c-format
+msgid "Error reading iPod photo database (%s).\n"
+msgstr "Errore durante la lettura del database delle foto dell'iPod (%s).\n"
+
+#: ../src/display_photo.c:168
+msgid "Error reading iPod photo database.\n"
+msgstr "Errore durante la lettura del database delle foto dell'iPod.\n"
+
+#: ../src/display_photo.c:238
+msgid "Could not access the iPod's photo database."
+msgstr "Impossibile accedere al database delle foto dell'iPod."
+
+#: ../src/display_photo.c:441
+msgid "Photo Albums"
+msgstr "Album fotografici"
+
+#: ../src/display_photo.c:451 ../src/display_photo.c:1685
+msgid "<Unnamed>"
+msgstr "<senza_nome>"
+
+#: ../src/display_photo.c:939
+msgid "The Photo Library album cannot be removed"
+msgstr "L'album Photo Library non può essere rimosso"
+
+#: ../src/display_photo.c:961
+msgid "Do you want to remove the album's photos too?"
+msgstr "Eliminare anche le foto contenute nell'album?"
+
+#: ../src/display_photo.c:967
+msgid "Yes. Do Not Display Again"
+msgstr "Sì. Non chiedere più"
+
+#: ../src/display_photo.c:1038
+msgid ""
+"This will remove the photo selection from the selected album.\n"
+" Do you want to delete them from the database as well?"
+msgstr ""
+"Questo rimuoverà le foto selezionate dall'album selezionato.\n"
+" Eliminarle anche dal database?"
+
+#: ../src/display_photo.c:1053
+msgid ""
+"This will delete the photo selection from the Photo Library and all albums. "
+"Are you sure?"
+msgstr ""
+"Questo rimuoverà le foto selezionate da Photo Library e da tutti gli album. "
+"Procedere?"
+
+#: ../src/display_photo.c:1128
+msgid "New Photo Album Name"
+msgstr "Nome del  nuovo album fotografico"
+
+#: ../src/display_photo.c:1129
+msgid "Please enter a new name for the photo album"
+msgstr "Inserire un nuovo nome per l'album fotografico"
+
+#: ../src/display_photo.c:1141 ../src/display_photo.c:1223
+msgid "An album with that name already exists."
+msgstr "Un album con quel nome esiste già."
+
+#: ../src/display_photo.c:1210
+msgid "New Photo Album"
+msgstr "Nuovo album fotografico"
+
+#: ../src/display_photo.c:1211
+msgid "Please enter a name for the new photo album"
+msgstr "Inserire un nome per il nuovo album fotografico"
+
+#: ../src/display_photo.c:1232
+msgid "The new album failed to be created."
+msgstr "La creazione del nuovo album è fallita."
+
+#: ../src/display_photo.c:1256
+msgid "Add Image to iPod"
+msgstr "Aggiungi un'immagine all'iPod"
+
+#. Open a dialog directory chooser window
+#: ../src/display_photo.c:1311
+msgid "Add a Directory of Images to the iPod. Select the Directory."
+msgstr "Aggiungi una directory di immagini all'iPod. Selezionare la directory."
+
+#: ../src/display_photo.c:1699
+#, c-format
+msgid "<No members>\n"
+msgstr "<Nessun membro>\n"
+
+#. give a notice on the statusbar -- otherwise the user
+#. * will never know why the drag is not possible
+#: ../src/display_playlists.c:516 ../src/display_playlists.c:558
+msgid "Error: drag from iPod not possible in offline mode."
+msgstr ""
+"Errore: il trascinamento dall'iPod non è possibile in modalità non in linea."
+
+#: ../src/display_playlists.c:585 ../src/display_tracks.c:286
+#, c-format
+msgid "Copied one track"
+msgid_plural "Copied %d tracks"
+msgstr[0] "Copiata una traccia"
+msgstr[1] "Copiate %d tracce"
+
+#: ../src/display_playlists.c:865 ../src/display_playlists.c:877
+msgid "Can't reorder sorted treeview."
+msgstr "Impossibile riordinare la vista ad albero ordinata."
+
+#: ../src/display_playlists.c:954
+#, c-format
+msgid ""
+"This DND type (%d) is not (yet) supported. If you feel implementing this "
+"would be useful, please contact the author.\n"
+"\n"
+msgstr ""
+"Questo tipo DND (%d) non è (ancora) supportato. Se pensi che possa essere "
+"utile implementarlo, contatta l'autore.\n"
+
+#. no existing photo playlist found so add one
+#. * either itdb had no children or none of them
+#. * were of the photo type.
+#.
+#: ../src/display_playlists.c:1569
+msgid "Photos"
+msgstr "Fotografie"
+
+#: ../src/display_sorttabs.c:473
+msgid "'Played' condition ignored because of error."
+msgstr "Condizione «Riprodotto» ignorata a causa di un errore."
+
+#: ../src/display_sorttabs.c:476
+msgid "'Modified' condition ignored because of error."
+msgstr "Condizione «Modificato» ignorata a causa di un errore."
+
+#: ../src/display_sorttabs.c:479
+msgid "'Added' condition ignored because of error."
+msgstr "Condizione «Aggiunta» ignorata a causa di un errore."
+
+#: ../src/display_sorttabs.c:1562 ../src/misc_conversion.c:59
+msgid "All"
+msgstr "Tutti"
+
+#: ../src/display_sorttabs.c:1588
+msgid "Compilations"
+msgstr "Compilation"
+
+#: ../src/display_sorttabs.c:2988
+msgid "Comp."
+msgstr "Comp."
+
+#: ../src/display_sorttabs.c:2994 ../src/display_spl.c:88
+#: ../src/display_tracks.c:2109 ../src/misc_conversion.c:84
+msgid "Year"
+msgstr "Anno"
+
+#: ../src/display_sorttabs.c:2997
+msgid "Special"
+msgstr "Speciale"
+
+#: ../src/display_sorttabs.c:3245
+msgid "Last Played"
+msgstr "Ultimo ascolto"
+
+#: ../src/display_sorttabs.c:3246
+msgid "Last Modified"
+msgstr "Ultima modifica"
+
+#: ../src/display_spl.c:64
+msgid "days"
+msgstr "giorni"
+
+#: ../src/display_spl.c:65
+msgid "weeks"
+msgstr "settimane"
+
+#: ../src/display_spl.c:66
+msgid "months"
+msgstr "mesi"
+
+#: ../src/display_spl.c:73
+msgid "kbps"
+msgstr "kbps"
+
+#: ../src/display_spl.c:74
+msgid "Hz"
+msgstr "Hz"
+
+#: ../src/display_spl.c:75 ../src/display_spl.c:179 ../src/info.c:780
+msgid "MB"
+msgstr "MB"
+
+#: ../src/display_spl.c:76
+msgid "secs"
+msgstr "sec"
+
+#: ../src/display_spl.c:86 ../src/misc_conversion.c:74
+msgid "Bitrate"
+msgstr "Bitrate"
+
+#. 15
+#: ../src/display_spl.c:87 ../src/misc_conversion.c:75
+msgid "Samplerate"
+msgstr "Frequenza di campionamento"
+
+#: ../src/display_spl.c:90
+msgid "Kind"
+msgstr "Tipo"
+
+#: ../src/display_spl.c:91 ../src/misc_conversion.c:81
+msgid "Date modified"
+msgstr "Data di modifica"
+
+#: ../src/display_spl.c:92
+msgid "Track number"
+msgstr "Numero della traccia"
+
+#: ../src/display_spl.c:93
+msgid "Size"
+msgstr "Dimensione"
+
+#: ../src/display_spl.c:95 ../src/misc_conversion.c:64
+msgid "Comment"
+msgstr "Commento"
+
+#: ../src/display_spl.c:96 ../src/misc_conversion.c:79
+msgid "Date added"
+msgstr "Data di aggiunta"
+
+#: ../src/display_spl.c:99
+msgid "Last played"
+msgstr "Ultimo ascolto"
+
+#: ../src/display_spl.c:100
+msgid "Disc number"
+msgstr "Numero disco"
+
+#: ../src/display_spl.c:102 ../src/misc_conversion.c:87
+msgid "Compilation"
+msgstr "Compilation"
+
+#: ../src/display_spl.c:103 ../src/misc_conversion.c:76
+msgid "BPM"
+msgstr "BPM"
+
+#: ../src/display_spl.c:104 ../src/misc_conversion.c:86
+msgid "Grouping"
+msgstr "Raggruppamento"
+
+#: ../src/display_spl.c:105
+msgid "Playlist"
+msgstr "Playlist"
+
+#: ../src/display_spl.c:106
+msgid "Video Kind"
+msgstr "Tipo di video"
+
+#: ../src/display_spl.c:108
+msgid "Season number"
+msgstr "Numero stagione"
+
+#: ../src/display_spl.c:109
+msgid "Skip count"
+msgstr "Conta salti"
+
+#: ../src/display_spl.c:110
+msgid "Last skipped"
+msgstr "Saltata l'ultima volta"
+
+#: ../src/display_spl.c:111
+msgid "Album artist"
+msgstr "Artista dell'album"
+
+#: ../src/display_spl.c:117
+msgid "contains"
+msgstr "contiene"
+
+#: ../src/display_spl.c:118
+msgid "does not contain"
+msgstr "non contiene"
+
+#: ../src/display_spl.c:119 ../src/display_spl.c:128 ../src/display_spl.c:138
+#: ../src/display_spl.c:157 ../src/display_spl.c:164
+msgid "is"
+msgstr "è"
+
+#: ../src/display_spl.c:120 ../src/display_spl.c:129 ../src/display_spl.c:139
+#: ../src/display_spl.c:158 ../src/display_spl.c:165
+msgid "is not"
+msgstr "non è"
+
+#: ../src/display_spl.c:121
+msgid "starts with"
+msgstr "comincia con"
+
+#: ../src/display_spl.c:122
+msgid "ends with"
+msgstr "finisce con"
+
+#: ../src/display_spl.c:130
+msgid "is greater than"
+msgstr "è maggiore di"
+
+#: ../src/display_spl.c:131
+msgid "is less than"
+msgstr "è minore di"
+
+#: ../src/display_spl.c:132 ../src/display_spl.c:144
+msgid "is in the range"
+msgstr "è nell'intervallo"
+
+#: ../src/display_spl.c:140
+msgid "is after"
+msgstr "è dopo"
+
+#: ../src/display_spl.c:141
+msgid "is before"
+msgstr "è prima"
+
+#: ../src/display_spl.c:142
+msgid "in the last"
+msgstr "negli ultimi"
+
+#: ../src/display_spl.c:143
+msgid "not in the last"
+msgstr "non negli ultimi"
+
+#: ../src/display_spl.c:150
+msgid "is set"
+msgstr "è impostato"
+
+#: ../src/display_spl.c:151
+msgid "is not set"
+msgstr "non è impostato"
+
+#: ../src/display_spl.c:171
+msgid "Not supported"
+msgstr "Non supportato"
+
+#: ../src/display_spl.c:178
+msgid "minutes"
+msgstr "minuti"
+
+#: ../src/display_spl.c:180
+msgid "tracks"
+msgstr "tracce"
+
+#: ../src/display_spl.c:181
+msgid "hours"
+msgstr "ore"
+
+#: ../src/display_spl.c:182 ../src/info.c:780
+msgid "GB"
+msgstr "GB"
+
+#: ../src/display_spl.c:189
+msgid "random order"
+msgstr "ordine casuale"
+
+#: ../src/display_spl.c:190
+msgid "title"
+msgstr "titolo"
+
+#: ../src/display_spl.c:191
+msgid "album"
+msgstr "album"
+
+#: ../src/display_spl.c:192
+msgid "artist"
+msgstr "artista"
+
+#: ../src/display_spl.c:193
+msgid "genre"
+msgstr "genere"
+
+#: ../src/display_spl.c:194
+msgid "most recently added"
+msgstr "aggiunto più di recente"
+
+#: ../src/display_spl.c:195
+msgid "least recently added"
+msgstr "aggiunto meno di recente"
+
+#: ../src/display_spl.c:196
+msgid "most often played"
+msgstr "ascoltato più spesso"
+
+#: ../src/display_spl.c:197
+msgid "least often played"
+msgstr "ascoltato meno spesso"
+
+#: ../src/display_spl.c:198
+msgid "most recently played"
+msgstr "ascoltato più di recente"
+
+#: ../src/display_spl.c:199
+msgid "least recently played"
+msgstr "ascoltato meno di recente"
+
+#: ../src/display_spl.c:200
+msgid "highest rating"
+msgstr "voto migliore"
+
+#: ../src/display_spl.c:201
+msgid "lowest rating"
+msgstr "voto peggiore"
+
+#: ../src/display_spl.c:208 ../src/display_spl.c:217
+msgid "Movie"
+msgstr "Film"
+
+#: ../src/display_spl.c:1192 ../src/display_spl.c:1207
+msgid "to"
+msgstr "a"
+
+#: ../src/display_spl.c:1485
+msgid "-"
+msgstr "-"
+
+#: ../src/display_spl.c:1500
+msgid "+"
+msgstr "+"
+
+# c-format
+#: ../src/display_tracks.c:281
+#, c-format
+msgid "Moved one track"
+msgid_plural "Moved %d tracks"
+msgstr[0] "Spostata una traccia"
+msgstr[1] "Spostate %d tracce"
+
+#: ../src/display_tracks.c:1810
+#, c-format
+msgid ""
+"Cannot unsort track view because of a bug in the GTK lib you are using (%d.%"
+"d.%d < 2.5.4). Once you sort the track view, you cannot go back to the "
+"unsorted state.\n"
+"\n"
+msgstr ""
+"È impossibile annullare l'ordinamento delle tracce per un bug delle librerie "
+"GTK in uso(%d.%d.%d < 2.5.4). Una volta che avrai ordinato la "
+"visualizzazione delle tracce, non sarà possibile tornare allo stato «non "
+"ordinato».\n"
+"\n"
+
+#: ../src/display_tracks.c:2069
+msgid "Rtng"
+msgstr "Voto"
+
+#: ../src/display_tracks.c:2072
+msgid "#"
+msgstr "N°"
+
+#: ../src/display_tracks.c:2075
+msgid "CD"
+msgstr "CD"
+
+#: ../src/display_tracks.c:2078
+msgid "ID"
+msgstr "ID"
+
+#: ../src/display_tracks.c:2081
+msgid "Trnsfrd"
+msgstr "Trasferito"
+
+#: ../src/display_tracks.c:2085
+msgid "Cmpl"
+msgstr "Cmpl"
+
+#: ../src/display_tracks.c:2091
+msgid "Time"
+msgstr "Durata"
+
+#: ../src/display_tracks.c:2094
+msgid "Plycnt"
+msgstr "Conta rip."
+
+#: ../src/display_tracks.c:2106
+msgid "Released"
+msgstr "Pubblicato"
+
+#: ../src/display_tracks.c:2112
+msgid "Vol."
+msgstr "Vol."
+
+# L'interfaccia italiana usa "Verifica livello"
+#: ../src/display_tracks.c:2115
+msgid "Sndchk."
+msgstr "Ver. livello sonoro"
+
+#: ../src/fetchcover.c:358
+msgid "Coverart file already exists"
+msgstr "Il file della copertina esiste già"
+
+#: ../src/fetchcover.c:371
+#, c-format
+msgid ""
+"The picture file %s already exists.\n"
+"This may be associated with other music files in the directory.\n"
+"\n"
+"-  Clicking Yes will overwrite the existing file, possibly associating\n"
+"   other music files in the same directory with this coverart file.\n"
+"-  Clicking No will save the file with a unique file name.\n"
+"-  Clicking Cancel will abort the fetchcover operation."
+msgstr ""
+"Il file immagine %s esiste già.\n"
+"Potrebbe essere già associato ad altri file musicali nella directory.\n"
+"\n"
+"-  Selezionando Sì si sovrascriverà il file esistente ed è possibile che si\n"
+"   associno a questa copertina anche altri file musicali nella stessa "
+"directory.\n"
+"-..Selezionando No si salverà il file con un nome univoco.\n"
+"-..Selezionando Annulla si interromperà l'operazione."
+
+#: ../src/file.c:236
+#, c-format
+msgid ""
+"'%s' is a directory, not a playlist file.\n"
+"\n"
+msgstr ""
+"«%s» è una directory. non un file di playlist.\n"
+"\n"
+
+#: ../src/file.c:266
+#, c-format
+msgid ""
+"'%s' is a not a known playlist file.\n"
+"\n"
+msgstr ""
+"«%s» non è un file di playlist conosciuto.\n"
+"\n"
+
+#: ../src/file.c:283 ../src/file_export.c:217 ../src/oggfile.c:62
+#: ../src/wavfile.c:107
+#, c-format
+msgid "Could not open '%s' for reading.\n"
+msgstr "Impossibile aprire il file «%s» in lettura.\n"
+
+#: ../src/file.c:369
+#, c-format
+msgid "Skipping '%s' because it is a directory.\n"
+msgstr "Salto «%s» perché è una directory.\n"
+
+#: ../src/file.c:374
+#, c-format
+msgid "Skipping '%s' to avoid adding playlist file recursively\n"
+msgstr "Salto «%s» per evitare di aggiungere file di playlist ricorsivamente\n"
+
+#: ../src/file.c:629
+#, c-format
+msgid "Unknown token '%s' in template '%s'\n"
+msgstr "Segnaposto «%s» sconosciuto nel modello «%s»\n"
+
+#: ../src/file.c:923
+#, c-format
+msgid "Local filename not valid (%s)"
+msgstr "Nome del file locale non valido (%s)"
+
+#: ../src/file.c:982
+#, c-format
+msgid "No information found for user '%s' in '%s'"
+msgstr "Nessuna informazione trovata per l'utente «%s» in «%s»"
+
+#: ../src/file.c:991
+#, c-format
+msgid "mserv data file (%s) not available for track (%s)"
+msgstr "Il file dei dati mserv (%s) non è disponibile per la traccia (%s)"
+
+#: ../src/file.c:999
+#, c-format
+msgid "Track (%s) not in mserv music root directory (%s)"
+msgstr "La traccia (%s) non è nella directory radice musicale di mserv (%s)"
+
+#: ../src/file.c:1123
+#, c-format
+msgid ""
+"The following track could not be processed (file does not exist): '%s'\n"
+msgstr ""
+"La traccia seguente non può essere elaborata (il file non esiste): «%s»\n"
+
+#: ../src/file.c:1209
+#, c-format
+msgid "The following track could not be processed (filetype unknown): '%s'\n"
+msgstr ""
+"La traccia seguente non può essere elaborata (tipo di file sconosciuto): «%"
+"s»\n"
+
+#: ../src/file.c:1307
+#, c-format
+msgid ""
+"The following track could not be processed (filetype is known but analysis "
+"failed): '%s'\n"
+msgstr ""
+"La traccia seguente non può essere elaborata (tipo di file conosciuto ma "
+"l'analisi è fallita): «%s»\n"
+
+#: ../src/file.c:1337 ../src/file.c:1391
+msgid "Nothing to update"
+msgstr "Nulla da aggiornare"
+
+#: ../src/file.c:1358
+#, c-format
+msgid "Updating %s"
+msgstr "Aggiornamento di %s in corso"
+
+#: ../src/file.c:1372
+msgid "Updated selected tracks with info from file."
+msgstr "Le tracce sono state aggiornate con le informazioni dal file."
+
+#: ../src/file.c:1406
+#, c-format
+msgid "Retrieving mserv data %s"
+msgstr "Ricezione dei dati mserv %s"
+
+#: ../src/file.c:1411
+msgid "no filename available"
+msgstr "nessun nome di file disponibile"
+
+#: ../src/file.c:1416
+msgid "Updated selected tracks with data from mserv."
+msgstr "Le tracce sono state aggiornate con le informazioni da mserv."
+
+#: ../src/file.c:1437
+#, c-format
+msgid "The following track could not be updated"
+msgid_plural "The following %d tracks could not be updated"
+msgstr[0] "La traccia seguente non può essere aggiornata"
+msgstr[1] "Le %d tracce seguenti non possono essere aggiornate"
+
+#. gint id,
+#. gboolean modal,
+#: ../src/file.c:1443
+msgid "Failed Track Update"
+msgstr "Aggiornamento delle tracce fallito"
+
+#: ../src/file.c:1501
+#, c-format
+msgid "The following track has been updated"
+msgid_plural "The following %d tracks have been updated"
+msgstr[0] "La traccia seguente è stata aggiornata"
+msgstr[1] "Le %d tracce seguenti sono state aggiornate"
+
+#. gint id,
+#. gboolean modal,
+#: ../src/file.c:1507
+msgid "Successful Track Update"
+msgstr "Aggiornamento delle tracce completato con successo"
+
+#: ../src/file.c:1566
+#, c-format
+msgid "No mserv information could be retrieved for the following track"
+msgid_plural ""
+"No mserv information could be retrieved for the following %d tracks"
+msgstr[0] ""
+"Non è stato possibile raccogliere alcuna informazione mserv per la traccia "
+"seguente"
+msgstr[1] ""
+"Non è stato possibile raccogliere alcuna informazione mserv per le %d tracce "
+"seguenti"
+
+#. gint id,
+#. gboolean modal,
+#: ../src/file.c:1572
+msgid "mserv data retrieval problem"
+msgstr "problemi nel raccogliere le informazioni mserv"
+
+#: ../src/file.c:1661
+msgid "no local filename available, file on the iPod will be used instead"
+msgstr ""
+"il nome del file locale non è disponibile, al suo posto sarà usato il file "
+"sull'iPod"
+
+#: ../src/file.c:1667
+msgid "no local filename available and copy on iPod cannot be found"
+msgstr ""
+"il nome del file locale non è disponibile e la copia sull'iPod non è stata "
+"trovata"
+
+#: ../src/file.c:1671 ../src/file.c:1689
+msgid "no local filename available"
+msgstr "il nome del file locale non è disponibile"
+
+#: ../src/file.c:1679
+msgid "local file could not be found, file on the iPod will be used instead"
+msgstr ""
+"il file locale non è stato trovato, al suo posto sarà usato il file sull'iPod"
+
+#: ../src/file.c:1685
+msgid "local file as well as copy on the iPod cannot be found"
+msgstr "non è stato trovato né il file locale né la copia sull'iPod"
+
+#. update not successful -- log this track for later display
+#: ../src/file.c:1788
+msgid "update failed (format not supported?)"
+msgstr "aggiornamento fallito (formato non supportato?)"
+
+#: ../src/file.c:1873 ../src/misc_playlist.c:916
+#, c-format
+msgid "Processing '%s'..."
+msgstr "Elaborazione di «%s» in corso..."
+
+#: ../src/file.c:1879
+#, c-format
+msgid "Skipping '%s' because it matches exclude masks.\n"
+msgstr "Salto «%s» perché coincide con le maschere di esclusione.\n"
+
+#: ../src/file.c:1999 ../src/misc_track.c:1773 ../src/misc_track.c:1878
+#, c-format
+msgid ""
+"Podcast already present: '%s'\n"
+"\n"
+msgstr ""
+"Podcast già presente: «%s»\n"
+"\n"
+
+#: ../src/file.c:2064
+#, c-format
+msgid ""
+"Writing to video files not yet supported (%s).\n"
+"\n"
+msgstr ""
+"La scrittura su file video non è ancora supportata (%s).\n"
+"\n"
+
+#: ../src/file.c:2116 ../src/file.c:2130
+#, c-format
+msgid "Couldn't change tags of file: %s\n"
+msgstr "Impossibile cambiare le etichette del file: %s\n"
+
+#: ../src/file.c:2232
+#, c-format
+msgid "Could not open '%s' for reading and writing.\n"
+msgstr "Impossibile aprire il file «%s» in lettura e scrittura.\n"
+
+#: ../src/file.c:2239
+#, c-format
+msgid "Could not obtain lock on '%s'.\n"
+msgstr "Impossibile ottenere il lock su «%s».\n"
+
+#. error!
+#: ../src/file.c:2256 ../src/file.c:2265 ../src/file.c:2276 ../src/file.c:2286
+#, c-format
+msgid "Malformed line in '%s': %s\n"
+msgstr "Linea malformata in «%s»: %s\n"
+
+#. gint id,
+#. gboolean modal,
+#: ../src/file.c:2315
+msgid "Remove offline playcounts?"
+msgstr "Rimuovere i contatori di riproduzioni non in linea?"
+
+#. title
+#: ../src/file.c:2316
+msgid ""
+"Some tracks played offline could not be found in the iTunesDB. Press 'OK' to "
+"remove them from the offline playcount file, 'Cancel' to keep them."
+msgstr ""
+"Alcune tracce riprodotte non in linea non sono state trovate in iTunesDB. "
+"Premere «Ok» per rimuoverle dal file conta riproduzioni non in linea, "
+"«Annulla» per mantenerle."
+
+#: ../src/file.c:2333
+#, c-format
+msgid "Error writing to '%s'.\n"
+msgstr "Errore nella scrittura su «%s».\n"
+
+#: ../src/file.c:2390 ../src/tools.c:270
+#, c-format
+msgid ""
+"Normalization failed: file type not supported (%s).\n"
+"\n"
+msgstr ""
+"Normalizzazione fallita: tipo di file non supportato (%s).\n"
+"\n"
+
+#: ../src/file.c:2406 ../src/tools.c:287
+#, c-format
+msgid ""
+"Normalization failed: file not available (%s).\n"
+"\n"
+msgstr ""
+"Normalizzazione fallita: file non disponibile (%s).\n"
+"\n"
+
+#: ../src/file_convert.c:316
+msgid "Summary status of conversion processes"
+msgstr "Riepilogo dello stato del processo di conversione"
+
+#: ../src/file_convert.c:564
+msgid "active"
+msgstr "attivo"
+
+#: ../src/file_convert.c:569
+msgid "inactive"
+msgstr "non attivo"
+
+#: ../src/file_convert.c:580
+#, c-format
+msgid "Active threads: %d. Scheduled tracks: %d."
+msgstr "Thread attivi: %d. Tracce in coda: %d."
+
+#: ../src/file_convert.c:1071
+#, c-format
+msgid "Original filename not available for '%s.'\n"
+msgstr "Nome del file originale non disponibile per «%s».\n"
+
+#: ../src/file_convert.c:1086
+#, c-format
+msgid "Filename '%s' is no longer valid for '%s'.\n"
+msgstr "Il nome del file «%s» non è più valido per «%s».\n"
+
+#: ../src/file_convert.c:1137
+msgid "Ogg Vorbis"
+msgstr "Ogg Vorbis"
+
+#: ../src/file_convert.c:1143
+msgid "FLAC"
+msgstr "FLAC"
+
+#: ../src/file_convert.c:1198
+#, c-format
+msgid ""
+"Files of type '%s' are not supported by the iPod. Please go to the "
+"Preferences to set up and turn on a suitable conversion script for '%s'.\n"
+"\n"
+msgstr ""
+"I file di tipo «%s» non sono supportati dall'iPod. Andare nelle Preferenze "
+"per impostare ed attivare uno script di conversione adatto per «%s».\n"
+"\n"
+
+#: ../src/file_convert.c:1284
+msgid "No information available"
+msgstr "Nessuna informazione disponibile"
+
+#: ../src/file_convert.c:1323
+#, c-format
+msgid "Could not create '%s'. Filetype conversion will not work.\n"
+msgstr ""
+"Impossibile creare «%s». La conversione del tipo di file non funzionerà.\n"
+
+#: ../src/file_convert.c:1641 ../src/file_convert.c:3049
+#, c-format
+msgid ""
+"Transfer of '%s' failed. %s\n"
+"\n"
+msgstr ""
+"Trasferimento di «%s» fallito. %s\n"
+"\n"
+
+#: ../src/file_convert.c:2047 ../src/file_convert.c:2325
+#, c-format
+msgid ""
+"Conversion of '%s' failed: '%s'.\n"
+"\n"
+msgstr ""
+"La conversione di «%s» è fallita: «%s».\n"
+"\n"
+
+#: ../src/file_convert.c:2062
+#, c-format
+msgid ""
+"Conversion of '%s' failed: '%s %s' returned exit status %d.\n"
+"\n"
+msgstr ""
+"La conversione di «%s» è fallita: «%s %s» ha fornito lo stato di uscita %d.\n"
+"\n"
+
+#: ../src/file_convert.c:2091
+#, c-format
+msgid ""
+"Conversion of '%s' failed: '\"%s\" %s' did not return filename extension as "
+"expected.\n"
+"\n"
+msgstr ""
+"La conversione di «%s» è fallita: «\"%s\" %s» non ha fornito l'estensione "
+"del nome del file come previsto.\n"
+"\n"
+
+#: ../src/file_convert.c:2167
+#, c-format
+msgid ""
+"Conversion of '%s' failed: Could not access original file '%s' (%s).\n"
+"\n"
+msgstr ""
+"La conversione di «%s» è fallita: impossibile accedere al file originale «%"
+"s» (%s).\n"
+"\n"
+
+#: ../src/file_convert.c:2222
+#, c-format
+msgid ""
+"Conversion of '%s' failed: Could not create directory '%s'.\n"
+"\n"
+msgstr ""
+"La conversione di «%s» è fallita: impossibile creare la directory «%s».\n"
+"\n"
+
+#: ../src/file_convert.c:2356
+#, c-format
+msgid ""
+"Conversion of '%s' failed: '%s' returned exit status %d.\n"
+"\n"
+msgstr ""
+"La conversione di «%s» è fallita: «%s» ha restituito lo stato %d.\n"
+"\n"
+
+#: ../src/file_convert.c:2395
+#, c-format
+msgid ""
+"Conversion of '%s' failed: could not stat the converted file '%s'.\n"
+"\n"
+msgstr ""
+"La conversione di «%s» è fallita: impossibile eseguire stat sul file "
+"convertito «%s».\n"
+"\n"
+
+#: ../src/file_export.c:182
+#, c-format
+msgid "Skipping existing file with same length: '%s'\n"
+msgstr "Saltato il file esistente con la stessa lunghezza: «%s»\n"
+
+#: ../src/file_export.c:190
+#, c-format
+msgid "Overwriting existing file: '%s'\n"
+msgstr "Sovrascrittura del file esistente: «%s»\n"
+
+#: ../src/file_export.c:207
+#, c-format
+msgid "Error copying '%s' to '%s': Permission Error (%s)\n"
+msgstr "Errore nella copia di «%s» su «%s»: Errore nei permessi (%s)\n"
+
+#: ../src/file_export.c:209
+#, c-format
+msgid "Error copying '%s' to '%s' (%s)\n"
+msgstr "Errore nella copia di «%s» su «%s» (%s)\n"
+
+#: ../src/file_export.c:327
+#, c-format
+msgid "Could find file for '%s' on the iPod\n"
+msgstr "Impossibile trovare il file per «%s» sull'iPod\n"
+
+#. create the dialog window
+#: ../src/file_export.c:395 ../src/tools.c:360
+msgid "Information"
+msgstr "Informazioni"
+
+#: ../src/file_export.c:406 ../src/tools.c:372
+msgid "Press button to abort."
+msgstr "Premere il bottone per interrompere."
+
+#: ../src/file_export.c:419
+msgid "copying..."
+msgstr "copia in corso..."
+
+#: ../src/file_export.c:476
+#, c-format
+msgid "Failed to write '%s-%s'\n"
+msgstr "Impossibile scrivere «%s-%s»\n"
+
+#: ../src/file_export.c:489
+#, c-format
+msgid "Copied %d of %d track."
+msgid_plural "Copied %d of %d tracks."
+msgstr[0] "Copiata traccia %d di %d."
+msgstr[1] "Copiata traccia %d di %d."
+
+#: ../src/file_export.c:505 ../src/tools.c:518
+#, c-format
+msgid "%d%% (%d:%02d:%02d left)"
+msgstr "%d%% (%d:%02d:%02d rimasti)"
+
+#: ../src/file_export.c:514
+msgid "Some tracks were not copied."
+msgstr "Alcune tracce non sono state copiate."
+
+#: ../src/file_export.c:579
+msgid "Export from iPod database not possible in offline mode."
+msgstr ""
+"L'esportazione dal database dell'iPod non è possibile in modalità non in "
+"linea."
+
+#: ../src/file_export.c:587
+msgid "Select Export Destination Directory"
+msgstr "Selezionare la directory di destinazione dell'esportazione"
+
+#: ../src/file_export.c:736
+msgid "Drag from iPod database not possible in offline mode."
+msgstr ""
+"Impossibile trascinare dal database dell'iPod in modalità non in linea."
+
+#: ../src/file_export.c:770
+msgid "The following tracks have to be copied to your harddisk"
+msgstr "Le tracce seguenti devono essere copiate sul disco fisso"
+
+#: ../src/file_export.c:815
+msgid ""
+"Some tracks were not copied to your harddisk. Only the copied tracks will be "
+"included in the current drag and drop operation.\n"
+"\n"
+msgstr ""
+"Alcune tracce non sono state copiate sul disco fisso. Solo le tracce copiate "
+"saranno incluse nell'operazione attuale di trascinamento.\n"
+"\n"
+
+#: ../src/file_export.c:1010
+#, c-format
+msgid ""
+"No valid filename for: %s\n"
+"\n"
+msgstr ""
+"Nessuno nome di file valido per: %s\n"
+"\n"
+
+#: ../src/file_export.c:1026
+#, c-format
+msgid "Created playlist with one track."
+msgid_plural "Created playlist with %d tracks."
+msgstr[0] "Creata la playlist con una traccia."
+msgstr[1] "Creata la playlist con %d tracce."
+
+#: ../src/file_export.c:1031
+#, c-format
+msgid ""
+"Could not open '%s' for writing (%s).\n"
+"\n"
+msgstr ""
+"Impossibile aprire il file «%s» in scrittura (%s).\n"
+"\n"
+
+#: ../src/file_itunesdb.c:129
+#, c-format
+msgid "Matching SHA1 checksum for file %d/%d"
+msgstr "Confronto delle somme di controllo SHA1 per il file %d di %d"
+
+#: ../src/file_itunesdb.c:236
+#, c-format
+msgid "Could not open \"%s\" for reading extended info.\n"
+msgstr "Impossibile aprire «%s» per la lettura delle informazioni estese.\n"
+
+#: ../src/file_itunesdb.c:243
+msgid "Could not create hash value from itunesdb\n"
+msgstr "Impossibile creare il valore di hash da itunesdb\n"
+
+#: ../src/file_itunesdb.c:259
+#, c-format
+msgid "Error while reading extended info: %s\n"
+msgstr "Errore nella lettura delle informazioni estese: %s\n"
+
+#: ../src/file_itunesdb.c:276
+#, c-format
+msgid ""
+"iTunesDB '%s' does not match checksum in extended information file '%s'\n"
+"gtkpod will try to match the information using SHA1 checksums. This may take "
+"a long time.\n"
+"\n"
+msgstr ""
+"iTunesDB «%s» ha una somma di controllo diversa da quella nel file con le "
+"informazioni estese «%s»\n"
+" gtkpod proverà a confrontare le informazioni usando somme di controllo "
+"SHA1. Questo può richiedere molto tempo.\n"
+"\n"
+
+#: ../src/file_itunesdb.c:288
+#, c-format
+msgid ""
+"%s:\n"
+"Expected \"itunesdb_hash=\" but got:\"%s\"\n"
+msgstr ""
+"%s:\n"
+"Atteso «itunesdb_hash=» ma trovato: «%s»\n"
+
+#: ../src/file_itunesdb.c:348
+#, c-format
+msgid ""
+"%s:\n"
+"Format error: %s\n"
+msgstr ""
+"%s:\n"
+"Errore nel formato: %s\n"
+
+#: ../src/file_itunesdb.c:393
+msgid ""
+"No SHA1 checksums on individual tracks are available.\n"
+"\n"
+"To avoid this situation in the future either switch on duplicate detection "
+"(will provide SHA1 checksums) or avoid using the iPod with programs other "
+"than gtkpod.\n"
+"\n"
+msgstr ""
+"Non sono disponibili somme di controllo SHA1 individuali per le tracce.\n"
+"\n"
+"Nel futuro, per evitare questa situazione, usare l'opzione di rilevamento "
+"dei duplicati (aggiungerà somme di controllo SHA1) oppure evitate di usare "
+"l'iPod con programmi diversi da gtkpod.\n"
+"\n"
+
+#: ../src/file_itunesdb.c:457
+msgid ""
+"Extended info will not be used. If you have non-transferred tracks,\n"
+"these will be lost.\n"
+msgstr ""
+"Le informazioni estese non verranno usate. Le tracce non trasferite verranno "
+"perse.\n"
+
+#: ../src/file_itunesdb.c:465
+msgid "Offline iPod database successfully imported"
+msgstr "Database non in linea dell'iPod importato con successo"
+
+#: ../src/file_itunesdb.c:468
+msgid "Local database successfully imported"
+msgstr "Database locale importato con successo"
+
+#: ../src/file_itunesdb.c:476
+#, c-format
+msgid ""
+"Offline iPod database import failed: '%s'\n"
+"\n"
+msgstr ""
+"Importazione del database non in linea dell'iPod fallita: «%s» \n"
+"\n"
+
+#: ../src/file_itunesdb.c:480
+#, c-format
+msgid ""
+"Local database import failed: '%s'\n"
+"\n"
+msgstr ""
+"Importazione del database locale fallita: «%s»\n"
+"\n"
+
+#: ../src/file_itunesdb.c:487
+msgid ""
+"Offline iPod database import failed: \n"
+"\n"
+msgstr ""
+"Importazione del database non in linea dell'iPod fallita: \n"
+"\n"
+
+#: ../src/file_itunesdb.c:490
+msgid ""
+"Local database import failed: \n"
+"\n"
+msgstr ""
+"Importazione del database locale fallita:\n"
+"\n"
+
+#: ../src/file_itunesdb.c:497
+#, c-format
+msgid ""
+"'%s' does not exist. Import aborted.\n"
+"\n"
+msgstr ""
+"«%s» non esiste. Importazione interrotta.\n"
+"\n"
+
+#: ../src/file_itunesdb.c:520
+msgid "Extended info will not be used.\n"
+msgstr "Le informazioni estese non verranno usate.\n"
+
+#: ../src/file_itunesdb.c:527
+msgid "iPod Database Successfully Imported"
+msgstr "Database dell'iPod importato con successo"
+
+#: ../src/file_itunesdb.c:534
+#, c-format
+msgid ""
+"iPod Database Import Failed: '%s'\n"
+"\n"
+msgstr ""
+"Importazione del database dell'iPod fallita: «%s»\n"
+"\n"
+
+#: ../src/file_itunesdb.c:540
+msgid ""
+"iPod Database Import Failed.\n"
+"\n"
+msgstr ""
+"Importazione del database dell'iPod fallita.\n"
+"\n"
+
+#: ../src/file_itunesdb.c:549
+#, c-format
+msgid ""
+"'%s' (or similar) does not exist. Import aborted.\n"
+"\n"
+msgstr ""
+"«%s» (o simile) non esiste. Importazione interrotta.\n"
+"\n"
+
+#: ../src/file_itunesdb.c:865
+#, c-format
+msgid ""
+"Could not find iPod directory structure at '%s'.\n"
+"If you are sure that the iPod is properly mounted at '%s', gtkpod can create "
+"the directory structure for you.\n"
+"\n"
+"Do you want to create the directory structure now?\n"
+msgstr ""
+"Impossibile trovare la struttura delle directory dell'iPod in «%s».\n"
+"Se si è sicuri che l'iPod sia montato correttamente in «%s», gtkpod può "
+"creare la struttura delle directory.\n"
+"\n"
+"Si desidera creare la struttura delle directory ora?\n"
+
+#: ../src/file_itunesdb.c:1180
+#, c-format
+msgid "Could not open \"%s\" for writing extended info.\n"
+msgstr "Impossibile aprire «%s» per la scrittura delle informazioni estese.\n"
+
+#: ../src/file_itunesdb.c:1195
+msgid "Aborted writing of extended info.\n"
+msgstr "Scrittura delle informazioni estese interrotta.\n"
+
+#: ../src/file_itunesdb.c:1397
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: ../src/file_itunesdb.c:1411
+#, c-format
+msgid "%d%% (%d/%d  %d:%02d:%02d left)"
+msgstr "%d%% (%d/%d  %d:%02d:%02d rimasti)"
+
+#: ../src/file_itunesdb.c:1463
+msgid "Status: Deleting File"
+msgstr "Status: eliminazione file in corso"
+
+#: ../src/file_itunesdb.c:1524
+#, c-format
+msgid ""
+"Could not remove the following file: '%s'\n"
+"\n"
+msgstr ""
+"Impossibile rimuovere il file seguente: «%s»\n"
+"\n"
+
+#: ../src/file_itunesdb.c:1632
+msgid ""
+"The following track could not be converted successfully:\n"
+"\n"
+msgid_plural ""
+"The following tracks could not be converted successfully:\n"
+"\n"
+msgstr[0] ""
+"La traccia seguente non è stata convertita con successo:\n"
+"\n"
+msgstr[1] ""
+"Le tracce seguenti non sono state convertite con successo:\n"
+"\n"
+
+#: ../src/file_itunesdb.c:1642
+msgid ""
+"The following track could not be transferred successfully:\n"
+"\n"
+msgid_plural ""
+"The following tracks could not be transferred successfully:\n"
+"\n"
+msgstr[0] ""
+"La traccia seguente non è stata trasferita con successo:\n"
+"\n"
+msgstr[1] ""
+"Le tracce seguenti non sono state trasferite con successo:\n"
+"\n"
+
+#. ID
+#. modal,
+#. gint id,
+#. gboolean modal,
+#: ../src/file_itunesdb.c:1651 ../src/misc_confirm.c:70
+msgid "Warning"
+msgstr "Attenzione"
+
+#. title
+#: ../src/file_itunesdb.c:1652
+msgid ""
+"The iPod could not be ejected. Please fix the problems mentioned below and "
+"then eject the iPod again. Pressing 'OK' will re-schedule the failed tracks "
+"for conversion and transfer."
+msgstr ""
+"Impossibile espellere l'iPod. Correggere i problemi menzionati sotto e poi "
+"espellere di nuovo l'iPod. Premendo «Ok» le tracce mancanti saranno di nuovo "
+"messe in coda per la conversione e il trasferimento."
+
+#: ../src/file_itunesdb.c:1715
+#, c-format
+msgid "Status: Copying track"
+msgstr "Status: copia traccia in corso"
+
+#: ../src/file_itunesdb.c:1721
+#, c-format
+msgid "Status: Waiting for conversion to complete"
+msgstr "Status: in attesa del completamento della conversione"
+
+#: ../src/file_itunesdb.c:1725
+#, c-format
+msgid "Status: Finished transfer"
+msgstr "Status: trasferimento completato"
+
+#: ../src/file_itunesdb.c:1770
+#, c-format
+msgid ""
+"One track could not be transferred because your iPod is full. Either delete "
+"some tracks or otherwise create space on the iPod before ejecting the iPod "
+"again."
+msgid_plural ""
+"%d tracks could not be transferred because your iPod is full. Either delete "
+"some tracks or otherwise create space on the iPod before ejecting the iPod "
+"again."
+msgstr[0] ""
+"Non è stato possibile trasferire una traccia perché l'iPod è pieno. "
+"Cancellare alcune tracce oppure creare spazio sull'iPod in altro modo prima "
+"di espellerlo di nuovo."
+msgstr[1] ""
+"Non è stato possibile trasferire %d tracce perché l'iPod è pieno. Cancellare "
+"alcune tracce oppure creare spazio sull'iPod in altro modo prima di "
+"espellerlo di nuovo."
+
+#: ../src/file_itunesdb.c:1852
+#, c-format
+msgid ""
+"You did not import the existing iTunesDB ('%s'). This is most likely "
+"incorrect and will result in the loss of the existing database.\n"
+"\n"
+"Press 'OK' if you want to proceed anyhow or 'Cancel' to skip storing. If you "
+"cancel, you can import the existing database before calling this function "
+"again.\n"
+msgstr ""
+"Non si è importato l'iTunesDB esistente («%s»). Questo è quasi certamente "
+"sbagliato e porterà alla perdita del database esistente.\n"
+"\n"
+"Premere «Ok» se si vuole procedere comunque o «Annulla» se si vuole "
+"interrompere l'operazione. Se la si interrompe, si può importare il database "
+"esistente prima di richiamare di nuovo questa funzione.\n"
+
+#: ../src/file_itunesdb.c:1887
+msgid ""
+"iPod directory structure must be present before synching to the iPod can be "
+"performed.\n"
+msgstr ""
+"La struttura delle directory dell'iPod deve essere presente prima che la "
+"sincronizzazione verso l'iPod possa essere eseguita.\n"
+
+#: ../src/file_itunesdb.c:1896
+msgid "Some tracks could not be deleted from the iPod. Export aborted!"
+msgstr ""
+"Alcune tracce non possono essere cancellate dall'iPod. Esportazione "
+"interrotta!"
+
+#: ../src/file_itunesdb.c:1914
+#, c-format
+msgid "Now writing database '%s'. Please wait..."
+msgstr "Scrittura del database «%s» in corso. Attendere prego..."
+
+#: ../src/file_itunesdb.c:1963
+#, c-format
+msgid "Extended information file not deleted: '%s'"
+msgstr "Il file con le informazioni estese non è stato cancellato: «%s»"
+
+#: ../src/file_itunesdb.c:2070
+#, c-format
+msgid "%s: Database saved"
+msgstr "%s: database salvato"
+
+#: ../src/file_itunesdb.c:2074
+#, c-format
+msgid "%s: Changes saved"
+msgstr "%s: modifiche salvate"
+
+#: ../src/fileselection.c:129
+msgid "Successfully added files"
+msgstr "File aggiunti con successo"
+
+#: ../src/fileselection.c:131
+msgid "Some files were not added successfully"
+msgstr "Alcuni file non sono stati aggiunti con successo"
+
+#: ../src/fileselection.c:164 ../src/fileselection.c:305
+#: ../src/fileselection.c:792
+msgid "Please select a playlist or repository before adding tracks."
+msgstr "Selezionare una playlist o un archivio prima di aggiungere le tracce."
+
+#: ../src/fileselection.c:175 ../src/fileselection.c:314
+#: ../src/fileselection.c:803
+msgid "Please load the iPod before adding tracks."
+msgstr "Leggere l'iPod  prima di aggiungere le tracce."
+
+#: ../src/fileselection.c:185
+#, c-format
+msgid "Add files to '%s'"
+msgstr "Aggiungi file a «%s»"
+
+#: ../src/fileselection.c:189
+#, c-format
+msgid "Add files to '%s/%s'"
+msgstr "Aggiungi file a «%s/%s»"
+
+#. Create window title
+#: ../src/fileselection.c:322
+#, c-format
+msgid "Add playlist files to '%s'"
+msgstr "Aggiungi un file di playlist a «%s»"
+
+#. Create the file chooser, and handle the response
+#: ../src/fileselection.c:378
+msgid "Set Cover"
+msgstr "Imposta copertina"
+
+#: ../src/fileselection.c:816
+#, c-format
+msgid "Add directories to '%s'"
+msgstr "Aggiungi directory a «%s»"
+
+#: ../src/fileselection.c:820
+#, c-format
+msgid "Add directories to '%s/%s'"
+msgstr "Aggiungi directory a «%s/%s»"
+
+#: ../src/fileselection.c:1097
+msgid "Ok"
+msgstr "Ok"
+
+#: ../src/fileselection.c:1106
+msgid "Cancel"
+msgstr "Annulla"
+
+#: ../src/flacfile.c:62
+#, c-format
+msgid "'%s' does not appear to be an FLAC audio file.\n"
+msgstr "«%s» non sembra essere un file audio FLAC.\n"
+
+#: ../src/flacfile.c:78
+#, c-format
+msgid "Error retrieving tags for '%s'.\n"
+msgstr "Errore nel recupero delle etichette per «%s».\n"
+
+#: ../src/flacfile.c:165
+#, c-format
+msgid ""
+"Import of '%s' failed: FLAC not supported without the FLAC library. You must "
+"compile the gtkpod source together with the FLAC library.\n"
+msgstr ""
+"Importazione di «%s» fallita: FLAC non è supportato senza la libreria FLAC. "
+"Devi compilare i sorgenti di gtkpod insieme alla libreria FLAC.\n"
+
+#: ../src/flacfile.c:171
+#, c-format
+msgid ""
+"FLAC metadata update for '%s' failed: FLAC not supported without the FLAC "
+"library. You must compile the gtkpod source together with the FLAC library.\n"
+msgstr ""
+"Aggiornamento fallito dei metadati FLAC per «%s»: FLAC non è supportati "
+"senza la libreria FLAC. Devi compilare i sorgenti di gtkpod insieme alla "
+"libreria FLAC.\n"
+
+#: ../src/getopt.c:681
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: l'opzione «%s» è ambigua\n"
+
+#: ../src/getopt.c:706
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: l'opzione «--%s» non ammette argomenti\n"
+
+#: ../src/getopt.c:711
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: l'opzione «%c%s» non ammette argomenti\n"
+
+#: ../src/getopt.c:729 ../src/getopt.c:902
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: l'opzione «%s» richiede un argomento\n"
+
+#. --option
+#: ../src/getopt.c:758
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: opzione sconosciuta «--%s»\n"
+
+#. +option or -option
+#: ../src/getopt.c:762
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: opzione sconosciuta «%c%s»\n"
+
+#. 1003.2 specifies the format of this message.
+#: ../src/getopt.c:788
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: opzione illegale -- %c\n"
+
+#: ../src/getopt.c:791
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: opzione non valida -- %c\n"
+
+#. 1003.2 specifies the format of this message.
+#: ../src/getopt.c:821 ../src/getopt.c:951
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: l'opzione richiede un argomento -- %c\n"
+
+#: ../src/getopt.c:868
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: l'opzione «-W %s» è ambigua\n"
+
+#: ../src/getopt.c:886
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: l'opzione «-W %s» non ammette argomenti\n"
+
+#: ../src/info.c:383
+msgid "n/c"
+msgstr "n.c."
+
+#: ../src/info.c:388 ../src/info.c:838
+msgid "offline"
+msgstr "non in linea"
+
+#: ../src/info.c:486
+#, c-format
+msgid " P:%d T:%d/%d"
+msgstr " P:%d T:%d/%d"
+
+#: ../src/info.c:780
+msgid "B"
+msgstr "B"
+
+#: ../src/info.c:780
+msgid "kB"
+msgstr "kB"
+
+#: ../src/info.c:780
+msgid "TB"
+msgstr "TB"
+
+#: ../src/info.c:823
+#, c-format
+msgid " %s Free"
+msgstr "%s liberi"
+
+#: ../src/info.c:828
+#, c-format
+msgid " %s Pending"
+msgstr " %s in sospeso"
+
+#: ../src/info.c:833
+msgid " disconnected"
+msgstr " scollegato"
+
+#: ../src/info.c:884
+msgid "No database or playlist selected"
+msgstr "Nessun database o playlist selezionato"
+
+#: ../src/info.c:889
+msgid "No tracks selected"
+msgstr "Nessuna traccia selezionata"
+
+#: ../src/info.c:894
+msgid "No playlist selected"
+msgstr "Nessuna playlist selezionata"
+
+#: ../src/info.c:899
+msgid "No iPod or iPod playlist selected"
+msgstr "Nessun iPod o playlist di iPod selezionato"
+
+#. Strings used several times
+#: ../src/ipod_init.c:48
+msgid "Select or enter your model"
+msgstr "Scegliere o inserire il modello"
+
+#: ../src/ipod_init.c:79 ../src/repository.c:546 ../src/repository.c:2369
+msgid "Select mountpoint"
+msgstr "Selezionare il punto di mount"
+
+#: ../src/ipod_init.c:359
+#, c-format
+msgid "Error initialising iPod: %s\n"
+msgstr "Errore nell'inizializzazione dell'iPod: «%s».\n"
+
+#: ../src/ipod_init.c:366
+msgid "Error initialising iPod, unknown error\n"
+msgstr "Errore nell'inizializzazione dell'iPod, errore sconosciuto\n"
+
+#: ../src/ipod_init.c:422
+#, c-format
+msgid "<b>Please select your iPod model at </b><i>%s</i>"
+msgstr "<b>Scegliere il modello di iPod in </b><i>%s</i>"
+
+#: ../src/ipod_init.c:463
+msgid ""
+"Could not determine the model you selected -- this could be a bug or "
+"incompatibilty in the GTK+ or glade library.\n"
+"\n"
+msgstr ""
+"Impossibile determinare il modello che è stato selezionato -- potrebbe "
+"essere un bug o un'incompatibilità nelle librerie GTK+ o glade.\n"
+"\n"
+
+#: ../src/misc.c:70
+msgid ""
+"© 2002 - 2007\n"
+"Jorg Schuler (jcsjcs at users dot sourceforge dot net)\n"
+"Corey Donohoe (atmos at atmos dot org)\n"
+msgstr ""
+"© 2002 - 2007\n"
+"Jorg Schuler (jcsjcs at users dot sourceforge dot net)\n"
+"Corey Donohoe (atmos at atmos dot org)\n"
+
+#: ../src/misc.c:74
+msgid ""
+"Patches were supplied by the following people (list may be incomplete -- "
+"please contact me)\n"
+msgstr ""
+"Correzioni sono state fornite dalle seguenti persone (la lista potrebbe "
+"essere incompleta -- per favore contattatemi)\n"
+
+#: ../src/misc.c:75
+msgid "Ramesh Dharan: Multi-Edit (edit tags of several tracks in one run)"
+msgstr ""
+"Ramesh Dharan: Multi-Edit (modifica le etichette di diverse tracce in una "
+"volta)"
+
+#: ../src/misc.c:76
+msgid "Hiroshi Kawashima: Japanese charset autodetection feature"
+msgstr "Hiroshi Kawashima: riconoscimento automatico della codifica giapponese"
+
+#: ../src/misc.c:77
+msgid "Adrian Ulrich: porting of playlist code from mktunes.pl to itunesdb.c"
+msgstr ""
+"Adrian Ulrich: porting del codice della playlist da mktunes.pl a itunesdb.c"
+
+#: ../src/misc.c:78
+msgid ""
+"Walter Bell: correct handling of DND URIs with escaped characters and/or cr/"
+"newlines at the end"
+msgstr ""
+"Waiter Bell: trattamento corretto dei DND di URI con la presenza di "
+"caratteri di escape e/o cr/nuova linea alla fine"
+
+#: ../src/misc.c:79
+msgid "Sam Clegg: user defined filenames when exporting tracks from the iPod"
+msgstr ""
+"Sam Clegg: nomi dei file decisi dall'utente per l'esportazione delle tracce "
+"dall'iPod"
+
+#: ../src/misc.c:80
+msgid "Chris Cutler: automatic creation of various playlist types"
+msgstr "Chris Cutler: creazione automatica di diversi tipi di playlist"
+
+#: ../src/misc.c:81
+msgid ""
+"Graeme Wilford: reading and writing of the 'Composer' ID3 tags, progress "
+"dialogue during sync"
+msgstr ""
+"Graeme Wilford: lettura e scrittura dell'etichetta ID3 «Compositore», barra "
+"di avanzamento durante la sincronizzazione"
+
+#: ../src/misc.c:82
+msgid ""
+"Edward Matteucci: debugging, special playlist creation, most of the volume "
+"normalizing code"
+msgstr ""
+"Edward Matteucci: debugging, creazione delle playlist speciali, buona parte "
+"del codice relativo alla normalizzazione"
+
+#: ../src/misc.c:83
+msgid "Jens Lautenbach: some optical improvements"
+msgstr "Jens Lautenbach: alcuni miglioramenti ottici"
+
+#: ../src/misc.c:84
+msgid "Alex Tribble: iPod eject patch"
+msgstr "Alex Tribble: patch per l'espulsione dell'iPod"
+
+#: ../src/misc.c:85
+msgid "Yaroslav Halchenko: Orphaned and dangling tracks handling"
+msgstr "Yaroslav Halchenko: gestione delle tracce orfane e fantasma"
+
+#: ../src/misc.c:86
+msgid ""
+"Andrew Huntwork: Filename case sensitivity fix and various other bugfixes"
+msgstr ""
+"Andrew Huntwork: correzione di maiuscole/minuscole nei nomi dei file e "
+"correzione di vari altri bug"
+
+#: ../src/misc.c:87
+msgid ""
+"Ero Carrera: Filename validation and quick sync when copying tracks from the "
+"iPod"
+msgstr ""
+"Ero Carrera: validazione dei nomi dei file e sincronizzazione rapida nella "
+"copia delle tracce dall'iPod"
+
+#: ../src/misc.c:88
+msgid "Jens Taprogge: Support for LAME's replay gain tag to normalize volume"
+msgstr ""
+"Jens Taprogge: supporto per l'etichetta per il guadagno di riproduzione di "
+"LAME per normalizzare il volume"
+
+#: ../src/misc.c:89
+msgid "Armando Atienza: Support with external playcounts"
+msgstr "Armando Atienza: supporto per i contatori di riproduzione esterni"
+
+#: ../src/misc.c:90
+msgid "D.L. Sharp: Support for m4b files (bookmarkable AAC files)"
+msgstr "D.L. Sharp: supporto per i file m4b (file AAC con segnalibri)"
+
+#: ../src/misc.c:91
+msgid "Jim Hall: Decent INSTALL file"
+msgstr "Jim Hall: un file INSTALL decente"
+
+#: ../src/misc.c:92
+msgid ""
+"Juergen Helmers, Markus Gaugusch: Conversion scripts to sync calendar/"
+"contacts to the iPod"
+msgstr ""
+"Juergen Helmers, Markus Gaugusch: script di conversione per sincronizzare "
+"calendari e contatti con l'iPod"
+
+#. J"urgen!
+#: ../src/misc.c:93
+msgid "Flavio Stanchina: bugfixes"
+msgstr "Flavio Stanchina: correzione di bug"
+
+#: ../src/misc.c:94
+msgid ""
+"Chris Micacchi: when sorting ignore 'the' and similar at the beginning of "
+"the title"
+msgstr ""
+"Chris Micacchi: ignora «the» e cose simili all'inizio del titolo durante "
+"l'ordinamento"
+
+#: ../src/misc.c:95
+msgid "Steve Jay: use statvfs() instead of df (better portability, faster)"
+msgstr ""
+"Steve Jay: usa statvfs() invece di df (migliore portabilità, più veloce)"
+
+#: ../src/misc.c:97
+msgid ""
+"Christoph Kunz: address compatibility issues when writing id3v2.4 type mp3 "
+"tags"
+msgstr ""
+"Christoph Kunz: risoluzione dei problemi di compatibilità nella scrittura "
+"delle etichette mp3 di tipo id3v2.4"
+
+#: ../src/misc.c:99
+msgid ""
+"James Liggett:\n"
+"replacement of old GTK file selection dialogs with new GTK filechooser "
+"dialogs\n"
+"refactored user preferences system."
+msgstr ""
+"James Ligget:\n"
+"sostituzione dei vecchi «GTK file selection dialog» con i nuovi «GTK "
+"filechooser dialog»\n"
+"rifacimento del sistema di preferenze dell'utente."
+
+#: ../src/misc.c:103
+msgid "Daniel Kercher: sync scripts for abook and webcalendar"
+msgstr "Daniel Kercher: script di sincronizzazione per abook e webcalendar"
+
+#: ../src/misc.c:105
+msgid "Clinton Gormley: sync scripts for thunderbird"
+msgstr "Clinton Gormley: script di sincronizzazione per thunderbird"
+
+#: ../src/misc.c:107
+msgid "Sebastien Beridot: sync script for ldif addressbook format"
+msgstr ""
+"Sebastien Beridot: script di sincronizzazione per la rubrica in formato ldif "
+
+#: ../src/misc.c:109
+msgid "Sebastian Scherer: sync script for kNotes"
+msgstr "Sebastian Scherer: script di sincronizzazione per kNotes"
+
+#: ../src/misc.c:111
+msgid "Nick Piper: sync script for Palm, type-ahead search"
+msgstr "Nick Piper: script di sincronizzazione per Palm, ricerca type-ahead"
+
+#: ../src/misc.c:113
+msgid "Uwe Hermann: help with support for iPod Video"
+msgstr "Uwe Hermann: aiuto nel supporto per l'iPod Video"
+
+#: ../src/misc.c:115
+msgid ""
+"Iain Benson: support for compilation tag in mp3 files and separate display "
+"of compilations in the sort tab."
+msgstr ""
+"Iain Benson: supporto per l'etichetta compilation nei file mp3 e "
+"visualizzazione separata delle compilation nella scheda di ordinamento."
+
+#: ../src/misc.c:116
+msgid ""
+"Nicolas Chariot: icons of buttons\n"
+"\n"
+msgstr ""
+"Nicolas Chariot: icone dei bottoni\n"
+"\n"
+
+#: ../src/misc.c:118
+msgid "This program borrows code from the following projects:"
+msgstr "Questo programma prende in prestito codice dai seguenti progetti:"
+
+#: ../src/misc.c:119
+msgid ""
+"gnutools: (mktunes.pl, ported to C) reading and writing of iTunesDB  (http://"
+"www.gnu.org/software/gnupod/)"
+msgstr ""
+"gnutools: (mktunes.pl, portato in C) lettura e scrittura di iTunesDB (http://"
+"www.gnu.org/software/gnupod/)"
+
+#: ../src/misc.c:120
+msgid ""
+"iPod.cpp, iPod.h by Samuel Wood (sam dot wood at gmail dot com): some code "
+"for smart playlists is based on his C++-classes."
+msgstr ""
+"iPod.cpp, iPod.h di Samuel Wood (sam dot wood at gmail dot com): una "
+"partedel codice per le playlist intelligenti è basata sulle sue classi in C+"
+"+."
+
+#: ../src/misc.c:121
+msgid "mp3info: mp3 playlength detection (http://ibiblio.org/mp3info/)"
+msgstr ""
+"mp3info:  rilevazione della durata dei brani mp3 (http://ibiblio.org/"
+"mp3info/)"
+
+#: ../src/misc.c:122
+msgid "xmms: dirbrowser, mp3 playlength detection (http://www.xmms.org)"
+msgstr ""
+"xmms: sfoglia directory, rilevazione della durata dei brani mp3 (http://www."
+"xmms.org)"
+
+#: ../src/misc.c:124
+msgid "The GUI was created with the help of glade-2 (http://glade.gnome.org/)."
+msgstr ""
+"La GUI è stata creata con l'aiuto di glade-2 (http://glade.gnome.org/)."
+
+#: ../src/misc.c:128
+msgid "French: David Le Brun (david at dyn-ns dot net)"
+msgstr "Francese: David Le Brun (david at dyn-ns dot net)"
+
+#: ../src/misc.c:129
+msgid "French: Éric Lassauge (rpmfarm at free dot fr)"
+msgstr "Francese: Éric Lassauge (rpmfarm at free dot fr)"
+
+#: ../src/misc.c:130
+msgid "German: Jorg Schuler (jcsjcs at users dot sourceforge dot net)"
+msgstr "Tedesco: Jorg Schuler (jcsjcs at users dot sourceforge dot net)"
+
+#: ../src/misc.c:131
+msgid "German: Kai-Ove"
+msgstr "Tedesco: Kai-Ove"
+
+#: ../src/misc.c:132
+msgid "Hebrew: Assaf Gillat (gillata at gmail dot com)"
+msgstr "Ebraico: Assaf Gillat (gillata at gmail dot com)"
+
+#: ../src/misc.c:133
+msgid ""
+"Italian: Edward Matteucci (edward_matteucc at users dot sourceforge dot net)"
+msgstr ""
+"Italiano: Edward Matteucci (edward_matteucc at users dot sourceforge dot)"
+
+#: ../src/misc.c:134
+msgid "Italian: Daniele Forsi (dforsi at gmail dot com)"
+msgstr "Italiano: Daniele Forsi (dforsi at gmail dot com)"
+
+#: ../src/misc.c:135
+msgid "Japanese: Ayako Sano"
+msgstr "Giapponese: Ayako Sano"
+
+#: ../src/misc.c:136
+msgid "Japanese: Kentaro Fukuchi (fukuchi at users dot sourceforge dot net)"
+msgstr "Giapponese: Kentaro Fukuchi (fukuchi at users dot sourceforge dot net)"
+
+#: ../src/misc.c:137
+msgid "Romanian: Alex Eftimie (alexeftimie at gmail dot com)"
+msgstr "Rumeno: Alex Eftimie (alexeftimie at gmail dot com)"
+
+#: ../src/misc.c:138
+msgid "Spanish: Alejandro Lamas Daviña (alejandro.lamas at ific dot uv dot es)"
+msgstr ""
+"Spagnolo: Alejandro Lamas Daviña (alejandro.lamas at ific dot uv dot es)"
+
+#: ../src/misc.c:139
+msgid "Swedish: Stefan Asserhall (stefan.asserhall at comhem dot se)"
+msgstr "Svedese: Stefan Asserhall (stefan.asserhall at comhem dot se)"
+
+#: ../src/misc.c:144
+msgid ""
+"This program is free software; you can redistribute it and/or\n"
+"modify it under the terms of the GNU General Public License as\n"
+"published by the Free Software Foundation; either version 2 of the\n"
+"License, or (at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful, but\n"
+"WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See\n"
+"the GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public\n"
+"License along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA\n"
+"02111-1307, USA."
+msgstr ""
+"Questo programma è software libero; è possibile ridistribuirlo e/o\n"
+"modificarlo secondo i termini della licenza GNU General Public License,\n"
+"come pubblicata dalla Free Software Foundation; versione 2 della licenza,\n"
+"o (a scelta) una versione più recente.\n"
+"\n"
+"Questo programma è distribuito nella speranza che possa risultare utile,\n"
+"ma SENZA ALCUNA GARANZIA, nemmeno la garanzia implicita di\n"
+"COMMERCIABILITÀ o APPLICABILITÀ PER UNO SCOPO PARTICOLARE.\n"
+"Per maggiori dettagli vedere la GNU General Public License.\n"
+"\n"
+"Una copia della GNU General Public License dovrebbe essere stata\n"
+"fornita con questo programma. In caso contrario scrivere a:\n"
+"Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA\n"
+"02111-1307, USA."
+
+#: ../src/misc.c:159
+msgid ""
+"© 2002-2007\n"
+"Jorg Schuler <jcsjcs at users.sourceforge.net>\n"
+"Corey Donohoe <atmos at atmos.org>"
+msgstr ""
+"© 2002-2007\n"
+"Jorg Schuler <jcsjcs at users.sourceforge.net>\n"
+"Corey Donohoe <atmos at atmos.org>"
+
+#: ../src/misc.c:167
+msgid "Cross-platform multilingual interface to Apple's iPod™"
+msgstr "Interfaccia multi-lingua e multi-piattaforma per Apple iPod™"
+
+#: ../src/misc.c:934
+#, c-format
+msgid "Could not process '%s' (no filename available)"
+msgstr "Impossibile processare «%s» (nessun nome di file disponibile)"
+
+#: ../src/misc.c:1088
+#, c-format
+msgid "Unknown token '%%%c' in template '%s'"
+msgstr "Segnaposto sconosciuto «%%%c» nel modello «%s»"
+
+#: ../src/misc.c:1171
+#, c-format
+msgid "Template ('%s') does not match file type '%s'\n"
+msgstr "Il modello («%s») non coincide con il tipo di file «%s»\n"
+
+#: ../src/misc.c:1257
+#, c-format
+msgid "Error creating %s: %s\n"
+msgstr "Errore nella creazione di %s: %s\n"
+
+#: ../src/misc.c:1691
+#, c-format
+msgid ""
+"Writing preferences file '%s' failed (%s).\n"
+"\n"
+msgstr ""
+"La scrittura del file delle preferenze «%s» è fallita (%s).\n"
+"\n"
+
+#: ../src/misc.c:1693
+msgid "unspecified error"
+msgstr "errore non specificato"
+
+#: ../src/misc.c:1701
+#, c-format
+msgid ""
+"Writing preferences to the iPod (%s) failed: could not get path to Control "
+"Directory.\n"
+"\n"
+msgstr ""
+"La scrittura delle preferenze sull'iPod (%s) è fallita: impossibile "
+"raggiungere il percorso per la Control Directory.\n"
+"\n"
+
+#. title
+#: ../src/misc_confirm.c:71
+msgid "The following has occurred:"
+msgstr "Si è verificato l'errore seguente:"
+
+#: ../src/misc_confirm.c:122
+msgid ""
+"Are you sure you want to delete the following track completely from your "
+"iPod? The number of playlists this track is a member of is indicated in "
+"parentheses."
+msgid_plural ""
+"Are you sure you want to delete the following tracks completely from your "
+"iPod? The number of playlists the tracks are member of is indicated in "
+"parentheses."
+msgstr[0] ""
+"Sei sicuro di voler eliminare completamente la seguente traccia dal tuo "
+"iPod? Il numero di playlist di cui questa traccia fa parte è indicato tra "
+"parentesi."
+msgstr[1] ""
+"Sei sicuro di voler eliminare completamente le seguenti tracce dall'iPod? Il "
+"numero di playlist di cui ognuna di queste tracce fa parte è indicato tra "
+"parentesi."
+
+#: ../src/misc_confirm.c:126
+msgid "Delete Track Completely from iPod?"
+msgid_plural "Delete Tracks Completely from iPod?"
+msgstr[0] "Cancellare completamente la traccia dall'iPod?"
+msgstr[1] "Cancellare completamente le tracce dall'iPod?"
+
+#: ../src/misc_confirm.c:137 ../src/misc_confirm.c:178
+#, c-format
+msgid ""
+"Are you sure you want to remove the following track from the playlist \"%s\"?"
+msgid_plural ""
+"Are you sure you want to remove the following tracks from the playlist \"%s"
+"\"?"
+msgstr[0] "Eliminare veramente la seguente traccia dalla playlist «%s»?"
+msgstr[1] "Eliminare veramente le seguenti tracce dalla playlist «%s»?"
+
+#: ../src/misc_confirm.c:141 ../src/misc_confirm.c:182
+msgid "Remove Track From Playlist?"
+msgid_plural "Remove Tracks From Playlist?"
+msgstr[0] "Rimuovere la traccia dalla playlist?"
+msgstr[1] "Rimuovere le tracce dalla playlist?"
+
+#: ../src/misc_confirm.c:163
+msgid ""
+"Are you sure you want to delete the following track completely from your "
+"harddisk? The number of playlists this track is a member of is indicated in "
+"parentheses."
+msgid_plural ""
+"Are you sure you want to delete the following tracks completely from your "
+"harddisk? The number of playlists the tracks are member of is indicated in "
+"parentheses."
+msgstr[0] ""
+"Sei sicuro di voler eliminare completamente la seguente traccia dal tuo "
+"disco fisso? Il numero di playlist di cui questa traccia fa parte è indicato "
+"tra parentesi."
+msgstr[1] ""
+"Sei sicuro di voler eliminare completamente le seguenti tracce dal tuo disco "
+"fisso? Il numero di playlist di cui ognuna di queste tracce fa parte è "
+"indicato tra parentesi."
+
+#: ../src/misc_confirm.c:167
+msgid "Delete Track from Harddisk?"
+msgid_plural "Delete Tracks from Harddisk?"
+msgstr[0] "Cancellare la traccia dal disco fisso?"
+msgstr[1] "Cancellare le tracce dal disco fisso?"
+
+#: ../src/misc_confirm.c:192
+msgid ""
+"Are you sure you want to remove the following track completely from your "
+"local database? The number of playlists this track is a member of is "
+"indicated in parentheses."
+msgid_plural ""
+"Are you sure you want to remove the following tracks completely from your "
+"local database? The number of playlists the tracks are member of is "
+"indicated in parentheses."
+msgstr[0] ""
+"Sei sicuro di voler eliminare completamente la seguente traccia dal tuo "
+"database locale? Il numero di playlist di cui questa traccia fa parte è "
+"indicato tra parentesi."
+msgstr[1] ""
+"Sei sicuro di voler eliminare completamente le seguenti tracce dal tuo "
+"database locale? Il numero di playlist di cui ognuna di queste tracce fa "
+"parte è indicato tra parentesi."
+
+#: ../src/misc_confirm.c:196
+msgid "Remove Track from Local Database?"
+msgid_plural "Remove Tracks from Local Database?"
+msgstr[0] "Rimuovere la traccia dal database locale?"
+msgstr[1] "Rimuovere le tracce dal database locale?"
+
+#: ../src/misc_confirm.c:261
+#, c-format
+msgid "Deleted one track completely from iPod"
+msgid_plural "Deleted %d tracks completely from iPod"
+msgstr[0] "Cancellata completamente una traccia dall'iPod"
+msgstr[1] "Cancellate completamente %d tracce dall'iPod"
+
+#: ../src/misc_confirm.c:267 ../src/misc_confirm.c:291
+#, c-format
+msgid "Deleted %d track from playlist '%s'"
+msgid_plural "Deleted %d tracks from playlist '%s'"
+msgstr[0] "Cancellata %d traccia dalla playlist «%s»"
+msgstr[1] "Cancellate %d tracce dalla playlist «%s»"
+
+#: ../src/misc_confirm.c:285
+#, c-format
+msgid "Deleted one track from harddisk"
+msgid_plural "Deleted %d tracks from harddisk"
+msgstr[0] "Cancellata una traccia dal disco fisso"
+msgstr[1] "Cancellate %d tracce dal disco fisso"
+
+#: ../src/misc_confirm.c:297
+#, c-format
+msgid "Deleted track from local database"
+msgid_plural "Deleted %d tracks from local database"
+msgstr[0] "Cancellata la traccia dal database locale"
+msgstr[1] "Cancellate %d tracce dal database locale"
+
+#: ../src/misc_confirm.c:442
+msgid "Cannot remove entry 'All'"
+msgstr "Impossibile rimuovere la voce «Tutti»"
+
+#: ../src/misc_confirm.c:536
+#, c-format
+msgid "Removed all %d tracks from the iPod"
+msgstr "Eliminate tutte le %d tracce dall'iPod"
+
+#: ../src/misc_confirm.c:541
+#, c-format
+msgid "Removed all podcasts from the iPod"
+msgstr "Eliminati tutti i podcast dall'iPod"
+
+#: ../src/misc_confirm.c:550 ../src/misc_confirm.c:624
+#, c-format
+msgid "Deleted playlist '%s' including %d member track"
+msgid_plural "Deleted playlist '%s' including %d member tracks"
+msgstr[0] "Cancellata la playlist «%s» con %d traccia appartenente"
+msgstr[1] "Cancellata la playlist «%s» con le %d tracce appartenenti"
+
+#. first use playlist name
+#: ../src/misc_confirm.c:566 ../src/misc_confirm.c:640
+#, c-format
+msgid "Deleted playlist '%s'"
+msgstr "Playlist «%s» eliminata"
+
+#: ../src/misc_confirm.c:600
+#, c-format
+msgid "Deleted playlist '%s' including %d member track on harddisk"
+msgid_plural "Deleted playlist '%s' including %d member tracks on harddisk"
+msgstr[0] ""
+"Cancellata la playlist «%s» con %d traccia appartenente sul disco fisso"
+msgstr[1] ""
+"Cancellata la playlist «%s» con le %d tracce appartenenti sul disco fisso"
+
+#: ../src/misc_confirm.c:617
+#, c-format
+msgid "Removed all %d tracks from the database"
+msgstr "Rimosse tutte le %d tracce dal database"
+
+#: ../src/misc_confirm.c:695
+#, c-format
+msgid "Are you sure you want to remove all tracks from your iPod?"
+msgstr "Eliminare veramente tutte le tracce dall'iPod?"
+
+#: ../src/misc_confirm.c:700
+#, c-format
+msgid "Are you sure you want to remove all podcasts from your iPod?"
+msgstr "Eliminare veramente tutti i podcast dall'iPod?"
+
+#: ../src/misc_confirm.c:708
+#, c-format
+msgid ""
+"Are you sure you want to delete playlist '%s' and the following track "
+"completely from your iPod? The number of playlists this track is a member of "
+"is indicated in parentheses."
+msgid_plural ""
+"Are you sure you want to delete playlist '%s' and the following tracks "
+"completely from your iPod? The number of playlists the tracks are member of "
+"is indicated in parentheses."
+msgstr[0] ""
+"Sei sicuro di voler eliminare completamente la playlist «%s» e la traccia "
+"seguente dall'iPod? Il numero di playlist di cui questa traccia fa parte è "
+"indicato tra parentesi."
+msgstr[1] ""
+"Sei sicuro di voler eliminare completamente la playlist «%s» e le tracce "
+"seguenti dall'iPod? Il numero di playlist di cui ogni traccia fa parte è "
+"indicato tra parentesi."
+
+#: ../src/misc_confirm.c:719 ../src/misc_confirm.c:774
+#, c-format
+msgid "Are you sure you want to delete the playlist '%s'?"
+msgstr "Cancellare veramente la playlist «%s»?"
+
+#: ../src/misc_confirm.c:745
+#, c-format
+msgid ""
+"Are you sure you want to delete playlist '%s' and remove the following track "
+"from your harddisk? The number of playlists this track is a member of is "
+"indicated in parentheses."
+msgid_plural ""
+"Are you sure you want to delete playlist '%s' and remove the following "
+"tracks from your harddisk? The number of playlists the tracks are member of "
+"is indicated in parentheses."
+msgstr[0] ""
+"Sei sicuro di voler eliminare la playlist «%s» e la traccia seguente dal tuo "
+"disco fisso? Il numero di playlist di cui questa traccia fa parte è indicato "
+"tra parentesi."
+msgstr[1] ""
+"Sei sicuro di voler eliminare la playlist «%s» e le tracce seguenti dal tuo "
+"disco fisso? Il numero di playlist di cui ogni traccia fa parte è indicato "
+"tra parentesi."
+
+#: ../src/misc_confirm.c:753
+#, c-format
+msgid "Are you sure you want to remove all tracks from the database?"
+msgstr "Eliminare veramente tutte le tracce dal database?"
+
+#: ../src/misc_confirm.c:762
+#, c-format
+msgid ""
+"Are you sure you want to delete playlist '%s' and remove the following track "
+"from the database? The number of playlists this track is a member of is "
+"indicated in parentheses."
+msgid_plural ""
+"Are you sure you want to delete playlist '%s' and remove the following "
+"tracks from the database? The number of playlists the tracks are member of "
+"is indicated in parentheses."
+msgstr[0] ""
+"Sei sicuro di voler eliminare completamente la playlist «%s» e la traccia "
+"seguente dal database? Il numero di playlist di cui questa traccia fa parte "
+"è indicato tra parentesi."
+msgstr[1] ""
+"Sei sicuro di voler eliminare completamente la playlist «%s» e le tracce "
+"seguenti dal database? Il numero di playlist di cui ogni traccia fa parte è "
+"indicato tra parentesi."
+
+#: ../src/misc_confirm.c:841
+msgid ""
+"Data has been changed and not been saved.\n"
+"OK to exit gtkpod?"
+msgstr ""
+"Ci sono dei dati modificati e non salvati.\n"
+"Uscire comunque da gtkpod?"
+
+#: ../src/misc_conversion.c:66
+msgid "File type"
+msgstr "Tipo file"
+
+#: ../src/misc_conversion.c:67
+msgid "PC File"
+msgstr "File sul PC"
+
+#: ../src/misc_conversion.c:68
+msgid "iPod File"
+msgstr "File sull'iPod"
+
+#: ../src/misc_conversion.c:69
+msgid "iPod ID"
+msgstr "iPod ID"
+
+#. 10
+#: ../src/misc_conversion.c:70
+msgid "Track Nr (#)"
+msgstr "Numero traccia"
+
+#: ../src/misc_conversion.c:71
+msgid "Transferred"
+msgstr "Trasferito"
+
+#: ../src/misc_conversion.c:72
+msgid "File Size"
+msgstr "Dimensione file"
+
+#: ../src/misc_conversion.c:73
+msgid "Play Time"
+msgstr "Durata"
+
+#. 20
+#: ../src/misc_conversion.c:80
+msgid "Date played"
+msgstr "Data riproduzione"
+
+#: ../src/misc_conversion.c:82
+msgid "Volume"
+msgstr "Volume"
+
+#: ../src/misc_conversion.c:83
+msgid "Soundcheck"
+msgstr "Ver. livello sonoro"
+
+#. 25
+#: ../src/misc_conversion.c:85
+msgid "CD Nr"
+msgstr "Numero CD"
+
+#: ../src/misc_conversion.c:88
+msgid "Category"
+msgstr "Categoria"
+
+#: ../src/misc_conversion.c:89
+msgid "Description"
+msgstr "Descrizione"
+
+#. 30
+#: ../src/misc_conversion.c:90
+msgid "Podcast URL"
+msgstr "URL del podcast"
+
+#: ../src/misc_conversion.c:91
+msgid "Podcast RSS"
+msgstr "RSS del podcast"
+
+#: ../src/misc_conversion.c:92
+msgid "Subtitle"
+msgstr "Sottotitoli"
+
+#: ../src/misc_conversion.c:93
+msgid "Date released"
+msgstr "Data pubblicazione"
+
+#: ../src/misc_conversion.c:94
+msgid "Checked"
+msgstr "Selezionato"
+
+#. 35
+#: ../src/misc_conversion.c:95
+msgid "Start time"
+msgstr "Inizio"
+
+#: ../src/misc_conversion.c:96
+msgid "Stop time"
+msgstr "Fine"
+
+#: ../src/misc_conversion.c:97
+msgid "Remember Playback Position"
+msgstr "Ricorda la posizione raggiunta"
+
+#: ../src/misc_conversion.c:98
+msgid "Skip when Shuffling"
+msgstr "Salta quando riproduci casualmente"
+
+#: ../src/misc_conversion.c:99
+msgid "Artwork Path"
+msgstr "Percorso artwork"
+
+#. 40
+#: ../src/misc_conversion.c:100
+msgid "Media Type"
+msgstr "Tipo di media"
+
+#: ../src/misc_conversion.c:102
+msgid "TV Episode"
+msgstr "Episodio TV"
+
+#: ../src/misc_conversion.c:103
+msgid "TV Network"
+msgstr "Rete TV"
+
+#: ../src/misc_conversion.c:104
+msgid "Season Nr"
+msgstr "N° stagione"
+
+#. 45
+#: ../src/misc_conversion.c:105
+msgid "Episode Nr"
+msgstr "N° episodio"
+
+#: ../src/misc_conversion.c:106
+msgid "Album Artist"
+msgstr "Artista dell'album"
+
+#: ../src/misc_conversion.c:107
+msgid "Sort Artist"
+msgstr "Artista per l'ordinamento"
+
+#: ../src/misc_conversion.c:108
+msgid "Sort Title"
+msgstr "Titolo per l'ordinamento"
+
+#: ../src/misc_conversion.c:109
+msgid "Sort Album"
+msgstr "Album per l'ordinamento"
+
+#. 50
+#: ../src/misc_conversion.c:110
+msgid "Sort Album Artist"
+msgstr "Artista dell'album per l'ordinamento"
+
+#: ../src/misc_conversion.c:111
+msgid "Sort Composer"
+msgstr "Compositore per l'ordinamento"
+
+#: ../src/misc_conversion.c:112
+msgid "Sort TV Show"
+msgstr "Programma TV per l'ordinamento"
+
+#: ../src/misc_conversion.c:113
+msgid "Gapless Track Flag"
+msgstr "Traccia senza pause"
+
+#: ../src/misc_conversion.c:126
+msgid "Name of file on PC, if available"
+msgstr "Nome del file sul PC, se disponibile"
+
+#: ../src/misc_conversion.c:127
+msgid "Name of file on the iPod"
+msgstr "Nome del file sull'iPod"
+
+#. 10
+#: ../src/misc_conversion.c:129
+msgid "Track Nr. and total number of tracks on CD"
+msgstr "N° traccia e numero totale di tracce sul CD"
+
+#: ../src/misc_conversion.c:130
+msgid "Whether the file has already been transferred to the iPod or not"
+msgstr "Se il file è stato già trasferito sull'iPod o meno"
+
+#: ../src/misc_conversion.c:136
+msgid "Beats per minute"
+msgstr "Battute al minuto"
+
+#: ../src/misc_conversion.c:137
+msgid "Number of times the track has been played"
+msgstr "Numero di volte in cui la traccia è stata riprodotta"
+
+#: ../src/misc_conversion.c:138
+msgid "Star rating from 0 to 5"
+msgstr "Votazione a stelle da 0 a 5"
+
+#: ../src/misc_conversion.c:139
+msgid "Date and time track has been added"
+msgstr "Data e ora in cui la traccia è stata aggiunta"
+
+#. 20
+#: ../src/misc_conversion.c:140
+msgid "Date and time track has last been played"
+msgstr "Data e ora in cui la traccia è stata riprodotta l'ultima volta"
+
+#: ../src/misc_conversion.c:141
+msgid "Date and time track has last been modified"
+msgstr "Data e ora in cui la traccia è stata modificata l'ultima volta"
+
+#: ../src/misc_conversion.c:142
+msgid "Manual volume adjust"
+msgstr "Regolazione manuale del volume"
+
+#: ../src/misc_conversion.c:143
+msgid ""
+"Volume adjust in dB (replay gain) -- you need to activate 'soundcheck' on "
+"the iPod"
+msgstr ""
+"Regolazione del volume in dB (guadagno di riproduzione) -- bisogna anche "
+"attivare «Ver. livello sonoro» sull'iPod"
+
+#. 25
+#: ../src/misc_conversion.c:146
+msgid "CD Nr. and total number of CDS in set"
+msgstr "N° CD e numero totale dei CD nel cofanetto"
+
+#: ../src/misc_conversion.c:149
+msgid ""
+"The category (e.g. 'Technology' or 'Music') where the podcast was located."
+msgstr ""
+"La categoria (es. «Tecnologia» o «Musica») in cui si trovava il podcast."
+
+#: ../src/misc_conversion.c:150
+msgid "Accessible by selecting the center button on the iPod."
+msgstr "Accessibile selezionando il bottone centrale sull'iPod."
+
+#: ../src/misc_conversion.c:154
+msgid "Release date (for podcasts displayed next to the title on the iPod)"
+msgstr ""
+"Data di pubblicazione (per i podcast è mostrata accanto al titolo sull'iPod)"
+
+#. 50
+#: ../src/misc_conversion.c:168 ../src/misc_conversion.c:169
+#: ../src/misc_conversion.c:170 ../src/misc_conversion.c:171
+#: ../src/misc_conversion.c:172 ../src/misc_conversion.c:173
+msgid "Used for sorting on the iPod"
+msgstr "Usato per l'ordinamento sull'iPod"
+
+#: ../src/misc_conversion.c:735
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the file scheme"
+msgstr "L'URI «%s» non è un URI assoluto usando lo schema dei file"
+
+#: ../src/misc_conversion.c:745
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "L'URI del file locale «%s» non può includere «#»"
+
+#: ../src/misc_conversion.c:762
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "L'URI «%s» non è valido"
+
+#: ../src/misc_conversion.c:774
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Il nome dell'host dell'URI «%s» non è valido"
+
+#: ../src/misc_conversion.c:790
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "L'URI «%s» contiene caratteri di escape non validi"
+
+#: ../src/misc_playlist.c:67 ../src/misc_playlist.c:94
+#: ../src/misc_playlist.c:429
+msgid "Please enter a name for the new playlist"
+msgstr "Inserire un nome per la nuova playlist"
+
+#: ../src/misc_playlist.c:154
+msgid "AR:"
+msgstr "AR:"
+
+#: ../src/misc_playlist.c:157
+msgid "AL:"
+msgstr "AL:"
+
+#: ../src/misc_playlist.c:160
+msgid "GE:"
+msgstr "GE:"
+
+#: ../src/misc_playlist.c:163
+msgid "CO:"
+msgstr "CO:"
+
+#: ../src/misc_playlist.c:166
+msgid "YE:"
+msgstr "AN:"
+
+#: ../src/misc_playlist.c:194
+msgid "Unknown"
+msgstr "Sconosciuto"
+
+#: ../src/misc_playlist.c:272
+#, c-format
+msgid "Random (%d)"
+msgstr "Casuale (%d)"
+
+#: ../src/misc_playlist.c:297
+msgid ""
+"Auto Store of track view disabled.\n"
+"\n"
+msgstr ""
+"Salvataggio automatico dell'ordine delle tracce disabilitato.\n"
+"\n"
+
+#: ../src/misc_playlist.c:356
+msgid "Not Listed"
+msgstr "Non elencati"
+
+#: ../src/misc_playlist.c:406
+#, c-format
+msgid "Created playlist '%s' with %d track."
+msgid_plural "Created playlist '%s' with %d tracks."
+msgstr[0] "Creata la playlist «%s» con %d traccia."
+msgstr[1] "Creata la playlist «%s» con %d tracce."
+
+#. n==0
+#: ../src/misc_playlist.c:417
+msgid "No tracks available, playlist not created"
+msgstr "Nessuna traccia disponibile, la playlist non è stata creata"
+
+#: ../src/misc_playlist.c:543
+#, c-format
+msgid "Most Listened (%d)"
+msgstr "Più ascoltate (%d)"
+
+#: ../src/misc_playlist.c:584
+#, c-format
+msgid "Never Listened"
+msgstr "Mai ascoltate"
+
+#: ../src/misc_playlist.c:624
+#, c-format
+msgid "Best Rated (%d)"
+msgstr "Voti migliori (%d)"
+
+#: ../src/misc_playlist.c:666
+msgid "Unrated tracks"
+msgstr "Tracce senza voto"
+
+#: ../src/misc_playlist.c:671
+#, c-format
+msgid "Rated %d"
+msgstr "Voto (%d)"
+
+#: ../src/misc_playlist.c:714
+#, c-format
+msgid "Recent (%d)"
+msgstr "Recenti (%d)"
+
+#: ../src/misc_playlist.c:753
+msgid "Last Time"
+msgstr "Ultima volta"
+
+#: ../src/misc_playlist.c:844
+msgid "Removal of dangling tracks with no files on PC was canceled."
+msgstr ""
+"La rimozione delle tracce fantasma senza file sul PC è stata annullata."
+
+#: ../src/misc_playlist.c:854
+msgid "Handling of dangling tracks with files on PC was canceled."
+msgstr ""
+"La gestione delle tracce fantasma con file presenti sul PC è stata annullata."
+
+#: ../src/misc_playlist.c:882
+msgid "Dangling tracks with no files on PC were removed."
+msgstr "Le tracce fantasma senza file sul PC sono state rimosse."
+
+#: ../src/misc_playlist.c:943
+msgid "Dangling tracks with files on PC were handled."
+msgstr "Le tracce fantasma con i file sul PC sono state gestite."
+
+#: ../src/misc_playlist.c:976
+msgid "Track"
+msgstr "Traccia"
+
+#: ../src/misc_playlist.c:1019
+msgid ""
+"You did not import the existing iTunesDB. This is most likely incorrect and "
+"will result in the loss of the existing database.\n"
+"\n"
+"Press 'OK' if you want to proceed anyhow or 'Cancel' to abort. If you "
+"cancel, you can import the existing database before calling this function "
+"again.\n"
+msgstr ""
+"Non si è importato l'iTunesDB esistente. Questo è quasi certamente sbagliato "
+"e porterà alla perdita del database esistente.\n"
+"\n"
+"Premere «Ok» se si vuole procedere comunque o «Annulla» se si vuole "
+"interrompere l'operazione. Se la si interrompe, si può importare il database "
+"esistente prima di richiamare di nuovo questa funzione.\n"
+
+#: ../src/misc_playlist.c:1033
+msgid "Creating a tree of known files"
+msgstr "Creazione di un albero di file conosciuti"
+
+#: ../src/misc_playlist.c:1077
+msgid "Checking iPOD files against known files in DB"
+msgstr "Confronto dei file dell'iPod con i file conosciuti nel DB"
+
+#: ../src/misc_playlist.c:1120
+msgid "Orphaned"
+msgstr "Orfani"
+
+#: ../src/misc_playlist.c:1147
+#, c-format
+msgid ""
+"The following orphaned file had already been added to the iPod again. It "
+"will be removed with the next sync:\n"
+"%s\n"
+"\n"
+msgstr ""
+"Il seguente file orfano era già stato aggiunto di nuovo all'iPod. Verrà "
+"rimosso alla prossima sincronizzazione:\n"
+"%s\n"
+"\n"
+
+#: ../src/misc_playlist.c:1175
+#, c-format
+msgid "Found %d orphaned and %d dangling files. Processing..."
+msgstr "Trovati %d file orfani e %d fantasma. Elaborazione in corso..."
+
+#: ../src/misc_playlist.c:1199
+#, c-format
+msgid ""
+"The following dangling track has a file on PC.\n"
+"Press OK to have them transfered from the file on next Sync, CANCEL to leave "
+"it as is."
+msgid_plural ""
+"The following %d dangling tracks have files on PC.\n"
+"Press OK to have them transfered from the files on next Sync, CANCEL to "
+"leave them as is."
+msgstr[0] ""
+"La seguente traccia fantasma ha un file sul PC.\n"
+"Premere Ok per trasferirla dal file nella prossima sincronizzazione, Annulla "
+"per lasciare tutto così."
+msgstr[1] ""
+"Le seguenti %d tracce fantasma hanno file sul PC.\n"
+"Premere Ok per trasferirle dai file nella prossima sincronizzazione, Annulla "
+"per lasciare tutto così."
+
+#: ../src/misc_playlist.c:1204
+#, c-format
+msgid ""
+"The following dangling track doesn't have file on PC. \n"
+"Press OK to remove it, CANCEL to leave it as is."
+msgid_plural ""
+"The following %d dangling tracks do not have files on PC. \n"
+"Press OK to remove them, CANCEL to leave them. as is"
+msgstr[0] ""
+"La seguente traccia fantasma non ha un file sul PC.\n"
+"Premere Ok per rimuoverla, Annulla per lasciare tutto così."
+msgstr[1] ""
+"Le seguenti %d tracce fantasma non hanno un file sul PC.\n"
+"Premere Ok per rimuoverle, Annulla per lasciare tutto così."
+
+#. we want unique window for each
+#. gboolean modal,
+#: ../src/misc_playlist.c:1211
+msgid "Dangling Tracks"
+msgstr "Tracce fantasma"
+
+#: ../src/misc_playlist.c:1234
+#, c-format
+msgid "Found %d orphaned and %d dangling files. Done."
+msgstr "Trovati %d file orfani e %d fantasma. Terminato."
+
+#. update for count == 1, 21, 41 ... and for count == n
+#: ../src/misc_track.c:89
+#, c-format
+msgid "Hashed %d of %d track."
+msgid_plural "Hashed %d of %d tracks."
+msgstr[0] "Calcolato l'hash di %d traccia su %d."
+msgstr[1] "Calcolato l'hash di %d tracce su %d."
+
+#: ../src/misc_track.c:198
+#, c-format
+msgid "The following duplicate track has been removed."
+msgid_plural "The following %d duplicate tracks have been removed."
+msgstr[0] "La seguente traccia duplicata è stata rimossa."
+msgstr[1] "Le seguenti %d tracce duplicate sono state rimosse."
+
+#: ../src/misc_track.c:205
+#, c-format
+msgid ""
+"The following duplicate track has not been added to the master play list."
+msgid_plural ""
+"The following %d duplicate tracks have not been added to the master play "
+"list."
+msgstr[0] ""
+"La seguente traccia duplicata non è stata aggiunta alla playlist principale."
+msgstr[1] ""
+"Le seguenti %d tracce duplicate non sono state aggiunte alla playlist "
+"principale."
+
+#. gint id,
+#. gboolean modal,
+#: ../src/misc_track.c:212
+msgid "Duplicate detection"
+msgstr "Rilevazione dei duplicati"
+
+#: ../src/misc_track.c:1339
+msgid "Local Database"
+msgstr "Database locale"
+
+#. artwork is set
+#: ../src/misc_track.c:1350
+msgid "Embedded or filename was lost"
+msgstr "Incorporato o il nome del file è andato perso"
+
+#: ../src/misc_track.c:1354
+msgid "Artwork not set"
+msgstr "Artwork non impostato"
+
+#: ../src/misc_track.c:1816
+#, c-format
+msgid "Could not find source file for '%s'. Track not copied."
+msgstr "Impossibile trovare il file sorgente per «%s». Traccia non copiata."
+
+#: ../src/misc_track.c:2052
+#, c-format
+msgid "drag and drop: ignored '%s'\n"
+msgstr "drag and drop: ignorato «%s»\n"
+
+#: ../src/mp3file.c:1336
+#, c-format
+msgid "Error setting ID3 field: %s\n"
+msgstr "Errore nella impostazione del campo ID3: %s\n"
+
+#: ../src/mp3file.c:1360 ../src/mp3file.c:1453 ../src/mp3file.c:1608
+#: ../src/mp3file.c:2733
+#, c-format
+msgid "ERROR while opening file: '%s' (%s).\n"
+msgstr "ERRORE nell'apertura del file: «%s» (%s).\n"
+
+#: ../src/mp3file.c:1688
+#, c-format
+msgid "ERROR while writing tag to file: '%s' (%s).\n"
+msgstr "ERRORE nella scrittura dell'etichetta sul file: «%s» (%s).\n"
+
+#. Tracks with zero play length are ignored by iPod...
+#: ../src/mp3file.c:2770
+#, c-format
+msgid "File \"%s\" has zero play length. Ignoring.\n"
+msgstr "Il file «%s» ha durata zero. Ignorato.\n"
+
+#: ../src/mp4file.c:243 ../src/mp4file.c:404
+#, c-format
+msgid "'%s' does not appear to be a mp4 audio or video file.\n"
+msgstr "«%s» non sembra essere un file audio mp4 o un file video.\n"
+
+#: ../src/mp4file.c:253 ../src/mp4file.c:414
+#, c-format
+msgid "Could not open '%s' for reading, or file is not an mp4 file.\n"
+msgstr "Impossibile aprire «%s» in lettura, o il file non è un file mp4.\n"
+
+#: ../src/mp4file.c:529
+#, c-format
+msgid "'%s' does not appear to be a mp4 audio file.\n"
+msgstr "«%s» non sembra essere un file audio mp4.\n"
+
+#: ../src/mp4file.c:540
+#, c-format
+msgid "Could not open '%s' for writing, or file is not an mp4 file.\n"
+msgstr "Impossibile aprire «%s» in scrittura, o il file non è un file mp4.\n"
+
+#: ../src/mp4file.c:553
+#, c-format
+msgid ""
+"Import of '%s' failed: m4a/m4p/m4b not supported without the mp4v2 library. "
+"You must compile the gtkpod source together with the mp4v2 library.\n"
+msgstr ""
+"Importazione di «%s» fallita: m4a/m4p/m4b non sono supportati senza la "
+"libreria mp4v2. Devi compilare i sorgenti di gtkpod insieme alla libreria "
+"mp4v2.\n"
+
+#: ../src/mp4file.c:559
+#, c-format
+msgid ""
+"m4a/m4p/m4b metadata update for '%s' failed: m4a/m4p/m4b not supported "
+"without the mp4v2 library. You must compile the gtkpod source together with "
+"the mp4v2 library.\n"
+msgstr ""
+"Aggiornamento fallito dei metadati m4a/m4p/m4b per «%s»: m4a/m4p/m4b non "
+"sono supportati senza la libreria mp4v2. Devi compilare i sorgenti di gtkpod "
+"insieme alla libreria mp4v2.\n"
+
+#: ../src/mp4file.c:565
+#, c-format
+msgid ""
+"m4a/m4p/m4b soundcheck update for '%s' failed: m4a/m4p/m4b not supported "
+"without the mp4v2 library. You must compile the gtkpod source together with "
+"the mp4v2 library.\n"
+msgstr ""
+"Aggiornamento fallito di soundcheck m4a/m4p/m4b per «%s»: m4a/m4p/m4b non "
+"sono supportati senza la libreria mp4v2. Devi compilare i sorgenti gtkpod "
+"insieme alla libreria mp4v2.\n"
+
+#: ../src/oggfile.c:73
+#, c-format
+msgid "'%s' does not appear to be an ogg audio file.\n"
+msgstr "«%s» non sembra essere un file audio ogg.\n"
+
+#: ../src/oggfile.c:154
+#, c-format
+msgid ""
+"Import of '%s' failed: ogg not supported without the ogg library. You must "
+"compile the gtkpod source together with the ogg library.\n"
+msgstr ""
+"Importazione di «%s» fallita: m4a/m4p/m4b non sono supportati senza la "
+"libreria ogg. Devi compilare i sorgenti di gtkpod insieme alla libreria "
+"ogg.\n"
+
+#: ../src/oggfile.c:160
+#, c-format
+msgid ""
+"ogg metadata update for '%s' failed: ogg not supported without the ogg "
+"library. You must compile the gtkpod source together with the ogg library.\n"
+msgstr ""
+"Aggiornamento fallito dei metadati ogg per «%s»: ogg non è supportato senza "
+"la libreria ogg. Devi compilare i sorgenti di gtkpod insieme alla libreria "
+"ogg.\n"
+
+#: ../src/prefs.c:357
+#, c-format
+msgid "gtkpod version %s usage:\n"
+msgstr "uso di gtkpod versione %s:\n"
+
+#: ../src/prefs.c:358
+msgid "  -h, --help:   display this message\n"
+msgstr "  -h, --help:   mostra questo messaggio\n"
+
+#: ../src/prefs.c:359
+msgid "  -p <file>:    increment playcount for file by one\n"
+msgstr "  -p <file>:incrementa di uno il contatore delle riproduzioni\n"
+
+#: ../src/prefs.c:360
+msgid "  --hash <file>:print gtkpod hash for file\n"
+msgstr "  --hash <file>:stampa l'hash di gtkpod per il file\n"
+
+#: ../src/prefs.c:361
+msgid "  -m path:      define the mountpoint of your iPod\n"
+msgstr "  -m percorso   definisce il punto di mount dell'iPod\n"
+
+#: ../src/prefs.c:362
+msgid "  --mountpoint: same as '-m'.\n"
+msgstr "  --mountpoint: come «-m».\n"
+
+#: ../src/prefs.c:363
+msgid "  -a:           import database automatically after start.\n"
+msgstr "  -a:           importa il database automaticamente all'avvio.\n"
+
+#: ../src/prefs.c:364
+msgid "  --auto:       same as '-a'.\n"
+msgstr "  --auto:       come «-a».\n"
+
+#: ../src/prefs.c:561
+#, c-format
+msgid "Couldn't create ~/.gtkpod\n"
+msgstr "Impossibile creare ~/.gtkpod\n"
+
+#: ../src/prefs_window.c:133
+msgid "Please select command for 'Play Now'"
+msgstr "Selezionare il comando per «Riproduci ora»"
+
+#: ../src/prefs_window.c:134
+msgid "Please select command for 'Enqueue'"
+msgstr "Selezionare il comando per «Metti in coda»"
+
+#: ../src/prefs_window.c:135
+msgid "Please select the mp3gain executable"
+msgstr "Selezionare l'eseguibile di mp3gain"
+
+#: ../src/prefs_window.c:136
+msgid "Please select the aacgain executable"
+msgstr "Selezionare l'eseguibile di aacgain"
+
+#: ../src/prefs_window.c:137
+msgid "Select the mserv music root directory"
+msgstr "Selezionare la directory musicale radice di mserv"
+
+#: ../src/prefs_window.c:138
+msgid "Select the mserv trackinfo root directory"
+msgstr "Selezionare la directory trackinfo radice di mserv"
+
+#: ../src/prefs_window.c:139
+msgid "Select the ogg/vorbis converter command"
+msgstr "Selezionare il comando per il convertitore ogg/vorbis"
+
+#: ../src/prefs_window.c:140
+msgid "Select the flac converter command"
+msgstr "Selezionare il comando per il convertitore flac"
+
+#: ../src/prefs_window.c:141
+msgid "Select the m4a converter command."
+msgstr "Selezionare il comando per il convertitore m4a."
+
+#: ../src/prefs_window.c:142
+msgid "Select the mp3 converter command."
+msgstr "Selezionare il comando per il convertitore mp3."
+
+#: ../src/prefs_window.c:143
+msgid "Select the wav converter command."
+msgstr "Selezionare il comando per il convertitore wav."
+
+#: ../src/prefs_window.c:201 ../src/repository.c:662
+#, c-format
+msgid ""
+"<i>Have a look at the scripts provided in '%s'. If you write a new script or "
+"improve an existing one, please send it to jcsjcs at users.sourceforge.net "
+"for inclusion into the next release.</i>"
+msgstr ""
+"<i>Consultare lo script fornito in «%s». Se scrivi un nuovo script, mandalo "
+"a jcsjcs at users.sourceforge.net per la inclusione nella prossima release.</"
+"i>"
+
+#: ../src/prefs_window.c:1205 ../src/prefs_window.c:1223
+msgid "Preferences not updated"
+msgstr "Preferenze non aggiornate"
+
+#: ../src/prefs_window.c:1232
+msgid "Preferences applied"
+msgstr "Preferenze applicate"
+
+#: ../src/repository.c:573 ../src/repository.c:2395
+msgid "Set backup file"
+msgstr "Impostare il file di backup"
+
+#: ../src/repository.c:612
+msgid "Select directory for synchronization"
+msgstr "Selezionare una directory per la sincronizzazione"
+
+#: ../src/repository.c:638
+msgid "Please select command to sync contacts"
+msgstr "Selezionare il comando per sincronizzare i contatti"
+
+#: ../src/repository.c:644
+msgid "Please select command to sync calendar"
+msgstr "Selezionare il comando per sincronizzare il calendario"
+
+#: ../src/repository.c:650
+msgid "Please select command to sync notes"
+msgstr "Selezionare il comando per sincronizzare le note"
+
+#: ../src/repository.c:729
+msgid "Smart playlist updated."
+msgstr "Playlist intelligente aggiornata."
+
+#: ../src/repository.c:1190
+msgid "Podcasts Repository"
+msgstr "Archivio dei podcast"
+
+#: ../src/repository.c:1194
+msgid "Local Repository"
+msgstr "Archivio locale"
+
+#: ../src/repository.c:1348
+msgid "Master Playlist"
+msgstr "Playlist principale"
+
+#: ../src/repository.c:1352
+msgid "Podcasts Playlist"
+msgstr "Playlist dei podcast"
+
+#: ../src/repository.c:1360
+msgid "Regular Playlist"
+msgstr "Playlist normale"
+
+#: ../src/repository.c:2423
+msgid "Set local repository file"
+msgstr "Imposta il file dell'archivio locale"
+
+#: ../src/repository.c:2522
+msgid "New Repository"
+msgstr "Nuovo archivio"
+
+#: ../src/sha1.c:186
+msgid "Hashed file is 0 bytes long\n"
+msgstr "Il file sottoposto ad hash è lungo 0 byte\n"
+
+#: ../src/sha1.c:239
+#, c-format
+msgid "Could not open '%s' to calculate SHA1 checksum: %s\n"
+msgstr "Impossibile aprire «%s» per calcolare le somme di controllo SHA1: %s\n"
+
+#: ../src/syncdir.c:237
+#, c-format
+msgid "Sync summary for %s/%s\n"
+msgstr "Riepilogo della sincronizzazione per %s/%s\n"
+
+#: ../src/syncdir.c:246
+msgid "The following track has been added or updated:\n"
+msgid_plural "The following tracks have been added or updated:\n"
+msgstr[0] "La traccia seguente è stata aggiunta o aggiornata:\n"
+msgstr[1] "Le %d tracce seguenti sono state aggiunte o aggiornate:\n"
+
+#: ../src/syncdir.c:255
+msgid "The following track has been completely removed from the iPod:\n"
+msgid_plural ""
+"The following tracks have been completely removed from the iPod:\n"
+msgstr[0] "La traccia seguente è stata completamente rimossa dall'iPod:\n"
+msgstr[1] "La tracce seguenti sono state completamente rimosse dall'iPod:\n"
+
+#: ../src/syncdir.c:264
+msgid "The following track has been removed from the repository:\n"
+msgid_plural "The following tracks have been removed from the repository:\n"
+msgstr[0] "La traccia seguente è stata completamente rimossa dall'archivio:\n"
+msgstr[1] ""
+"Le tracce seguenti sono state completamente rimosse dall'archivio:\n"
+
+#: ../src/syncdir.c:271
+msgid "The following track has been removed from the playlist:\n"
+msgid_plural "The following tracks have been removed from the playlist:\n"
+msgstr[0] "La traccia seguente è stata completamente rimossa dalla playlist:\n"
+msgstr[1] ""
+"Le tracce seguenti sono state completamente rimosse dalla playlist:\n"
+
+#: ../src/syncdir.c:277
+msgid "Nothing was changed.\n"
+msgstr "Nessun cambiamento.\n"
+
+#: ../src/syncdir.c:282
+msgid "Sync summary"
+msgstr "Riepilogo della sincronizzazione"
+
+#: ../src/tools.c:118
+#, c-format
+msgid ""
+"Could not find '%s'.\n"
+"Please specifiy the exact path in the Tools section of the preference dialog "
+"or install the program if it is not installed on your system.\n"
+"\n"
+msgstr ""
+"Impossibile trovare «%s».\n"
+"Specificare il percorso esatto nella sezione «Strumenti» della finestra di "
+"dialogo delle preferenze o installare il programma se non è installato nel "
+"sistema.\n"
+"\n"
+
+#: ../src/tools.c:203
+#, c-format
+msgid ""
+"Execution of '%s' failed.\n"
+"\n"
+msgstr ""
+"Esecuzione di «%s» fallita.\n"
+"\n"
+
+#: ../src/tools.c:248
+#, c-format
+msgid ""
+"Did not normalize '%s'. Set mp3gain path in the Tools section of the "
+"preferences.\n"
+msgstr ""
+"Non normalizzato «%s». Impostare il percorso di mp3gain nella sezione "
+"Strumenti delle preferenze.\n"
+
+#: ../src/tools.c:258
+#, c-format
+msgid ""
+"Did not normalize '%s'. Set aacgain path in the Tools section of the "
+"preferences.\n"
+msgstr ""
+"Non normalizzato «%s». Impostare il percorso di aacgain nella sezione "
+"Strumenti delle preferenze.\n"
+
+#: ../src/tools.c:385
+msgid "Normalizing..."
+msgstr "Normalizzazione in corso..."
+
+#: ../src/tools.c:435
+#, c-format
+msgid "%s - %s"
+msgstr "%s - %s"
+
+#: ../src/tools.c:461
+msgid "Aborting..."
+msgstr "Interruzione in corso..."
+
+#: ../src/tools.c:465
+msgid "Will abort after current mp3gain process ends."
+msgstr ""
+"L'operazione verrà interrotta alla conclusione del processo corrente di "
+"mp3gain."
+
+#: ../src/tools.c:491
+#, c-format
+msgid ""
+"'%s-%s' (%s) could not be normalized.\n"
+"\n"
+msgstr ""
+"«%s-%s» (%s) non può essere normalizzata.\n"
+"\n"
+
+#: ../src/tools.c:530
+#, c-format
+msgid "Normalized %d of %d tracks."
+msgid_plural "Normalized %d of %d tracks."
+msgstr[0] "Normalizzata %d traccia su %d."
+msgstr[1] "Normalizzate %d tracce su %d."
+
+#: ../src/tools.c:633
+msgid ""
+"Please specify the command to be called on the 'Tools' section of the "
+"preferences dialog.\n"
+msgstr ""
+"Specificare il comando da richiamare nella sezione «Strumenti» della "
+"finestra di dialogo delle preferenze.\n"
+
+#: ../src/tools.c:645
+#, c-format
+msgid ""
+"Could not find the command '%s'.\n"
+"\n"
+"Please verify the setting in the 'Tools' section of the preferences dialog.\n"
+"\n"
+msgstr ""
+"Impossibile trovare il comando «%s».\n"
+"\n"
+"Verificare le impostazioni nella sezione «Strumenti» della finestra di "
+"dialogo delle preferenze.\n"
+"\n"
+
+#: ../src/tools.c:687
+#, c-format
+msgid ""
+"'%s' returned the following output:\n"
+"%s\n"
+msgstr ""
+"«%s» ha restituito il seguente output:\n"
+"%s\n"
+
+#: ../src/tools.c:754
+#, c-format
+msgid "No command set for '%s'"
+msgstr "Nessun comando impostato per «%s»"
+
+#: ../src/tools.c:774
+#, c-format
+msgid "Could not find command '%s' specified for '%s'"
+msgstr "Impossibile trovare il comando «%s» specificato per «%s»"
+
+#: ../src/wavfile.c:181
+#, c-format
+msgid "%s does not appear to be a supported wav file.\n"
+msgstr "%s non sembra essere un file wav supportato.\n"

Added: trunk/po/ja.po
===================================================================
--- trunk/po/ja.po	                        (rev 0)
+++ trunk/po/ja.po	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,5669 @@
+# Japanese Translation Catalogue
+# Copyright (C) 2003 gtkpod
+# This file is distributed under the same license as the gtkpod package.
+# Jorg Schuler <jcsjcs at users.sourceforge.net>, 2003.
+# 
+msgid ""
+msgstr ""
+"Project-Id-Version: gtkpod 0.40\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-12-13 18:36-0500\n"
+"PO-Revision-Date: 2005-06-20 23:25+0900\n"
+"Last-Translator: Kentaro Fukuchi <fukuchi at users.sourceforge.net>\n"
+"Language-Team: n/a\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: ../data/gtkpod.desktop.in.h:1
+#, fuzzy
+msgid "GtkPod"
+msgstr "gtkpod"
+
+#: ../data/gtkpod.desktop.in.h:2
+msgid "Manage music and video on an Apple iPod"
+msgstr ""
+
+#: ../data/gtkpod.desktop.in.h:3
+msgid "iPod Manager"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:1
+msgid " "
+msgstr " "
+
+#: ../data/gtkpod.glade.h:2
+msgid "    "
+msgstr ""
+
+#: ../data/gtkpod.glade.h:3
+msgid "     "
+msgstr ""
+
+#: ../data/gtkpod.glade.h:4
+msgid "      "
+msgstr ""
+
+#: ../data/gtkpod.glade.h:5
+msgid "   Sort by:"
+msgstr "   ソート順:"
+
+#: ../data/gtkpod.glade.h:6
+msgid " <= cts <= "
+msgstr " <= 回数 <= "
+
+#: ../data/gtkpod.glade.h:7
+msgid " Logic: "
+msgstr "条件: "
+
+#: ../data/gtkpod.glade.h:9
+#, no-c-format
+msgid "%A"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:10
+msgid ""
+"'DD/MM/YYYY HH:MM < d < DD/MM/YYYY HH:MM' or similar. Press 'enter' when "
+"finished."
+msgstr ""
+"'DD/MM/YYYY HH:MM < d < DD/MM/YYYY HH:MM' のように設定してください. 書き込ん"
+"だら 'enter' キーを押してください."
+
+#: ../data/gtkpod.glade.h:11
+#, fuzzy
+msgid "'aacgain' executable:"
+msgstr "'mp3gain' コマンドの場所:"
+
+#: ../data/gtkpod.glade.h:12
+msgid "'mp3gain' executable:"
+msgstr "'mp3gain' コマンドの場所:"
+
+#: ../data/gtkpod.glade.h:13
+#, fuzzy
+msgid "(Checked)"
+msgstr "チェック済み"
+
+#: ../data/gtkpod.glade.h:14
+msgid "...as icons"
+msgstr "アイコンのみ"
+
+#: ../data/gtkpod.glade.h:15
+msgid "...as text"
+msgstr "テキストのみ"
+
+#: ../data/gtkpod.glade.h:16
+msgid "...both as icons and text"
+msgstr "アイコンとテキスト"
+
+#: ../data/gtkpod.glade.h:17
+msgid "...entry 'All' in sort tab..."
+msgstr "...以下のソートタブ内の「すべて」の項目"
+
+#: ../data/gtkpod.glade.h:18
+msgid "...master playlist"
+msgstr "...マスタープレイリスト"
+
+#: ../data/gtkpod.glade.h:20
+#, no-c-format
+msgid "../%A.jpg"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:21
+msgid "0"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:22
+msgid "1"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:23
+msgid "2"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:24
+msgid "3"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:25
+msgid "4"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:26
+msgid "5"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:27
+msgid ":"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:28
+msgid "<"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:29
+#, fuzzy
+msgid "<b>Account Information</b>"
+msgstr "<b>削除の確認</b>"
+
+#: ../data/gtkpod.glade.h:30
+msgid "<b>Adding/Updating/Syncing</b>"
+msgstr "<b>登録/更新/同期</b>"
+
+#: ../data/gtkpod.glade.h:31
+#, fuzzy
+msgid "<b>Audioscrobbler</b>"
+msgstr "<b>ツールバー</b>"
+
+#: ../data/gtkpod.glade.h:32
+msgid "<b>Auto-Generated Playlists</b>"
+msgstr "<b>プレイリストの自動生成</b>"
+
+#: ../data/gtkpod.glade.h:33
+msgid "<b>Automatically select...</b>"
+msgstr "<b>自動的に選択...</b>"
+
+#: ../data/gtkpod.glade.h:34
+msgid "<b>Calendar/Contacts/Notes</b>"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:35
+#, fuzzy
+msgid "<b>Coverart</b>"
+msgstr "<b>インポート</b>"
+
+#: ../data/gtkpod.glade.h:36
+msgid "<b>Delete Confirmation</b>"
+msgstr "<b>削除の確認</b>"
+
+#: ../data/gtkpod.glade.h:37
+msgid "<b>Examples</b>"
+msgstr "<b>例</b>"
+
+#: ../data/gtkpod.glade.h:38
+msgid "<b>Ignore Frequent Words</b>"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:39
+msgid "<b>Misc</b>"
+msgstr "<b>その他</b>"
+
+#: ../data/gtkpod.glade.h:40
+msgid "<b>Mountpoint and individual repository/playlist options</b>"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:41
+#, fuzzy
+msgid "<b>On-the-fly Conversion</b>"
+msgstr "<b>削除の確認</b>"
+
+#: ../data/gtkpod.glade.h:42
+msgid "<b>Play</b>"
+msgstr "<b>再生</b>"
+
+#: ../data/gtkpod.glade.h:43
+#, fuzzy
+msgid "<b>Playlists</b>"
+msgstr "<b>再生</b>"
+
+#: ../data/gtkpod.glade.h:44
+msgid "<b>Please select mountpoint and your iPod model</b>"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:45
+#, fuzzy
+msgid "<b>Repositories</b>"
+msgstr "<b>ツールチップ</b>"
+
+#: ../data/gtkpod.glade.h:46
+msgid "<b>Sort Order</b>"
+msgstr "<b>ソート順</b>"
+
+#: ../data/gtkpod.glade.h:47
+msgid "<b>Sort Tabs</b>"
+msgstr "<b>ソートタブ</b>"
+
+#: ../data/gtkpod.glade.h:48
+msgid "<b>Sync</b>"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:49
+msgid "<b>Synchronization</b>"
+msgstr "<b>同期</b>"
+
+#: ../data/gtkpod.glade.h:50
+msgid "<b>Tag Reading</b>"
+msgstr "<b>タグの読み込み</b>"
+
+#: ../data/gtkpod.glade.h:51
+msgid "<b>Toolbar</b>"
+msgstr "<b>ツールバー</b>"
+
+#: ../data/gtkpod.glade.h:52
+msgid "<b>Tooltips</b>"
+msgstr "<b>ツールチップ</b>"
+
+#: ../data/gtkpod.glade.h:53
+#, fuzzy
+msgid "<b>Track Attributes</b>"
+msgstr "<b>表示する曲属性</b>"
+
+#: ../data/gtkpod.glade.h:54
+msgid "<b>Track Editing</b>"
+msgstr "<b>曲の編集</b>"
+
+#: ../data/gtkpod.glade.h:55
+msgid "<b>Volume Normalization</b>"
+msgstr "<b>音量の平均化</b>"
+
+#: ../data/gtkpod.glade.h:56
+msgid "<b>mserv</b>"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:57
+msgid ">"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:58
+msgid "About gtkpod"
+msgstr "gtkpod について"
+
+#: ../data/gtkpod.glade.h:59
+msgid "Add Directories Recursively"
+msgstr "ディレクトリを再帰的に追加します"
+
+#: ../data/gtkpod.glade.h:60
+#, fuzzy
+msgid "Add Files"
+msgstr "ファイルを追加する(_F)"
+
+#: ../data/gtkpod.glade.h:61
+msgid "Add Files or Directories"
+msgstr "ファイルまたはディレクトリを追加します"
+
+#: ../data/gtkpod.glade.h:62
+#, fuzzy
+msgid "Add Fol_der"
+msgstr "ファイルを追加する(_F)"
+
+#: ../data/gtkpod.glade.h:63
+#, fuzzy
+msgid "Add Folder"
+msgstr "ファイルを追加する(_F)"
+
+#: ../data/gtkpod.glade.h:64
+msgid "Add Image_s"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:65
+#, fuzzy
+msgid "Add Images from a Directory"
+msgstr "ファイルまたはディレクトリを追加します"
+
+#: ../data/gtkpod.glade.h:66
+#, fuzzy
+msgid "Add Playlist"
+msgstr "プレイリストを追加する(_P)"
+
+#: ../data/gtkpod.glade.h:67
+msgid "Add _Files"
+msgstr "ファイルを追加する(_F)"
+
+#: ../data/gtkpod.glade.h:68
+msgid "Add _Playlist"
+msgstr "プレイリストを追加する(_P)"
+
+#: ../data/gtkpod.glade.h:69
+#, fuzzy
+msgid "Add coverart from file using the following template"
+msgstr "次のテンプレートに合うファイルをアートワークとして登録する"
+
+#: ../data/gtkpod.glade.h:70
+msgid "Add directories recursively"
+msgstr "ディレクトリを再帰的に追加する"
+
+#: ../data/gtkpod.glade.h:71
+msgid "Add new repository/iPod"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:72
+msgid "Add playlist from file"
+msgstr "プレイリストをファイルから読み込んで追加します"
+
+#: ../data/gtkpod.glade.h:73 ../src/display_sorttabs.c:3247
+#: ../src/display_tracks.c:2103
+msgid "Added"
+msgstr "登録日"
+
+#: ../data/gtkpod.glade.h:74
+msgid "Advanced Sorting Options"
+msgstr ""
+
+#. 0
+#: ../data/gtkpod.glade.h:75 ../src/display_sorttabs.c:2982
+#: ../src/display_spl.c:84 ../src/misc_conversion.c:60
+msgid "Album"
+msgstr "アルバム"
+
+#: ../data/gtkpod.glade.h:76
+#, fuzzy
+msgid "Album Art"
+msgstr "アルバム"
+
+#: ../data/gtkpod.glade.h:77
+msgid "All (AND)"
+msgstr "すべて(AND)"
+
+#: ../data/gtkpod.glade.h:78
+msgid "All Tracks Never Listened To"
+msgstr "一度も聴いた事がない曲"
+
+#: ../data/gtkpod.glade.h:79
+msgid "All Tracks Played Since Last Time"
+msgstr "前回以降再生された曲"
+
+#: ../data/gtkpod.glade.h:80
+msgid "All Tracks not Listed in any Playlist"
+msgstr "プレイリストに載っていないすべての曲"
+
+#: ../data/gtkpod.glade.h:81
+msgid "Also include tracks never played in \"Best Rated\" playlist"
+msgstr ""
+"「評価の高い曲」のリストを作る際に、一度も\n"
+"再生された事のない曲も対象とします。"
+
+#: ../data/gtkpod.glade.h:82
+msgid "Always write ID3v2.4 tags (only applies to MP3)"
+msgstr "常に ID3v2.4 タグを書き込む (MP3 のみ)"
+
+#: ../data/gtkpod.glade.h:83
+msgid "Any (OR)"
+msgstr "いずれか(OR)"
+
+#: ../data/gtkpod.glade.h:84 ../src/display_sorttabs.c:2979
+#: ../src/display_spl.c:85 ../src/misc_conversion.c:61
+msgid "Artist"
+msgstr "アーティスト"
+
+#: ../data/gtkpod.glade.h:85
+#, fuzzy
+msgid "Artwork Preview"
+msgstr "が設定されていない"
+
+#: ../data/gtkpod.glade.h:86
+msgid ""
+"As a last resort set the following tags to the\n"
+"filename if they are (still) empty:"
+msgstr ""
+"最後の手段として、以下のタグが未設定の場合にファイル名をその値として使用する:"
+
+#: ../data/gtkpod.glade.h:88
+msgid "Ascending"
+msgstr "昇順"
+
+#: ../data/gtkpod.glade.h:89
+msgid "Auto Store"
+msgstr "自動保存"
+
+#: ../data/gtkpod.glade.h:90
+msgid ""
+"Automatically start displaying tracks that match the criteria entered above. "
+"If not selected, you must press 'Display' to start displaying."
+msgstr ""
+"各項目が入力されるとすぐに表示を更新します. この項目が選択されていない時に"
+"は、「表示」ボタンを押すことで更新することができます."
+
+#: ../data/gtkpod.glade.h:91
+msgid "Available:"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:92
+msgid "Before removing playlists or tracks from a playlist"
+msgstr "プレイリストや、プレイリストから曲を削除する時"
+
+#: ../data/gtkpod.glade.h:93
+msgid "Before removing tracks from the harddisk"
+msgstr "曲をハードディスクから完全に削除する時"
+
+#: ../data/gtkpod.glade.h:94
+msgid "Before removing tracks from the iPod"
+msgstr "曲をiPodから完全に削除する時"
+
+#: ../data/gtkpod.glade.h:95
+msgid "Before removing tracks from the local database"
+msgstr "曲をローカルデータベースから削除する時"
+
+#: ../data/gtkpod.glade.h:96
+msgid "Best Rated Tracks"
+msgstr "評価の高い曲"
+
+#: ../data/gtkpod.glade.h:97
+msgid "Browse"
+msgstr "ブラウズ"
+
+#: ../data/gtkpod.glade.h:98
+#, fuzzy
+msgid "Cache directory:"
+msgstr "ディレクトリを追加する(_D)"
+
+#: ../data/gtkpod.glade.h:99
+msgid "Calendar"
+msgstr "カレンダー"
+
+#: ../data/gtkpod.glade.h:100
+msgid "Calendar sync command:"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:101
+msgid "Call automatically when synchronizing iTunesDB"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:102
+msgid "Category: "
+msgstr "カテゴリ: "
+
+#: ../data/gtkpod.glade.h:103
+msgid ""
+"Change all tracks\n"
+"simultaneously"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:105
+msgid ""
+"Check before removing photos from a photo album whether\n"
+"they should be deleted from the Photo Database."
+msgstr ""
+
+#: ../data/gtkpod.glade.h:107
+msgid "Check for existing files when copying from iPod."
+msgstr "iPod からコピーする際に同じファイルかどうかをチェックする"
+
+#: ../data/gtkpod.glade.h:108
+msgid "Command for 'Enqueue':"
+msgstr "「演奏キューに入れる」ためのコマンド:"
+
+#: ../data/gtkpod.glade.h:109
+msgid "Command for 'Play now':"
+msgstr "「今すぐ演奏」のためのコマンド:"
+
+#. 5
+#: ../data/gtkpod.glade.h:110 ../src/display_spl.c:97
+#: ../src/misc_conversion.c:65
+msgid "Composer"
+msgstr "作曲者"
+
+#: ../data/gtkpod.glade.h:111
+#, fuzzy
+msgid "Confirm before removing tracks from the iPod or repository"
+msgstr "曲をiPodから完全に削除する時"
+
+#: ../data/gtkpod.glade.h:112
+msgid ""
+"Confirm before removing tracks from the iPod or repository\n"
+"when syncing playlists"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:114
+msgid "Confirm lists of directories"
+msgstr "ディレクトリのリストを確認する"
+
+#: ../data/gtkpod.glade.h:115
+msgid "Contacts sync command:"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:116
+msgid "Containing Displayed Tracks"
+msgstr "表示されている曲から作成"
+
+#: ../data/gtkpod.glade.h:117
+msgid "Containing Selected Tracks"
+msgstr "選択されている曲から作成"
+
+#: ../data/gtkpod.glade.h:118
+msgid "Conversion Progress Display"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:119
+msgid "Cover"
+msgstr "カバー"
+
+#: ../data/gtkpod.glade.h:120
+msgid "Create New Playlist"
+msgstr "新しくプレイリストを作成します"
+
+#: ../data/gtkpod.glade.h:121
+#, fuzzy
+msgid "Create Repository"
+msgstr "iPodから削除"
+
+#: ../data/gtkpod.glade.h:122
+msgid "Create _Playlist File"
+msgstr "プレイリストファイルを作成 (_P)"
+
+#: ../data/gtkpod.glade.h:123
+msgid "Credits"
+msgstr "権利表示"
+
+#: ../data/gtkpod.glade.h:124
+msgid "Currently only rating is supported."
+msgstr "現在は評価情報のみ使用"
+
+#: ../data/gtkpod.glade.h:125
+#, fuzzy
+msgid "Delete repository"
+msgstr "iPodから削除"
+
+#: ../data/gtkpod.glade.h:126
+#, fuzzy
+msgid ""
+"Delete tracks that are no longer present from the\n"
+"iPod or repository"
+msgstr "以下の重複した%d曲が削除されました。"
+
+#: ../data/gtkpod.glade.h:128
+msgid "Deleted tracks"
+msgstr "削除された曲"
+
+#: ../data/gtkpod.glade.h:129
+msgid "Descending"
+msgstr "降順"
+
+#: ../data/gtkpod.glade.h:130
+msgid "Details"
+msgstr "詳細"
+
+#: ../data/gtkpod.glade.h:132
+#, no-c-format
+msgid ""
+"Determines how the string for the info field should be constructed, e.g '%a/%"
+"A/%T - %t.mp3' or '%o'.  You can separate several templates by semicolons -- "
+"gtkpod will determine which one to use by the filename extension given. "
+"Artist: %a, album: %A, composer: %c, title: %t, genre: %G, track nr: %T, CD "
+"nr: %C, year: %Y, original filename (requires extended information file): %"
+"o, the character '%': %%."
+msgstr ""
+"曲情報を抽出するための形式情報を設定します. 例: '%a/%A/%T - %t.mp3' や '%o'."
+"複数の形式情報をセミコロンで区切って連続して書くことができます -- gtkpod はど"
+"の形式を使えばいいかを, ファイル名の拡張子から判断します.アーティスト: %a, ア"
+"ルバム: %A, 作曲者: %c, 名前: %t, ジャンル: %G, 曲番号: %T, ディスク番号: %"
+"C, 年: %Y, 元のファイル名 (拡張情報ファイルが必要): %o, 「%」: %%."
+
+#: ../data/gtkpod.glade.h:134
+#, no-c-format
+msgid ""
+"Determines the filename of tracks you copy from the iPod, e.g '%a/%A/%T - %t."
+"mp3' or '%o'.  You can separate several patterns by semicolons -- gtkpod "
+"will determine which one to use by the filename extension given. Artist: %a, "
+"album: %A, composer: %c, title: %t, genre: %G, track nr: %T, CD nr: %C, "
+"year: %Y, original filename (requires extended information file): %o, "
+"current playlist: %p, the character '%': %%."
+msgstr ""
+"iPodからコピーした曲に付けられるファイル名を設定します. 例:'%a/%A/%T - %t."
+"mp3' や '%o'. 複数の書式をセミコロンで区切って連続して書くこともできます -- "
+"gtkpod はどの書式を使えばいいかを, ファイル名の拡張子から判断します.アーティ"
+"スト: %a, アルバム: %A, 作曲者: %c, 名前: %t, ジャンル: %G, 曲番号: %T, ディ"
+"スク番号: %C, 年: %Y, 元のファイル名 (拡張情報ファイルが必要): %o, プレイリス"
+"ト: %p, 「%」: %%."
+
+#: ../data/gtkpod.glade.h:136
+#, fuzzy, no-c-format
+msgid ""
+"Determines the name of the file with the cover art. You can separate several "
+"patterns by semicolons which will be tried in order. Artist: %a, album: %A, "
+"composer: %c, title: %t, genre: %G, track nr: %T, CD nr: %C, year: %Y, "
+"original filename (requires extended information file): %o, original "
+"filename without file extension: %O, current playlist: %p, the character "
+"'%': %%."
+msgstr ""
+"iPodからコピーした曲に付けられるファイル名を設定します。例:'%A/%d%t - %n' や "
+"'%o' など。%A: アーティスト; %n: タイトル; %t: トラックNo.; %o: 元のファイル"
+"名 (拡張情報ファイルが必要)"
+
+#: ../data/gtkpod.glade.h:137
+msgid ""
+"Directories to sync with are determined from the filenames of the tracks in "
+"the playlist."
+msgstr ""
+
+#: ../data/gtkpod.glade.h:138
+msgid "Display a list of tracks that could actually be updated."
+msgstr "実際に更新された曲のリストを表示します。"
+
+#: ../data/gtkpod.glade.h:139
+msgid "Display a list of tracks that could not be updated."
+msgstr "実際には更新されなかった曲のリストを表示します。"
+
+#: ../data/gtkpod.glade.h:140
+msgid "Display conversion log"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:141
+msgid "Display info about detected duplicates"
+msgstr "重複を見つけた際に報告する"
+
+#: ../data/gtkpod.glade.h:142
+msgid "Display info about non-updated tracks"
+msgstr "更新されなかった曲を表示する"
+
+#: ../data/gtkpod.glade.h:143
+msgid "Display info about updated tracks"
+msgstr "更新された曲の情報を表示する"
+
+#: ../data/gtkpod.glade.h:144
+msgid "Display messages and warnings at startup"
+msgstr "起動時にメッセージや警告を表示する"
+
+#: ../data/gtkpod.glade.h:145
+msgid ""
+"Display the list of duplicates that have been detected after adding files."
+msgstr "ファイルを追加した際に発見した、重複する曲のリストを表示します。"
+
+#: ../data/gtkpod.glade.h:146
+msgid "Display toolbar..."
+msgstr "ツールバーの表示..."
+
+#: ../data/gtkpod.glade.h:147
+msgid "Display tooltips in main window"
+msgstr "ツールチップをメイン画面で表示する"
+
+#: ../data/gtkpod.glade.h:148
+msgid "Display tooltips in prefs window"
+msgstr "ツールチップを設定画面で表示する"
+
+#: ../data/gtkpod.glade.h:149
+msgid "Display tracks that match the criteria entered above."
+msgstr "上で指定された条件に合致する曲を表示します."
+
+#: ../data/gtkpod.glade.h:150
+msgid ""
+"Displayed\n"
+"Tracks"
+msgstr ""
+"表示され\n"
+"ている曲"
+
+#: ../data/gtkpod.glade.h:152
+#, fuzzy
+msgid "Displayed:"
+msgstr "表示(_D)"
+
+#: ../data/gtkpod.glade.h:153
+msgid "Don't allow file duplication"
+msgstr "ファイルの重複を許さない"
+
+#: ../data/gtkpod.glade.h:154
+#, fuzzy
+msgid "Don't automatically sync on startup"
+msgstr "起動時に自動的に iTunesDB を読み込む"
+
+#: ../data/gtkpod.glade.h:155
+#, fuzzy
+msgid "Duplicate Recognition is based on a (modified) sha1 hash over the file."
+msgstr "md5を利用した重複チェックを行うようになります。"
+
+#: ../data/gtkpod.glade.h:156
+msgid "Edit Repository/iPod Options"
+msgstr "iPod の設定"
+
+#: ../data/gtkpod.glade.h:157 ../src/context_menus.c:662
+msgid "Edit Smart Playlist"
+msgstr "スマートプレイリストの編集"
+
+#: ../data/gtkpod.glade.h:158 ../src/context_menus.c:749
+msgid "Edit Track Details"
+msgstr "曲情報を編集"
+
+#: ../data/gtkpod.glade.h:159
+msgid "Edit _Preferences"
+msgstr "設定(_P)"
+
+#: ../data/gtkpod.glade.h:160
+msgid "Effective free space"
+msgstr "空き容量"
+
+#: ../data/gtkpod.glade.h:161
+msgid "Empty Playlist"
+msgstr "空リスト"
+
+#: ../data/gtkpod.glade.h:162
+msgid "Exclude file mask(s)"
+msgstr "適用しないファイル"
+
+#: ../data/gtkpod.glade.h:163
+#, fuzzy
+msgid "Export can be continued at a later time if canceled."
+msgstr ""
+"ボタンを押すと中断します。\n"
+"ファイルのエクスポートは後で再開する事ができます。"
+
+#: ../data/gtkpod.glade.h:164
+msgid "File size"
+msgstr "ファイルサイズ"
+
+#: ../data/gtkpod.glade.h:165
+msgid "File size (deleted)"
+msgstr "削除されたファイルサイズ"
+
+#: ../data/gtkpod.glade.h:166
+msgid "File size (non-transferred)"
+msgstr "未転送のファイルサイズ"
+
+#: ../data/gtkpod.glade.h:167
+msgid "Filename Format: "
+msgstr "ファイル名の書式: "
+
+#: ../data/gtkpod.glade.h:168
+#, fuzzy
+msgid ""
+"Find orphan files (files with no track info in DB) and dangling tracks "
+"(tracks with no corresponding files on iPod)"
+msgstr ""
+"みなしごファイル (データベースに曲情報が登録されていないファイル) やぶらさが"
+"り曲 (曲情報があるのにファイル自体が iPod 上に存在しない) を探す"
+
+#: ../data/gtkpod.glade.h:169
+#, fuzzy
+msgid "First try <i>folder.jpg</i>, then <i>&lt;artist&gt;.jpg</i>"
+msgstr "最初に <i>folder.jpg</i> を試し、無ければ <i>&lt;artist&gt;.jpg</i>"
+
+#: ../data/gtkpod.glade.h:170
+msgid "Flac with :"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:172
+#, fuzzy, no-c-format
+msgid ""
+"For example, 'xmms %s' will clear xmms' current playlist, add the selected "
+"tracks and start playing."
+msgstr ""
+"例えば 'xmms -p %s' とすると、xmms のその時のプレイリストをクリアし、選択した"
+"曲をプレイリストの先頭に加えて演奏を始めます。"
+
+#: ../data/gtkpod.glade.h:174
+#, no-c-format
+msgid ""
+"For example, 'xmms -e %s' will append (enqueue) the selected tracks to xmms' "
+"current playlist."
+msgstr ""
+"例えば 'xmms -e %s' とすると、選択された曲を xmms のその時のプレイリストの最"
+"後尾に追加します"
+
+#: ../data/gtkpod.glade.h:175 ../src/display_sorttabs.c:2985
+#: ../src/display_spl.c:89 ../src/misc_conversion.c:63
+msgid "Genre"
+msgstr "ジャンル"
+
+#: ../data/gtkpod.glade.h:176
+msgid "Group artists on compilation CDs"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:177
+#, fuzzy
+msgid ""
+"Highly recommended for faster import when taking advantage of the "
+"duplication recognition. Also, having the PC filenames allows writing "
+"changed ID3 tags to disk, and even to reconstruct your iPod's contents in "
+"case of file system corruption (change the \"transferred=\" entries in your "
+"backuped database)."
+msgstr ""
+"重複チェックを高速化するためには、この項目を有効にする事が強く推奨されます。"
+"また、ファイル名を保持する事でID3タグの変更をiPodに反映させる事が可能になり、"
+"仮にiPodの中身が壊れたりした場合にも、再構成を容易にします。(データベースの"
+"バックアップファイルの中の \"transferred=\" の項目を変更すればよい)"
+
+#: ../data/gtkpod.glade.h:178 ../src/context_menus.c:685
+#: ../src/context_menus.c:703 ../src/context_menus.c:820
+msgid "I'm sure"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:179
+msgid ""
+"If available, the local copy of the track is referenced in the playlist. "
+"Otherwise the file on the iPod is used."
+msgstr ""
+"可能であれば, プレイリストはこの曲のハードディスク上のファイルを参照します.見"
+"つからない場合には iPod 上のファイルを参照します."
+
+#: ../data/gtkpod.glade.h:180
+msgid "If both options are selected, embedded APIC data takes precedence."
+msgstr ""
+
+#: ../data/gtkpod.glade.h:181
+msgid ""
+"If checked, sorting will be case sensitive. Please note that case sensitive "
+"sorting will not work well with most charsets."
+msgstr ""
+"並べ換えの際に, アルファベットの大文字と小文字を区別します. この機能はアル"
+"ファベット以外のほとんどの文字には対応していません."
+
+#: ../data/gtkpod.glade.h:182
+msgid ""
+"If the filename (full path) of an existing track matches that of a track to "
+"be added, this option allows you to update the information about the "
+"existing track rather than just skipping the track altogether. No update "
+"will take place if the file hasn't changed and you have selected the 'Don't "
+"allow file duplication' option above."
+msgstr ""
+"すでに記録されている曲と同じファイル名(フルパスで)を持つ曲を追加しようとした"
+"場合、この項目が有効になっていると、その曲を無視する代わりに記録されている曲"
+"の情報を更新します。もしファイルに変更がなく、「ファイルの重複を許さない」の"
+"項目を有効にしている場合は、更新はなされません。"
+
+#: ../data/gtkpod.glade.h:183
+msgid "If you check this, gtkpod will descend into subdirectories recursively."
+msgstr "この項目を有効にすると、gtkpodはサブディレクトリを再帰的に辿ります。"
+
+#: ../data/gtkpod.glade.h:184
+msgid ""
+"If you check this, information (cover art and meta information) changed for "
+"this track will be copied to all other selected tracks as well. Use with "
+"care."
+msgstr ""
+
+#: ../data/gtkpod.glade.h:185
+msgid ""
+"If you don't select the master playlist automatically, the initial database "
+"import is much faster because the display dosn't have to be updated."
+msgstr ""
+"マスタープレイリストを自動的に選択しないようにすると、起動時にデータベースを"
+"読み込む際には何も表示しなくなるので、スピードが速くなります。"
+
+#: ../data/gtkpod.glade.h:186
+msgid ""
+"If you select several tracks in the track list and edit a tag of the first "
+"track, the tags in the other tracks are updated as well."
+msgstr ""
+"曲リストの曲を二つ以上選択して、最初の曲のタグを変更すると他の曲にもその変更"
+"を適用します。"
+
+#: ../data/gtkpod.glade.h:187
+msgid "Ignore these words when at the beginning of the following fields:"
+msgstr "これらの語が以下の項目の冒頭にあった場合には無視します:"
+
+#: ../data/gtkpod.glade.h:188
+msgid ""
+"In order to save the displayed track order to the iPod choose 'Save "
+"Displayed Track Order' from the 'Edit' menu or select 'Auto Store' below."
+msgstr ""
+"表示されている曲順を iPod に保存するには,「編集」メニューから「現在の曲順を保"
+"存」を選択するか, この下の「自動保存」を選択してください."
+
+#: ../data/gtkpod.glade.h:189
+msgid "Initialize iPod"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:190
+msgid ""
+"Insert before\n"
+"Insert after"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:192
+msgid "Keeps all compilation CDs grouped together in the artists sort tab."
+msgstr ""
+
+#: ../data/gtkpod.glade.h:193
+msgid "Live _updating"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:194
+msgid "Load iPod(s)"
+msgstr "iPod から読み込み"
+
+#: ../data/gtkpod.glade.h:195
+msgid "Lower Margin"
+msgstr "下限"
+
+#: ../data/gtkpod.glade.h:196
+msgid "M4A with :"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:197
+msgid "MP3 with :"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:198
+msgid "Match al_l of the following"
+msgstr "以下のすべてに該当するもの(_l)"
+
+#: ../data/gtkpod.glade.h:199
+msgid "Match an_y of the following"
+msgstr "以下のいずれかに該当するもの(_y)"
+
+#: ../data/gtkpod.glade.h:200
+msgid "Match only _checked tracks"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:201
+msgid "Maximum number of background threads:"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:202
+msgid "Maximum size of cache directory (in GB):"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:203
+msgid "Model:"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:204 ../src/display_tracks.c:2100
+msgid "Modified"
+msgstr "変更日"
+
+#: ../data/gtkpod.glade.h:205
+msgid "Most Recently Played Tracks"
+msgstr "最近再生された曲"
+
+#: ../data/gtkpod.glade.h:206
+msgid "Move selected attributes to the displayed list"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:207
+msgid "Music Root:"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:208
+msgid ""
+"Music files can have images embedded in the APIC tag. Currently this is only "
+"supported for MP3 files."
+msgstr ""
+
+#: ../data/gtkpod.glade.h:209
+msgid "Never show this dialogue again"
+msgstr "この質問を二度と表示しない"
+
+#: ../data/gtkpod.glade.h:210 ../src/display_spl.c:1719
+#: ../src/misc_playlist.c:66 ../src/misc_playlist.c:68
+#: ../src/misc_playlist.c:93 ../src/misc_playlist.c:95
+#: ../src/misc_playlist.c:428 ../src/misc_playlist.c:430
+msgid "New Playlist"
+msgstr "新規プレイリスト"
+
+#: ../data/gtkpod.glade.h:211
+msgid "No lower margin"
+msgstr "下限を指定しない"
+
+#: ../data/gtkpod.glade.h:212
+msgid "No upper margin"
+msgstr "上限を指定しない"
+
+#: ../data/gtkpod.glade.h:213
+msgid "Non-transferred tracks"
+msgstr "未転送の曲数"
+
+#: ../data/gtkpod.glade.h:214
+msgid "None"
+msgstr "無指定"
+
+#: ../data/gtkpod.glade.h:215
+msgid ""
+"Normally the charset specified when first importing the track will be used "
+"for the filename. If you set this option you can set a different charset "
+"with the charset selector (Preferences/'Adding/Updating/Syncing'). Note: the "
+"charset info is stored in the extended information file (see "
+"Preferences/'Writing of the iTunesDB'). Tracks imported before V0.51 will "
+"have no charset stored. Instead the charset specified will be used."
+msgstr ""
+"通常は, 最初に曲を登録した時に指定された文字コードをファイル名にも使用します"
+"が, この項目を有効にすると, 設定メニューの「追加/更新/同期」の項目で指定した"
+"文字コードをかわりに使用できます. 注意: 文字コードの情報は拡張情報ファイル "
+"(「iTunesDBへの書き込み」を参照)に記録されます. バージョン0.51以前の gtkpod "
+"で登録された曲にはこの情報が記録されていません. この場合, 上で指定された文字"
+"コードが今後使われるようになります."
+
+#: ../data/gtkpod.glade.h:216
+msgid ""
+"Normally the charset specified when first importing the track will be used "
+"to update the track information. If you have chosen a wrong charset when "
+"first importing a track and want to correct it using the 'Update Track' "
+"function, you must check this option. Note: the charset info is stored in "
+"the extended information file (see 'Writing of iTunesDB' below) and tracks "
+"imported before V0.51 will have no charset stored. Instead the charset "
+"specified above will be used then."
+msgstr ""
+"通常は, 曲をインポートする際に指定された文字コードがその後も使われますが, も"
+"しその時に間違った文字コードを指定してしまっていて,「曲の更新」を使ってそれを"
+"直したいのであれば, この項目を有効にしてください. 注意: 文字コードの情報は拡"
+"張情報ファイルに記録されますが(「iTunesDBへの書き込み」の項目を参照), バー"
+"ジョン0.51以前の gtkpod でインポートされた曲はこの情報が記録さていません. こ"
+"の場合, ここで指定された文字コードが今後使われるようになります."
+
+#: ../data/gtkpod.glade.h:217
+msgid ""
+"Normally the charset specified when first importing the track will be used "
+"to write the tags. If you have chosen a wrong charset when first importing a "
+"track, you should select this option along with the correct charset.  Note: "
+"uses the extended information file to store the charset information (see "
+"'Writing of the iTunesDB' on the 'Input/Output' page) and tracks imported "
+"before V0.51 will have no charset stored -- the charset specified on the "
+"'Input/Output' page will be used."
+msgstr ""
+"通常は、最初に曲を保存した時に指定された文字コードをタグを書き込む時にも使用"
+"します。もし最初に間違った文字コードを指定してしまった場合には、正しい文字"
+"コードを選択した後にこのオプションを選択してください。注意: 文字コードの情報"
+"を保存するために、拡張情報ファイルを使用してください(「入出力」のページの"
+"「iTunesDBへの書き込み」の項を参照)。また、バージョン0.51以前に登録された曲に"
+"ついては文字コード情報が保存されていません。「入出力」の項目で指定された文字"
+"コードが適用されます。"
+
+#: ../data/gtkpod.glade.h:218
+msgid ""
+"Normally, if a track is no longer present in the sync directory, it will be "
+"removed from the playlist, but not from the iPod or local repository.\n"
+"If this option is checked, tracks will be completely removed from the iPod "
+"or local repository, unless the track is a member of other playlists as "
+"well.\n"
+"NOTE: if you sync with the master playlist, you must check this option if "
+"you want tracks to be removed, because removing from the master playlist "
+"means removing from the iPod."
+msgstr ""
+
+#: ../data/gtkpod.glade.h:221
+msgid "Notes sync command:"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:222
+msgid "Number of playlists"
+msgstr "プレイリストの数"
+
+#: ../data/gtkpod.glade.h:223
+msgid "Number of tracks"
+msgstr "曲数"
+
+#: ../data/gtkpod.glade.h:224
+msgid "Number of tracks in generated playlists:"
+msgstr "生成するプレイリストに加える曲数:"
+
+#: ../data/gtkpod.glade.h:225
+msgid ""
+"Number of tracks in the generated playlists 'Most Often Listened', 'Best "
+"Rated' and 'Most Recently Played'. Choose '0' for 'no limit'."
+msgstr ""
+"プレイリストの新規作成で、「再生回数の多い曲」「評価の高い曲」「最近再生され"
+"た曲」を選択した際にリストに登録する曲の数を指定します。0を指定すると、曲数を"
+"制限しません。"
+
+#: ../data/gtkpod.glade.h:226
+msgid "Ogg with :"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:227
+msgid "On startup automatically sync with playlist directories"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:228
+#, fuzzy
+msgid "On startup automatically sync with the following directory"
+msgstr "以下のディレクトリで同期処理をしてもよろしいですか?"
+
+#: ../data/gtkpod.glade.h:229
+msgid "On startup automatically update (Live Playlist)"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:230
+msgid "One for each Album"
+msgstr "各アルバムごとのリスト"
+
+#: ../data/gtkpod.glade.h:231
+msgid "One for each Artist"
+msgstr "各アーティストごとのリスト"
+
+#: ../data/gtkpod.glade.h:232
+msgid "One for each Composer"
+msgstr "各作曲者ごとのリスト"
+
+#: ../data/gtkpod.glade.h:233
+msgid "One for each Genre"
+msgstr "各ジャンルごとのリスト"
+
+#: ../data/gtkpod.glade.h:234
+msgid "One for each Rating"
+msgstr "各評価値ごとのリスト"
+
+#: ../data/gtkpod.glade.h:235
+msgid "One for each Year"
+msgstr "各年ごとのリスト"
+
+#: ../data/gtkpod.glade.h:236
+msgid "Overwrite tags that are already set"
+msgstr "すでにあタグ情報を上書きする"
+
+#: ../data/gtkpod.glade.h:237
+msgid "Password:"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:238
+msgid "Path:"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:239
+#, fuzzy
+msgid "Photo Window"
+msgstr "情報(_I)"
+
+#: ../data/gtkpod.glade.h:240 ../src/display_spl.c:94
+msgid "Play time"
+msgstr "演奏時間"
+
+#: ../data/gtkpod.glade.h:241 ../src/display_spl.c:98
+#: ../src/misc_conversion.c:77
+msgid "Playcount"
+msgstr "再生回数"
+
+#: ../data/gtkpod.glade.h:242 ../src/display_tracks.c:2097
+msgid "Played"
+msgstr "演奏日"
+
+#: ../data/gtkpod.glade.h:243
+msgid "Playlist name:"
+msgstr "プレイリストの名前:"
+
+#: ../data/gtkpod.glade.h:244
+#, fuzzy
+msgid "Playlist type:"
+msgstr "プレイリスト"
+
+#: ../data/gtkpod.glade.h:245 ../src/display_playlists.c:2258
+msgid "Playlists"
+msgstr "プレイリスト"
+
+#: ../data/gtkpod.glade.h:246
+msgid "Please refer to the notice below."
+msgstr "下記の注意を参照してください。"
+
+#: ../data/gtkpod.glade.h:247
+msgid "Please specify a time interval"
+msgstr "期間を指定してください"
+
+#: ../data/gtkpod.glade.h:248
+msgid "Preferences"
+msgstr "設定"
+
+#: ../data/gtkpod.glade.h:249
+#, fuzzy
+msgid "Progress Information"
+msgstr "情報"
+
+#: ../data/gtkpod.glade.h:250
+msgid "R_ename Album"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:251
+msgid "Random Playlist from Displayed Tracks"
+msgstr "表示されている曲からランダムに作成"
+
+#: ../data/gtkpod.glade.h:252
+msgid "Randomize Current Playlist"
+msgstr "現在のプレイリストをランダムに並べ換える"
+
+#: ../data/gtkpod.glade.h:253 ../src/display_spl.c:101
+#: ../src/misc_conversion.c:78
+msgid "Rating"
+msgstr "評価"
+
+#: ../data/gtkpod.glade.h:254
+msgid "Read coverart from embedded APIC data"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:255
+msgid "Read tags from file contents (e.g. ID3 tags in MP3 files)"
+msgstr "ファイルからタグ情報を読み込む (MP3 ファイルの ID3 タグなど)"
+
+#: ../data/gtkpod.glade.h:256
+#, fuzzy
+msgid "Remove selected attributes from the displayed list"
+msgstr "選択された曲をプレイリストから削除する"
+
+#: ../data/gtkpod.glade.h:257
+#, fuzzy
+msgid "Repository Options"
+msgstr "ソートの設定"
+
+#: ../data/gtkpod.glade.h:258
+#, fuzzy
+msgid "Repository name:"
+msgstr "ソートの設定"
+
+#: ../data/gtkpod.glade.h:259
+#, fuzzy
+msgid "Repository type:"
+msgstr "ソートの設定"
+
+#: ../data/gtkpod.glade.h:260
+msgid "Root directory of mserv database (trackinfo root)."
+msgstr "mserv データベースのあるディレクトリ。(trackinfo root)"
+
+#: ../data/gtkpod.glade.h:261
+msgid "Rules"
+msgstr "ルール"
+
+#: ../data/gtkpod.glade.h:262 ../src/context_menus.c:804
+msgid "Save Changes"
+msgstr "変更を保存"
+
+#: ../data/gtkpod.glade.h:263
+#, fuzzy
+msgid "Scrobble Tracks?"
+msgstr "選択された曲(_T)"
+
+#: ../data/gtkpod.glade.h:264
+msgid "Select '-1' for no upper limit."
+msgstr "上限を指定しない場合は '-1' を選んでください。"
+
+#: ../data/gtkpod.glade.h:265
+msgid "Select '0' for no lower limit."
+msgstr "下限を指定しない場合は '0' を選んでください."
+
+#: ../data/gtkpod.glade.h:266
+msgid ""
+"Selected\n"
+"Playlist"
+msgstr ""
+"選択された\n"
+"プレイリスト"
+
+#: ../data/gtkpod.glade.h:268
+msgid ""
+"Selected\n"
+"Tracks"
+msgstr ""
+"選択され\n"
+"ている曲"
+
+#: ../data/gtkpod.glade.h:270
+#, fuzzy
+msgid "Selected Filter Tab Entry from Database"
+msgstr "選択されたタブで指定した曲をデータベースから削除する"
+
+#: ../data/gtkpod.glade.h:271
+#, fuzzy
+msgid "Selected Filter Tab Entry from Hard Disk"
+msgstr "選択されたタブで指定した曲をハードディスクから削除する"
+
+#: ../data/gtkpod.glade.h:272
+#, fuzzy
+msgid "Selected Filter Tab Entry from Playlist"
+msgstr "選択されたタブで指定した曲をプレイリストから削除する"
+
+#: ../data/gtkpod.glade.h:273
+#, fuzzy
+msgid "Selected Filter Tab Entry from iPod"
+msgstr "選択されたタブで指定した曲を iPod から削除する"
+
+#: ../data/gtkpod.glade.h:274
+#, fuzzy
+msgid "Selected Playlist Including Tracks from Database"
+msgstr "選択されたプレイリストを曲ごとデータベースから削除する"
+
+#: ../data/gtkpod.glade.h:275
+#, fuzzy
+msgid "Selected Playlist Including Tracks from Hard Disk"
+msgstr "選択されたプレイリストを曲ごとデータベースから削除する"
+
+#: ../data/gtkpod.glade.h:276
+#, fuzzy
+msgid "Selected Playlist Including Tracks from iPod"
+msgstr "選択されたプレイリストを曲ごと iPod から削除する"
+
+#: ../data/gtkpod.glade.h:277
+msgid "Selected Tab _Entry"
+msgstr "選択されたソートタブ(_E)"
+
+#: ../data/gtkpod.glade.h:278
+#, fuzzy
+msgid "Selected Tracks from Database"
+msgstr "選択された曲をデータベースから削除する"
+
+#: ../data/gtkpod.glade.h:279
+#, fuzzy
+msgid "Selected Tracks from Hard Disk"
+msgstr "選択された曲をハードディスクから削除する"
+
+#: ../data/gtkpod.glade.h:280
+#, fuzzy
+msgid "Selected Tracks from Playlist"
+msgstr "選択された曲をプレイリストから削除する"
+
+#: ../data/gtkpod.glade.h:281
+#, fuzzy
+msgid "Selected Tracks from iPod"
+msgstr "選択された曲を iPod から削除する"
+
+#: ../data/gtkpod.glade.h:282
+msgid "Selected _Playlist"
+msgstr "選択されたプレイリスト(_P)"
+
+#: ../data/gtkpod.glade.h:283
+msgid "Selected _Tracks"
+msgstr "選択された曲(_T)"
+
+#: ../data/gtkpod.glade.h:284
+msgid "Selected playlist"
+msgstr "選択されたプレイリスト"
+
+#: ../data/gtkpod.glade.h:285
+#, fuzzy
+msgid "Semicolon separated list of file exclusion masks, e.g. '*.mp3'"
+msgstr "セミコロンで区切られた, 適用しないファイルのマスクリスト. 例: '*.mp3'"
+
+#: ../data/gtkpod.glade.h:286
+#, fuzzy
+msgid "Set Cover Art from _File"
+msgstr "mserv データを更新する(_m)"
+
+#: ../data/gtkpod.glade.h:287
+msgid "Set mountpoint or edit repository options"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:288
+msgid "Set options for Calendar/Contacts/Notes"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:289
+msgid ""
+"Set this to 'aacgain -q -k' to use the 'Normalize volume' functionality in "
+"the Tools Menu. If this is set, missing normalization data for .m4a and .m4b "
+"files will be calculated and written to your music file using this command."
+msgstr ""
+
+#: ../data/gtkpod.glade.h:290
+msgid ""
+"Set this to 'mp3gain -q -k' to use the 'Normalize volume' functionality in "
+"the Tools Menu. If this is set, missing normalization data for mp3 files "
+"will be calculated and written to your mp3 file using this command."
+msgstr ""
+
+#: ../data/gtkpod.glade.h:291
+msgid "Set this to your last.fm password"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:292
+msgid "Set this to your last.fm username"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:293
+msgid ""
+"Set to 0 to effectively disable caching (a maximum of one track will be "
+"cached at a time)."
+msgstr ""
+
+#: ../data/gtkpod.glade.h:294
+msgid ""
+"Set to 0 to use as many background threads as CPUs are available on your "
+"system."
+msgstr ""
+
+#: ../data/gtkpod.glade.h:295
+msgid "Show information about problems when accessing mserv"
+msgstr "mserv へアクセスするとき、問題の報告を表示する"
+
+#: ../data/gtkpod.glade.h:296
+msgid "Show summary of sync result"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:297 ../src/misc_playlist.c:96
+#: ../src/repository.c:1356
+msgid "Smart Playlist"
+msgstr "スマートプレイリスト"
+
+#: ../data/gtkpod.glade.h:298
+msgid "Sort tracks according to: "
+msgstr "曲順を次の順で並べ換える: "
+
+#: ../data/gtkpod.glade.h:299
+msgid "Sorting Options"
+msgstr "ソートの設定"
+
+#: ../data/gtkpod.glade.h:300
+msgid "Sorting case sensitive"
+msgstr "並べ換えの際に大文字小文字を区別する"
+
+#: ../data/gtkpod.glade.h:301
+msgid "Sorttab: "
+msgstr "ソートタブ: "
+
+#: ../data/gtkpod.glade.h:302
+msgid "Sorttabs"
+msgstr "ソートタブ"
+
+#: ../data/gtkpod.glade.h:303
+msgid "Source:"
+msgstr "参照先:"
+
+#: ../data/gtkpod.glade.h:305
+#, no-c-format
+msgid ""
+"Specify exact path including command line options. '%i' will be replaced "
+"with the mount point of the iPod."
+msgstr ""
+
+#: ../data/gtkpod.glade.h:306
+msgid "Specify interval"
+msgstr "範囲を指定してください"
+
+#: ../data/gtkpod.glade.h:307
+msgid "Start display automatically"
+msgstr "自動的に表示を更新する"
+
+#: ../data/gtkpod.glade.h:308
+msgid "Synchronise Contacts, Calendar and Notes"
+msgstr "アドレスデータ,カレンダー,メモを同期する"
+
+#: ../data/gtkpod.glade.h:309
+msgid "Synchronize All"
+msgstr "すべて同期"
+
+#: ../data/gtkpod.glade.h:310
+msgid "Synchronize Calendar"
+msgstr "カレンダーを同期"
+
+#: ../data/gtkpod.glade.h:311
+msgid "Synchronize Contacts"
+msgstr "アドレスデータを同期"
+
+#: ../data/gtkpod.glade.h:312
+msgid "Synchronize Notes"
+msgstr "メモを同期"
+
+#: ../data/gtkpod.glade.h:313
+msgid "Template for info field: "
+msgstr ""
+
+#: ../data/gtkpod.glade.h:314
+msgid ""
+"The local copy of the track is referenced in the playlist. If the track is "
+"not available locally, an error message is displayed."
+msgstr ""
+"ハードディスク上にある対応する曲を常に参照します. 見つからない場合にはエラー"
+"メッセージを表示します."
+
+#: ../data/gtkpod.glade.h:315
+msgid ""
+"The output of the background conversion scripts is copied below. Each page "
+"of the notebook corresponds to one background thread."
+msgstr ""
+
+#: ../data/gtkpod.glade.h:316
+#, fuzzy
+msgid ""
+"The tags are written to the files on your harddrive and on the iPod (if "
+"available)."
+msgstr ""
+"タグは使っているハードディスクと(可能であれば)iPodの両方で修正されます。"
+
+#: ../data/gtkpod.glade.h:317
+msgid "The track on the iPod is referenced in the playlist file."
+msgstr "iPod 上の曲を常に参照します."
+
+#: ../data/gtkpod.glade.h:318
+msgid "This is the same option as in 'Edit/Delete Confirmation'"
+msgstr "「編集/削除の確認」の項目と同じです"
+
+#: ../data/gtkpod.glade.h:319
+msgid ""
+"This is the way to go, but maybe not all programs support it yet. ID3v2.4 "
+"uses unicode to store the tags, so you won't have to worry about charsets "
+"any more. gtkpod will use UTF8 encoding as this will not increase the size "
+"of pure ASCII tags. ID3v2.2/4 tags will also be written if they are already "
+"present in the file to write to."
+msgstr ""
+
+#: ../data/gtkpod.glade.h:320
+msgid "This option will be re-activated when you upgrade gtkpod."
+msgstr ""
+
+#: ../data/gtkpod.glade.h:321
+msgid "Time:"
+msgstr "時刻:"
+
+#: ../data/gtkpod.glade.h:322 ../src/display_sorttabs.c:2991
+#: ../src/display_spl.c:83 ../src/misc_conversion.c:62
+msgid "Title"
+msgstr "タイトル"
+
+#: ../data/gtkpod.glade.h:323
+msgid ""
+"Total\n"
+"(iPod)"
+msgstr ""
+"合計\n"
+"(iPod)"
+
+#: ../data/gtkpod.glade.h:325
+msgid ""
+"Total\n"
+"(local)"
+msgstr ""
+"合計\n"
+"(ローカル)"
+
+#: ../data/gtkpod.glade.h:327
+msgid "Tracks"
+msgstr "曲リスト"
+
+#: ../data/gtkpod.glade.h:328
+msgid "Tracks Most Often Listened To"
+msgstr "再生回数の多い曲"
+
+#: ../data/gtkpod.glade.h:329
+msgid ""
+"Tracks can be transferred in the background as soon as they are added to an "
+"iPod repository. Otherwise they will be transferred when ejecting the "
+"contents of the iPod completely unchanged until then."
+msgstr ""
+
+#: ../data/gtkpod.glade.h:330
+msgid "Tracks in Selected Tab _Entry"
+msgstr "選択されたタブの曲(_E)"
+
+#: ../data/gtkpod.glade.h:331
+msgid "Tracks in Selected _Playlist"
+msgstr "選択されたプレイリストの曲(_P)"
+
+#: ../data/gtkpod.glade.h:332
+msgid "Transfer tracks to the iPod in the background"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:333
+msgid "Translators"
+msgstr "翻訳担当"
+
+#: ../data/gtkpod.glade.h:334
+msgid ""
+"Try to load contents of all connected iPods. For each iPod a separate "
+"repository must be set up."
+msgstr ""
+"接続されているすべての iPod の内容を読み込みます. それぞれの iPod ごとに個別"
+"に設定をしておく必要があります."
+
+#: ../data/gtkpod.glade.h:335
+#, fuzzy
+msgid "Undo _Track"
+msgstr "未評価の曲"
+
+#: ../data/gtkpod.glade.h:336
+msgid "Update _mserv Data from File"
+msgstr "mserv データを更新する(_m)"
+
+#: ../data/gtkpod.glade.h:337
+msgid "Update/Sync all playlists now"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:338
+msgid "Update/Sync playlist now"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:339
+msgid "Upper margin"
+msgstr "上限"
+
+#: ../data/gtkpod.glade.h:340
+msgid "Use 'Multi-Edit' also for title field"
+msgstr "タイトルの項目も「一斉編集」を可能にする"
+
+#: ../data/gtkpod.glade.h:341
+msgid "Use 'Multi-Edit' for tracks selections"
+msgstr "選択された曲を「一斉編集」する"
+
+#: ../data/gtkpod.glade.h:342
+#, fuzzy
+msgid "Use <i>&lt;Album&gt;.jpg</i> in the parent directory"
+msgstr "親ディレクトリにある <i>&lt;Album&gt;.jpg</i> を使う"
+
+#: ../data/gtkpod.glade.h:343
+#, fuzzy
+msgid "Use <i>&lt;Album&gt;.jpg</i>, <i>&lt;Album&gt;.png</i>..."
+msgstr "<i>&lt;Album&gt;.jpg</i>, <i>&lt;Album&gt;.png</i> など"
+
+#: ../data/gtkpod.glade.h:344
+msgid "Use <i>folder.jpg</i> as cover art."
+msgstr "<i>folder.jpg</i> をカバーアートに使う"
+
+#: ../data/gtkpod.glade.h:345
+msgid "Use <i>folder.jpg</i>, <i>folder.png</i>..."
+msgstr "<i>folder.jpg</i>, <i>folder.png</i> など"
+
+#: ../data/gtkpod.glade.h:346
+msgid "Use mserv database to fill additional information"
+msgstr "mserv のデータベースから追加情報を取得する"
+
+#: ../data/gtkpod.glade.h:347
+msgid ""
+"Use selected charset (Preferences/'Adding/Updating/ Syncing')\n"
+"for this filename."
+msgstr ""
+"指定された文字コード (「設定」内「登録/更新/同期」を参照)\n"
+"をファイル名にも使用する。"
+
+#: ../data/gtkpod.glade.h:349
+#, fuzzy
+msgid ""
+"Use selected encoding (on the 'General' page)\n"
+"when writing tags"
+msgstr ""
+"「基本設定」のページで指定された文字コードを\n"
+"タグの読み書きにも使用する"
+
+#: ../data/gtkpod.glade.h:351
+#, fuzzy
+msgid "Use selected encoding also when updating or syncing tracks"
+msgstr "選択された文字コードを更新・同期処理でも使用する"
+
+#: ../data/gtkpod.glade.h:352
+msgid "Use this template to parse filename for tag information:"
+msgstr "以下のテンプレートを、ファイル名からタグ情報を抽出するのに使用する:"
+
+#: ../data/gtkpod.glade.h:353
+msgid "Username to be used for mserv database lookup."
+msgstr "ユーザー名は mserv データベースの参照に使います。"
+
+#: ../data/gtkpod.glade.h:354
+msgid "Username:"
+msgstr "ユーザー名:"
+
+#: ../data/gtkpod.glade.h:355
+msgid ""
+"Usually you don't want to set the title of several tracks to the same text. "
+"This option might avoid unwanted results (especially since there is no "
+"'undo' yet)."
+msgstr ""
+"普通は複数の曲のタイトルを同じものにする必要はないでしょう。このオプションを"
+"選択すると大抵は望ましくない結果を得る事になります。(特に、今のところ「やり直"
+"し」は効かないので、選択するべきではありません)"
+
+#: ../data/gtkpod.glade.h:356
+#, fuzzy
+msgid "View Full Size"
+msgstr "ファイルサイズ"
+
+#: ../data/gtkpod.glade.h:357
+msgid "WAV with :"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:358
+msgid ""
+"When adding dirs/files, update information of\n"
+"existing tracks with identical filenames"
+msgstr ""
+"ファイルやディレクトリを追加する際に、同じファイル名の\n"
+"曲がすでにあったら場合には、そちらを更新する"
+
+#: ../data/gtkpod.glade.h:360
+msgid ""
+"When copying from iPod no check is performed on whether the destination file "
+"exists. Enabling this option will make gtkpod check whether the length of "
+"the destination file is the same as the file in the iPod. If so the file is "
+"skipped, allowing a quick sync of the iPod's contents."
+msgstr ""
+"iPod から曲をコピーする際には, 同じ名前のファイルがあっても単純に上書きしま"
+"す. この項目を選択すると gtkpod は同じ名前のファイルがあった場合にそのサイズ"
+"を iPod 上のファイルと比較して, 同じだった場合には飛ばします. 結果として同期"
+"処理を高速に行えます."
+
+#: ../data/gtkpod.glade.h:361
+#, fuzzy
+msgid "When syncing playlists"
+msgstr "ディレクトリの同期処理時"
+
+#: ../data/gtkpod.glade.h:362
+msgid ""
+"Will show a list of tracks removed and a list of tracks newly added or "
+"updated."
+msgstr ""
+
+#: ../data/gtkpod.glade.h:363
+msgid "Write ID3 tags to disk when modified in gtkpod"
+msgstr "gtkpod内で変更があったID3タグをディスクに書き込む"
+
+#: ../data/gtkpod.glade.h:364
+msgid "Write all changes made to the disk and the iPod(s)."
+msgstr "ハードディスクと iPod に対する変更をすべて保存します."
+
+#: ../data/gtkpod.glade.h:365
+#, fuzzy
+msgid ""
+"Write extended information (PC filenames, SHA1 hashes,\n"
+"encoding...). Recommended."
+msgstr ""
+"拡張情報(PC上のファイル名,MD5値,文字コード)を書き込む。\n"
+"推奨される設定です。"
+
+#: ../data/gtkpod.glade.h:367
+msgid ""
+"You can also use the table headers, but this allows you to sort according to "
+"a column that is not displayed."
+msgstr ""
+"表のヘッダを操作しても並べ換えはできますが, この機能を使うと表示されていない"
+"項目を使って並べ換えることができます."
+
+#: ../data/gtkpod.glade.h:368
+#, fuzzy
+msgid "_About gtkpod"
+msgstr "gtkpod について"
+
+#: ../data/gtkpod.glade.h:369
+#, fuzzy
+msgid "_Add Album"
+msgstr "アルバム"
+
+#: ../data/gtkpod.glade.h:370
+msgid "_Add Image"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:371
+#, fuzzy
+msgid "_Album"
+msgstr "アルバム"
+
+#: ../data/gtkpod.glade.h:372
+msgid "_All Tracks"
+msgstr "すべての曲(_A)"
+
+#: ../data/gtkpod.glade.h:373
+msgid "_Arrange Sort Tabs"
+msgstr "ソートタブを再配置(_A)"
+
+#: ../data/gtkpod.glade.h:374
+msgid "_Check iPod's Files"
+msgstr "iPod のファイルをチェック(_C)"
+
+#: ../data/gtkpod.glade.h:375
+msgid "_Conversion Log"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:376
+msgid "_Create Playlists"
+msgstr "プレイリストを作成(_C)"
+
+#: ../data/gtkpod.glade.h:377
+msgid "_Create iPod's Directories"
+msgstr "iPodの初期設定(_C)"
+
+#: ../data/gtkpod.glade.h:378
+msgid "_Delete"
+msgstr "削除(_D)"
+
+#: ../data/gtkpod.glade.h:379
+msgid "_Display"
+msgstr "表示(_D)"
+
+#: ../data/gtkpod.glade.h:380
+msgid "_Displayed Tracks"
+msgstr "表示されている曲(_D)"
+
+#: ../data/gtkpod.glade.h:381
+msgid "_Edit"
+msgstr "編集(_E)"
+
+#: ../data/gtkpod.glade.h:382
+msgid "_Encoding (ID3, files):"
+msgstr "文字コード(_E) (ID3, ファイル):"
+
+#: ../data/gtkpod.glade.h:383
+msgid "_Enqueue"
+msgstr "演奏キューに入れる(_E)"
+
+#: ../data/gtkpod.glade.h:384
+msgid "_Export Tracks from Database"
+msgstr "データベースから曲を取り出す(_E)"
+
+#: ../data/gtkpod.glade.h:385
+msgid "_File"
+msgstr "ファイル(_F)"
+
+#: ../data/gtkpod.glade.h:386
+msgid "_General"
+msgstr "基本設定(_G)"
+
+#: ../data/gtkpod.glade.h:387
+msgid "_Help"
+msgstr "ヘルプ(_H)"
+
+#: ../data/gtkpod.glade.h:388
+msgid "_Ignore rules"
+msgstr "ルールを無視(_I)"
+
+#: ../data/gtkpod.glade.h:389
+msgid "_Image"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:390
+msgid "_Info Window"
+msgstr "情報(_I)"
+
+#: ../data/gtkpod.glade.h:391
+msgid "_Last.FM"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:392
+msgid "_Less Sort Tabs"
+msgstr "ソートタブの削除(_L)"
+
+#: ../data/gtkpod.glade.h:393
+msgid "_Limit to"
+msgstr "制限(_L)"
+
+#: ../data/gtkpod.glade.h:394
+msgid "_Load iPod(s)"
+msgstr "iPod から読み込み(_L)"
+
+#: ../data/gtkpod.glade.h:395
+msgid "_Local"
+msgstr "ディスク(_L)"
+
+#: ../data/gtkpod.glade.h:396
+msgid "_M3U"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:397
+msgid "_Misc."
+msgstr ""
+
+#: ../data/gtkpod.glade.h:398
+msgid "_More Sort Tabs"
+msgstr "ソートタブの追加(_M)"
+
+#: ../data/gtkpod.glade.h:399
+msgid "_Newly Added Tracks"
+msgstr "新たに追加された曲(_N)"
+
+#: ../data/gtkpod.glade.h:400
+msgid "_Normalize Volume"
+msgstr "ボリュームの平均化"
+
+#: ../data/gtkpod.glade.h:401
+msgid "_Number of sort tabs:"
+msgstr "ソートタブの数(_N):"
+
+#: ../data/gtkpod.glade.h:402
+msgid "_PLS"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:403
+msgid "_Play Now"
+msgstr "今すぐ演奏(_P)"
+
+#: ../data/gtkpod.glade.h:404
+msgid "_Podcasts"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:405
+msgid "_Prefer Local"
+msgstr "できればディスク(_P)"
+
+#: ../data/gtkpod.glade.h:406
+#, fuzzy
+msgid "_Remove Album"
+msgstr "アルバム"
+
+#: ../data/gtkpod.glade.h:407
+#, fuzzy
+msgid "_Remove Cover Art"
+msgstr "カバーアートを削除"
+
+#: ../data/gtkpod.glade.h:408
+msgid "_Remove Images"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:409
+msgid "_Save Changes"
+msgstr "変更の保存(_S)"
+
+#: ../data/gtkpod.glade.h:410
+msgid "_Save Displayed Track Order"
+msgstr "現在の曲順を保存(_S)"
+
+#: ../data/gtkpod.glade.h:411
+msgid "_Sorting"
+msgstr "並べ換え(_S)"
+
+#: ../data/gtkpod.glade.h:412
+#, fuzzy
+msgid "_Synchronize Playlist with Dir(s)"
+msgstr "プレイリストを同期する(_S)"
+
+#: ../data/gtkpod.glade.h:413
+msgid "_Toolbar"
+msgstr "ツールバー(_T)"
+
+#: ../data/gtkpod.glade.h:414
+msgid "_Tools"
+msgstr "ツール(_T)"
+
+#: ../data/gtkpod.glade.h:415
+msgid "_Tooltips"
+msgstr "ツールチップ(_T)"
+
+#: ../data/gtkpod.glade.h:416
+msgid "_Track Info"
+msgstr "曲情報(_T)"
+
+#: ../data/gtkpod.glade.h:417
+msgid "_Undo All"
+msgstr "すべてやり直し(_U)"
+
+#: ../data/gtkpod.glade.h:418
+msgid "_Update Tracks from File"
+msgstr "ファイルを元に曲を更新する(_U)"
+
+#: ../data/gtkpod.glade.h:419
+#, fuzzy
+msgid "_Video"
+msgstr "表示(_V)"
+
+#: ../data/gtkpod.glade.h:420
+msgid "_View"
+msgstr "表示(_V)"
+
+#: ../data/gtkpod.glade.h:421
+msgid "_iPod"
+msgstr "iPod(_i)"
+
+#: ../data/gtkpod.glade.h:423
+#, no-c-format
+msgid ""
+"artist: %a, album: %A, composer: %c, title: %t, genre: %G, track nr: %T, CD "
+"nr: %C, year: %Y, skip data: %*, the character '%': %%. You can separate "
+"several templates by a ';'. The first one matching the filename will be "
+"used. Example: '%a - %A/%T %t.mp3;%t.wav'."
+msgstr ""
+"アーティスト: %a, アルバム: %A, 作曲者: %c, タイトル: %t, ジャンル: %G, ト"
+"ラック番号: %T, CD 番号: %C, 年: %Y, スキップ: %*, パーセント記号: %%。いくつ"
+"かのテンプレートを';' で区切って並べることができます。最初に合ったテンプレー"
+"トが使われます。例: '%a - %A/%T %t.mp3;%t.wav'."
+
+#: ../data/gtkpod.glade.h:424
+msgid "folder"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:425
+msgid "folder.jpg"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:427
+#, no-c-format
+msgid "folder.jpg;%a.jpg"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:428
+msgid "gtkpod"
+msgstr "gtkpod"
+
+#: ../data/gtkpod.glade.h:429
+#, fuzzy
+msgid "gtkpod Info"
+msgstr "gtkpod"
+
+#: ../data/gtkpod.glade.h:430
+msgid ""
+"gtkpod expects the ID3 tags and the filenames to be in the encoding "
+"specified here. You can change it for consecutive 'Add Files' and 'Add Dirs' "
+"operation. 'System Charset' is the charset used by your current locale."
+msgstr ""
+"gtkpod はここで指定された文字コードが, ID3のタグやファイル名に使われているも"
+"のとして処理します.「ファイルの追加」や「ディレクトリごと追加」を実行する前に"
+"この設定を変更すれば, これらの処理に設定が反映されます.「システム文字」を選択"
+"すると, ロケールで指定されたコードが使われます."
+
+#: ../data/gtkpod.glade.h:431
+msgid "gtkpod options"
+msgstr "gtkpod のオプション"
+
+#. These are the items for the 'Repository type' combo in the 'Create Repository' dialog. Keep the three items in order!
+#: ../data/gtkpod.glade.h:433
+msgid ""
+"iPod\n"
+"Local Repository (Standard)\n"
+"Local Repository (Podcasts)\n"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:437
+#, fuzzy
+msgid "iPod mountpoint:"
+msgstr "iPodのマウント場所(_P):"
+
+#: ../data/gtkpod.glade.h:438
+msgid "iTunesDB backup:"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:439
+msgid "mserv Root:"
+msgstr ""
+
+#: ../data/gtkpod.glade.h:440
+msgid "mserv database lookup will be done for music in this directory."
+msgstr "このディレクトリ内の曲に対し、mserv のデータベースを参照します。"
+
+#: ../data/gtkpod.glade.h:441 ../src/details.c:1347
+msgid "n/a"
+msgstr "不可"
+
+#: ../data/gtkpod.glade.h:442
+msgid "special_sorttab -- Don't translate!"
+msgstr ""
+
+#: ../src/autodetection.c:310
+msgid "Could not initialize GnomeVFS\n"
+msgstr ""
+
+#: ../src/autodetection.c:397
+#, c-format
+msgid ""
+"Newly mounted iPod at '%s' could not be loaded into gtkpod.\n"
+"\n"
+msgstr ""
+
+#: ../src/autodetection.c:403
+#, c-format
+msgid ""
+"Newly mounted iPod at '%s' appears to be already loaded!\n"
+"\n"
+msgstr ""
+
+#: ../src/autodetection.c:416
+#, fuzzy
+msgid "New iPod"
+msgstr "新規プレイリスト"
+
+#: ../src/charset.c:53
+msgid "Arabic (IBM-864)"
+msgstr "アラビア語 (IBM-864)"
+
+#: ../src/charset.c:54
+msgid "Arabic (ISO-8859-6)"
+msgstr "アラビア語 (ISO-8859-6)"
+
+#: ../src/charset.c:55
+msgid "Arabic (Windows-1256)"
+msgstr "アラビア語 (Windows-1256)"
+
+#: ../src/charset.c:56
+msgid "Baltic (ISO-8859-13)"
+msgstr "バルト語 (ISO-8859-13)"
+
+#: ../src/charset.c:57
+msgid "Baltic (ISO-8859-4)"
+msgstr "バルト語 (ISO-8859-4)"
+
+#: ../src/charset.c:58
+msgid "Baltic (Windows-1257)"
+msgstr "バルト語 (Windows-1257)"
+
+#: ../src/charset.c:59
+msgid "Celtic (ISO-8859-14)"
+msgstr "ケルト語 (ISO-8859-14)"
+
+#: ../src/charset.c:60
+msgid "Central European (IBM-852)"
+msgstr "中央ヨーロッパ (IBM-852)"
+
+#: ../src/charset.c:61
+msgid "Central European (ISO-8859-2)"
+msgstr "中央ヨーロッパ (ISO-8859-2)"
+
+#: ../src/charset.c:62
+msgid "Central European (Windows-1250)"
+msgstr "中央ヨーロッパ (Windows-1250)"
+
+#: ../src/charset.c:63
+msgid "Chinese Simplified (GB18030)"
+msgstr "中国語 簡体字 (GB18030)"
+
+#: ../src/charset.c:64
+msgid "Chinese Simplified (GB2312)"
+msgstr "中国語 簡体字 (GB2312)"
+
+#: ../src/charset.c:65
+msgid "Chinese Traditional (Big5)"
+msgstr "中国語 繁体字 (Big5)"
+
+#: ../src/charset.c:66
+msgid "Chinese Traditional (Big5-HKSCS)"
+msgstr "中国語 繁体字 (Big5-HKSCS)"
+
+#: ../src/charset.c:67
+msgid "Cyrillic (IBM-855)"
+msgstr "キリル語 (IBM-855)"
+
+#: ../src/charset.c:68
+msgid "Cyrillic (ISO-8859-5)"
+msgstr "キリル語 (ISO-8859-5)"
+
+#: ../src/charset.c:69
+msgid "Cyrillic (ISO-IR-111)"
+msgstr "キリル語 (ISO-IR-111)"
+
+#: ../src/charset.c:70
+msgid "Cyrillic (KOI8-R)"
+msgstr "キリル語 (KOI8-R)"
+
+#: ../src/charset.c:71
+msgid "Cyrillic (Windows-1251)"
+msgstr "キリル語 (Windows-1251)"
+
+#: ../src/charset.c:72
+msgid "Cyrillic/Russian (CP-866)"
+msgstr "キリル/ロシア語 (CP-866)"
+
+#: ../src/charset.c:73
+msgid "Cyrillic/Ukrainian (KOI8-U)"
+msgstr "キリル/ウクライナ語 (KOI8-U)"
+
+#: ../src/charset.c:74
+msgid "English (US-ASCII)"
+msgstr "英語 (US-ASCII)"
+
+#: ../src/charset.c:75
+msgid "Greek (ISO-8859-7)"
+msgstr "ギリシア語 (ISO-8859-7)"
+
+#: ../src/charset.c:76
+msgid "Greek (Windows-1253)"
+msgstr "ギリシア語 (Windows-1253)"
+
+#: ../src/charset.c:77
+msgid "Hebrew (IBM-862)"
+msgstr "ヘブライ語 (IBM-862)"
+
+#: ../src/charset.c:78
+msgid "Hebrew (Windows-1255)"
+msgstr "ヘブライ語 (Windows-1255)"
+
+#: ../src/charset.c:79
+msgid "Japanese (automatic detection)"
+msgstr "日本語 (自動判別)"
+
+#: ../src/charset.c:80
+msgid "Japanese (EUC-JP)"
+msgstr "日本語 (EUC-JP)"
+
+#: ../src/charset.c:81
+msgid "Japanese (ISO-2022-JP)"
+msgstr "日本語 (ISO-2022-JP)"
+
+#: ../src/charset.c:82
+msgid "Japanese (Shift_JIS)"
+msgstr "日本語 (Shift_JIS)"
+
+#: ../src/charset.c:83
+msgid "Korean (EUC-KR)"
+msgstr "韓国語 (EUC-KR)"
+
+#: ../src/charset.c:84
+msgid "Nordic (ISO-8859-10)"
+msgstr "北欧語 (ISO-8859-10)"
+
+#: ../src/charset.c:85
+msgid "South European (ISO-8859-3)"
+msgstr "南部ヨーロッパ語 (ISO-8859-3)"
+
+#: ../src/charset.c:86
+msgid "Thai (TIS-620)"
+msgstr "タイ語 (TIS-620)"
+
+#: ../src/charset.c:87
+msgid "Turkish (IBM-857)"
+msgstr "トルコ語 (IBM-857)"
+
+#: ../src/charset.c:88
+msgid "Turkish (ISO-8859-9)"
+msgstr "トルコ語 (ISO-8859-9)"
+
+#: ../src/charset.c:89
+msgid "Turkish (Windows-1254)"
+msgstr "トルコ語 (Windows-1254)"
+
+#: ../src/charset.c:90
+msgid "Unicode (UTF-7)"
+msgstr "Unicode (UTF-7)"
+
+#: ../src/charset.c:91
+msgid "Unicode (UTF-8)"
+msgstr "Unicode (UTF-8)"
+
+#: ../src/charset.c:92
+msgid "Unicode (UTF-16BE)"
+msgstr "Unicode (UTF-16BE)"
+
+#: ../src/charset.c:93
+msgid "Unicode (UTF-16LE)"
+msgstr "Unicode (UTF-16LE)"
+
+#: ../src/charset.c:94
+msgid "Unicode (UTF-32BE)"
+msgstr "Unicode (UTF-32BE)"
+
+#: ../src/charset.c:95
+msgid "Unicode (UTF-32LE)"
+msgstr "Unicode (UTF-32LE)"
+
+#: ../src/charset.c:96
+msgid "Vietnamese (VISCII)"
+msgstr "ベトナム語 (VISCII)"
+
+#: ../src/charset.c:97
+msgid "Vietnamese (Windows-1258)"
+msgstr "ベトナム語 (Windows-1258)"
+
+#: ../src/charset.c:98
+msgid "Visual Hebrew (ISO-8859-8)"
+msgstr "視覚芸術向けヘブライ語 (ISO-8859-8)"
+
+#: ../src/charset.c:99
+msgid "Western (IBM-850)"
+msgstr "西洋 (IBM-850)"
+
+#: ../src/charset.c:100
+msgid "Western (ISO-8859-1)"
+msgstr "西洋 (ISO-8859-1)"
+
+#: ../src/charset.c:101
+msgid "Western (ISO-8859-15)"
+msgstr "西洋 (ISO-8859-15)"
+
+#: ../src/charset.c:102
+msgid "Western (Windows-1252)"
+msgstr "西洋 (Windows-1252)"
+
+#. sanity!
+#. check for "System Charset" and return NULL
+#: ../src/charset.c:160 ../src/charset.c:170 ../src/charset.c:223
+msgid "System Charset"
+msgstr "システム文字"
+
+#. we are not the first instance of gtkpod -- the socket is
+#. already being used, so we pass
+#: ../src/clientserver.c:214
+msgid ""
+"Another instance of gtkpod was detected. Playcount server not started.\n"
+msgstr "gtkpod がすでに動作中です。プレイカウントサーバーは起動しません。\n"
+
+#: ../src/confirmation.c:377
+msgid "Confirmation Dialogue"
+msgstr "確認"
+
+#: ../src/context_menus.c:362
+#, c-format
+msgid "Copied \"%s\" playlist to %s"
+msgstr ""
+
+#: ../src/context_menus.c:401
+#, fuzzy, c-format
+msgid "Copied %d track to '%s'"
+msgid_plural "Copied %d tracks to '%s'"
+msgstr[0] "%2$d曲中 %1$d曲をコピーしました。"
+
+#: ../src/context_menus.c:429
+#, c-format
+msgid "Copied '%s' playlist to '%s' in '%s'"
+msgstr ""
+
+#: ../src/context_menus.c:462
+#, fuzzy, c-format
+msgid "Copied %d track to '%s' in '%s'"
+msgid_plural "Copied %d tracks to %s in '%s'"
+msgstr[0] "プレイリスト '%2$s' から %1$d 曲削除しました"
+
+#: ../src/context_menus.c:622 ../src/tools.c:854
+msgid "Play Now"
+msgstr "今すぐ演奏"
+
+#: ../src/context_menus.c:628 ../src/tools.c:867
+msgid "Enqueue"
+msgstr "演奏キューに加える"
+
+#: ../src/context_menus.c:634
+msgid "Copy Tracks to Filesystem"
+msgstr "曲をファイルシステムにコピーする"
+
+#: ../src/context_menus.c:641 ../src/file_export.c:1085
+msgid "Create Playlist File"
+msgstr "プレイリストファイルを作成"
+
+#: ../src/context_menus.c:648
+msgid "Create new Playlist"
+msgstr "プレイリストの新規作成"
+
+#: ../src/context_menus.c:655
+#, fuzzy
+msgid "Update Tracks from File"
+msgstr "ファイルを元に曲を更新する(_U)"
+
+#: ../src/context_menus.c:669
+msgid "Sync Playlist with Dir(s)"
+msgstr ""
+
+#: ../src/context_menus.c:679
+msgid "Remove All Tracks from iPod"
+msgstr "iPodから曲を削除"
+
+#: ../src/context_menus.c:697
+msgid "Remove All Podcasts from iPod"
+msgstr "すべての Podcast を iPod から削除"
+
+#: ../src/context_menus.c:712
+msgid "Delete Including Tracks"
+msgstr "中の曲ごと削除"
+
+#: ../src/context_menus.c:720
+msgid "Delete But Keep Tracks"
+msgstr "曲は残したまま削除"
+
+#: ../src/context_menus.c:728
+#, fuzzy
+msgid "Edit iPod Properties"
+msgstr "iPodの初期設定"
+
+#: ../src/context_menus.c:735
+#, fuzzy
+msgid "Edit Repository Properties"
+msgstr "iPodの初期設定"
+
+#: ../src/context_menus.c:742
+#, fuzzy
+msgid "Edit Playlist Properties"
+msgstr "プレイリストをファイルから読み込んで追加します"
+
+#: ../src/context_menus.c:770
+msgid "View Full Size Artwork"
+msgstr ""
+
+#: ../src/context_menus.c:777
+#, fuzzy
+msgid "Select Cover From File"
+msgstr "iPodから削除"
+
+#: ../src/context_menus.c:790
+#, fuzzy
+msgid "Load iPod"
+msgstr "iPod ファイル"
+
+#: ../src/context_menus.c:797
+msgid "Eject iPod"
+msgstr ""
+
+#: ../src/context_menus.c:814
+msgid "Remove All Tracks from Database"
+msgstr "すべての曲をデータベースから削除"
+
+#: ../src/context_menus.c:829
+msgid "Delete Including Tracks (Harddisk)"
+msgstr "中の曲ごと削除 (ハードディスクから)"
+
+#: ../src/context_menus.c:837
+msgid "Delete Including Tracks (Database)"
+msgstr "中の曲ごと削除 (データベースから)"
+
+#: ../src/context_menus.c:845
+msgid "Delete From iPod"
+msgstr "iPodから削除"
+
+#: ../src/context_menus.c:853
+msgid "Delete From Playlist"
+msgstr "プレイリストから削除"
+
+#: ../src/context_menus.c:861
+msgid "Delete From Harddisk"
+msgstr "ハードディスクから削除"
+
+#: ../src/context_menus.c:869
+msgid "Delete From Database"
+msgstr "データベースから削除"
+
+#: ../src/context_menus.c:877
+msgid "Alphabetize"
+msgstr "並べ換え"
+
+#: ../src/context_menus.c:895
+#, fuzzy
+msgid "Remove Album"
+msgstr "アルバム"
+
+#: ../src/context_menus.c:905
+#, fuzzy
+msgid "Remove Photo"
+msgstr "カバーアートを削除"
+
+#: ../src/context_menus.c:922
+msgid "Rename Album"
+msgstr ""
+
+#: ../src/context_menus.c:981 ../src/context_menus.c:1030
+#, fuzzy
+msgid "Copy selected playlist to..."
+msgstr "選択されたプレイリスト"
+
+#: ../src/context_menus.c:1083
+#, fuzzy
+msgid "Copy selected track(s) to..."
+msgstr "削除された曲"
+
+#: ../src/date_parser.l:269
+#, c-format
+msgid "Date format error: unrecognized character: '%s'\n"
+msgstr "データエラー: 次の文字は使用できません: '%s'\n"
+
+#: ../src/details.c:82
+msgid "Audio/Video"
+msgstr ""
+
+#: ../src/details.c:83
+msgid "Audio"
+msgstr ""
+
+#: ../src/details.c:84
+#, fuzzy
+msgid "Video"
+msgstr "表示(_V)"
+
+#: ../src/details.c:85
+msgid "Podcast"
+msgstr ""
+
+#: ../src/details.c:86
+msgid "Video Podcast"
+msgstr ""
+
+#: ../src/details.c:87
+msgid "Audiobook"
+msgstr ""
+
+#: ../src/details.c:88 ../src/display_spl.c:209 ../src/display_spl.c:218
+msgid "Music Video"
+msgstr ""
+
+#: ../src/details.c:89 ../src/display_spl.c:107 ../src/display_spl.c:210
+#: ../src/display_spl.c:219 ../src/misc_conversion.c:101
+msgid "TV Show"
+msgstr ""
+
+#: ../src/details.c:90
+msgid "TV Show & Music Video"
+msgstr ""
+
+#: ../src/details.c:836
+#, c-format
+msgid "%s (image data corrupted or unreadable)"
+msgstr ""
+
+#: ../src/details.c:973
+#, c-format
+msgid "Please report unknown mediatype %x\n"
+msgstr ""
+
+#: ../src/details.c:1418
+msgid "<b>n/a</b>"
+msgstr "<b>不可</b>"
+
+#: ../src/details.c:1906
+#, c-format
+msgid "Error occurred dropping an image onto the details window: %s\n"
+msgstr ""
+
+#: ../src/details.c:1952 ../src/display_coverart.c:2128
+msgid "Successfully set new coverart for selected tracks"
+msgstr ""
+
+#: ../src/display.c:490
+#, c-format
+msgid "<b>Image Dimensions: %s</b>"
+msgstr ""
+
+#: ../src/display.c:744
+msgid "Edit selected entry of which sort tab?"
+msgstr "どのソートタブで選択されたものを編集しますか?"
+
+#. no entry selected
+#: ../src/display.c:751 ../src/misc_confirm.c:435 ../src/misc_track.c:2138
+msgid "No entry selected."
+msgstr "何も選択されていません。"
+
+#: ../src/display.c:910 ../src/display.c:1230 ../src/display.c:1286
+#: ../src/display.c:1340 ../src/display.c:1395 ../src/display.c:1656
+#, c-format
+msgid "No entry selected in Sort Tab %d"
+msgstr "ソートタブ %d 内では何も選択されていません。"
+
+#: ../src/display.c:949
+msgid "Remove entry of which sort tab from database?"
+msgstr "どのソートタブで選択されたものをデータベースから削除しますか?"
+
+#: ../src/display.c:957
+msgid "Remove tracks in selected entry of which filter tab from the iPod?"
+msgstr "どのソートタブで選択された曲をiPodから削除しますか?"
+
+#: ../src/display.c:979
+msgid "Remove tracks in selected entry of which filter tab from the harddisk?"
+msgstr "どのソートタブで選択された曲をハードディスクから削除しますか?"
+
+#: ../src/display.c:1009
+msgid "Remove tracks in selected entry of which filter tab from playlist?"
+msgstr "どのソートタブで選択された曲をプレイリストから削除しますか?"
+
+#: ../src/display.c:1036 ../src/display.c:1074
+#, c-format
+msgid ""
+"iPod at '%s' is not loaded.\n"
+"Please load it first."
+msgstr ""
+
+#: ../src/display.c:1111 ../src/display.c:1138
+msgid "Update selected entry of which sort tab?"
+msgstr "どのソートタブで選択されたものを更新しますか?"
+
+#: ../src/display.c:1224
+msgid "Export selected entry of which sort tab?"
+msgstr "どのソートタブで選択されたものをエクスポートしますか?"
+
+#: ../src/display.c:1280
+msgid "Create playlist file from selected entry of which sort tab?"
+msgstr "どのソートタブで選択されたものからプレイリストを作成しますか?"
+
+#: ../src/display.c:1334
+msgid "Play tracks in selected entry of which sort tab?"
+msgstr "どのソートタブで選択された曲を演奏しますか?"
+
+#: ../src/display.c:1389
+msgid "Enqueue tracks in selected entry of which sort tab?"
+msgstr "どのソートタブで選択された曲を演奏キューに加えますか?"
+
+#: ../src/display.c:1646
+msgid "Normalize tracks in selected entry of which sort tab?"
+msgstr "どのソートタブで選択された曲を平均化しますか?"
+
+#: ../src/display_coverart.c:1713
+msgid "Failed to remove the album from the album hash store."
+msgstr ""
+
+#: ../src/display_coverart.c:2098
+#, c-format
+msgid "Error occurred dropping an image onto the coverart display: %s\n"
+msgstr ""
+
+#: ../src/display_itdb.c:376
+#, fuzzy, c-format
+msgid "Failed to set cover art: '%s'\n"
+msgstr "カバーアートが設定できません: '%s'"
+
+#: ../src/display_itdb.c:858 ../src/display_itdb.c:991
+msgid "Local"
+msgstr ""
+
+#. add podcast playlist
+#: ../src/display_itdb.c:866 ../src/display_itdb.c:989
+#: ../src/display_itdb.c:1025
+msgid "Podcasts"
+msgstr ""
+
+#: ../src/display_itdb.c:875 ../src/display_itdb.c:993
+#: ../src/repository.c:1186
+#, fuzzy
+msgid "iPod"
+msgstr "iPod ファイル"
+
+#: ../src/display_itdb.c:1084
+#, c-format
+msgid "Increased playcount for '%s'"
+msgstr "'%s' の再生回数を増やしました"
+
+#: ../src/display_photo.c:163
+#, c-format
+msgid "Error reading iPod photo database (%s).\n"
+msgstr ""
+
+#: ../src/display_photo.c:168
+msgid "Error reading iPod photo database.\n"
+msgstr ""
+
+#: ../src/display_photo.c:238
+msgid "Could not access the iPod's photo database."
+msgstr ""
+
+#: ../src/display_photo.c:441
+#, fuzzy
+msgid "Photo Albums"
+msgstr "アルバム"
+
+#: ../src/display_photo.c:451 ../src/display_photo.c:1685
+msgid "<Unnamed>"
+msgstr ""
+
+#: ../src/display_photo.c:939
+msgid "The Photo Library album cannot be removed"
+msgstr ""
+
+#: ../src/display_photo.c:961
+#, fuzzy
+msgid "Do you want to remove the album's photos too?"
+msgstr "すべての Podcast を iPod から削除しても本当によろしいですか?"
+
+#: ../src/display_photo.c:967
+msgid "Yes. Do Not Display Again"
+msgstr ""
+
+#: ../src/display_photo.c:1038
+msgid ""
+"This will remove the photo selection from the selected album.\n"
+" Do you want to delete them from the database as well?"
+msgstr ""
+
+#: ../src/display_photo.c:1053
+msgid ""
+"This will delete the photo selection from the Photo Library and all albums. "
+"Are you sure?"
+msgstr ""
+
+#: ../src/display_photo.c:1128
+msgid "New Photo Album Name"
+msgstr ""
+
+#: ../src/display_photo.c:1129
+#, fuzzy
+msgid "Please enter a new name for the photo album"
+msgstr "新しいプレイリストの名前を入力してください"
+
+#: ../src/display_photo.c:1141 ../src/display_photo.c:1223
+msgid "An album with that name already exists."
+msgstr ""
+
+#: ../src/display_photo.c:1210
+#, fuzzy
+msgid "New Photo Album"
+msgstr "アルバム"
+
+#: ../src/display_photo.c:1211
+#, fuzzy
+msgid "Please enter a name for the new photo album"
+msgstr "新しいプレイリストの名前を入力してください"
+
+#: ../src/display_photo.c:1232
+msgid "The new album failed to be created."
+msgstr ""
+
+#: ../src/display_photo.c:1256
+msgid "Add Image to iPod"
+msgstr ""
+
+#. Open a dialog directory chooser window
+#: ../src/display_photo.c:1311
+msgid "Add a Directory of Images to the iPod. Select the Directory."
+msgstr ""
+
+#: ../src/display_photo.c:1699
+#, c-format
+msgid "<No members>\n"
+msgstr ""
+
+#. give a notice on the statusbar -- otherwise the user
+#. * will never know why the drag is not possible
+#: ../src/display_playlists.c:516 ../src/display_playlists.c:558
+msgid "Error: drag from iPod not possible in offline mode."
+msgstr "エラー: オフラインモードでは iPod からのドラッグ操作はできません。"
+
+#: ../src/display_playlists.c:585 ../src/display_tracks.c:286
+#, c-format
+msgid "Copied one track"
+msgid_plural "Copied %d tracks"
+msgstr[0] "%d曲コピーしました"
+
+#: ../src/display_playlists.c:865 ../src/display_playlists.c:877
+msgid "Can't reorder sorted treeview."
+msgstr "ソートされている順番を変更することはできません"
+
+#: ../src/display_playlists.c:954
+#, c-format
+msgid ""
+"This DND type (%d) is not (yet) supported. If you feel implementing this "
+"would be useful, please contact the author.\n"
+"\n"
+msgstr ""
+"この種類のドラッグ&ドロップ (DND type %d) は未対応です。もしこの操作をサポー"
+"トすることが有用だとお考えでしたら、作者に連絡してください。\n"
+"\n"
+
+#. no existing photo playlist found so add one
+#. * either itdb had no children or none of them
+#. * were of the photo type.
+#.
+#: ../src/display_playlists.c:1569
+msgid "Photos"
+msgstr ""
+
+#: ../src/display_sorttabs.c:473
+msgid "'Played' condition ignored because of error."
+msgstr "「演奏日」の条件はエラーのために無視されました。"
+
+#: ../src/display_sorttabs.c:476
+msgid "'Modified' condition ignored because of error."
+msgstr "「変更日」の条件はエラーのために無視されました。"
+
+#: ../src/display_sorttabs.c:479
+msgid "'Added' condition ignored because of error."
+msgstr "「登録日」の条件はエラーのために無視されました。"
+
+#: ../src/display_sorttabs.c:1562 ../src/misc_conversion.c:59
+msgid "All"
+msgstr "すべて"
+
+#: ../src/display_sorttabs.c:1588
+msgid "Compilations"
+msgstr "コンピレーション"
+
+#: ../src/display_sorttabs.c:2988
+msgid "Comp."
+msgstr "作曲者"
+
+#: ../src/display_sorttabs.c:2994 ../src/display_spl.c:88
+#: ../src/display_tracks.c:2109 ../src/misc_conversion.c:84
+msgid "Year"
+msgstr "年"
+
+#: ../src/display_sorttabs.c:2997
+msgid "Special"
+msgstr "スペシャル"
+
+#: ../src/display_sorttabs.c:3245
+msgid "Last Played"
+msgstr "最後に演奏した日"
+
+#: ../src/display_sorttabs.c:3246
+msgid "Last Modified"
+msgstr "最後に変更した日"
+
+#: ../src/display_spl.c:64
+msgid "days"
+msgstr "日"
+
+#: ../src/display_spl.c:65
+msgid "weeks"
+msgstr "週"
+
+#: ../src/display_spl.c:66
+msgid "months"
+msgstr "月"
+
+#: ../src/display_spl.c:73
+msgid "kbps"
+msgstr ""
+
+#: ../src/display_spl.c:74
+msgid "Hz"
+msgstr ""
+
+#: ../src/display_spl.c:75 ../src/display_spl.c:179 ../src/info.c:780
+msgid "MB"
+msgstr ""
+
+#: ../src/display_spl.c:76
+msgid "secs"
+msgstr "秒"
+
+#: ../src/display_spl.c:86 ../src/misc_conversion.c:74
+msgid "Bitrate"
+msgstr "ビットレート"
+
+#. 15
+#: ../src/display_spl.c:87 ../src/misc_conversion.c:75
+msgid "Samplerate"
+msgstr "サンプリングレート"
+
+#: ../src/display_spl.c:90
+msgid "Kind"
+msgstr "種類"
+
+#: ../src/display_spl.c:91 ../src/misc_conversion.c:81
+msgid "Date modified"
+msgstr "変更日"
+
+#: ../src/display_spl.c:92
+msgid "Track number"
+msgstr "曲番号"
+
+#: ../src/display_spl.c:93
+msgid "Size"
+msgstr "サイズ"
+
+#: ../src/display_spl.c:95 ../src/misc_conversion.c:64
+msgid "Comment"
+msgstr "コメント"
+
+#: ../src/display_spl.c:96 ../src/misc_conversion.c:79
+msgid "Date added"
+msgstr "登録日"
+
+#: ../src/display_spl.c:99
+msgid "Last played"
+msgstr "最後に演奏した日"
+
+#: ../src/display_spl.c:100
+msgid "Disc number"
+msgstr "CD 番号"
+
+#: ../src/display_spl.c:102 ../src/misc_conversion.c:87
+msgid "Compilation"
+msgstr "コンピレーション"
+
+#: ../src/display_spl.c:103 ../src/misc_conversion.c:76
+msgid "BPM"
+msgstr ""
+
+#: ../src/display_spl.c:104 ../src/misc_conversion.c:86
+msgid "Grouping"
+msgstr "グループ"
+
+#: ../src/display_spl.c:105
+msgid "Playlist"
+msgstr "プレイリスト"
+
+#: ../src/display_spl.c:106
+msgid "Video Kind"
+msgstr ""
+
+#: ../src/display_spl.c:108
+#, fuzzy
+msgid "Season number"
+msgstr "CD 番号"
+
+#: ../src/display_spl.c:109
+msgid "Skip count"
+msgstr ""
+
+#: ../src/display_spl.c:110
+#, fuzzy
+msgid "Last skipped"
+msgstr "最後に演奏した日"
+
+#: ../src/display_spl.c:111
+#, fuzzy
+msgid "Album artist"
+msgstr "アーティスト"
+
+#: ../src/display_spl.c:117
+msgid "contains"
+msgstr "が次のものを含む"
+
+#: ../src/display_spl.c:118
+msgid "does not contain"
+msgstr "が次のものを含まない"
+
+#: ../src/display_spl.c:119 ../src/display_spl.c:128 ../src/display_spl.c:138
+#: ../src/display_spl.c:157 ../src/display_spl.c:164
+msgid "is"
+msgstr "が次のものである"
+
+#: ../src/display_spl.c:120 ../src/display_spl.c:129 ../src/display_spl.c:139
+#: ../src/display_spl.c:158 ../src/display_spl.c:165
+msgid "is not"
+msgstr "が次のものでない"
+
+#: ../src/display_spl.c:121
+msgid "starts with"
+msgstr "が次のものから始まる"
+
+#: ../src/display_spl.c:122
+msgid "ends with"
+msgstr "が次のもので終わる"
+
+#: ../src/display_spl.c:130
+msgid "is greater than"
+msgstr "が次の値より大きい"
+
+#: ../src/display_spl.c:131
+msgid "is less than"
+msgstr "が次の値より小さい"
+
+#: ../src/display_spl.c:132 ../src/display_spl.c:144
+msgid "is in the range"
+msgstr "が次の範囲に入る"
+
+#: ../src/display_spl.c:140
+msgid "is after"
+msgstr "が次のもの以降"
+
+#: ../src/display_spl.c:141
+msgid "is before"
+msgstr "が次のもの以前"
+
+#: ../src/display_spl.c:142
+msgid "in the last"
+msgstr "が次の値以内"
+
+#: ../src/display_spl.c:143
+msgid "not in the last"
+msgstr "が次の値より古い"
+
+#: ../src/display_spl.c:150
+msgid "is set"
+msgstr "が設定されている"
+
+#: ../src/display_spl.c:151
+msgid "is not set"
+msgstr "が設定されていない"
+
+#: ../src/display_spl.c:171
+#, fuzzy
+msgid "Not supported"
+msgstr "リストに載ってない曲"
+
+#: ../src/display_spl.c:178
+msgid "minutes"
+msgstr "分"
+
+#: ../src/display_spl.c:180
+msgid "tracks"
+msgstr "曲"
+
+#: ../src/display_spl.c:181
+msgid "hours"
+msgstr "時間"
+
+#: ../src/display_spl.c:182 ../src/info.c:780
+msgid "GB"
+msgstr ""
+
+#: ../src/display_spl.c:189
+msgid "random order"
+msgstr "ランダムな順"
+
+#: ../src/display_spl.c:190
+msgid "title"
+msgstr "タイトル"
+
+#: ../src/display_spl.c:191
+msgid "album"
+msgstr "アルバム"
+
+#: ../src/display_spl.c:192
+msgid "artist"
+msgstr "アーティスト"
+
+#: ../src/display_spl.c:193
+msgid "genre"
+msgstr "ジャンル"
+
+#: ../src/display_spl.c:194
+msgid "most recently added"
+msgstr "最近登録された曲"
+
+#: ../src/display_spl.c:195
+msgid "least recently added"
+msgstr "古くに登録された曲"
+
+#: ../src/display_spl.c:196
+msgid "most often played"
+msgstr "よく再生される曲"
+
+#: ../src/display_spl.c:197
+msgid "least often played"
+msgstr "あまり再生されない曲"
+
+#: ../src/display_spl.c:198
+msgid "most recently played"
+msgstr "最近再生された曲"
+
+#: ../src/display_spl.c:199
+msgid "least recently played"
+msgstr "最近再生されない曲"
+
+#: ../src/display_spl.c:200
+msgid "highest rating"
+msgstr "評価の高い曲"
+
+#: ../src/display_spl.c:201
+msgid "lowest rating"
+msgstr "評価の低い曲"
+
+#: ../src/display_spl.c:208 ../src/display_spl.c:217
+#, fuzzy
+msgid "Movie"
+msgstr "変更日"
+
+#: ../src/display_spl.c:1192 ../src/display_spl.c:1207
+msgid "to"
+msgstr "から"
+
+#: ../src/display_spl.c:1485
+msgid "-"
+msgstr ""
+
+#: ../src/display_spl.c:1500
+msgid "+"
+msgstr ""
+
+#: ../src/display_tracks.c:281
+#, c-format
+msgid "Moved one track"
+msgid_plural "Moved %d tracks"
+msgstr[0] "%d曲を移動しました"
+
+#: ../src/display_tracks.c:1810
+#, c-format
+msgid ""
+"Cannot unsort track view because of a bug in the GTK lib you are using (%d.%"
+"d.%d < 2.5.4). Once you sort the track view, you cannot go back to the "
+"unsorted state.\n"
+"\n"
+msgstr ""
+"使われている GTK+ ライブラリ %d.%d.%d < 2.5.4) のバグのため、ソート表示を解除"
+"することができません。一度ソート表示を選んでしまうと、非ソート表示に戻すこと"
+"はできません。\n"
+"\n"
+
+#: ../src/display_tracks.c:2069
+msgid "Rtng"
+msgstr "評価"
+
+#: ../src/display_tracks.c:2072
+msgid "#"
+msgstr "#"
+
+#: ../src/display_tracks.c:2075
+msgid "CD"
+msgstr ""
+
+#: ../src/display_tracks.c:2078
+msgid "ID"
+msgstr "ID"
+
+#: ../src/display_tracks.c:2081
+msgid "Trnsfrd"
+msgstr "転送済み"
+
+#: ../src/display_tracks.c:2085
+msgid "Cmpl"
+msgstr "コンピ"
+
+#: ../src/display_tracks.c:2091
+msgid "Time"
+msgstr "演奏時間"
+
+#: ../src/display_tracks.c:2094
+msgid "Plycnt"
+msgstr "再生回数"
+
+#: ../src/display_tracks.c:2106
+msgid "Released"
+msgstr "公開日"
+
+#: ../src/display_tracks.c:2112
+msgid "Vol."
+msgstr "音量"
+
+#: ../src/display_tracks.c:2115
+msgid "Sndchk."
+msgstr "サウンドチェック"
+
+#: ../src/fetchcover.c:358
+msgid "Coverart file already exists"
+msgstr ""
+
+#: ../src/fetchcover.c:371
+#, c-format
+msgid ""
+"The picture file %s already exists.\n"
+"This may be associated with other music files in the directory.\n"
+"\n"
+"-  Clicking Yes will overwrite the existing file, possibly associating\n"
+"   other music files in the same directory with this coverart file.\n"
+"-  Clicking No will save the file with a unique file name.\n"
+"-  Clicking Cancel will abort the fetchcover operation."
+msgstr ""
+
+#: ../src/file.c:236
+#, c-format
+msgid ""
+"'%s' is a directory, not a playlist file.\n"
+"\n"
+msgstr ""
+"'%s' はプレイリストファイルではなく、ディレクトリです。\n"
+"\n"
+
+#: ../src/file.c:266
+#, c-format
+msgid ""
+"'%s' is a not a known playlist file.\n"
+"\n"
+msgstr ""
+"'%s' は プレイリストファイルではないようです。\n"
+"\n"
+
+#: ../src/file.c:283 ../src/file_export.c:217 ../src/oggfile.c:62
+#: ../src/wavfile.c:107
+#, c-format
+msgid "Could not open '%s' for reading.\n"
+msgstr "ファイル '%s' を読み込もうとしましたが、開くことができません。\n"
+
+#: ../src/file.c:369
+#, c-format
+msgid "Skipping '%s' because it is a directory.\n"
+msgstr "'%s' はディレクトリなので飛ばします。\n"
+
+#: ../src/file.c:374
+#, c-format
+msgid "Skipping '%s' to avoid adding playlist file recursively\n"
+msgstr "プレイリストファイルの再帰的な登録を避けるため、'%s' は飛ばします。\n"
+
+#: ../src/file.c:629
+#, c-format
+msgid "Unknown token '%s' in template '%s'\n"
+msgstr "未知のトークン '%s' がテンプレート '%s' 中にあります。\n"
+
+#: ../src/file.c:923
+#, c-format
+msgid "Local filename not valid (%s)"
+msgstr "ローカルのファイル名が不正です (%s)"
+
+#: ../src/file.c:982
+#, c-format
+msgid "No information found for user '%s' in '%s'"
+msgstr "ユーザー '%s' の情報が '%s' 内に見つかりません"
+
+#: ../src/file.c:991
+#, c-format
+msgid "mserv data file (%s) not available for track (%s)"
+msgstr "この曲 (%2$s) 用の mserv データファイル (%1$s) がありません"
+
+#: ../src/file.c:999
+#, c-format
+msgid "Track (%s) not in mserv music root directory (%s)"
+msgstr "この曲 (%s) は mserv のルートディレクトリ (%s) には入っていません"
+
+#: ../src/file.c:1123
+#, c-format
+msgid ""
+"The following track could not be processed (file does not exist): '%s'\n"
+msgstr "以下の曲を処理できませんでした (ファイルが存在しないため): '%s'\n"
+
+#: ../src/file.c:1209
+#, c-format
+msgid "The following track could not be processed (filetype unknown): '%s'\n"
+msgstr "以下の曲を処理できませんでした (ファイル形式が不明なため): '%s'\n"
+
+#: ../src/file.c:1307
+#, c-format
+msgid ""
+"The following track could not be processed (filetype is known but analysis "
+"failed): '%s'\n"
+msgstr ""
+"以下の曲を処理できませんでした (ファイル形式は既知だが解析に失敗したため): '%"
+"s'\n"
+
+#: ../src/file.c:1337 ../src/file.c:1391
+msgid "Nothing to update"
+msgstr "更新されるデータはありません"
+
+#: ../src/file.c:1358
+#, c-format
+msgid "Updating %s"
+msgstr "%s を更新中"
+
+#: ../src/file.c:1372
+msgid "Updated selected tracks with info from file."
+msgstr "選択された曲の情報を、ファイルを元に更新しました。"
+
+#: ../src/file.c:1406
+#, c-format
+msgid "Retrieving mserv data %s"
+msgstr "mserv data %s を取得中"
+
+#: ../src/file.c:1411
+msgid "no filename available"
+msgstr "ファイル名がわかりません"
+
+#: ../src/file.c:1416
+msgid "Updated selected tracks with data from mserv."
+msgstr "選択された曲を mserv のデータを元に更新しました。"
+
+#: ../src/file.c:1437
+#, c-format
+msgid "The following track could not be updated"
+msgid_plural "The following %d tracks could not be updated"
+msgstr[0] "以下の%d曲を更新することができませんでした"
+
+#. gint id,
+#. gboolean modal,
+#: ../src/file.c:1443
+msgid "Failed Track Update"
+msgstr "曲の更新に失敗"
+
+#: ../src/file.c:1501
+#, c-format
+msgid "The following track has been updated"
+msgid_plural "The following %d tracks have been updated"
+msgstr[0] "以下の%d曲を更新しました"
+
+#. gint id,
+#. gboolean modal,
+#: ../src/file.c:1507
+msgid "Successful Track Update"
+msgstr "曲の更新を完了"
+
+#: ../src/file.c:1566
+#, c-format
+msgid "No mserv information could be retrieved for the following track"
+msgid_plural ""
+"No mserv information could be retrieved for the following %d tracks"
+msgstr[0] "以下の%d曲について、mserv から情報を取得できません"
+
+#. gint id,
+#. gboolean modal,
+#: ../src/file.c:1572
+msgid "mserv data retrieval problem"
+msgstr "mserv からのデータ取得に問題があります"
+
+#: ../src/file.c:1661
+msgid "no local filename available, file on the iPod will be used instead"
+msgstr ""
+
+#: ../src/file.c:1667
+msgid "no local filename available and copy on iPod cannot be found"
+msgstr ""
+
+#: ../src/file.c:1671 ../src/file.c:1689
+#, fuzzy
+msgid "no local filename available"
+msgstr "ファイル名がわかりません"
+
+#: ../src/file.c:1679
+msgid "local file could not be found, file on the iPod will be used instead"
+msgstr ""
+
+#: ../src/file.c:1685
+msgid "local file as well as copy on the iPod cannot be found"
+msgstr ""
+
+#. update not successful -- log this track for later display
+#: ../src/file.c:1788
+#, fuzzy
+msgid "update failed (format not supported?)"
+msgstr "対応していない形式です"
+
+#: ../src/file.c:1873 ../src/misc_playlist.c:916
+#, c-format
+msgid "Processing '%s'..."
+msgstr "'%s' の処理中..."
+
+#: ../src/file.c:1879
+#, fuzzy, c-format
+msgid "Skipping '%s' because it matches exclude masks.\n"
+msgstr "'%s' はディレクトリなので飛ばします。\n"
+
+#: ../src/file.c:1999 ../src/misc_track.c:1773 ../src/misc_track.c:1878
+#, c-format
+msgid ""
+"Podcast already present: '%s'\n"
+"\n"
+msgstr ""
+"Podcast はすでに存在します: '%s'\n"
+"\n"
+
+#: ../src/file.c:2064
+#, c-format
+msgid ""
+"Writing to video files not yet supported (%s).\n"
+"\n"
+msgstr ""
+"ビデオファイルへの書き込みはまだできません (%s).\n"
+"\n"
+
+#: ../src/file.c:2116 ../src/file.c:2130
+#, c-format
+msgid "Couldn't change tags of file: %s\n"
+msgstr "次のファイルのタグを変更できません: %s\n"
+
+#: ../src/file.c:2232
+#, c-format
+msgid "Could not open '%s' for reading and writing.\n"
+msgstr "ファイル '%s' の読み込みおよび書き込みができません。\n"
+
+#: ../src/file.c:2239
+#, c-format
+msgid "Could not obtain lock on '%s'.\n"
+msgstr "'%s' をロックすることができませんでした。\n"
+
+#. error!
+#: ../src/file.c:2256 ../src/file.c:2265 ../src/file.c:2276 ../src/file.c:2286
+#, c-format
+msgid "Malformed line in '%s': %s\n"
+msgstr "'%s' におかしな行があります: %s\n"
+
+#. gint id,
+#. gboolean modal,
+#: ../src/file.c:2315
+msgid "Remove offline playcounts?"
+msgstr "オフラインでの再生回数を削除しますか"
+
+#. title
+#: ../src/file.c:2316
+msgid ""
+"Some tracks played offline could not be found in the iTunesDB. Press 'OK' to "
+"remove them from the offline playcount file, 'Cancel' to keep them."
+msgstr ""
+"オフラインで演奏されたいくつかの曲が iTunesDB には見付かりません。'OK' を押す"
+"とそれらの曲の再生回数はファイルから削除されます。'キャンセル' を押せば削除さ"
+"れず残ります。"
+
+#: ../src/file.c:2333
+#, c-format
+msgid "Error writing to '%s'.\n"
+msgstr "'%s'の書き込み中にエラーが発生しました。\n"
+
+#: ../src/file.c:2390 ../src/tools.c:270
+#, c-format
+msgid ""
+"Normalization failed: file type not supported (%s).\n"
+"\n"
+msgstr ""
+"平均化に失敗: このファイル形式は扱えません (%s).\n"
+"\n"
+
+#: ../src/file.c:2406 ../src/tools.c:287
+#, c-format
+msgid ""
+"Normalization failed: file not available (%s).\n"
+"\n"
+msgstr ""
+"平均化に失敗: ファイルが取得できません (%s).\n"
+"\n"
+
+#: ../src/file_convert.c:316
+msgid "Summary status of conversion processes"
+msgstr ""
+
+#: ../src/file_convert.c:564
+msgid "active"
+msgstr ""
+
+#: ../src/file_convert.c:569
+msgid "inactive"
+msgstr ""
+
+#: ../src/file_convert.c:580
+#, c-format
+msgid "Active threads: %d. Scheduled tracks: %d."
+msgstr ""
+
+#: ../src/file_convert.c:1071
+#, fuzzy, c-format
+msgid "Original filename not available for '%s.'\n"
+msgstr ""
+"平均化に失敗: ファイルが取得できません (%s).\n"
+"\n"
+
+#: ../src/file_convert.c:1086
+#, c-format
+msgid "Filename '%s' is no longer valid for '%s'.\n"
+msgstr ""
+
+#: ../src/file_convert.c:1137
+msgid "Ogg Vorbis"
+msgstr ""
+
+#: ../src/file_convert.c:1143
+msgid "FLAC"
+msgstr ""
+
+#: ../src/file_convert.c:1198
+#, c-format
+msgid ""
+"Files of type '%s' are not supported by the iPod. Please go to the "
+"Preferences to set up and turn on a suitable conversion script for '%s'.\n"
+"\n"
+msgstr ""
+
+#: ../src/file_convert.c:1284
+#, fuzzy
+msgid "No information available"
+msgstr "ファイル名がわかりません"
+
+#: ../src/file_convert.c:1323
+#, c-format
+msgid "Could not create '%s'. Filetype conversion will not work.\n"
+msgstr ""
+
+#: ../src/file_convert.c:1641 ../src/file_convert.c:3049
+#, c-format
+msgid ""
+"Transfer of '%s' failed. %s\n"
+"\n"
+msgstr ""
+
+#: ../src/file_convert.c:2047 ../src/file_convert.c:2325
+#, c-format
+msgid ""
+"Conversion of '%s' failed: '%s'.\n"
+"\n"
+msgstr ""
+
+#: ../src/file_convert.c:2062
+#, c-format
+msgid ""
+"Conversion of '%s' failed: '%s %s' returned exit status %d.\n"
+"\n"
+msgstr ""
+
+#: ../src/file_convert.c:2091
+#, c-format
+msgid ""
+"Conversion of '%s' failed: '\"%s\" %s' did not return filename extension as "
+"expected.\n"
+"\n"
+msgstr ""
+
+#: ../src/file_convert.c:2167
+#, c-format
+msgid ""
+"Conversion of '%s' failed: Could not access original file '%s' (%s).\n"
+"\n"
+msgstr ""
+
+#: ../src/file_convert.c:2222
+#, c-format
+msgid ""
+"Conversion of '%s' failed: Could not create directory '%s'.\n"
+"\n"
+msgstr ""
+
+#: ../src/file_convert.c:2356
+#, c-format
+msgid ""
+"Conversion of '%s' failed: '%s' returned exit status %d.\n"
+"\n"
+msgstr ""
+
+#: ../src/file_convert.c:2395
+#, c-format
+msgid ""
+"Conversion of '%s' failed: could not stat the converted file '%s'.\n"
+"\n"
+msgstr ""
+
+#: ../src/file_export.c:182
+#, c-format
+msgid "Skipping existing file with same length: '%s'\n"
+msgstr "同じ大きさのファイルを飛ばします: '%s'\n"
+
+#: ../src/file_export.c:190
+#, c-format
+msgid "Overwriting existing file: '%s'\n"
+msgstr "ファイルを上書きします: '%s'\n"
+
+#: ../src/file_export.c:207
+#, c-format
+msgid "Error copying '%s' to '%s': Permission Error (%s)\n"
+msgstr "'%s' を '%s' にコピー中にエラー発生: 許可がありません (%s)\n"
+
+#: ../src/file_export.c:209
+#, c-format
+msgid "Error copying '%s' to '%s' (%s)\n"
+msgstr "'%s' を '%s' にコピー中にエラー発生: (%s)\n"
+
+#: ../src/file_export.c:327
+#, c-format
+msgid "Could find file for '%s' on the iPod\n"
+msgstr "iPod 上の '%s' に相当するファイルが見つかりません\n"
+
+#. create the dialog window
+#: ../src/file_export.c:395 ../src/tools.c:360
+msgid "Information"
+msgstr "情報"
+
+#: ../src/file_export.c:406 ../src/tools.c:372
+msgid "Press button to abort."
+msgstr "ボタンを押すと中止します。"
+
+#: ../src/file_export.c:419
+msgid "copying..."
+msgstr "コピー中..."
+
+#: ../src/file_export.c:476
+#, c-format
+msgid "Failed to write '%s-%s'\n"
+msgstr "保存ができません '%s-%s'\n"
+
+#: ../src/file_export.c:489
+#, c-format
+msgid "Copied %d of %d track."
+msgid_plural "Copied %d of %d tracks."
+msgstr[0] "%2$d曲中 %1$d曲をコピーしました。"
+
+#: ../src/file_export.c:505 ../src/tools.c:518
+#, c-format
+msgid "%d%% (%d:%02d:%02d left)"
+msgstr "%d%% (残り %d:%02d:%02d)"
+
+#: ../src/file_export.c:514
+msgid "Some tracks were not copied."
+msgstr "一部の曲がコピーされませんでした。"
+
+#: ../src/file_export.c:579
+msgid "Export from iPod database not possible in offline mode."
+msgstr "オフラインモードでは iPod データベースからのエクスポートはできません。"
+
+#: ../src/file_export.c:587
+msgid "Select Export Destination Directory"
+msgstr "ファイルのエクスポート先ディレクトリを選択してください"
+
+#: ../src/file_export.c:736
+msgid "Drag from iPod database not possible in offline mode."
+msgstr "オフラインモードでは iPod データベースからのドラッグ操作はできません。"
+
+#: ../src/file_export.c:770
+msgid "The following tracks have to be copied to your harddisk"
+msgstr "以下の曲がハードディスクにコピーされました"
+
+#: ../src/file_export.c:815
+msgid ""
+"Some tracks were not copied to your harddisk. Only the copied tracks will be "
+"included in the current drag and drop operation.\n"
+"\n"
+msgstr ""
+"一部の曲はハードディスクにコピーされませんでした。コピーされた曲のみが、今の"
+"ドラッグ&ドロップ操作に含まれています。\n"
+
+#: ../src/file_export.c:1010
+#, c-format
+msgid ""
+"No valid filename for: %s\n"
+"\n"
+msgstr "'%s' のファイル名が不正です。\n"
+
+#: ../src/file_export.c:1026
+#, c-format
+msgid "Created playlist with one track."
+msgid_plural "Created playlist with %d tracks."
+msgstr[0] "新規プレイリストに %d曲登録しました。"
+
+#: ../src/file_export.c:1031
+#, c-format
+msgid ""
+"Could not open '%s' for writing (%s).\n"
+"\n"
+msgstr ""
+"'%s' を書き込み用に開くことができません。(%s)\n"
+"\n"
+
+#: ../src/file_itunesdb.c:129
+#, fuzzy, c-format
+msgid "Matching SHA1 checksum for file %d/%d"
+msgstr "MD5 チェックサムの照合中 %d/%d"
+
+#: ../src/file_itunesdb.c:236
+#, fuzzy, c-format
+msgid "Could not open \"%s\" for reading extended info.\n"
+msgstr "'%s' を開けないため、拡張情報を記録できません。\n"
+
+#: ../src/file_itunesdb.c:243
+msgid "Could not create hash value from itunesdb\n"
+msgstr "itunesdb からハッシュ値を読み込めませんでした。\n"
+
+#: ../src/file_itunesdb.c:259
+#, c-format
+msgid "Error while reading extended info: %s\n"
+msgstr "拡張情報ファイルの読み込み中に以下のエラーが発生しました: %s\n"
+
+#: ../src/file_itunesdb.c:276
+#, fuzzy, c-format
+msgid ""
+"iTunesDB '%s' does not match checksum in extended information file '%s'\n"
+"gtkpod will try to match the information using SHA1 checksums. This may take "
+"a long time.\n"
+"\n"
+msgstr ""
+"iTunesDB '%s' と、拡張情報ファイル '%s' とでチェックサムが合いません。\n"
+"gtkpod は MD5 チェックサムを使ってさらに照合を進めます。これには時間がかかり"
+"ます。\n"
+"\n"
+
+#: ../src/file_itunesdb.c:288
+#, c-format
+msgid ""
+"%s:\n"
+"Expected \"itunesdb_hash=\" but got:\"%s\"\n"
+msgstr ""
+"%s:\n"
+"\"itunesdb_hash=\" が書かれているべき箇所に違う内容が書かれています: \"%s\"\n"
+
+#: ../src/file_itunesdb.c:348
+#, c-format
+msgid ""
+"%s:\n"
+"Format error: %s\n"
+msgstr ""
+"%s:\n"
+"書式エラー: %s\n"
+
+#: ../src/file_itunesdb.c:393
+#, fuzzy
+msgid ""
+"No SHA1 checksums on individual tracks are available.\n"
+"\n"
+"To avoid this situation in the future either switch on duplicate detection "
+"(will provide SHA1 checksums) or avoid using the iPod with programs other "
+"than gtkpod.\n"
+"\n"
+msgstr ""
+"各曲のMD5 チェックサムが保存されていません。\n"
+"\n"
+"以降この状況を回避するには、重複検出を有効にするか(それによりMD5チェックサム"
+"が保存されるようになります)、gtkpod 以外のソフトウェアでiPodを使用しないよう"
+"にしてください。\n"
+"\n"
+
+#: ../src/file_itunesdb.c:457
+msgid ""
+"Extended info will not be used. If you have non-transferred tracks,\n"
+"these will be lost.\n"
+msgstr ""
+"拡張情報は使用されません。iPod本体にまだ転送していない曲の情報は\n"
+"終了時に失われます。\n"
+
+#: ../src/file_itunesdb.c:465
+msgid "Offline iPod database successfully imported"
+msgstr "オフラインでiPodデータベースを読み込みました"
+
+#: ../src/file_itunesdb.c:468
+msgid "Local database successfully imported"
+msgstr "ローカルデータベースを読み込みました"
+
+#: ../src/file_itunesdb.c:476
+#, c-format
+msgid ""
+"Offline iPod database import failed: '%s'\n"
+"\n"
+msgstr ""
+"オフラインでのiPodデータベースの読み込みに失敗しました: '%s'\n"
+"\n"
+
+#: ../src/file_itunesdb.c:480
+#, c-format
+msgid ""
+"Local database import failed: '%s'\n"
+"\n"
+msgstr ""
+"ローカルデータベースの読み込みに失敗しました: '%s'\n"
+"\n"
+
+#: ../src/file_itunesdb.c:487
+msgid ""
+"Offline iPod database import failed: \n"
+"\n"
+msgstr ""
+"オフラインでのiPodデータベースの読み込みに失敗しました\n"
+"\n"
+
+#: ../src/file_itunesdb.c:490
+msgid ""
+"Local database import failed: \n"
+"\n"
+msgstr ""
+"ローカルデータベースの読み込みに失敗しました: \n"
+"\n"
+
+#: ../src/file_itunesdb.c:497
+#, c-format
+msgid ""
+"'%s' does not exist. Import aborted.\n"
+"\n"
+msgstr ""
+"'%s' は見つかりません。読み込みを中止します。\n"
+"\n"
+
+#: ../src/file_itunesdb.c:520
+msgid "Extended info will not be used.\n"
+msgstr "拡張情報は使用されません。\n"
+
+#: ../src/file_itunesdb.c:527
+msgid "iPod Database Successfully Imported"
+msgstr "iPod からデータベースを読み込みました"
+
+#: ../src/file_itunesdb.c:534
+#, c-format
+msgid ""
+"iPod Database Import Failed: '%s'\n"
+"\n"
+msgstr ""
+"iPod からのデータベースの読み込みに失敗しました: '%s'\n"
+"\n"
+
+#: ../src/file_itunesdb.c:540
+msgid ""
+"iPod Database Import Failed.\n"
+"\n"
+msgstr ""
+"iPodからのデータベースの読み込みに失敗しました。\n"
+"\n"
+
+#: ../src/file_itunesdb.c:549
+#, fuzzy, c-format
+msgid ""
+"'%s' (or similar) does not exist. Import aborted.\n"
+"\n"
+msgstr ""
+"'%s' は見つかりません。読み込みを中止します。\n"
+"\n"
+
+#: ../src/file_itunesdb.c:865
+#, c-format
+msgid ""
+"Could not find iPod directory structure at '%s'.\n"
+"If you are sure that the iPod is properly mounted at '%s', gtkpod can create "
+"the directory structure for you.\n"
+"\n"
+"Do you want to create the directory structure now?\n"
+msgstr ""
+
+#: ../src/file_itunesdb.c:1180
+#, c-format
+msgid "Could not open \"%s\" for writing extended info.\n"
+msgstr "'%s' を開けないため、拡張情報を記録できません。\n"
+
+#: ../src/file_itunesdb.c:1195
+msgid "Aborted writing of extended info.\n"
+msgstr "拡張情報の書き込みは中止されました。\n"
+
+#: ../src/file_itunesdb.c:1397
+#, c-format
+msgid "%d%%"
+msgstr ""
+
+#: ../src/file_itunesdb.c:1411
+#, fuzzy, c-format
+msgid "%d%% (%d/%d  %d:%02d:%02d left)"
+msgstr "%d%% (残り %d:%02d:%02d)"
+
+#: ../src/file_itunesdb.c:1463
+msgid "Status: Deleting File"
+msgstr ""
+
+#: ../src/file_itunesdb.c:1524
+#, fuzzy, c-format
+msgid ""
+"Could not remove the following file: '%s'\n"
+"\n"
+msgstr ""
+"'%s' を書き込み用に開くことができません。(%s)\n"
+"\n"
+
+#: ../src/file_itunesdb.c:1632
+#, fuzzy
+msgid ""
+"The following track could not be converted successfully:\n"
+"\n"
+msgid_plural ""
+"The following tracks could not be converted successfully:\n"
+"\n"
+msgstr[0] "以下の%d曲を更新することができませんでした"
+
+#: ../src/file_itunesdb.c:1642
+#, fuzzy
+msgid ""
+"The following track could not be transferred successfully:\n"
+"\n"
+msgid_plural ""
+"The following tracks could not be transferred successfully:\n"
+"\n"
+msgstr[0] "以下の%d曲を更新することができませんでした"
+
+#. ID
+#. modal,
+#. gint id,
+#. gboolean modal,
+#: ../src/file_itunesdb.c:1651 ../src/misc_confirm.c:70
+msgid "Warning"
+msgstr "警告"
+
+#. title
+#: ../src/file_itunesdb.c:1652
+msgid ""
+"The iPod could not be ejected. Please fix the problems mentioned below and "
+"then eject the iPod again. Pressing 'OK' will re-schedule the failed tracks "
+"for conversion and transfer."
+msgstr ""
+
+#: ../src/file_itunesdb.c:1715
+#, c-format
+msgid "Status: Copying track"
+msgstr ""
+
+#: ../src/file_itunesdb.c:1721
+#, c-format
+msgid "Status: Waiting for conversion to complete"
+msgstr ""
+
+#: ../src/file_itunesdb.c:1725
+#, c-format
+msgid "Status: Finished transfer"
+msgstr ""
+
+#: ../src/file_itunesdb.c:1770
+#, c-format
+msgid ""
+"One track could not be transferred because your iPod is full. Either delete "
+"some tracks or otherwise create space on the iPod before ejecting the iPod "
+"again."
+msgid_plural ""
+"%d tracks could not be transferred because your iPod is full. Either delete "
+"some tracks or otherwise create space on the iPod before ejecting the iPod "
+"again."
+msgstr[0] ""
+
+#: ../src/file_itunesdb.c:1852
+#, c-format
+msgid ""
+"You did not import the existing iTunesDB ('%s'). This is most likely "
+"incorrect and will result in the loss of the existing database.\n"
+"\n"
+"Press 'OK' if you want to proceed anyhow or 'Cancel' to skip storing. If you "
+"cancel, you can import the existing database before calling this function "
+"again.\n"
+msgstr ""
+"あなたは既にある iTunesDB ('%s') を読み込まずにこの操作をしています。これは普"
+"通は行わない事であり、今あるデータベースは失われることになります。\n"
+"\n"
+"もしそれでもよければ、'OK' を、保存を取り止めるなら 'キャンセル' を押してくだ"
+"さい。キャンセルした場合は、既にあるデータベースを取り込んでから再びこの操作"
+"を行うことができます。\n"
+
+#: ../src/file_itunesdb.c:1887
+msgid ""
+"iPod directory structure must be present before synching to the iPod can be "
+"performed.\n"
+msgstr ""
+"iPod への同期を行うためには、まず iPod のディレクトリ構造をあらかじめ作成して"
+"おく必要があります。\n"
+
+#: ../src/file_itunesdb.c:1896
+msgid "Some tracks could not be deleted from the iPod. Export aborted!"
+msgstr "一部の曲をiPodから削除できませんでした。エクスポートを中断します。"
+
+#: ../src/file_itunesdb.c:1914
+#, fuzzy, c-format
+msgid "Now writing database '%s'. Please wait..."
+msgstr "iTunesDBの書き込み中。しばらくお待ちください..."
+
+#: ../src/file_itunesdb.c:1963
+#, c-format
+msgid "Extended information file not deleted: '%s'"
+msgstr "拡張情報ファイルを削除できません: '%s'"
+
+#: ../src/file_itunesdb.c:2070
+#, fuzzy, c-format
+msgid "%s: Database saved"
+msgstr "iPodデータベースを保存しました"
+
+#: ../src/file_itunesdb.c:2074
+#, c-format
+msgid "%s: Changes saved"
+msgstr ""
+
+#: ../src/fileselection.c:129
+msgid "Successfully added files"
+msgstr "ファイルの追加に成功しました"
+
+#: ../src/fileselection.c:131
+msgid "Some files were not added successfully"
+msgstr "一部のファイルの追加に失敗しました"
+
+#: ../src/fileselection.c:164 ../src/fileselection.c:305
+#: ../src/fileselection.c:792
+msgid "Please select a playlist or repository before adding tracks."
+msgstr ""
+
+#: ../src/fileselection.c:175 ../src/fileselection.c:314
+#: ../src/fileselection.c:803
+msgid "Please load the iPod before adding tracks."
+msgstr ""
+
+#: ../src/fileselection.c:185
+#, fuzzy, c-format
+msgid "Add files to '%s'"
+msgstr "ファイルを追加する"
+
+#: ../src/fileselection.c:189
+#, c-format
+msgid "Add files to '%s/%s'"
+msgstr ""
+
+#. Create window title
+#: ../src/fileselection.c:322
+#, fuzzy, c-format
+msgid "Add playlist files to '%s'"
+msgstr "プレイリストをファイルから読み込んで追加します"
+
+#. Create the file chooser, and handle the response
+#: ../src/fileselection.c:378
+msgid "Set Cover"
+msgstr "カバーアートを設定"
+
+#: ../src/fileselection.c:816
+#, fuzzy, c-format
+msgid "Add directories to '%s'"
+msgstr "ディレクトリを再帰的に追加する"
+
+#: ../src/fileselection.c:820
+#, fuzzy, c-format
+msgid "Add directories to '%s/%s'"
+msgstr "ディレクトリを再帰的に追加する"
+
+#: ../src/fileselection.c:1097
+msgid "Ok"
+msgstr "OK"
+
+#: ../src/fileselection.c:1106
+msgid "Cancel"
+msgstr "キャンセル"
+
+#: ../src/flacfile.c:62
+#, fuzzy, c-format
+msgid "'%s' does not appear to be an FLAC audio file.\n"
+msgstr "'%s' は mp4 オーディオファイルとは認識できません。\n"
+
+#: ../src/flacfile.c:78
+#, fuzzy, c-format
+msgid "Error retrieving tags for '%s'.\n"
+msgstr "'%s'の書き込み中にエラーが発生しました。\n"
+
+#: ../src/flacfile.c:165
+#, fuzzy, c-format
+msgid ""
+"Import of '%s' failed: FLAC not supported without the FLAC library. You must "
+"compile the gtkpod source together with the FLAC library.\n"
+msgstr ""
+"'%s'の読み込みに失敗: m4a/m4p の取り扱いには mp4v2 ライブラリが必要です。"
+"mp4v2 ライブラリを使って gtkpod を再度コンパイルしてください。\n"
+
+#: ../src/flacfile.c:171
+#, fuzzy, c-format
+msgid ""
+"FLAC metadata update for '%s' failed: FLAC not supported without the FLAC "
+"library. You must compile the gtkpod source together with the FLAC library.\n"
+msgstr ""
+"'%s' の m4a/m4p メタデータの更新に失敗: m4a/m4p の取り扱いには mp4v2 ライブラ"
+"リが必要です。mp4v2 ライブラリを使って gtkpod を再度コンパイルしてくださ"
+"い。\n"
+
+#: ../src/getopt.c:681
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: 指定されたオプション `%s' では記述が曖昧です\n"
+
+#: ../src/getopt.c:706
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: 指定されたオプション `--%s' は引数を取りません\n"
+
+#: ../src/getopt.c:711
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: 指定されたオプション `%c%s' は引数を取りません\n"
+
+#: ../src/getopt.c:729 ../src/getopt.c:902
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: 指定されたオプション `%s' には引数が必要です\n"
+
+#. --option
+#: ../src/getopt.c:758
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: 認識できないオプション `--%s' です\n"
+
+#. +option or -option
+#: ../src/getopt.c:762
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: 認識できないオプション `%c%s' です\n"
+
+#. 1003.2 specifies the format of this message.
+#: ../src/getopt.c:788
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: オプションが違います -- %c\n"
+
+#: ../src/getopt.c:791
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: 不正なオプションです -- %c\n"
+
+#. 1003.2 specifies the format of this message.
+#: ../src/getopt.c:821 ../src/getopt.c:951
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: 指定されたオプションには引数が必要です -- %c\n"
+
+#: ../src/getopt.c:868
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: 指定されたオプション `-W %s' では記述が曖昧です\n"
+
+#: ../src/getopt.c:886
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: 指定されたオプション `-W %s' は引数を取りません\n"
+
+#: ../src/info.c:383
+msgid "n/c"
+msgstr ""
+
+#: ../src/info.c:388 ../src/info.c:838
+msgid "offline"
+msgstr "オフライン"
+
+#: ../src/info.c:486
+#, c-format
+msgid " P:%d T:%d/%d"
+msgstr ""
+
+#: ../src/info.c:780
+msgid "B"
+msgstr ""
+
+#: ../src/info.c:780
+msgid "kB"
+msgstr ""
+
+#: ../src/info.c:780
+msgid "TB"
+msgstr ""
+
+#: ../src/info.c:823
+#, c-format
+msgid " %s Free"
+msgstr "%s 空き"
+
+#: ../src/info.c:828
+#, c-format
+msgid " %s Pending"
+msgstr "%s 不足"
+
+#: ../src/info.c:833
+msgid " disconnected"
+msgstr "未接続"
+
+#: ../src/info.c:884
+#, fuzzy
+msgid "No database or playlist selected"
+msgstr "プレイリストが選択されていません"
+
+#: ../src/info.c:889
+msgid "No tracks selected"
+msgstr "曲が選択されていません。"
+
+#: ../src/info.c:894
+msgid "No playlist selected"
+msgstr "プレイリストが選択されていません"
+
+#: ../src/info.c:899
+#, fuzzy
+msgid "No iPod or iPod playlist selected"
+msgstr "プレイリストが選択されていません"
+
+#. Strings used several times
+#: ../src/ipod_init.c:48
+msgid "Select or enter your model"
+msgstr ""
+
+#: ../src/ipod_init.c:79 ../src/repository.c:546 ../src/repository.c:2369
+#, fuzzy
+msgid "Select mountpoint"
+msgstr "iPodのマウント場所(_P):"
+
+#: ../src/ipod_init.c:359
+#, fuzzy, c-format
+msgid "Error initialising iPod: %s\n"
+msgstr "'%s'の書き込み中にエラーが発生しました。\n"
+
+#: ../src/ipod_init.c:366
+msgid "Error initialising iPod, unknown error\n"
+msgstr ""
+
+#: ../src/ipod_init.c:422
+#, c-format
+msgid "<b>Please select your iPod model at </b><i>%s</i>"
+msgstr ""
+
+#: ../src/ipod_init.c:463
+msgid ""
+"Could not determine the model you selected -- this could be a bug or "
+"incompatibilty in the GTK+ or glade library.\n"
+"\n"
+msgstr ""
+
+#: ../src/misc.c:70
+msgid ""
+"© 2002 - 2007\n"
+"Jorg Schuler (jcsjcs at users dot sourceforge dot net)\n"
+"Corey Donohoe (atmos at atmos dot org)\n"
+msgstr ""
+
+#: ../src/misc.c:74
+msgid ""
+"Patches were supplied by the following people (list may be incomplete -- "
+"please contact me)\n"
+msgstr ""
+
+#: ../src/misc.c:75
+msgid "Ramesh Dharan: Multi-Edit (edit tags of several tracks in one run)"
+msgstr ""
+
+#: ../src/misc.c:76
+msgid "Hiroshi Kawashima: Japanese charset autodetection feature"
+msgstr ""
+
+#: ../src/misc.c:77
+msgid "Adrian Ulrich: porting of playlist code from mktunes.pl to itunesdb.c"
+msgstr ""
+
+#: ../src/misc.c:78
+msgid ""
+"Walter Bell: correct handling of DND URIs with escaped characters and/or cr/"
+"newlines at the end"
+msgstr ""
+
+#: ../src/misc.c:79
+msgid "Sam Clegg: user defined filenames when exporting tracks from the iPod"
+msgstr ""
+
+#: ../src/misc.c:80
+msgid "Chris Cutler: automatic creation of various playlist types"
+msgstr ""
+
+#: ../src/misc.c:81
+msgid ""
+"Graeme Wilford: reading and writing of the 'Composer' ID3 tags, progress "
+"dialogue during sync"
+msgstr ""
+
+#: ../src/misc.c:82
+msgid ""
+"Edward Matteucci: debugging, special playlist creation, most of the volume "
+"normalizing code"
+msgstr ""
+
+#: ../src/misc.c:83
+msgid "Jens Lautenbach: some optical improvements"
+msgstr ""
+
+#: ../src/misc.c:84
+msgid "Alex Tribble: iPod eject patch"
+msgstr ""
+
+#: ../src/misc.c:85
+msgid "Yaroslav Halchenko: Orphaned and dangling tracks handling"
+msgstr ""
+
+#: ../src/misc.c:86
+msgid ""
+"Andrew Huntwork: Filename case sensitivity fix and various other bugfixes"
+msgstr ""
+
+#: ../src/misc.c:87
+msgid ""
+"Ero Carrera: Filename validation and quick sync when copying tracks from the "
+"iPod"
+msgstr ""
+
+#: ../src/misc.c:88
+msgid "Jens Taprogge: Support for LAME's replay gain tag to normalize volume"
+msgstr ""
+
+#: ../src/misc.c:89
+msgid "Armando Atienza: Support with external playcounts"
+msgstr ""
+
+#: ../src/misc.c:90
+msgid "D.L. Sharp: Support for m4b files (bookmarkable AAC files)"
+msgstr ""
+
+#: ../src/misc.c:91
+msgid "Jim Hall: Decent INSTALL file"
+msgstr ""
+
+#: ../src/misc.c:92
+msgid ""
+"Juergen Helmers, Markus Gaugusch: Conversion scripts to sync calendar/"
+"contacts to the iPod"
+msgstr ""
+
+#. J"urgen!
+#: ../src/misc.c:93
+msgid "Flavio Stanchina: bugfixes"
+msgstr ""
+
+#: ../src/misc.c:94
+msgid ""
+"Chris Micacchi: when sorting ignore 'the' and similar at the beginning of "
+"the title"
+msgstr ""
+
+#: ../src/misc.c:95
+msgid "Steve Jay: use statvfs() instead of df (better portability, faster)"
+msgstr ""
+
+#: ../src/misc.c:97
+msgid ""
+"Christoph Kunz: address compatibility issues when writing id3v2.4 type mp3 "
+"tags"
+msgstr ""
+
+#: ../src/misc.c:99
+msgid ""
+"James Liggett:\n"
+"replacement of old GTK file selection dialogs with new GTK filechooser "
+"dialogs\n"
+"refactored user preferences system."
+msgstr ""
+
+#: ../src/misc.c:103
+msgid "Daniel Kercher: sync scripts for abook and webcalendar"
+msgstr ""
+
+#: ../src/misc.c:105
+msgid "Clinton Gormley: sync scripts for thunderbird"
+msgstr ""
+
+#: ../src/misc.c:107
+msgid "Sebastien Beridot: sync script for ldif addressbook format"
+msgstr ""
+
+#: ../src/misc.c:109
+msgid "Sebastian Scherer: sync script for kNotes"
+msgstr ""
+
+#: ../src/misc.c:111
+msgid "Nick Piper: sync script for Palm, type-ahead search"
+msgstr ""
+
+#: ../src/misc.c:113
+msgid "Uwe Hermann: help with support for iPod Video"
+msgstr ""
+
+#: ../src/misc.c:115
+msgid ""
+"Iain Benson: support for compilation tag in mp3 files and separate display "
+"of compilations in the sort tab."
+msgstr ""
+
+#: ../src/misc.c:116
+msgid ""
+"Nicolas Chariot: icons of buttons\n"
+"\n"
+msgstr ""
+
+#: ../src/misc.c:118
+msgid "This program borrows code from the following projects:"
+msgstr ""
+
+#: ../src/misc.c:119
+msgid ""
+"gnutools: (mktunes.pl, ported to C) reading and writing of iTunesDB  (http://"
+"www.gnu.org/software/gnupod/)"
+msgstr ""
+
+#: ../src/misc.c:120
+msgid ""
+"iPod.cpp, iPod.h by Samuel Wood (sam dot wood at gmail dot com): some code "
+"for smart playlists is based on his C++-classes."
+msgstr ""
+
+#: ../src/misc.c:121
+msgid "mp3info: mp3 playlength detection (http://ibiblio.org/mp3info/)"
+msgstr ""
+
+#: ../src/misc.c:122
+msgid "xmms: dirbrowser, mp3 playlength detection (http://www.xmms.org)"
+msgstr ""
+
+#: ../src/misc.c:124
+msgid "The GUI was created with the help of glade-2 (http://glade.gnome.org/)."
+msgstr ""
+
+#: ../src/misc.c:128
+msgid "French: David Le Brun (david at dyn-ns dot net)"
+msgstr ""
+
+#: ../src/misc.c:129
+msgid "French: Éric Lassauge (rpmfarm at free dot fr)"
+msgstr ""
+
+#: ../src/misc.c:130
+msgid "German: Jorg Schuler (jcsjcs at users dot sourceforge dot net)"
+msgstr ""
+
+#: ../src/misc.c:131
+msgid "German: Kai-Ove"
+msgstr ""
+
+#: ../src/misc.c:132
+msgid "Hebrew: Assaf Gillat (gillata at gmail dot com)"
+msgstr ""
+
+#: ../src/misc.c:133
+msgid ""
+"Italian: Edward Matteucci (edward_matteucc at users dot sourceforge dot net)"
+msgstr ""
+
+#: ../src/misc.c:134
+msgid "Italian: Daniele Forsi (dforsi at gmail dot com)"
+msgstr ""
+
+#: ../src/misc.c:135
+msgid "Japanese: Ayako Sano"
+msgstr ""
+
+#: ../src/misc.c:136
+msgid "Japanese: Kentaro Fukuchi (fukuchi at users dot sourceforge dot net)"
+msgstr ""
+
+#: ../src/misc.c:137
+msgid "Romanian: Alex Eftimie (alexeftimie at gmail dot com)"
+msgstr ""
+
+#: ../src/misc.c:138
+msgid "Spanish: Alejandro Lamas Daviña (alejandro.lamas at ific dot uv dot es)"
+msgstr ""
+
+#: ../src/misc.c:139
+msgid "Swedish: Stefan Asserhall (stefan.asserhall at comhem dot se)"
+msgstr ""
+
+#: ../src/misc.c:144
+#, fuzzy
+msgid ""
+"This program is free software; you can redistribute it and/or\n"
+"modify it under the terms of the GNU General Public License as\n"
+"published by the Free Software Foundation; either version 2 of the\n"
+"License, or (at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful, but\n"
+"WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See\n"
+"the GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public\n"
+"License along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA\n"
+"02111-1307, USA."
+msgstr ""
+"このプログラムはフリーソフトウェアです。あなたはこれを、フリーソフトウェア財"
+"団によって発行された GNU 一般公衆利用許諾契約書(バージョン2か、希望によっては"
+"それ以降のバージョンのうちどれか)の定める条件の下で再頒布または改変することが"
+"できます。\n"
+"\n"
+"このプログラムは有用であることを願って頒布されますが、*全くの無保証*です。商"
+"業可能性の保証や特定の目的への適合性は、言外に示されたものも含め全く存在しま"
+"せん。詳しくはGNU 一般公衆利用許諾契約書をご覧ください。\n"
+"\n"
+"あなたはこのプログラムと共に、GNU 一般公衆利用許諾契約書の複製物を一部受け"
+"取ったはずです。もし受け取っていなければ、フリーソフトウェア財団まで請求して"
+"ください(宛先は the Free Software Foundation, Inc., 59 Temple Place,Suite "
+"330, Boston, MA 02111-1307 USA)。\n"
+"\n"
+"\n"
+
+#: ../src/misc.c:159
+msgid ""
+"© 2002-2007\n"
+"Jorg Schuler <jcsjcs at users.sourceforge.net>\n"
+"Corey Donohoe <atmos at atmos.org>"
+msgstr ""
+
+#: ../src/misc.c:167
+msgid "Cross-platform multilingual interface to Apple's iPod™"
+msgstr ""
+
+#: ../src/misc.c:934
+#, fuzzy, c-format
+msgid "Could not process '%s' (no filename available)"
+msgstr "ファイル名がわかりません"
+
+#: ../src/misc.c:1088
+#, c-format
+msgid "Unknown token '%%%c' in template '%s'"
+msgstr "未知のトークン '%%%c' がテンプレート '%s' 中にあります"
+
+#: ../src/misc.c:1171
+#, c-format
+msgid "Template ('%s') does not match file type '%s'\n"
+msgstr "テンプレート ('%s') がファイル形式 '%s' に合いません。\n"
+
+#: ../src/misc.c:1257
+#, c-format
+msgid "Error creating %s: %s\n"
+msgstr "'%s'の作成に失敗: %s\n"
+
+#: ../src/misc.c:1691
+#, c-format
+msgid ""
+"Writing preferences file '%s' failed (%s).\n"
+"\n"
+msgstr ""
+
+#: ../src/misc.c:1693
+msgid "unspecified error"
+msgstr ""
+
+#: ../src/misc.c:1701
+#, c-format
+msgid ""
+"Writing preferences to the iPod (%s) failed: could not get path to Control "
+"Directory.\n"
+"\n"
+msgstr ""
+
+#. title
+#: ../src/misc_confirm.c:71
+#, fuzzy
+msgid "The following has occurred:"
+msgstr "以下の問題が発生しました:"
+
+#: ../src/misc_confirm.c:122
+msgid ""
+"Are you sure you want to delete the following track completely from your "
+"iPod? The number of playlists this track is a member of is indicated in "
+"parentheses."
+msgid_plural ""
+"Are you sure you want to delete the following tracks completely from your "
+"iPod? The number of playlists the tracks are member of is indicated in "
+"parentheses."
+msgstr[0] ""
+"以下の曲を iPod から完全に削除しても本当によろしいですか? 括弧の中の数字は、"
+"この曲がいくつのプレイリストに登録されているかを示しています。"
+
+#: ../src/misc_confirm.c:126
+msgid "Delete Track Completely from iPod?"
+msgid_plural "Delete Tracks Completely from iPod?"
+msgstr[0] "iPod から完全に削除しますか?"
+
+#: ../src/misc_confirm.c:137 ../src/misc_confirm.c:178
+#, c-format
+msgid ""
+"Are you sure you want to remove the following track from the playlist \"%s\"?"
+msgid_plural ""
+"Are you sure you want to remove the following tracks from the playlist \"%s"
+"\"?"
+msgstr[0] "以下の曲をプレイリスト \"%s\" から削除してもよろしいですか?"
+
+#: ../src/misc_confirm.c:141 ../src/misc_confirm.c:182
+msgid "Remove Track From Playlist?"
+msgid_plural "Remove Tracks From Playlist?"
+msgstr[0] "これら曲をプレイリストから削除しますか?"
+
+#: ../src/misc_confirm.c:163
+msgid ""
+"Are you sure you want to delete the following track completely from your "
+"harddisk? The number of playlists this track is a member of is indicated in "
+"parentheses."
+msgid_plural ""
+"Are you sure you want to delete the following tracks completely from your "
+"harddisk? The number of playlists the tracks are member of is indicated in "
+"parentheses."
+msgstr[0] ""
+"以下の曲をハードディスクから完全に削除してもよろしいですか? 括弧の中の数字"
+"は、この曲がいくつのプレイリストに登録されているかを示しています。"
+
+#: ../src/misc_confirm.c:167
+msgid "Delete Track from Harddisk?"
+msgid_plural "Delete Tracks from Harddisk?"
+msgstr[0] "これらの曲をハードディスクから削除しますか?"
+
+#: ../src/misc_confirm.c:192
+msgid ""
+"Are you sure you want to remove the following track completely from your "
+"local database? The number of playlists this track is a member of is "
+"indicated in parentheses."
+msgid_plural ""
+"Are you sure you want to remove the following tracks completely from your "
+"local database? The number of playlists the tracks are member of is "
+"indicated in parentheses."
+msgstr[0] ""
+"以下の曲をローカルのデータベースから完全に削除してもよろしいですか? 括弧の中"
+"の数字は、これらの曲がいくつのプレイリストに登録されているかを示しています。"
+
+#: ../src/misc_confirm.c:196
+msgid "Remove Track from Local Database?"
+msgid_plural "Remove Tracks from Local Database?"
+msgstr[0] "これらの曲をローカルのデータベースから削除しますか?"
+
+#: ../src/misc_confirm.c:261
+#, c-format
+msgid "Deleted one track completely from iPod"
+msgid_plural "Deleted %d tracks completely from iPod"
+msgstr[0] "iPodから%d曲完全に削除しました"
+
+#: ../src/misc_confirm.c:267 ../src/misc_confirm.c:291
+#, c-format
+msgid "Deleted %d track from playlist '%s'"
+msgid_plural "Deleted %d tracks from playlist '%s'"
+msgstr[0] "プレイリスト '%2$s' から %1$d 曲削除しました"
+
+#: ../src/misc_confirm.c:285
+#, c-format
+msgid "Deleted one track from harddisk"
+msgid_plural "Deleted %d tracks from harddisk"
+msgstr[0] "ハードディスクから%d曲削除しました"
+
+#: ../src/misc_confirm.c:297
+#, c-format
+msgid "Deleted track from local database"
+msgid_plural "Deleted %d tracks from local database"
+msgstr[0] "ローカルデータベースから%d曲削除しました"
+
+#: ../src/misc_confirm.c:442
+msgid "Cannot remove entry 'All'"
+msgstr "'すべて' の項目を削除することはできません"
+
+#: ../src/misc_confirm.c:536
+#, c-format
+msgid "Removed all %d tracks from the iPod"
+msgstr "全%d曲を iPod から削除しました"
+
+#: ../src/misc_confirm.c:541
+#, c-format
+msgid "Removed all podcasts from the iPod"
+msgstr "すべての Podcast を iPod から削除しました"
+
+#: ../src/misc_confirm.c:550 ../src/misc_confirm.c:624
+#, c-format
+msgid "Deleted playlist '%s' including %d member track"
+msgid_plural "Deleted playlist '%s' including %d member tracks"
+msgstr[0] "プレイリスト '%s' (%d曲) を削除しました"
+
+#. first use playlist name
+#: ../src/misc_confirm.c:566 ../src/misc_confirm.c:640
+#, c-format
+msgid "Deleted playlist '%s'"
+msgstr "プレイリスト '%s' を削除"
+
+#: ../src/misc_confirm.c:600
+#, c-format
+msgid "Deleted playlist '%s' including %d member track on harddisk"
+msgid_plural "Deleted playlist '%s' including %d member tracks on harddisk"
+msgstr[0] "ハードディスクからプレイリスト '%s' (%d曲) を削除しました"
+
+#: ../src/misc_confirm.c:617
+#, c-format
+msgid "Removed all %d tracks from the database"
+msgstr "データベースから全%d曲を削除しました"
+
+#: ../src/misc_confirm.c:695
+#, c-format
+msgid "Are you sure you want to remove all tracks from your iPod?"
+msgstr "iPod のすべての曲を削除しても本当によろしいですか?"
+
+#: ../src/misc_confirm.c:700
+#, c-format
+msgid "Are you sure you want to remove all podcasts from your iPod?"
+msgstr "すべての Podcast を iPod から削除しても本当によろしいですか?"
+
+#: ../src/misc_confirm.c:708
+#, fuzzy, c-format
+msgid ""
+"Are you sure you want to delete playlist '%s' and the following track "
+"completely from your iPod? The number of playlists this track is a member of "
+"is indicated in parentheses."
+msgid_plural ""
+"Are you sure you want to delete playlist '%s' and the following tracks "
+"completely from your iPod? The number of playlists the tracks are member of "
+"is indicated in parentheses."
+msgstr[0] ""
+"プレイリスト '%s' 及びそれに含まれる以下の曲を iPod から削除しても本当によろ"
+"しいですか? 括弧の中の数字は、それぞれの曲がいくつのプレイリストに登録されて"
+"いるかを示しています。"
+
+#: ../src/misc_confirm.c:719 ../src/misc_confirm.c:774
+#, c-format
+msgid "Are you sure you want to delete the playlist '%s'?"
+msgstr "プレイリスト '%s' を本当に削除してもいいですか?"
+
+#: ../src/misc_confirm.c:745
+#, c-format
+msgid ""
+"Are you sure you want to delete playlist '%s' and remove the following track "
+"from your harddisk? The number of playlists this track is a member of is "
+"indicated in parentheses."
+msgid_plural ""
+"Are you sure you want to delete playlist '%s' and remove the following "
+"tracks from your harddisk? The number of playlists the tracks are member of "
+"is indicated in parentheses."
+msgstr[0] ""
+"プレイリスト '%s' 及びそれに含まれる以下の曲をハードディスクから削除しても本"
+"当によろしいですか? 括弧の中の数字は、それぞれの曲がいくつのプレイリストに登"
+"録されているかを示しています。"
+
+#: ../src/misc_confirm.c:753
+#, c-format
+msgid "Are you sure you want to remove all tracks from the database?"
+msgstr "データベースからすべての曲を削除しても本当によろしいですか?"
+
+#: ../src/misc_confirm.c:762
+#, c-format
+msgid ""
+"Are you sure you want to delete playlist '%s' and remove the following track "
+"from the database? The number of playlists this track is a member of is "
+"indicated in parentheses."
+msgid_plural ""
+"Are you sure you want to delete playlist '%s' and remove the following "
+"tracks from the database? The number of playlists the tracks are member of "
+"is indicated in parentheses."
+msgstr[0] ""
+"プレイリスト '%s' 及びそれに含まれる以下の曲をデータベースから削除しても本当"
+"によろしいですか? 括弧の中の数字は、それぞれの曲がいくつのプレイリストに登録"
+"されているかを示しています。"
+
+#: ../src/misc_confirm.c:841
+msgid ""
+"Data has been changed and not been saved.\n"
+"OK to exit gtkpod?"
+msgstr ""
+"変更のあったデータはセーブされていません。\n"
+"本当に終了しますか?"
+
+#: ../src/misc_conversion.c:66
+msgid "File type"
+msgstr "ファイル形式"
+
+#: ../src/misc_conversion.c:67
+msgid "PC File"
+msgstr "PCファイル"
+
+#: ../src/misc_conversion.c:68
+msgid "iPod File"
+msgstr "iPod ファイル"
+
+#: ../src/misc_conversion.c:69
+msgid "iPod ID"
+msgstr ""
+
+#. 10
+#: ../src/misc_conversion.c:70
+msgid "Track Nr (#)"
+msgstr "トラックNo.(#)"
+
+#: ../src/misc_conversion.c:71
+msgid "Transferred"
+msgstr "転送済み"
+
+#: ../src/misc_conversion.c:72
+msgid "File Size"
+msgstr "ファイルサイズ"
+
+#: ../src/misc_conversion.c:73
+msgid "Play Time"
+msgstr "演奏時間"
+
+#. 20
+#: ../src/misc_conversion.c:80
+msgid "Date played"
+msgstr "最後に演奏した日"
+
+#: ../src/misc_conversion.c:82
+msgid "Volume"
+msgstr "音量"
+
+#: ../src/misc_conversion.c:83
+msgid "Soundcheck"
+msgstr "サウンドチェック"
+
+#. 25
+#: ../src/misc_conversion.c:85
+msgid "CD Nr"
+msgstr "CD番号"
+
+#: ../src/misc_conversion.c:88
+msgid "Category"
+msgstr "カテゴリ"
+
+#: ../src/misc_conversion.c:89
+msgid "Description"
+msgstr "説明"
+
+#. 30
+#: ../src/misc_conversion.c:90
+msgid "Podcast URL"
+msgstr ""
+
+#: ../src/misc_conversion.c:91
+msgid "Podcast RSS"
+msgstr ""
+
+#: ../src/misc_conversion.c:92
+msgid "Subtitle"
+msgstr "サブタイトル"
+
+#: ../src/misc_conversion.c:93
+msgid "Date released"
+msgstr "公開日"
+
+#: ../src/misc_conversion.c:94
+msgid "Checked"
+msgstr "チェック済み"
+
+#. 35
+#: ../src/misc_conversion.c:95
+#, fuzzy
+msgid "Start time"
+msgstr "前回以降"
+
+#: ../src/misc_conversion.c:96
+#, fuzzy
+msgid "Stop time"
+msgstr "中止"
+
+#: ../src/misc_conversion.c:97
+msgid "Remember Playback Position"
+msgstr ""
+
+#: ../src/misc_conversion.c:98
+msgid "Skip when Shuffling"
+msgstr ""
+
+#: ../src/misc_conversion.c:99
+msgid "Artwork Path"
+msgstr ""
+
+#. 40
+#: ../src/misc_conversion.c:100
+msgid "Media Type"
+msgstr ""
+
+#: ../src/misc_conversion.c:102
+msgid "TV Episode"
+msgstr ""
+
+#: ../src/misc_conversion.c:103
+msgid "TV Network"
+msgstr ""
+
+#: ../src/misc_conversion.c:104
+msgid "Season Nr"
+msgstr ""
+
+#. 45
+#: ../src/misc_conversion.c:105
+msgid "Episode Nr"
+msgstr ""
+
+#: ../src/misc_conversion.c:106
+#, fuzzy
+msgid "Album Artist"
+msgstr "アーティスト"
+
+#: ../src/misc_conversion.c:107
+#, fuzzy
+msgid "Sort Artist"
+msgstr "アーティスト"
+
+#: ../src/misc_conversion.c:108
+#, fuzzy
+msgid "Sort Title"
+msgstr "サブタイトル"
+
+#: ../src/misc_conversion.c:109
+#, fuzzy
+msgid "Sort Album"
+msgstr "アルバム"
+
+#. 50
+#: ../src/misc_conversion.c:110
+#, fuzzy
+msgid "Sort Album Artist"
+msgstr "アーティスト"
+
+#: ../src/misc_conversion.c:111
+#, fuzzy
+msgid "Sort Composer"
+msgstr "作曲者"
+
+#: ../src/misc_conversion.c:112
+msgid "Sort TV Show"
+msgstr ""
+
+#: ../src/misc_conversion.c:113
+msgid "Gapless Track Flag"
+msgstr ""
+
+#: ../src/misc_conversion.c:126
+msgid "Name of file on PC, if available"
+msgstr "PC 上でのファイル名 (登録されている場合)"
+
+#: ../src/misc_conversion.c:127
+msgid "Name of file on the iPod"
+msgstr "iPod 上でのファイル名"
+
+#. 10
+#: ../src/misc_conversion.c:129
+msgid "Track Nr. and total number of tracks on CD"
+msgstr "曲番号および CD の総曲数"
+
+#: ../src/misc_conversion.c:130
+msgid "Whether the file has already been transferred to the iPod or not"
+msgstr "このファイルが iPod に転送済みかどうかを示す"
+
+#: ../src/misc_conversion.c:136
+msgid "Beats per minute"
+msgstr ""
+
+#: ../src/misc_conversion.c:137
+msgid "Number of times the track has been played"
+msgstr "曲が演奏された回数"
+
+#: ../src/misc_conversion.c:138
+msgid "Star rating from 0 to 5"
+msgstr "評価 (0から5)"
+
+#: ../src/misc_conversion.c:139
+msgid "Date and time track has been added"
+msgstr "登録されたときの日付と時刻"
+
+#. 20
+#: ../src/misc_conversion.c:140
+msgid "Date and time track has last been played"
+msgstr "最後に演奏されたときの日付と時刻"
+
+#: ../src/misc_conversion.c:141
+msgid "Date and time track has last been modified"
+msgstr "最後に変更されたときの日付と時刻"
+
+#: ../src/misc_conversion.c:142
+msgid "Manual volume adjust"
+msgstr "音量の調整値"
+
+#: ../src/misc_conversion.c:143
+msgid ""
+"Volume adjust in dB (replay gain) -- you need to activate 'soundcheck' on "
+"the iPod"
+msgstr ""
+"音量の調整値 (dB) ― iPod の設定で「サウンドチェック」を ON にしておく必要があ"
+"ります"
+
+#. 25
+#: ../src/misc_conversion.c:146
+msgid "CD Nr. and total number of CDS in set"
+msgstr "CD 番号と、セットに含まれる CD の総枚数"
+
+#: ../src/misc_conversion.c:149
+msgid ""
+"The category (e.g. 'Technology' or 'Music') where the podcast was located."
+msgstr "Podcast のカテゴリ (例: '技術系' や '音楽')"
+
+#: ../src/misc_conversion.c:150
+msgid "Accessible by selecting the center button on the iPod."
+msgstr "iPod の真中のボタンを押すと見ることができる"
+
+#: ../src/misc_conversion.c:154
+msgid "Release date (for podcasts displayed next to the title on the iPod)"
+msgstr "公開日 (Podcast 用。iPod 上でタイトルの横に表示される)"
+
+#. 50
+#: ../src/misc_conversion.c:168 ../src/misc_conversion.c:169
+#: ../src/misc_conversion.c:170 ../src/misc_conversion.c:171
+#: ../src/misc_conversion.c:172 ../src/misc_conversion.c:173
+#, fuzzy
+msgid "Used for sorting on the iPod"
+msgstr "iPod 上でのファイル名"
+
+#: ../src/misc_conversion.c:735
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the file scheme"
+msgstr "指定されたURI '%s' は file スキームが設定されていない、不完全なURIです"
+
+#: ../src/misc_conversion.c:745
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "ローカルファイルを指すURI '%s' には '#' は含まれてはなりません"
+
+#: ../src/misc_conversion.c:762
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "指定されたURI '%s' は不正です"
+
+#: ../src/misc_conversion.c:774
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "指定されたURI '%s' のホスト名が不正です"
+
+#: ../src/misc_conversion.c:790
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "指定されたURI '%s' は不正なエスケープ文字を含んでいます"
+
+#: ../src/misc_playlist.c:67 ../src/misc_playlist.c:94
+#: ../src/misc_playlist.c:429
+msgid "Please enter a name for the new playlist"
+msgstr "新しいプレイリストの名前を入力してください"
+
+#: ../src/misc_playlist.c:154
+msgid "AR:"
+msgstr ""
+
+#: ../src/misc_playlist.c:157
+msgid "AL:"
+msgstr ""
+
+#: ../src/misc_playlist.c:160
+msgid "GE:"
+msgstr ""
+
+#: ../src/misc_playlist.c:163
+msgid "CO:"
+msgstr ""
+
+#: ../src/misc_playlist.c:166
+msgid "YE:"
+msgstr ""
+
+#: ../src/misc_playlist.c:194
+msgid "Unknown"
+msgstr "不明"
+
+#: ../src/misc_playlist.c:272
+#, c-format
+msgid "Random (%d)"
+msgstr "ランダム (%d)"
+
+#: ../src/misc_playlist.c:297
+msgid ""
+"Auto Store of track view disabled.\n"
+"\n"
+msgstr ""
+"曲順の自動保存が無効になっています。\n"
+"\n"
+
+#: ../src/misc_playlist.c:356
+msgid "Not Listed"
+msgstr "リストに載ってない曲"
+
+#: ../src/misc_playlist.c:406
+#, c-format
+msgid "Created playlist '%s' with %d track."
+msgid_plural "Created playlist '%s' with %d tracks."
+msgstr[0] "新しくプレイリスト'%s'(%d曲)を作成しました"
+
+#. n==0
+#: ../src/misc_playlist.c:417
+msgid "No tracks available, playlist not created"
+msgstr "曲が見付からないので、プレイリストは作れません"
+
+#: ../src/misc_playlist.c:543
+#, c-format
+msgid "Most Listened (%d)"
+msgstr "良く聴く曲 (%d)"
+
+#: ../src/misc_playlist.c:584
+#, c-format
+msgid "Never Listened"
+msgstr "聴いたことがない曲"
+
+#: ../src/misc_playlist.c:624
+#, c-format
+msgid "Best Rated (%d)"
+msgstr "評価の高い曲 (%d)"
+
+#: ../src/misc_playlist.c:666
+msgid "Unrated tracks"
+msgstr "未評価の曲"
+
+#: ../src/misc_playlist.c:671
+#, c-format
+msgid "Rated %d"
+msgstr "評価された曲 (%d)"
+
+#: ../src/misc_playlist.c:714
+#, c-format
+msgid "Recent (%d)"
+msgstr "最近聴いた曲 (%d)"
+
+#: ../src/misc_playlist.c:753
+msgid "Last Time"
+msgstr "前回以降"
+
+#: ../src/misc_playlist.c:844
+msgid "Removal of dangling tracks with no files on PC was canceled."
+msgstr ""
+
+#: ../src/misc_playlist.c:854
+msgid "Handling of dangling tracks with files on PC was canceled."
+msgstr ""
+
+#: ../src/misc_playlist.c:882
+msgid "Dangling tracks with no files on PC were removed."
+msgstr ""
+
+#: ../src/misc_playlist.c:943
+msgid "Dangling tracks with files on PC were handled."
+msgstr ""
+
+#: ../src/misc_playlist.c:976
+msgid "Track"
+msgstr "曲"
+
+#: ../src/misc_playlist.c:1019
+msgid ""
+"You did not import the existing iTunesDB. This is most likely incorrect and "
+"will result in the loss of the existing database.\n"
+"\n"
+"Press 'OK' if you want to proceed anyhow or 'Cancel' to abort. If you "
+"cancel, you can import the existing database before calling this function "
+"again.\n"
+msgstr ""
+
+#: ../src/misc_playlist.c:1033
+msgid "Creating a tree of known files"
+msgstr ""
+
+#: ../src/misc_playlist.c:1077
+msgid "Checking iPOD files against known files in DB"
+msgstr ""
+
+#: ../src/misc_playlist.c:1120
+msgid "Orphaned"
+msgstr ""
+
+#: ../src/misc_playlist.c:1147
+#, c-format
+msgid ""
+"The following orphaned file had already been added to the iPod again. It "
+"will be removed with the next sync:\n"
+"%s\n"
+"\n"
+msgstr ""
+
+#: ../src/misc_playlist.c:1175
+#, c-format
+msgid "Found %d orphaned and %d dangling files. Processing..."
+msgstr ""
+
+#: ../src/misc_playlist.c:1199
+#, c-format
+msgid ""
+"The following dangling track has a file on PC.\n"
+"Press OK to have them transfered from the file on next Sync, CANCEL to leave "
+"it as is."
+msgid_plural ""
+"The following %d dangling tracks have files on PC.\n"
+"Press OK to have them transfered from the files on next Sync, CANCEL to "
+"leave them as is."
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../src/misc_playlist.c:1204
+#, c-format
+msgid ""
+"The following dangling track doesn't have file on PC. \n"
+"Press OK to remove it, CANCEL to leave it as is."
+msgid_plural ""
+"The following %d dangling tracks do not have files on PC. \n"
+"Press OK to remove them, CANCEL to leave them. as is"
+msgstr[0] ""
+msgstr[1] ""
+
+#. we want unique window for each
+#. gboolean modal,
+#: ../src/misc_playlist.c:1211
+msgid "Dangling Tracks"
+msgstr ""
+
+#: ../src/misc_playlist.c:1234
+#, c-format
+msgid "Found %d orphaned and %d dangling files. Done."
+msgstr ""
+
+#. update for count == 1, 21, 41 ... and for count == n
+#: ../src/misc_track.c:89
+#, c-format
+msgid "Hashed %d of %d track."
+msgid_plural "Hashed %d of %d tracks."
+msgstr[0] "%2$d曲中 %1$d曲のハッシュを生成しました。"
+
+#: ../src/misc_track.c:198
+#, c-format
+msgid "The following duplicate track has been removed."
+msgid_plural "The following %d duplicate tracks have been removed."
+msgstr[0] "以下の重複した%d曲が削除されました。"
+
+#: ../src/misc_track.c:205
+#, c-format
+msgid ""
+"The following duplicate track has not been added to the master play list."
+msgid_plural ""
+"The following %d duplicate tracks have not been added to the master play "
+"list."
+msgstr[0] "以下の重複した%d曲はマスタープレイリストに追加されませんでした。"
+
+#. gint id,
+#. gboolean modal,
+#: ../src/misc_track.c:212
+msgid "Duplicate detection"
+msgstr "重複の検出"
+
+#: ../src/misc_track.c:1339
+msgid "Local Database"
+msgstr ""
+
+#. artwork is set
+#: ../src/misc_track.c:1350
+msgid "Embedded or filename was lost"
+msgstr ""
+
+#: ../src/misc_track.c:1354
+#, fuzzy
+msgid "Artwork not set"
+msgstr "が設定されていない"
+
+#: ../src/misc_track.c:1816
+#, fuzzy, c-format
+msgid "Could not find source file for '%s'. Track not copied."
+msgstr "iPod 上の '%s' に相当するファイルが見つかりません\n"
+
+#: ../src/misc_track.c:2052
+#, c-format
+msgid "drag and drop: ignored '%s'\n"
+msgstr "ドラッグアンドドロップ: '%s'は無視します\n"
+
+#: ../src/mp3file.c:1336
+#, fuzzy, c-format
+msgid "Error setting ID3 field: %s\n"
+msgstr "'%s'の作成に失敗: %s\n"
+
+#: ../src/mp3file.c:1360 ../src/mp3file.c:1453 ../src/mp3file.c:1608
+#: ../src/mp3file.c:2733
+#, c-format
+msgid "ERROR while opening file: '%s' (%s).\n"
+msgstr "ファイル '%s' を開く際にエラーが発生しました。 (%s)\n"
+
+#: ../src/mp3file.c:1688
+#, fuzzy, c-format
+msgid "ERROR while writing tag to file: '%s' (%s).\n"
+msgstr "ファイル '%s' を開く際にエラーが発生しました。 (%s)\n"
+
+#. Tracks with zero play length are ignored by iPod...
+#: ../src/mp3file.c:2770
+#, c-format
+msgid "File \"%s\" has zero play length. Ignoring.\n"
+msgstr "ファイル \"%s\" は長さが0なので無視します。\n"
+
+#: ../src/mp4file.c:243 ../src/mp4file.c:404
+#, fuzzy, c-format
+msgid "'%s' does not appear to be a mp4 audio or video file.\n"
+msgstr "'%s' は mp4 オーディオファイルとは認識できません。\n"
+
+#: ../src/mp4file.c:253 ../src/mp4file.c:414
+#, c-format
+msgid "Could not open '%s' for reading, or file is not an mp4 file.\n"
+msgstr "'%s' は読み込みが許可されていないか、mp4 ファイルではありません。\n"
+
+#: ../src/mp4file.c:529
+#, c-format
+msgid "'%s' does not appear to be a mp4 audio file.\n"
+msgstr "'%s' は mp4 オーディオファイルとは認識できません。\n"
+
+#: ../src/mp4file.c:540
+#, c-format
+msgid "Could not open '%s' for writing, or file is not an mp4 file.\n"
+msgstr "'%s' は書き込みが許可されていないか、mp4 ファイルではありません。\n"
+
+#: ../src/mp4file.c:553
+#, fuzzy, c-format
+msgid ""
+"Import of '%s' failed: m4a/m4p/m4b not supported without the mp4v2 library. "
+"You must compile the gtkpod source together with the mp4v2 library.\n"
+msgstr ""
+"'%s'の読み込みに失敗: m4a/m4p の取り扱いには mp4v2 ライブラリが必要です。"
+"mp4v2 ライブラリを使って gtkpod を再度コンパイルしてください。\n"
+
+#: ../src/mp4file.c:559
+#, fuzzy, c-format
+msgid ""
+"m4a/m4p/m4b metadata update for '%s' failed: m4a/m4p/m4b not supported "
+"without the mp4v2 library. You must compile the gtkpod source together with "
+"the mp4v2 library.\n"
+msgstr ""
+"'%s' の m4a/m4p メタデータの更新に失敗: m4a/m4p の取り扱いには mp4v2 ライブラ"
+"リが必要です。mp4v2 ライブラリを使って gtkpod を再度コンパイルしてくださ"
+"い。\n"
+
+#: ../src/mp4file.c:565
+#, fuzzy, c-format
+msgid ""
+"m4a/m4p/m4b soundcheck update for '%s' failed: m4a/m4p/m4b not supported "
+"without the mp4v2 library. You must compile the gtkpod source together with "
+"the mp4v2 library.\n"
+msgstr ""
+"'%s' の m4a/m4p メタデータの更新に失敗: m4a/m4p の取り扱いには mp4v2 ライブラ"
+"リが必要です。mp4v2 ライブラリを使って gtkpod を再度コンパイルしてくださ"
+"い。\n"
+
+#: ../src/oggfile.c:73
+#, fuzzy, c-format
+msgid "'%s' does not appear to be an ogg audio file.\n"
+msgstr "'%s' は mp4 オーディオファイルとは認識できません。\n"
+
+#: ../src/oggfile.c:154
+#, fuzzy, c-format
+msgid ""
+"Import of '%s' failed: ogg not supported without the ogg library. You must "
+"compile the gtkpod source together with the ogg library.\n"
+msgstr ""
+"'%s'の読み込みに失敗: m4a/m4p の取り扱いには mp4v2 ライブラリが必要です。"
+"mp4v2 ライブラリを使って gtkpod を再度コンパイルしてください。\n"
+
+#: ../src/oggfile.c:160
+#, fuzzy, c-format
+msgid ""
+"ogg metadata update for '%s' failed: ogg not supported without the ogg "
+"library. You must compile the gtkpod source together with the ogg library.\n"
+msgstr ""
+"'%s' の m4a/m4p メタデータの更新に失敗: m4a/m4p の取り扱いには mp4v2 ライブラ"
+"リが必要です。mp4v2 ライブラリを使って gtkpod を再度コンパイルしてくださ"
+"い。\n"
+
+#: ../src/prefs.c:357
+#, c-format
+msgid "gtkpod version %s usage:\n"
+msgstr "gtkpod version %s 使い方:\n"
+
+#: ../src/prefs.c:358
+msgid "  -h, --help:   display this message\n"
+msgstr "  -h, --help:   このヘルプを表示します\n"
+
+#: ../src/prefs.c:359
+msgid "  -p <file>:    increment playcount for file by one\n"
+msgstr ""
+
+#: ../src/prefs.c:360
+msgid "  --hash <file>:print gtkpod hash for file\n"
+msgstr ""
+
+#: ../src/prefs.c:361
+msgid "  -m path:      define the mountpoint of your iPod\n"
+msgstr "  -m path:      iPodのマウントポイントを指定します\n"
+
+#: ../src/prefs.c:362
+msgid "  --mountpoint: same as '-m'.\n"
+msgstr "  --mountpoint: '-m'と同じ\n"
+
+#: ../src/prefs.c:363
+msgid "  -a:           import database automatically after start.\n"
+msgstr "  -a:           起動時にデータベースを自動的に読み込みます\n"
+
+#: ../src/prefs.c:364
+msgid "  --auto:       same as '-a'.\n"
+msgstr "  --auto:       '-a'と同じ\n"
+
+#: ../src/prefs.c:561
+#, c-format
+msgid "Couldn't create ~/.gtkpod\n"
+msgstr ""
+
+#: ../src/prefs_window.c:133
+msgid "Please select command for 'Play Now'"
+msgstr ""
+
+#: ../src/prefs_window.c:134
+msgid "Please select command for 'Enqueue'"
+msgstr ""
+
+#: ../src/prefs_window.c:135
+msgid "Please select the mp3gain executable"
+msgstr ""
+
+#: ../src/prefs_window.c:136
+msgid "Please select the aacgain executable"
+msgstr ""
+
+#: ../src/prefs_window.c:137
+msgid "Select the mserv music root directory"
+msgstr ""
+
+#: ../src/prefs_window.c:138
+msgid "Select the mserv trackinfo root directory"
+msgstr ""
+
+#: ../src/prefs_window.c:139
+msgid "Select the ogg/vorbis converter command"
+msgstr ""
+
+#: ../src/prefs_window.c:140
+msgid "Select the flac converter command"
+msgstr ""
+
+#: ../src/prefs_window.c:141
+msgid "Select the m4a converter command."
+msgstr ""
+
+#: ../src/prefs_window.c:142
+msgid "Select the mp3 converter command."
+msgstr ""
+
+#: ../src/prefs_window.c:143
+msgid "Select the wav converter command."
+msgstr ""
+
+#: ../src/prefs_window.c:201 ../src/repository.c:662
+#, c-format
+msgid ""
+"<i>Have a look at the scripts provided in '%s'. If you write a new script or "
+"improve an existing one, please send it to jcsjcs at users.sourceforge.net "
+"for inclusion into the next release.</i>"
+msgstr ""
+
+#: ../src/prefs_window.c:1205 ../src/prefs_window.c:1223
+msgid "Preferences not updated"
+msgstr "設定は更新されません"
+
+#: ../src/prefs_window.c:1232
+msgid "Preferences applied"
+msgstr "設定を適用しました"
+
+#: ../src/repository.c:573 ../src/repository.c:2395
+msgid "Set backup file"
+msgstr ""
+
+#: ../src/repository.c:612
+#, fuzzy
+msgid "Select directory for synchronization"
+msgstr "再帰的に追加するディレクトリを選択してください"
+
+#: ../src/repository.c:638
+msgid "Please select command to sync contacts"
+msgstr ""
+
+#: ../src/repository.c:644
+msgid "Please select command to sync calendar"
+msgstr ""
+
+#: ../src/repository.c:650
+msgid "Please select command to sync notes"
+msgstr ""
+
+#: ../src/repository.c:729
+#, fuzzy
+msgid "Smart playlist updated."
+msgstr "スマートプレイリスト"
+
+#: ../src/repository.c:1190
+#, fuzzy
+msgid "Podcasts Repository"
+msgstr "iPodから削除"
+
+#: ../src/repository.c:1194
+#, fuzzy
+msgid "Local Repository"
+msgstr "iPodから削除"
+
+#: ../src/repository.c:1348
+#, fuzzy
+msgid "Master Playlist"
+msgstr "...マスタープレイリスト"
+
+#: ../src/repository.c:1352
+#, fuzzy
+msgid "Podcasts Playlist"
+msgstr "スマートプレイリスト"
+
+#: ../src/repository.c:1360
+#, fuzzy
+msgid "Regular Playlist"
+msgstr "スマートプレイリスト"
+
+#: ../src/repository.c:2423
+#, fuzzy
+msgid "Set local repository file"
+msgstr "iPodから削除"
+
+#: ../src/repository.c:2522
+#, fuzzy
+msgid "New Repository"
+msgstr "iPodから削除"
+
+#: ../src/sha1.c:186
+msgid "Hashed file is 0 bytes long\n"
+msgstr "ファイルの大きさが 0 バイトです\n"
+
+#: ../src/sha1.c:239
+#, fuzzy, c-format
+msgid "Could not open '%s' to calculate SHA1 checksum: %s\n"
+msgstr "'%s' を開けないため、MD5 チェックサムが計算できません: %s\n"
+
+#: ../src/syncdir.c:237
+#, c-format
+msgid "Sync summary for %s/%s\n"
+msgstr ""
+
+#: ../src/syncdir.c:246
+#, fuzzy
+msgid "The following track has been added or updated:\n"
+msgid_plural "The following tracks have been added or updated:\n"
+msgstr[0] "以下の曲を更新しました"
+msgstr[1] "以下の%d曲を更新しました"
+
+#: ../src/syncdir.c:255
+#, fuzzy
+msgid "The following track has been completely removed from the iPod:\n"
+msgid_plural ""
+"The following tracks have been completely removed from the iPod:\n"
+msgstr[0] "以下の曲を更新しました"
+msgstr[1] "以下の%d曲を更新しました"
+
+#: ../src/syncdir.c:264
+#, fuzzy
+msgid "The following track has been removed from the repository:\n"
+msgid_plural "The following tracks have been removed from the repository:\n"
+msgstr[0] "以下の重複した%d曲が削除されました。"
+
+#: ../src/syncdir.c:271
+#, fuzzy
+msgid "The following track has been removed from the playlist:\n"
+msgid_plural "The following tracks have been removed from the playlist:\n"
+msgstr[0] "以下の重複した%d曲はマスタープレイリストに追加されませんでした。"
+
+#: ../src/syncdir.c:277
+msgid "Nothing was changed.\n"
+msgstr ""
+
+#: ../src/syncdir.c:282
+msgid "Sync summary"
+msgstr ""
+
+#: ../src/tools.c:118
+#, c-format
+msgid ""
+"Could not find '%s'.\n"
+"Please specifiy the exact path in the Tools section of the preference dialog "
+"or install the program if it is not installed on your system.\n"
+"\n"
+msgstr ""
+
+#: ../src/tools.c:203
+#, c-format
+msgid ""
+"Execution of '%s' failed.\n"
+"\n"
+msgstr ""
+
+#: ../src/tools.c:248
+#, c-format
+msgid ""
+"Did not normalize '%s'. Set mp3gain path in the Tools section of the "
+"preferences.\n"
+msgstr ""
+
+#: ../src/tools.c:258
+#, c-format
+msgid ""
+"Did not normalize '%s'. Set aacgain path in the Tools section of the "
+"preferences.\n"
+msgstr ""
+
+#: ../src/tools.c:385
+msgid "Normalizing..."
+msgstr "平均化中..."
+
+#: ../src/tools.c:435
+#, c-format
+msgid "%s - %s"
+msgstr ""
+
+#: ../src/tools.c:461
+msgid "Aborting..."
+msgstr "中止処理中..."
+
+#: ../src/tools.c:465
+msgid "Will abort after current mp3gain process ends."
+msgstr "現在実行中の mp3gain が終了次第、処理を中止します。"
+
+#: ../src/tools.c:491
+#, c-format
+msgid ""
+"'%s-%s' (%s) could not be normalized.\n"
+"\n"
+msgstr ""
+
+#: ../src/tools.c:530
+#, c-format
+msgid "Normalized %d of %d tracks."
+msgid_plural "Normalized %d of %d tracks."
+msgstr[0] "%2$d曲中 %1$d曲の音量を平均化しました。"
+
+#: ../src/tools.c:633
+msgid ""
+"Please specify the command to be called on the 'Tools' section of the "
+"preferences dialog.\n"
+msgstr ""
+
+#: ../src/tools.c:645
+#, c-format
+msgid ""
+"Could not find the command '%s'.\n"
+"\n"
+"Please verify the setting in the 'Tools' section of the preferences dialog.\n"
+"\n"
+msgstr ""
+
+#: ../src/tools.c:687
+#, c-format
+msgid ""
+"'%s' returned the following output:\n"
+"%s\n"
+msgstr ""
+
+#: ../src/tools.c:754
+#, c-format
+msgid "No command set for '%s'"
+msgstr "'%s' のためのコマンドが設定されていません"
+
+#: ../src/tools.c:774
+#, c-format
+msgid "Could not find command '%s' specified for '%s'"
+msgstr "'%s' のためのコマンド '%s' が見付かりません"
+
+#: ../src/wavfile.c:181
+#, c-format
+msgid "%s does not appear to be a supported wav file.\n"
+msgstr ""
+
+#, fuzzy
+#~ msgid "<b>Resolution:</b>"
+#~ msgstr "<b>ツールチップ</b>"
+
+#~ msgid ""
+#~ "Cannot open '%s' for reading.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "ファイル '%s' を読み込もうとしましたが、開くことができません。\n"
+#~ "\n"
+
+#~ msgid "Unable to open '%s' for reading\n"
+#~ msgstr "'%s' を読み込み用に開くことができません\n"
+
+#~ msgid "Could not open \"iTunesDB.ext\" for reading extended info.\n"
+#~ msgstr "拡張情報を格納したファイル \"iTunesDB.ext\" を開けません。\n"
+
+#~ msgid "Add _Directory"
+#~ msgstr "ディレクトリを追加する(_D)"
+
+#~ msgid "Dirs"
+#~ msgstr "ディレクトリ"
+
+#~ msgid "Files"
+#~ msgstr "ファイル"
+
+#~ msgid "New PL"
+#~ msgstr "新規プレイリスト"
+
+#~ msgid "_About"
+#~ msgstr "gtkpodについて(_A)"
+
+#, fuzzy
+#~ msgid "Set Cover Art from _Web"
+#~ msgstr "mserv データを更新する(_m)"
+
+#~ msgid "Add Playlists"
+#~ msgstr "プレイリストを追加する"
+
+#~ msgid "Select directory to add recursively"
+#~ msgstr "再帰的に追加するディレクトリを選択してください"
+
+#~ msgid ""
+#~ "Supposedly something that tells the iPod to increase or decrease the "
+#~ "playback speed"
+#~ msgstr "おそらく、iPod に再生速度の変更を伝えるための値"
+
+#~ msgid "Processing '%s'"
+#~ msgstr "'%s' の処理中"
+
+#~ msgid "<b>Import</b>"
+#~ msgstr "<b>インポート</b>"
+
+#, fuzzy
+#~ msgid "Automatically import iTunesDBs on startup"
+#~ msgstr "起動時に自動的に iTunesDB を読み込む"
+
+#, fuzzy
+#~ msgid "Couldn't find pixmap file: %s"
+#~ msgstr "次のファイルのタグを変更できません: %s\n"
+
+#~ msgid "Stop Display Update"
+#~ msgstr "表示の更新を止める"
+
+#~ msgid "Stop"
+#~ msgstr "中止"
+
+#~ msgid ""
+#~ "Temporarily disable sorting when changing playlist\n"
+#~ "or tab entry (faster!)"
+#~ msgstr ""
+#~ "プレイリストやソートタブを変更した時の自動並べ換えを\n"
+#~ "抑制する (動作が速くなる)"
+
+#~ msgid ""
+#~ "The display can be blocked after changing a selection. The display update "
+#~ "is faster, but you have to wait until it's finished. When using this "
+#~ "option, sorting is also temporarily disabled (see option above)."
+#~ msgstr ""
+#~ "選択を変更した時に、曲のリストを更新し終わるまで途中経過を表示しません。更"
+#~ "新のスピードは速くなりますが、それが終わるまでは何もする事ができなくなりま"
+#~ "す。この設定を有効にした場合、並べ換えは一時的にできなくなります (上の設定"
+#~ "を参照)。"
+
+#~ msgid ""
+#~ "Block display when changing playlist or tab\n"
+#~ " entry (faster!)"
+#~ msgstr ""
+#~ "プレイリストやソートタブを変更した時に途中経過の\n"
+#~ "表示を抑制する(動作が速くなる)"
+
+#~ msgid "deleting..."
+#~ msgstr "削除中..."
+
+#~ msgid "preparing to copy..."
+#~ msgstr "コピーの準備中..."
+
+#~ msgid "Copied %d of %d new track."
+#~ msgid_plural "Copied %d of %d new tracks."
+#~ msgstr[0] "%2$d曲中 %1$d曲をコピーしました。"
+
+#~ msgid "Some tracks were not written to iPod. Export aborted!"
+#~ msgstr "一部の曲をiPodに転送できませんでした。エクスポートを中止します!"

Added: trunk/po/ro.po
===================================================================
--- trunk/po/ro.po	                        (rev 0)
+++ trunk/po/ro.po	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,5813 @@
+# Romanian translation for gtkpod
+# Copyright (C) 2003-2005 Jörg Schuler
+# Alex Eftimie <alexeftimie at gmail dot com>, 2007.
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: ro\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-12-14 08:06-0500\n"
+"PO-Revision-Date: 2007-12-14 12:21+0200\n"
+"Last-Translator: Alex Eftimie <alexeftimie at gmail dot com>\n"
+"Language-Team: none\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Poedit-Language: Romanian\n"
+
+#: ../data/gtkpod.desktop.in.h:1
+msgid "GtkPod"
+msgstr "GtkPod"
+
+#: ../data/gtkpod.desktop.in.h:2
+msgid "Manage music and video on an Apple iPod"
+msgstr "Administrează muzica şi filmele pe un iPod Apple"
+
+#: ../data/gtkpod.desktop.in.h:3
+msgid "iPod Manager"
+msgstr "Manager iPod"
+
+#: ../data/gtkpod.glade.h:1
+msgid " "
+msgstr " "
+
+#: ../data/gtkpod.glade.h:2
+msgid "    "
+msgstr "    "
+
+#: ../data/gtkpod.glade.h:3
+msgid "     "
+msgstr "     "
+
+#: ../data/gtkpod.glade.h:4
+msgid "      "
+msgstr "      "
+
+#: ../data/gtkpod.glade.h:5
+msgid "   Sort by:"
+msgstr "   Sortare după:"
+
+#: ../data/gtkpod.glade.h:6
+msgid " <= cts <= "
+msgstr " <= nr. <= "
+
+#: ../data/gtkpod.glade.h:7
+msgid " Logic: "
+msgstr " Logică:"
+
+#: ../data/gtkpod.glade.h:9
+#, no-c-format
+msgid "%A"
+msgstr "%A"
+
+#: ../data/gtkpod.glade.h:10
+msgid ""
+"'DD/MM/YYYY HH:MM < d < DD/MM/YYYY HH:MM' or similar. Press 'enter' when "
+"finished."
+msgstr ""
+"'DD/MM/YYYY HH:MM < d < DD/MM/YYYY HH:MM' sau similar. Apasaţi 'enter' când "
+"este gata."
+
+#: ../data/gtkpod.glade.h:11
+msgid "'aacgain' executable:"
+msgstr "executabil 'aacgain':"
+
+#: ../data/gtkpod.glade.h:12
+msgid "'mp3gain' executable:"
+msgstr "executabil 'mp3gain'"
+
+#: ../data/gtkpod.glade.h:13
+msgid "(Checked)"
+msgstr "(Verificat)"
+
+#: ../data/gtkpod.glade.h:14
+msgid "...as icons"
+msgstr "...ca iconiţe"
+
+#: ../data/gtkpod.glade.h:15
+msgid "...as text"
+msgstr "...ca text"
+
+#: ../data/gtkpod.glade.h:16
+msgid "...both as icons and text"
+msgstr "...atât iconiţe cât şi text"
+
+#: ../data/gtkpod.glade.h:17
+msgid "...entry 'All' in sort tab..."
+msgstr "...intrarea 'Toate' în categorii..."
+
+#: ../data/gtkpod.glade.h:18
+msgid "...master playlist"
+msgstr "...listă de redare principală"
+
+#: ../data/gtkpod.glade.h:20
+#, no-c-format
+msgid "../%A.jpg"
+msgstr "../%A.jpg"
+
+#: ../data/gtkpod.glade.h:21
+msgid "0"
+msgstr "0"
+
+#: ../data/gtkpod.glade.h:22
+msgid "1"
+msgstr "1"
+
+#: ../data/gtkpod.glade.h:23
+msgid "2"
+msgstr "2"
+
+#: ../data/gtkpod.glade.h:24
+msgid "3"
+msgstr "3"
+
+#: ../data/gtkpod.glade.h:25
+msgid "4"
+msgstr "4"
+
+#: ../data/gtkpod.glade.h:26
+msgid "5"
+msgstr "5"
+
+#: ../data/gtkpod.glade.h:27
+msgid ":"
+msgstr ":"
+
+#: ../data/gtkpod.glade.h:28
+msgid "<"
+msgstr "<"
+
+#: ../data/gtkpod.glade.h:29
+msgid "<b>Account Information</b>"
+msgstr "<b>Informaţii cont</b>"
+
+#: ../data/gtkpod.glade.h:30
+msgid "<b>Adding/Updating/Syncing</b>"
+msgstr "<b>Adăugare/Actualizare/Sincronizare</b>"
+
+#: ../data/gtkpod.glade.h:31
+msgid "<b>Audioscrobbler</b>"
+msgstr "<b>Audioscrobbler</b>"
+
+#: ../data/gtkpod.glade.h:32
+msgid "<b>Auto-Generated Playlists</b>"
+msgstr "<b>Liste de redare generate automat</b>"
+
+#: ../data/gtkpod.glade.h:33
+msgid "<b>Automatically select...</b>"
+msgstr "<b>Selectează automat...</b>"
+
+#: ../data/gtkpod.glade.h:34
+msgid "<b>Calendar/Contacts/Notes</b>"
+msgstr "<b>Calendar/Agendă/Notiţe</b>"
+
+#: ../data/gtkpod.glade.h:35
+msgid "<b>Coverart</b>"
+msgstr "<b>Copertă</b>"
+
+#: ../data/gtkpod.glade.h:36
+msgid "<b>Delete Confirmation</b>"
+msgstr "<b>Confirmare ştergere</b>"
+
+#: ../data/gtkpod.glade.h:37
+msgid "<b>Examples</b>"
+msgstr "<b>Exemple</b>"
+
+#: ../data/gtkpod.glade.h:38
+msgid "<b>Ignore Frequent Words</b>"
+msgstr "<b>Ignoră cuvintele frecvente</b>"
+
+#: ../data/gtkpod.glade.h:39
+msgid "<b>Misc</b>"
+msgstr "<b>Diverse</b>"
+
+#: ../data/gtkpod.glade.h:40
+msgid "<b>Mountpoint and individual repository/playlist options</b>"
+msgstr "<b>Opţiuni punct de montare şi listă de redare/depozit individual</b>"
+
+#: ../data/gtkpod.glade.h:41
+msgid "<b>On-the-fly Conversion</b>"
+msgstr "<b>Conversie \"în zbor\"</b>"
+
+#: ../data/gtkpod.glade.h:42
+msgid "<b>Play</b>"
+msgstr "<b>Rulează</b>"
+
+#: ../data/gtkpod.glade.h:43
+msgid "<b>Playlists</b>"
+msgstr "<b>Liste de redare</b>"
+
+#: ../data/gtkpod.glade.h:44
+msgid "<b>Please select mountpoint and your iPod model</b>"
+msgstr "<b>Vă rugăm selectaţi punctul de montare şi modelul de iPod</b>"
+
+#: ../data/gtkpod.glade.h:45
+msgid "<b>Repositories</b>"
+msgstr "<b>Depozite</b>"
+
+#: ../data/gtkpod.glade.h:46
+msgid "<b>Sort Order</b>"
+msgstr "<b>Ordine sortare</b>"
+
+#: ../data/gtkpod.glade.h:47
+msgid "<b>Sort Tabs</b>"
+msgstr "<b>Categorii</b>"
+
+#: ../data/gtkpod.glade.h:48
+msgid "<b>Sync</b>"
+msgstr "<b>Sincronizare</b>"
+
+#: ../data/gtkpod.glade.h:49
+msgid "<b>Synchronization</b>"
+msgstr "<b>Sincronizare</b>"
+
+#: ../data/gtkpod.glade.h:50
+msgid "<b>Tag Reading</b>"
+msgstr "<b>Citire etichete</b>"
+
+#: ../data/gtkpod.glade.h:51
+msgid "<b>Toolbar</b>"
+msgstr "<b>Bară de unelte</b>"
+
+#: ../data/gtkpod.glade.h:52
+msgid "<b>Tooltips</b>"
+msgstr "<b>Indicii</b>"
+
+#: ../data/gtkpod.glade.h:53
+msgid "<b>Track Attributes</b>"
+msgstr "<b>Atribute piesă</b>"
+
+#: ../data/gtkpod.glade.h:54
+msgid "<b>Track Editing</b>"
+msgstr "<b>Editare piesă</b>"
+
+#: ../data/gtkpod.glade.h:55
+msgid "<b>Volume Normalization</b>"
+msgstr "<b>Normalizare volum</b>"
+
+#: ../data/gtkpod.glade.h:56
+msgid "<b>mserv</b>"
+msgstr "<b>mserv</b>"
+
+#: ../data/gtkpod.glade.h:57
+msgid ">"
+msgstr ">"
+
+#: ../data/gtkpod.glade.h:58
+msgid "About gtkpod"
+msgstr "Despre gtkpod"
+
+#: ../data/gtkpod.glade.h:59
+msgid "Add Directories Recursively"
+msgstr "Adaugă dosare recursiv"
+
+#: ../data/gtkpod.glade.h:60
+msgid "Add Files"
+msgstr "Adaugă fişiere"
+
+#: ../data/gtkpod.glade.h:61
+msgid "Add Files or Directories"
+msgstr "Adaugă fişiere sau dosare"
+
+#: ../data/gtkpod.glade.h:62
+msgid "Add Fol_der"
+msgstr "Adaugă _dosar"
+
+#: ../data/gtkpod.glade.h:63
+msgid "Add Folder"
+msgstr "Adaugă dosar"
+
+#: ../data/gtkpod.glade.h:64
+msgid "Add Image_s"
+msgstr "Adaugă imagi_ni"
+
+#: ../data/gtkpod.glade.h:65
+msgid "Add Images from a Directory"
+msgstr "Adaugă imagini dintr-un dosar"
+
+#: ../data/gtkpod.glade.h:66
+msgid "Add Playlist"
+msgstr "Adaugă listă"
+
+#: ../data/gtkpod.glade.h:67
+msgid "Add _Files"
+msgstr "Adaugă _fişiere"
+
+#: ../data/gtkpod.glade.h:68
+msgid "Add _Playlist"
+msgstr "Adaugă _listă de redare"
+
+#: ../data/gtkpod.glade.h:69
+msgid "Add coverart from file using the following template"
+msgstr "Adaugă copertă din fişier folosind următorul şablon"
+
+#: ../data/gtkpod.glade.h:70
+msgid "Add directories recursively"
+msgstr "Adaugă dosare recursiv"
+
+#: ../data/gtkpod.glade.h:71
+msgid "Add new repository/iPod"
+msgstr "Adaugă un nou depozit/iPod"
+
+#: ../data/gtkpod.glade.h:72
+msgid "Add playlist from file"
+msgstr "Adaugă fișier listă de redare"
+
+#: ../data/gtkpod.glade.h:73 ../src/display_sorttabs.c:3247
+#: ../src/display_tracks.c:2103
+msgid "Added"
+msgstr "Adăugat"
+
+#: ../data/gtkpod.glade.h:74
+msgid "Advanced Sorting Options"
+msgstr "Opţiuni de sortare avansate"
+
+#. 0
+#: ../data/gtkpod.glade.h:75 ../src/display_sorttabs.c:2982
+#: ../src/display_spl.c:84 ../src/misc_conversion.c:60
+msgid "Album"
+msgstr "Album"
+
+#: ../data/gtkpod.glade.h:76
+msgid "Album Art"
+msgstr "Copertă album"
+
+#: ../data/gtkpod.glade.h:77
+msgid "All (AND)"
+msgstr "Toate (AND)"
+
+#: ../data/gtkpod.glade.h:78
+msgid "All Tracks Never Listened To"
+msgstr "Toate piesele care nu au fost niciodată ascultate"
+
+#: ../data/gtkpod.glade.h:79
+msgid "All Tracks Played Since Last Time"
+msgstr "Toate piesele redate începând de ultima oară"
+
+#: ../data/gtkpod.glade.h:80
+msgid "All Tracks not Listed in any Playlist"
+msgstr "Toate piesele ne-listate în nicio listă de redare"
+
+#: ../data/gtkpod.glade.h:81
+msgid "Also include tracks never played in \"Best Rated\" playlist"
+msgstr ""
+"Include şi piesele care nu au fost redate în lista \"Cele mai apreciate\""
+
+#: ../data/gtkpod.glade.h:82
+msgid "Always write ID3v2.4 tags (only applies to MP3)"
+msgstr "Scrie mereu etichetele ID3v2.4 (se aplică numai pentru MP3)"
+
+#: ../data/gtkpod.glade.h:83
+msgid "Any (OR)"
+msgstr "Oricare (OR)"
+
+#: ../data/gtkpod.glade.h:84 ../src/display_sorttabs.c:2979
+#: ../src/display_spl.c:85 ../src/misc_conversion.c:61
+msgid "Artist"
+msgstr "Artist"
+
+#: ../data/gtkpod.glade.h:85
+msgid "Artwork Preview"
+msgstr "Previzualizare copertă"
+
+#: ../data/gtkpod.glade.h:86
+msgid ""
+"As a last resort set the following tags to the\n"
+"filename if they are (still) empty:"
+msgstr ""
+"Ca un ultim resort setează următoarele etichete \n"
+"la numele de fişier dacă sunt (încă) goale:"
+
+#: ../data/gtkpod.glade.h:88
+msgid "Ascending"
+msgstr "Crescător"
+
+#: ../data/gtkpod.glade.h:89
+msgid "Auto Store"
+msgstr "Memorare automată"
+
+#: ../data/gtkpod.glade.h:90
+msgid ""
+"Automatically start displaying tracks that match the criteria entered above. "
+"If not selected, you must press 'Display' to start displaying."
+msgstr ""
+"Porneşte automat afişarea pieselor care respectă criteriile introduse mai "
+"jos. Dacă nu este selectat, trebuie să apăsaţi 'Afişează' pentru aceasta."
+
+#: ../data/gtkpod.glade.h:91
+msgid "Available:"
+msgstr "Disponibil:"
+
+#: ../data/gtkpod.glade.h:92
+msgid "Before removing playlists or tracks from a playlist"
+msgstr "Înainte de a şterge liste de redare sau piese dintr-o listă de redare"
+
+#: ../data/gtkpod.glade.h:93
+msgid "Before removing tracks from the harddisk"
+msgstr "Înainte de a şterge piese de pe discul dur"
+
+#: ../data/gtkpod.glade.h:94
+msgid "Before removing tracks from the iPod"
+msgstr "Înainte de a şterge piese de pe iPod"
+
+#: ../data/gtkpod.glade.h:95
+msgid "Before removing tracks from the local database"
+msgstr "Înainte de a şterge piese din baza de date locală"
+
+#: ../data/gtkpod.glade.h:96
+msgid "Best Rated Tracks"
+msgstr "Piesele cele mai apreciate"
+
+#: ../data/gtkpod.glade.h:97
+msgid "Browse"
+msgstr "Răsfoieşte"
+
+#: ../data/gtkpod.glade.h:98
+msgid "Cache directory:"
+msgstr "Dosar cache"
+
+#: ../data/gtkpod.glade.h:99
+msgid "Calendar"
+msgstr "Calendar"
+
+#: ../data/gtkpod.glade.h:100
+msgid "Calendar sync command:"
+msgstr "Comandă sincronizare calendar:"
+
+#: ../data/gtkpod.glade.h:101
+msgid "Call automatically when synchronizing iTunesDB"
+msgstr "Apelează automat când se sincronizează iTunesDB"
+
+#: ../data/gtkpod.glade.h:102
+msgid "Category: "
+msgstr "Categorie:"
+
+#: ../data/gtkpod.glade.h:103
+msgid ""
+"Change all tracks\n"
+"simultaneously"
+msgstr ""
+"Modifică toate piesele\n"
+"simultan"
+
+#: ../data/gtkpod.glade.h:105
+msgid ""
+"Check before removing photos from a photo album whether\n"
+"they should be deleted from the Photo Database."
+msgstr ""
+"Verifică înainte de a șterge imagini dintr-un album foto dacă\n"
+"ar trebui șterse din baza de date foto."
+
+#: ../data/gtkpod.glade.h:107
+msgid "Check for existing files when copying from iPod."
+msgstr "Verifică dacă fişierele există deja când copiez de pe iPod."
+
+#: ../data/gtkpod.glade.h:108
+msgid "Command for 'Enqueue':"
+msgstr "Comandă pentru 'Adaugă în coadă':"
+
+#: ../data/gtkpod.glade.h:109
+msgid "Command for 'Play now':"
+msgstr "Comandă 'Redare acum':"
+
+#. 5
+#: ../data/gtkpod.glade.h:110 ../src/display_spl.c:97
+#: ../src/misc_conversion.c:65
+msgid "Composer"
+msgstr "Compozitor"
+
+#: ../data/gtkpod.glade.h:111
+msgid "Confirm before removing tracks from the iPod or repository"
+msgstr "Confirmă ştergerea pieselor de pe iPod sau din depozit"
+
+#: ../data/gtkpod.glade.h:112
+msgid ""
+"Confirm before removing tracks from the iPod or repository\n"
+"when syncing playlists"
+msgstr ""
+"Confirmă inainte de a şterge piese de pe iPod sau din depozit\n"
+"când se sincronizează listele de redare"
+
+#: ../data/gtkpod.glade.h:114
+msgid "Confirm lists of directories"
+msgstr "Confirmă listele de directoare"
+
+#: ../data/gtkpod.glade.h:115
+msgid "Contacts sync command:"
+msgstr "Comandă sincronizare agendă:"
+
+#: ../data/gtkpod.glade.h:116
+msgid "Containing Displayed Tracks"
+msgstr "Conţinând piesele afişate"
+
+#: ../data/gtkpod.glade.h:117
+msgid "Containing Selected Tracks"
+msgstr "Conţinând piesele selectate"
+
+#: ../data/gtkpod.glade.h:118
+msgid "Conversion Progress Display"
+msgstr "Afişare progres conversie"
+
+#: ../data/gtkpod.glade.h:119
+msgid "Cover"
+msgstr "Copertă"
+
+#: ../data/gtkpod.glade.h:120
+msgid "Create New Playlist"
+msgstr "Creează listă de redare nouă"
+
+#: ../data/gtkpod.glade.h:121
+msgid "Create Repository"
+msgstr "Creează depozit"
+
+#: ../data/gtkpod.glade.h:122
+msgid "Create _Playlist File"
+msgstr "Creează fişier _listă de redare"
+
+#: ../data/gtkpod.glade.h:123
+msgid "Credits"
+msgstr "Autori"
+
+#: ../data/gtkpod.glade.h:124
+msgid "Currently only rating is supported."
+msgstr "Momentan numai aprecierea este suportată"
+
+#: ../data/gtkpod.glade.h:125
+msgid "Delete repository"
+msgstr "Şterge depozit"
+
+#: ../data/gtkpod.glade.h:126
+msgid ""
+"Delete tracks that are no longer present from the\n"
+"iPod or repository"
+msgstr ""
+"Şterge piesele care nu mai sunt prezente de pe\n"
+"iPod sau din depozit"
+
+#: ../data/gtkpod.glade.h:128
+msgid "Deleted tracks"
+msgstr "Piese şterse"
+
+#: ../data/gtkpod.glade.h:129
+msgid "Descending"
+msgstr "Descrescător"
+
+#: ../data/gtkpod.glade.h:130
+msgid "Details"
+msgstr "Detalii"
+
+#: ../data/gtkpod.glade.h:132
+#, no-c-format
+msgid ""
+"Determines how the string for the info field should be constructed, e.g '%a/%"
+"A/%T - %t.mp3' or '%o'.  You can separate several templates by semicolons -- "
+"gtkpod will determine which one to use by the filename extension given. "
+"Artist: %a, album: %A, composer: %c, title: %t, genre: %G, track nr: %T, CD "
+"nr: %C, year: %Y, original filename (requires extended information file): %"
+"o, the character '%': %%."
+msgstr ""
+"Determină cum este construit şirul pentru câmpul de informaţii, e.g. '%a/%A/%"
+"T - %t.mp3' sau '%o'. Puteţi separa câteva şabloane prin punct şi virgulă -- "
+"gtkpod ca determina care să fie utilizată de către extensia fişierului dată. "
+"Artist: %a, album: %A, compozitor: %c, titlu: %t, gen: %G, număr pistă: %T, "
+"număr CD: %C, an: %Y, nume de fişier original (necesită fişier de informaţii "
+"extins): %o, caracterul '%': %%."
+
+#: ../data/gtkpod.glade.h:134
+#, no-c-format
+msgid ""
+"Determines the filename of tracks you copy from the iPod, e.g '%a/%A/%T - %t."
+"mp3' or '%o'.  You can separate several patterns by semicolons -- gtkpod "
+"will determine which one to use by the filename extension given. Artist: %a, "
+"album: %A, composer: %c, title: %t, genre: %G, track nr: %T, CD nr: %C, "
+"year: %Y, original filename (requires extended information file): %o, "
+"current playlist: %p, the character '%': %%."
+msgstr ""
+"Determină numele de fişier al pieselor pe care le copiaţi de pe iPod, e.g. '%"
+"a/%A/%T - %t.mp3' sau '%o'. Puteţi separa câteva şabloane prin punct şi "
+"virgulă -- gtkpod ca determina care să fie utilizată de către extensia "
+"fişierului dată. Artist: %a, album: %A, compozitor: %c, titlu: %t, gen: %G, "
+"număr pistă: %T, număr CD: %C, an: %Y, nume de fişier original (necesită "
+"fişier de informaţii extins): %o, caracterul '%': %%."
+
+#: ../data/gtkpod.glade.h:136
+#, no-c-format
+msgid ""
+"Determines the name of the file with the cover art. You can separate several "
+"patterns by semicolons which will be tried in order. Artist: %a, album: %A, "
+"composer: %c, title: %t, genre: %G, track nr: %T, CD nr: %C, year: %Y, "
+"original filename (requires extended information file): %o, original "
+"filename without file extension: %O, current playlist: %p, the character "
+"'%': %%."
+msgstr ""
+"Determină numele de fişier conţinând coverart. Puteţi separa câteva şabloane "
+"prin punct şi virgulă -- gtkpod ca determina care să fie utilizată de către "
+"extensia fişierului dată. Artist: %a, album: %A, compozitor: %c, titlu: %t, "
+"gen: %G, număr pistă: %T, număr CD: %C, an: %Y, nume de fişier original "
+"(necesită fişier de informaţii extins): %o, nume de fişier original fără "
+"extensie: %O, lista de redare curentă: %p, caracterul '%': %%."
+
+#: ../data/gtkpod.glade.h:137
+msgid ""
+"Directories to sync with are determined from the filenames of the tracks in "
+"the playlist."
+msgstr ""
+"Dosarele cu care sincronizez se obţin din numele de fişiere ale pieselor din "
+"lista de redare."
+
+#: ../data/gtkpod.glade.h:138
+msgid "Display a list of tracks that could actually be updated."
+msgstr "Afişează o listă a pieselor care pot fi actualizate."
+
+#: ../data/gtkpod.glade.h:139
+msgid "Display a list of tracks that could not be updated."
+msgstr "Afişează o listă a pieselor care nu pot fi actualizate."
+
+#: ../data/gtkpod.glade.h:140
+msgid "Display conversion log"
+msgstr "Afişează jurnalul conversiei"
+
+#: ../data/gtkpod.glade.h:141
+msgid "Display info about detected duplicates"
+msgstr "Afişează informaţii despre dublurile detectate"
+
+#: ../data/gtkpod.glade.h:142
+msgid "Display info about non-updated tracks"
+msgstr "Afişează informaţii despre piesele care nu au fost actualizate"
+
+#: ../data/gtkpod.glade.h:143
+msgid "Display info about updated tracks"
+msgstr "Afişează informaţii despre piesele actualizate"
+
+#: ../data/gtkpod.glade.h:144
+msgid "Display messages and warnings at startup"
+msgstr "Afişează mesaje şi avertizări la pornire"
+
+#: ../data/gtkpod.glade.h:145
+msgid ""
+"Display the list of duplicates that have been detected after adding files."
+msgstr ""
+"Afişează lista dublurilor care au fost detectate după adăugarea de fişiere."
+
+#: ../data/gtkpod.glade.h:146
+msgid "Display toolbar..."
+msgstr "Afişează bara de unelte..."
+
+#: ../data/gtkpod.glade.h:147
+msgid "Display tooltips in main window"
+msgstr "Afişează indicii în fereastra principală"
+
+#: ../data/gtkpod.glade.h:148
+msgid "Display tooltips in prefs window"
+msgstr "Afişează indicii în fereastra de preferinţe"
+
+#: ../data/gtkpod.glade.h:149
+msgid "Display tracks that match the criteria entered above."
+msgstr "Afişează piesele care se potrivesc criteriului introdus mai jos."
+
+#: ../data/gtkpod.glade.h:150
+msgid ""
+"Displayed\n"
+"Tracks"
+msgstr ""
+"Piese\n"
+"afişate"
+
+#: ../data/gtkpod.glade.h:152
+msgid "Displayed:"
+msgstr "Afişate:"
+
+#: ../data/gtkpod.glade.h:153
+msgid "Don't allow file duplication"
+msgstr "Nu permite existenţa dublurilor"
+
+#: ../data/gtkpod.glade.h:154
+msgid "Don't automatically sync on startup"
+msgstr "Nu sincroniza automat la pornire"
+
+#: ../data/gtkpod.glade.h:155
+msgid "Duplicate Recognition is based on a (modified) sha1 hash over the file."
+msgstr ""
+"Recunoaşterea dublurilor este bazată pe o sumă binară de căutare sha1 "
+"(modificată) asupra fişierelor."
+
+#: ../data/gtkpod.glade.h:156
+msgid "Edit Repository/iPod Options"
+msgstr "Editare opţiuni depozit/iPod"
+
+#: ../data/gtkpod.glade.h:157 ../src/context_menus.c:662
+msgid "Edit Smart Playlist"
+msgstr "Editare listă de redare inteligentă"
+
+#: ../data/gtkpod.glade.h:158 ../src/context_menus.c:749
+msgid "Edit Track Details"
+msgstr "Editare detalii piesă"
+
+#: ../data/gtkpod.glade.h:159
+msgid "Edit _Preferences"
+msgstr "_Preferinţe"
+
+#: ../data/gtkpod.glade.h:160
+msgid "Effective free space"
+msgstr "Spaţiu liber efectiv"
+
+#: ../data/gtkpod.glade.h:161
+msgid "Empty Playlist"
+msgstr "Listă de redare goală"
+
+#: ../data/gtkpod.glade.h:162
+msgid "Exclude file mask(s)"
+msgstr "Exclude masca (măştile) de fişier"
+
+#: ../data/gtkpod.glade.h:163
+msgid "Export can be continued at a later time if canceled."
+msgstr "Exportarea poate continua mai târziu dacă este revocată"
+
+#: ../data/gtkpod.glade.h:164
+msgid "File size"
+msgstr "Dimensiune"
+
+#: ../data/gtkpod.glade.h:165
+msgid "File size (deleted)"
+msgstr "Dimensiune (şters)"
+
+#: ../data/gtkpod.glade.h:166
+msgid "File size (non-transferred)"
+msgstr "Dimensiune (netransferat)"
+
+#: ../data/gtkpod.glade.h:167
+msgid "Filename Format: "
+msgstr "Format nume de fişier:"
+
+#: ../data/gtkpod.glade.h:168
+msgid ""
+"Find orphan files (files with no track info in DB) and dangling tracks "
+"(tracks with no corresponding files on iPod)"
+msgstr ""
+"Găseşte fişiere orfane (care nu au informaţii în DB) şi piese agăţate (piese "
+"care nu au fişiere corespunzătoare pe iPod)"
+
+#: ../data/gtkpod.glade.h:169
+msgid "First try <i>folder.jpg</i>, then <i>&lt;artist&gt;.jpg</i>"
+msgstr "Încearcă mai întâi <i>folder.jpg</i>, apoi <i>&lt;artist&gt;.jpg</i>"
+
+#: ../data/gtkpod.glade.h:170
+msgid "Flac with :"
+msgstr "Flac cu:"
+
+#: ../data/gtkpod.glade.h:172
+#, no-c-format
+msgid ""
+"For example, 'xmms %s' will clear xmms' current playlist, add the selected "
+"tracks and start playing."
+msgstr ""
+"De exemplu, 'xmms %s' va goli lista de redare curentă a xmms, va adăuga la "
+"listă piesele selectate şi va porni redarea."
+
+#: ../data/gtkpod.glade.h:174
+#, no-c-format
+msgid ""
+"For example, 'xmms -e %s' will append (enqueue) the selected tracks to xmms' "
+"current playlist."
+msgstr ""
+"De exemplu, 'xmms -e %s' va adăuga în coadă piesele selectate la lista de "
+"redare curentă a xmms"
+
+#: ../data/gtkpod.glade.h:175 ../src/display_sorttabs.c:2985
+#: ../src/display_spl.c:89 ../src/misc_conversion.c:63
+msgid "Genre"
+msgstr "Gen"
+
+#: ../data/gtkpod.glade.h:176
+msgid "Group artists on compilation CDs"
+msgstr "Grupează artiştii pe CD-uri de tip compilaţie"
+
+#: ../data/gtkpod.glade.h:177
+msgid ""
+"Highly recommended for faster import when taking advantage of the "
+"duplication recognition. Also, having the PC filenames allows writing "
+"changed ID3 tags to disk, and even to reconstruct your iPod's contents in "
+"case of file system corruption (change the \"transferred=\" entries in your "
+"backuped database)."
+msgstr ""
+"Foarte recomandat pentru importul mai rapid când se poate folosi avantajul "
+"recunoaşterii dublurilor. De asemenea, având numele de fişiere de pe PC "
+"permite scrierea etichetelor ID3 modificate pe disc, şi chiar reconstrucţia "
+"conţinutului iPod-ului în cazul coruperii sistemului de fişiere (schimbă "
+"intrările \"transferred=\" în copia de siguranţă a bazei de date)."
+
+#: ../data/gtkpod.glade.h:178 ../src/context_menus.c:685
+#: ../src/context_menus.c:703 ../src/context_menus.c:820
+msgid "I'm sure"
+msgstr "Sunt sigur"
+
+#: ../data/gtkpod.glade.h:179
+msgid ""
+"If available, the local copy of the track is referenced in the playlist. "
+"Otherwise the file on the iPod is used."
+msgstr ""
+"Dacă este posibil, copia locală a pieselor este referenţiată în lista de "
+"redare. Altfel, este folosit fişierul de pe iPod."
+
+#: ../data/gtkpod.glade.h:180
+msgid "If both options are selected, embedded APIC data takes precedence."
+msgstr ""
+"Dacă ambele opţiuni sunt selectate, datele APIC înglobate au prioritate."
+
+#: ../data/gtkpod.glade.h:181
+msgid ""
+"If checked, sorting will be case sensitive. Please note that case sensitive "
+"sorting will not work well with most charsets."
+msgstr ""
+"Dacă este bifat, sortarea va fi cu majuscule semnificative. A se reţine că "
+"sortarea cu majuscule semnificative nu va funcţiona corect cu cele mai multe "
+"seturi de caractere."
+
+#: ../data/gtkpod.glade.h:182
+msgid ""
+"If the filename (full path) of an existing track matches that of a track to "
+"be added, this option allows you to update the information about the "
+"existing track rather than just skipping the track altogether. No update "
+"will take place if the file hasn't changed and you have selected the 'Don't "
+"allow file duplication' option above."
+msgstr ""
+"Dacă numele de fişier (calea completă) a unei piese existente deja se "
+"potriveşte cu cel al uneia care urmează să fie adăugată, această opţiune "
+"permite să actualizaţi informaţia despre fişierul existent mai degrabă decât "
+"să omiteţi cu totul piesa. Nici un fel de actualizare nu va avea loc dacă "
+"fişierul nu s-a modificat şi dvs aţi selectat opţiunea \"Nu permite "
+"existenţa dublurilor' de mai sus."
+
+#: ../data/gtkpod.glade.h:183
+msgid "If you check this, gtkpod will descend into subdirectories recursively."
+msgstr ""
+"Dacă bifaţi această opţiune, gtkpod va pătrunde în subdirectoare recursiv."
+
+#: ../data/gtkpod.glade.h:184
+msgid ""
+"If you check this, information (cover art and meta information) changed for "
+"this track will be copied to all other selected tracks as well. Use with "
+"care."
+msgstr ""
+"Dacă bifaţi această opţiune, informaţiile (coperta şi meta-informaţia) "
+"modificate pentru această piesă vor fi copiate la toate celelalte piese "
+"selectate. Folosiţi-o cu atenţie."
+
+#: ../data/gtkpod.glade.h:185
+msgid ""
+"If you don't select the master playlist automatically, the initial database "
+"import is much faster because the display dosn't have to be updated."
+msgstr ""
+"Dacă nu selectaţi lista de redare principală automat, importarea iniţială a "
+"bazei de date este mult mai rapidă deoarece afişajul nu trebuie actualizat."
+
+#: ../data/gtkpod.glade.h:186
+msgid ""
+"If you select several tracks in the track list and edit a tag of the first "
+"track, the tags in the other tracks are updated as well."
+msgstr ""
+"Dacă selectaţi mai multe piese în lista de piese şi editaţi o etichetă a "
+"primei piese, etichetele următoarelor piese sunt actualizate de asemenea."
+
+#: ../data/gtkpod.glade.h:187
+msgid "Ignore these words when at the beginning of the following fields:"
+msgstr "Ignoră aceste cuvinte la începutul următoarelor câmpuri:"
+
+#: ../data/gtkpod.glade.h:188
+msgid ""
+"In order to save the displayed track order to the iPod choose 'Save "
+"Displayed Track Order' from the 'Edit' menu or select 'Auto Store' below."
+msgstr ""
+"Pentru a salva ordinea de afişare a pieselor pe iPod alegeţi 'Salvează "
+"ordinea afişată a pieselor' din meniul 'Editare' sau selectaţi 'Memorare "
+"automată' de mai jos."
+
+#: ../data/gtkpod.glade.h:189
+msgid "Initialize iPod"
+msgstr "Iniţializează iPod"
+
+#: ../data/gtkpod.glade.h:190
+msgid ""
+"Insert before\n"
+"Insert after"
+msgstr ""
+"Inserează înainte\n"
+"inserează după"
+
+#: ../data/gtkpod.glade.h:192
+msgid "Keeps all compilation CDs grouped together in the artists sort tab."
+msgstr ""
+"Păstrează toate CD-urile de tip compilaţie grupate împreună în categoria "
+"artişti."
+
+#: ../data/gtkpod.glade.h:193
+msgid "Live _updating"
+msgstr "Act_ualizare imediată"
+
+#: ../data/gtkpod.glade.h:194
+msgid "Load iPod(s)"
+msgstr "Încarcă"
+
+#: ../data/gtkpod.glade.h:195
+msgid "Lower Margin"
+msgstr "Marginea inferioară"
+
+#: ../data/gtkpod.glade.h:196
+msgid "M4A with :"
+msgstr "M4A cu :"
+
+#: ../data/gtkpod.glade.h:197
+msgid "MP3 with :"
+msgstr "MP3 cu :"
+
+#: ../data/gtkpod.glade.h:198
+msgid "Match al_l of the following"
+msgstr "Potriveşte toate condiţii_le următoare"
+
+#: ../data/gtkpod.glade.h:199
+msgid "Match an_y of the following"
+msgstr "Potri_veşte oricare dintre condiţiile următoare"
+
+#: ../data/gtkpod.glade.h:200
+msgid "Match only _checked tracks"
+msgstr "Potriveşte numai piesele bi_fate"
+
+#: ../data/gtkpod.glade.h:201
+msgid "Maximum number of background threads:"
+msgstr "Numărul maxim de fire de execuţie:"
+
+#: ../data/gtkpod.glade.h:202
+msgid "Maximum size of cache directory (in GB):"
+msgstr "Dimensiunea maximă a dosarului cache (în GO):"
+
+#: ../data/gtkpod.glade.h:203
+msgid "Model:"
+msgstr "Model:"
+
+#: ../data/gtkpod.glade.h:204 ../src/display_tracks.c:2100
+msgid "Modified"
+msgstr "Modificat"
+
+#: ../data/gtkpod.glade.h:205
+msgid "Most Recently Played Tracks"
+msgstr "Piese redate recent"
+
+#: ../data/gtkpod.glade.h:206
+msgid "Move selected attributes to the displayed list"
+msgstr "Mută atributele selectate către lista afișată"
+
+#: ../data/gtkpod.glade.h:207
+msgid "Music Root:"
+msgstr "Dosar de muzică rădăcină:"
+
+#: ../data/gtkpod.glade.h:208
+msgid ""
+"Music files can have images embedded in the APIC tag. Currently this is only "
+"supported for MP3 files."
+msgstr ""
+"Fişierele muzicale pot avea imagini înglobate în eticheta APIC. Momentan "
+"acest lucru este suportat numai pentru fişiere MP3."
+
+#: ../data/gtkpod.glade.h:209
+msgid "Never show this dialogue again"
+msgstr "Nu afişa acest dialog din nou"
+
+#: ../data/gtkpod.glade.h:210 ../src/display_spl.c:1719
+#: ../src/misc_playlist.c:66 ../src/misc_playlist.c:68
+#: ../src/misc_playlist.c:93 ../src/misc_playlist.c:95
+#: ../src/misc_playlist.c:428 ../src/misc_playlist.c:430
+msgid "New Playlist"
+msgstr "Listă nouă"
+
+#: ../data/gtkpod.glade.h:211
+msgid "No lower margin"
+msgstr "Fără margine inferioară"
+
+#: ../data/gtkpod.glade.h:212
+msgid "No upper margin"
+msgstr "Fără margine superioară"
+
+#: ../data/gtkpod.glade.h:213
+msgid "Non-transferred tracks"
+msgstr "Piese ne-transferate"
+
+#: ../data/gtkpod.glade.h:214
+msgid "None"
+msgstr "Nimic"
+
+#: ../data/gtkpod.glade.h:215
+msgid ""
+"Normally the charset specified when first importing the track will be used "
+"for the filename. If you set this option you can set a different charset "
+"with the charset selector (Preferences/'Adding/Updating/Syncing'). Note: the "
+"charset info is stored in the extended information file (see "
+"Preferences/'Writing of the iTunesDB'). Tracks imported before V0.51 will "
+"have no charset stored. Instead the charset specified will be used."
+msgstr ""
+"În mod normal, setul de caractere specificat la prima importare a piesei va "
+"fi utilizat pentru numele de fişier. Dacă stabiliţi această opţiune, puteţi "
+"stabili seturi de caractere diferite cu selectorul de seturi de caractere "
+"(Preferinţe/'Adăugare/Actualizare/Sincronizare'). Notă: informaţia despre "
+"setul de caractere este memorată în fişierul de informaţii extinse (vedeţi "
+"Preferinţe/'Scrierea iTunesDB'). Piesele importate înainte de versiunea "
+"V0.51 nu vor avea nici un set de caractere memorat. În locul acestuia, setul "
+"de caractere specificat va fi folosit."
+
+#: ../data/gtkpod.glade.h:216
+msgid ""
+"Normally the charset specified when first importing the track will be used "
+"to update the track information. If you have chosen a wrong charset when "
+"first importing a track and want to correct it using the 'Update Track' "
+"function, you must check this option. Note: the charset info is stored in "
+"the extended information file (see 'Writing of iTunesDB' below) and tracks "
+"imported before V0.51 will have no charset stored. Instead the charset "
+"specified above will be used then."
+msgstr ""
+"În mod normal, setul de caractere specificat la prima importare a piesei va "
+"fi utilizat pentru numele de fişier. Dacă stabiliţi un set de caractere "
+"greşit atunci când importaţi pentru prima oară o piesă şi doriţi să îl "
+"corectaţi folosind funcţia 'Actualizare piesă', bifaţi această opţiune. "
+"Notă: informaţia despre setul de caractere este memorată în fişierul de "
+"informaţii extinse (vedeţi Preferinţe/'Scrierea iTunesDB'). Piesele "
+"importate înainte de versiunea V0.51 nu vor avea nici un set de caractere "
+"memorat. În locul acestuia, setul de caractere specificat va fi folosit."
+
+#: ../data/gtkpod.glade.h:217
+msgid ""
+"Normally the charset specified when first importing the track will be used "
+"to write the tags. If you have chosen a wrong charset when first importing a "
+"track, you should select this option along with the correct charset.  Note: "
+"uses the extended information file to store the charset information (see "
+"'Writing of the iTunesDB' on the 'Input/Output' page) and tracks imported "
+"before V0.51 will have no charset stored -- the charset specified on the "
+"'Input/Output' page will be used."
+msgstr ""
+"În mod normal, setul de caractere specificat la prima importare a piesei va "
+"fi utilizat pentru numele de fişier. Dacă stabiliţi un set de caractere "
+"greşit atunci când importaţi pentru prima oară o piesă, bifaţi această "
+"opţiune împreună cu setul de caractere corect. Notă: foloseşte fişierul de "
+"informaţii extinse pentru a memora informaţia despre setul de caractere "
+"(vedeţi Preferinţe/'Scrierea iTunesDB'). Piesele importate înainte de "
+"versiunea V0.51 nu vor avea nici un set de caractere memorat. În locul "
+"acestuia, setul de caractere specificat va fi folosit."
+
+#: ../data/gtkpod.glade.h:218
+msgid ""
+"Normally, if a track is no longer present in the sync directory, it will be "
+"removed from the playlist, but not from the iPod or local repository.\n"
+"If this option is checked, tracks will be completely removed from the iPod "
+"or local repository, unless the track is a member of other playlists as "
+"well.\n"
+"NOTE: if you sync with the master playlist, you must check this option if "
+"you want tracks to be removed, because removing from the master playlist "
+"means removing from the iPod."
+msgstr ""
+"În mod normal, dacă o piesă nu mai este prezentă în dosarul de sincronizare, "
+"va fi ştearsă din lista de redare, dar nu şi de pe iPod, sau din depozitul "
+"local.\n"
+"Dacă această opţiune este bifată, piesele vor fi şterse complet de pe iPod "
+"sau din depozitul local, numai dacă piesa nu este membra şi a altei lsite de "
+"redare.\n"
+" NOTĂ: dacă sincronizaţi cu lista de redare principală, trebuie să bifaţi "
+"această opţiune dacă doriţi ca piesele să fie şterse, pentru că ştergerea "
+"lor din lista de redare principală înseamnă ştergerea de pe iPod."
+
+#: ../data/gtkpod.glade.h:221
+msgid "Notes sync command:"
+msgstr "Comandă sincronizare notiţe:"
+
+#: ../data/gtkpod.glade.h:222
+msgid "Number of playlists"
+msgstr "Număr liste de redare"
+
+#: ../data/gtkpod.glade.h:223
+msgid "Number of tracks"
+msgstr "Număr piese"
+
+#: ../data/gtkpod.glade.h:224
+msgid "Number of tracks in generated playlists:"
+msgstr "Număr piese în liste de redare generate:"
+
+#: ../data/gtkpod.glade.h:225
+msgid ""
+"Number of tracks in the generated playlists 'Most Often Listened', 'Best "
+"Rated' and 'Most Recently Played'. Choose '0' for 'no limit'."
+msgstr ""
+"Număr piese în listele de redare generate 'Cele mai ascultate', 'Cele mai "
+"apreciate' şi 'Piese redate recent'. Alegeţi '0' pentru  'nelimitat'."
+
+#: ../data/gtkpod.glade.h:226
+msgid "Ogg with :"
+msgstr "Ogg cu :"
+
+#: ../data/gtkpod.glade.h:227
+msgid "On startup automatically sync with playlist directories"
+msgstr "La pornire sincronizează automat cu dosarele listei de redare"
+
+#: ../data/gtkpod.glade.h:228
+msgid "On startup automatically sync with the following directory"
+msgstr "La pornire sincronizează automat cu următorul dosar"
+
+#: ../data/gtkpod.glade.h:229
+msgid "On startup automatically update (Live Playlist)"
+msgstr "La pornire actualizează automat (listă de redare 'live')"
+
+#: ../data/gtkpod.glade.h:230
+msgid "One for each Album"
+msgstr "Câte una din fiecare album"
+
+#: ../data/gtkpod.glade.h:231
+msgid "One for each Artist"
+msgstr "Câte una din fiecare artist"
+
+#: ../data/gtkpod.glade.h:232
+msgid "One for each Composer"
+msgstr "Câte una din fiecare compozitor"
+
+#: ../data/gtkpod.glade.h:233
+msgid "One for each Genre"
+msgstr "Câte una din fiecare gen"
+
+#: ../data/gtkpod.glade.h:234
+msgid "One for each Rating"
+msgstr "Câte una din fiecare nivel de apreciere"
+
+#: ../data/gtkpod.glade.h:235
+msgid "One for each Year"
+msgstr "Câte una din fiecare an"
+
+#: ../data/gtkpod.glade.h:236
+msgid "Overwrite tags that are already set"
+msgstr "Suprascrie etichetele care sunt definite deja"
+
+#: ../data/gtkpod.glade.h:237
+msgid "Password:"
+msgstr "Parolă:"
+
+#: ../data/gtkpod.glade.h:238
+msgid "Path:"
+msgstr "Cale:"
+
+#: ../data/gtkpod.glade.h:239
+msgid "Photo Window"
+msgstr "Fereastră foto"
+
+#: ../data/gtkpod.glade.h:240 ../src/display_spl.c:94
+msgid "Play time"
+msgstr "Durată"
+
+#: ../data/gtkpod.glade.h:241 ../src/display_spl.c:98
+#: ../src/misc_conversion.c:77
+msgid "Playcount"
+msgstr "Număr redări"
+
+#: ../data/gtkpod.glade.h:242 ../src/display_tracks.c:2097
+msgid "Played"
+msgstr "Redat"
+
+#: ../data/gtkpod.glade.h:243
+msgid "Playlist name:"
+msgstr "Nume listă de redare:"
+
+#: ../data/gtkpod.glade.h:244
+msgid "Playlist type:"
+msgstr "Tip listă de redare:"
+
+#: ../data/gtkpod.glade.h:245 ../src/display_playlists.c:2258
+msgid "Playlists"
+msgstr "Liste de redare"
+
+#: ../data/gtkpod.glade.h:246
+msgid "Please refer to the notice below."
+msgstr "Vă rugăm să vă referiţi la notiţa de mai jos."
+
+#: ../data/gtkpod.glade.h:247
+msgid "Please specify a time interval"
+msgstr "Vă rugăm specificaţi un interval de timp"
+
+#: ../data/gtkpod.glade.h:248
+msgid "Preferences"
+msgstr "Preferinţe"
+
+#: ../data/gtkpod.glade.h:249
+msgid "Progress Information"
+msgstr "Informaţii progres"
+
+#: ../data/gtkpod.glade.h:250
+msgid "R_ename Album"
+msgstr "R_edenumește album"
+
+#: ../data/gtkpod.glade.h:251
+msgid "Random Playlist from Displayed Tracks"
+msgstr "Listă de redare aleatoare din piesele afişate"
+
+#: ../data/gtkpod.glade.h:252
+msgid "Randomize Current Playlist"
+msgstr "Fă aleatoare lista de redare curentă"
+
+#: ../data/gtkpod.glade.h:253 ../src/display_spl.c:101
+#: ../src/misc_conversion.c:78
+msgid "Rating"
+msgstr "Apreciere"
+
+#: ../data/gtkpod.glade.h:254
+msgid "Read coverart from embedded APIC data"
+msgstr "Citeşte coverart din datele APIC înglobate"
+
+#: ../data/gtkpod.glade.h:255
+msgid "Read tags from file contents (e.g. ID3 tags in MP3 files)"
+msgstr "Citeşte etichete din fişier (e.g. etichete ID3 din fişiere MP3)"
+
+#: ../data/gtkpod.glade.h:256
+msgid "Remove selected attributes from the displayed list"
+msgstr "Șterge atributele selectate din lista afișată"
+
+#: ../data/gtkpod.glade.h:257
+msgid "Repository Options"
+msgstr "Opţiuni depozit"
+
+#: ../data/gtkpod.glade.h:258
+msgid "Repository name:"
+msgstr "Nume depozit:"
+
+#: ../data/gtkpod.glade.h:259
+msgid "Repository type:"
+msgstr "Tip depozit:"
+
+#: ../data/gtkpod.glade.h:260
+msgid "Root directory of mserv database (trackinfo root)."
+msgstr "Dosar rădăcină pentru baza de date mserv (trackinfo root)."
+
+#: ../data/gtkpod.glade.h:261
+msgid "Rules"
+msgstr "Reguli"
+
+#: ../data/gtkpod.glade.h:262 ../src/context_menus.c:804
+msgid "Save Changes"
+msgstr "Salvează"
+
+#: ../data/gtkpod.glade.h:263
+msgid "Scrobble Tracks?"
+msgstr "Scrobble piese?"
+
+#: ../data/gtkpod.glade.h:264
+msgid "Select '-1' for no upper limit."
+msgstr "Selectaţi '-1' pentru lipsă limită superioară"
+
+#: ../data/gtkpod.glade.h:265
+msgid "Select '0' for no lower limit."
+msgstr "Selectaţi '0' pentru lipsă limită inferioară"
+
+#: ../data/gtkpod.glade.h:266
+msgid ""
+"Selected\n"
+"Playlist"
+msgstr ""
+"Listă redare\n"
+"selectată"
+
+#: ../data/gtkpod.glade.h:268
+msgid ""
+"Selected\n"
+"Tracks"
+msgstr ""
+"Piese\n"
+"selectate"
+
+#: ../data/gtkpod.glade.h:270
+msgid "Selected Filter Tab Entry from Database"
+msgstr "Categorie selectată din baza de date"
+
+#: ../data/gtkpod.glade.h:271
+msgid "Selected Filter Tab Entry from Hard Disk"
+msgstr "Categorie selectată de pe discul dur"
+
+#: ../data/gtkpod.glade.h:272
+msgid "Selected Filter Tab Entry from Playlist"
+msgstr "Categorie selectată din lista de redare"
+
+#: ../data/gtkpod.glade.h:273
+msgid "Selected Filter Tab Entry from iPod"
+msgstr "Categorie selectată de pe iPod"
+
+#: ../data/gtkpod.glade.h:274
+msgid "Selected Playlist Including Tracks from Database"
+msgstr "Lista de redare selectată incluzând piesele din baza de date"
+
+#: ../data/gtkpod.glade.h:275
+msgid "Selected Playlist Including Tracks from Hard Disk"
+msgstr "Lista de redare selectată incluzând piesele de pe discul dur"
+
+#: ../data/gtkpod.glade.h:276
+msgid "Selected Playlist Including Tracks from iPod"
+msgstr "Lista de redare selectată incluzând piesele de pe iPod"
+
+#: ../data/gtkpod.glade.h:277
+msgid "Selected Tab _Entry"
+msgstr "Cat_egoria selectată"
+
+#: ../data/gtkpod.glade.h:278
+msgid "Selected Tracks from Database"
+msgstr "Piese selectate din baza de date"
+
+#: ../data/gtkpod.glade.h:279
+msgid "Selected Tracks from Hard Disk"
+msgstr "Piese selectate de pe discul dur"
+
+#: ../data/gtkpod.glade.h:280
+msgid "Selected Tracks from Playlist"
+msgstr "Piese selectate din lista de redare"
+
+#: ../data/gtkpod.glade.h:281
+msgid "Selected Tracks from iPod"
+msgstr "Piese selectate de pe iPod "
+
+#: ../data/gtkpod.glade.h:282
+msgid "Selected _Playlist"
+msgstr "Lista de _redare selectată"
+
+#: ../data/gtkpod.glade.h:283
+msgid "Selected _Tracks"
+msgstr "P_iese selectate"
+
+#: ../data/gtkpod.glade.h:284
+msgid "Selected playlist"
+msgstr "Lista de redare selectată"
+
+#: ../data/gtkpod.glade.h:285
+msgid "Semicolon separated list of file exclusion masks, e.g. '*.mp3'"
+msgstr ""
+"Măşti de fişiere pentru excludere, separate prin punct şi virgulă, e.g. '*."
+"mp3'"
+
+#: ../data/gtkpod.glade.h:286
+msgid "Set Cover Art from _File"
+msgstr "Stabileşte coperta din _fişier"
+
+#: ../data/gtkpod.glade.h:287
+msgid "Set mountpoint or edit repository options"
+msgstr "Stabileşte punct de montare sau editează opţiunile depozitului"
+
+#: ../data/gtkpod.glade.h:288
+msgid "Set options for Calendar/Contacts/Notes"
+msgstr "Stabileşte opţiuni pentru Calendar/Agendă/Notiţe"
+
+#: ../data/gtkpod.glade.h:289
+msgid ""
+"Set this to 'aacgain -q -k' to use the 'Normalize volume' functionality in "
+"the Tools Menu. If this is set, missing normalization data for .m4a and .m4b "
+"files will be calculated and written to your music file using this command."
+msgstr ""
+"Stabileşte la 'aacgain -q -k' pentru a folosi funcţionalitatea 'Normalizare "
+"volum' în meniul unelte. Dacă aceasta nu este definită, datele de "
+"normalizare lipsă pentru fişierele .m4a şi .m4b vor fi calculate şi scrise "
+"în fişierele dvs muzicale folosind această comandă."
+
+#: ../data/gtkpod.glade.h:290
+msgid ""
+"Set this to 'mp3gain -q -k' to use the 'Normalize volume' functionality in "
+"the Tools Menu. If this is set, missing normalization data for mp3 files "
+"will be calculated and written to your mp3 file using this command."
+msgstr ""
+"Stabileşte la 'mp3gain -q -k' pentru a folosi funcţionalitatea 'Normalizare "
+"volum' în meniul unelte. Dacă aceasta nu este definită, datele de "
+"normalizare lipsă pentru fişierele .m4a şi .m4b vor fi calculate şi scrise "
+"în fişierele dvs muzicale folosind această comandă."
+
+#: ../data/gtkpod.glade.h:291
+msgid "Set this to your last.fm password"
+msgstr "Stabiliţi parola dvs last.fm"
+
+#: ../data/gtkpod.glade.h:292
+msgid "Set this to your last.fm username"
+msgstr "Stabiliţi numele dvs de utilizator last.fm"
+
+#: ../data/gtkpod.glade.h:293
+msgid ""
+"Set to 0 to effectively disable caching (a maximum of one track will be "
+"cached at a time)."
+msgstr ""
+"Stabiliţi la 0 pentru a dezactiva efectiv stocarea temporară (cel mult o "
+"piesă va fi stocată temporar la un moment dat)."
+
+#: ../data/gtkpod.glade.h:294
+msgid ""
+"Set to 0 to use as many background threads as CPUs are available on your "
+"system."
+msgstr ""
+"Stabiliţi la 0 pentru a folosi la fel de multe fire de execuţie pe fundal ca "
+"numărul de procesoare disponibile pe sistemul dvs."
+
+#: ../data/gtkpod.glade.h:295
+msgid "Show information about problems when accessing mserv"
+msgstr "Afişează informaţii despre problemele la accesarea mserv"
+
+#: ../data/gtkpod.glade.h:296
+msgid "Show summary of sync result"
+msgstr "Afişează rezumatul rezultatului sincronizării"
+
+#: ../data/gtkpod.glade.h:297 ../src/misc_playlist.c:96
+#: ../src/repository.c:1356
+msgid "Smart Playlist"
+msgstr "Listă de redare inteligentă"
+
+#: ../data/gtkpod.glade.h:298
+msgid "Sort tracks according to: "
+msgstr "Sortează piesele conform:"
+
+#: ../data/gtkpod.glade.h:299
+msgid "Sorting Options"
+msgstr "Opţiuni sortare"
+
+#: ../data/gtkpod.glade.h:300
+msgid "Sorting case sensitive"
+msgstr "Majuscule semnificative în sortare"
+
+#: ../data/gtkpod.glade.h:301
+msgid "Sorttab: "
+msgstr "Categorie:"
+
+#: ../data/gtkpod.glade.h:302
+msgid "Sorttabs"
+msgstr "Categorii"
+
+#: ../data/gtkpod.glade.h:303
+msgid "Source:"
+msgstr "Sursă:"
+
+#: ../data/gtkpod.glade.h:305
+#, no-c-format
+msgid ""
+"Specify exact path including command line options. '%i' will be replaced "
+"with the mount point of the iPod."
+msgstr ""
+"Specifică calea exactă incluzând opţiunile în linie de comandă. '%i' va fi "
+"înlocuit cu punctul de montare al iPod."
+
+#: ../data/gtkpod.glade.h:306
+msgid "Specify interval"
+msgstr "Specificaţi un interval"
+
+#: ../data/gtkpod.glade.h:307
+msgid "Start display automatically"
+msgstr "Porneşte automat afişarea"
+
+#: ../data/gtkpod.glade.h:308
+msgid "Synchronise Contacts, Calendar and Notes"
+msgstr "Sincronizează agendă, calendar şi notiţe"
+
+#: ../data/gtkpod.glade.h:309
+msgid "Synchronize All"
+msgstr "Sincronizează tot"
+
+#: ../data/gtkpod.glade.h:310
+msgid "Synchronize Calendar"
+msgstr "Sincronizează calendar"
+
+#: ../data/gtkpod.glade.h:311
+msgid "Synchronize Contacts"
+msgstr "Sincronizează agendă"
+
+#: ../data/gtkpod.glade.h:312
+msgid "Synchronize Notes"
+msgstr "Sincronizează notiţe"
+
+#: ../data/gtkpod.glade.h:313
+msgid "Template for info field: "
+msgstr "Şablon pentru câmp informaţii:"
+
+#: ../data/gtkpod.glade.h:314
+msgid ""
+"The local copy of the track is referenced in the playlist. If the track is "
+"not available locally, an error message is displayed."
+msgstr ""
+"Copia locală a piesei este referenţiată în lista de redare. Dacă piesa nu "
+"este disponibilă local, un mesaj de eroare va fi afişat."
+
+#: ../data/gtkpod.glade.h:315
+msgid ""
+"The output of the background conversion scripts is copied below. Each page "
+"of the notebook corresponds to one background thread."
+msgstr ""
+"Ieşirea scripturilor de conversie din fundal este copiată mai jos. Fiecare "
+"pagină din carneţel corespunde unui fir de execuţie pe fundal."
+
+#: ../data/gtkpod.glade.h:316
+msgid ""
+"The tags are written to the files on your harddrive and on the iPod (if "
+"available)."
+msgstr ""
+"Etichetele sunt scrise în fişierele de pe discul dvs dur şi de pe iPod (dacă "
+"este disponibil)."
+
+#: ../data/gtkpod.glade.h:317
+msgid "The track on the iPod is referenced in the playlist file."
+msgstr "Piesa de pe iPod este referenţiată în fişierul listă de redare."
+
+#: ../data/gtkpod.glade.h:318
+msgid "This is the same option as in 'Edit/Delete Confirmation'"
+msgstr "Aceasta este aceeaşi opţiune cu cea din 'Editare/Confirmare ştergere'"
+
+#: ../data/gtkpod.glade.h:319
+msgid ""
+"This is the way to go, but maybe not all programs support it yet. ID3v2.4 "
+"uses unicode to store the tags, so you won't have to worry about charsets "
+"any more. gtkpod will use UTF8 encoding as this will not increase the size "
+"of pure ASCII tags. ID3v2.2/4 tags will also be written if they are already "
+"present in the file to write to."
+msgstr ""
+"Aceasta este alegerea corectă, dar poate că nu toate programele o suportă "
+"deocamdată. ID3v2.4 foloseşte Unicode pentru a memora etichetele, astfel că "
+"nu va mai trebui să vă faceţi probleme pentru seturi de caractere. gtkpod va "
+"folosi codarea UTF8 atâta timp cât aceasta nu va mări dimensiunea "
+"etichetelor pure ASCII. Etichetele ID3v2.2/4 vor fi verificate de asemenea "
+"dacă nu sunt prezente în fişierul în care se scrie."
+
+#: ../data/gtkpod.glade.h:320
+msgid "This option will be re-activated when you upgrade gtkpod."
+msgstr "Această opţiune va fi re-activată la actualizarea gtkpod."
+
+#: ../data/gtkpod.glade.h:321
+msgid "Time:"
+msgstr "Timp:"
+
+#: ../data/gtkpod.glade.h:322 ../src/display_sorttabs.c:2991
+#: ../src/display_spl.c:83 ../src/misc_conversion.c:62
+msgid "Title"
+msgstr "Titlu"
+
+#: ../data/gtkpod.glade.h:323
+msgid ""
+"Total\n"
+"(iPod)"
+msgstr ""
+"Total\n"
+"iPod"
+
+#: ../data/gtkpod.glade.h:325
+msgid ""
+"Total\n"
+"(local)"
+msgstr ""
+"Total\n"
+"(local)"
+
+#: ../data/gtkpod.glade.h:327
+msgid "Tracks"
+msgstr "Piese"
+
+#: ../data/gtkpod.glade.h:328
+msgid "Tracks Most Often Listened To"
+msgstr "Cele mai ascultate piese"
+
+#: ../data/gtkpod.glade.h:329
+msgid ""
+"Tracks can be transferred in the background as soon as they are added to an "
+"iPod repository. Otherwise they will be transferred when ejecting the "
+"contents of the iPod completely unchanged until then."
+msgstr ""
+"Piesele pot fi transferate pe fundal imediat ce sunt adăugate într-un "
+"depozit iPod. Altfel, ele vor fi transferate la deconectarea iPod, acesta "
+"fiind complet nemodificat până atunci."
+
+#: ../data/gtkpod.glade.h:330
+msgid "Tracks in Selected Tab _Entry"
+msgstr "Piese în cate_goria selectată"
+
+#: ../data/gtkpod.glade.h:331
+msgid "Tracks in Selected _Playlist"
+msgstr "Piese în _lista de redare selectată"
+
+#: ../data/gtkpod.glade.h:332
+msgid "Transfer tracks to the iPod in the background"
+msgstr "Transferă piesele către iPod pe fundal"
+
+#: ../data/gtkpod.glade.h:333
+msgid "Translators"
+msgstr "Traducători"
+
+#: ../data/gtkpod.glade.h:334
+msgid ""
+"Try to load contents of all connected iPods. For each iPod a separate "
+"repository must be set up."
+msgstr ""
+"Încearcă să încarce conţinutul tuturor iPodurilor conectate. Pentru fiecare "
+"iPod trebuie stabilit un depozit separat."
+
+#: ../data/gtkpod.glade.h:335
+msgid "Undo _Track"
+msgstr "Refacere _piesă"
+
+#: ../data/gtkpod.glade.h:336
+msgid "Update _mserv Data from File"
+msgstr "Actualizează date _mserv din fişier"
+
+#: ../data/gtkpod.glade.h:337
+msgid "Update/Sync all playlists now"
+msgstr "Actualizează/sincronizează toate listele de redare acum"
+
+#: ../data/gtkpod.glade.h:338
+msgid "Update/Sync playlist now"
+msgstr "Actualizează/sincronizează lista de redare acum"
+
+#: ../data/gtkpod.glade.h:339
+msgid "Upper margin"
+msgstr "Margine superioară"
+
+#: ../data/gtkpod.glade.h:340
+msgid "Use 'Multi-Edit' also for title field"
+msgstr "Foloseşte 'Editare multiplă' şi pentru câmpul titlu"
+
+#: ../data/gtkpod.glade.h:341
+msgid "Use 'Multi-Edit' for tracks selections"
+msgstr "Foloseşte 'Editare multiplă' pentru selecţii de piese"
+
+#: ../data/gtkpod.glade.h:342
+msgid "Use <i>&lt;Album&gt;.jpg</i> in the parent directory"
+msgstr "Foloseşte <i>&lt;Album&gt;.jpg</i> în dosarul părinte"
+
+#: ../data/gtkpod.glade.h:343
+msgid "Use <i>&lt;Album&gt;.jpg</i>, <i>&lt;Album&gt;.png</i>..."
+msgstr "Foloseşte <i>&lt;Album&gt;.jpg</i>, <i>&lt;Album&gt;.png</i>..."
+
+#: ../data/gtkpod.glade.h:344
+msgid "Use <i>folder.jpg</i> as cover art."
+msgstr "Foloseşte <i>dosar.jpg</i> ca şi copertă."
+
+#: ../data/gtkpod.glade.h:345
+msgid "Use <i>folder.jpg</i>, <i>folder.png</i>..."
+msgstr "Foloseşte <i>dosar.jpg</i>, <i>dosar.png</i>..."
+
+#: ../data/gtkpod.glade.h:346
+msgid "Use mserv database to fill additional information"
+msgstr "Foloseşte baza de date mserv pentru a obţine informaţie suplimentară"
+
+#: ../data/gtkpod.glade.h:347
+msgid ""
+"Use selected charset (Preferences/'Adding/Updating/ Syncing')\n"
+"for this filename."
+msgstr ""
+"Foloseşte setul de caractere selectat (Preferinţe/'Adăugare/Actualizare/"
+"Sincronizare')\n"
+"pentru acest nume de fişier."
+
+#: ../data/gtkpod.glade.h:349
+msgid ""
+"Use selected encoding (on the 'General' page)\n"
+"when writing tags"
+msgstr ""
+"Foloseşte tipul de codare selecatat (în pagina 'General')\n"
+"la scrierea etichetelor"
+
+#: ../data/gtkpod.glade.h:351
+msgid "Use selected encoding also when updating or syncing tracks"
+msgstr ""
+"Foloseşte de asemenea tipul de codare selectat la actualizarea sau "
+"sincronizarea pieselor"
+
+#: ../data/gtkpod.glade.h:352
+msgid "Use this template to parse filename for tag information:"
+msgstr ""
+"Foloseşte acest şablon pentru interpretarea numelor de fişiere pentru "
+"informaţii de etichete:"
+
+#: ../data/gtkpod.glade.h:353
+msgid "Username to be used for mserv database lookup."
+msgstr ""
+"Numele de utilizator va fi utilizat pentru căutarea în baza de date mserv."
+
+#: ../data/gtkpod.glade.h:354
+msgid "Username:"
+msgstr "Nume utilizator:"
+
+#: ../data/gtkpod.glade.h:355
+msgid ""
+"Usually you don't want to set the title of several tracks to the same text. "
+"This option might avoid unwanted results (especially since there is no "
+"'undo' yet)."
+msgstr ""
+"Uzual, nu veţi dori să stabiliţi titlul mai multor piese la acelaşi text. "
+"Această opţiune poate împiedica rezultate nedorite (mai ales atâta timp cât "
+"nu este nici o opţiune 'Refacere' deocamdată)."
+
+#: ../data/gtkpod.glade.h:356
+msgid "View Full Size"
+msgstr "Vizualizeză la dimensiunea reală"
+
+#: ../data/gtkpod.glade.h:357
+msgid "WAV with :"
+msgstr "WAV cu :"
+
+#: ../data/gtkpod.glade.h:358
+msgid ""
+"When adding dirs/files, update information of\n"
+"existing tracks with identical filenames"
+msgstr ""
+"Când adaug dosare/fişiere, actualizez informaţiile \n"
+"pieselor existente cu nume de fişier identice"
+
+#: ../data/gtkpod.glade.h:360
+msgid ""
+"When copying from iPod no check is performed on whether the destination file "
+"exists. Enabling this option will make gtkpod check whether the length of "
+"the destination file is the same as the file in the iPod. If so the file is "
+"skipped, allowing a quick sync of the iPod's contents."
+msgstr ""
+"Când copiez de pe iPod nu verific dacă fişierul destinaţie există. Activarea "
+"acestei opţiuni va face gtkpod să verifice dacă dimensiunea fişierului "
+"destinaţie este aceeaşi cu cea a fişierului de pe iPod. Dacă da, se sare "
+"peste fişier, permiţând sincronizarea rapidă a conţinutului iPod-ului."
+
+#: ../data/gtkpod.glade.h:361
+msgid "When syncing playlists"
+msgstr "Când se sincronizează liste de redare"
+
+#: ../data/gtkpod.glade.h:362
+msgid ""
+"Will show a list of tracks removed and a list of tracks newly added or "
+"updated."
+msgstr ""
+"Va afişa o listă a pieselor şterse şi o listă a pieselor adăugate recent sau "
+"actualizate."
+
+#: ../data/gtkpod.glade.h:363
+msgid "Write ID3 tags to disk when modified in gtkpod"
+msgstr "Scrie etichetele ID3 pe disc atunci când sunt modificate în gtkpod"
+
+#: ../data/gtkpod.glade.h:364
+msgid "Write all changes made to the disk and the iPod(s)."
+msgstr "Scrie toate modificările făcute pe disc şi pe iPod(uri)"
+
+#: ../data/gtkpod.glade.h:365
+msgid ""
+"Write extended information (PC filenames, SHA1 hashes,\n"
+"encoding...). Recommended."
+msgstr ""
+"Scrie informaţie extinsă (nume de fişier pe PC, hashes SHA1, \n"
+" codare....). Recomandat."
+
+#: ../data/gtkpod.glade.h:367
+msgid ""
+"You can also use the table headers, but this allows you to sort according to "
+"a column that is not displayed."
+msgstr ""
+"Puteţi folosi de asemenea antetele tabelului, dar această opţiune vă permite "
+"să sortaţi conform unei coloane care nu este afişată."
+
+#: ../data/gtkpod.glade.h:368
+msgid "_About gtkpod"
+msgstr "_Despre gtkpod"
+
+#: ../data/gtkpod.glade.h:369
+msgid "_Add Album"
+msgstr "_Adaugă album"
+
+#: ../data/gtkpod.glade.h:370
+msgid "_Add Image"
+msgstr "_Adaugă imagine"
+
+#: ../data/gtkpod.glade.h:371
+msgid "_Album"
+msgstr "_Album"
+
+#: ../data/gtkpod.glade.h:372
+msgid "_All Tracks"
+msgstr "_Toate"
+
+#: ../data/gtkpod.glade.h:373
+msgid "_Arrange Sort Tabs"
+msgstr "_Aranjează categoriile"
+
+#: ../data/gtkpod.glade.h:374
+msgid "_Check iPod's Files"
+msgstr "_Verifică fişierele iPodului"
+
+#: ../data/gtkpod.glade.h:375
+msgid "_Conversion Log"
+msgstr "_Jurnal conversie"
+
+#: ../data/gtkpod.glade.h:376
+msgid "_Create Playlists"
+msgstr "_Creează listă de redare"
+
+#: ../data/gtkpod.glade.h:377
+msgid "_Create iPod's Directories"
+msgstr "_Creează dosarele iPodului"
+
+#: ../data/gtkpod.glade.h:378
+msgid "_Delete"
+msgstr "Ş_terge"
+
+#: ../data/gtkpod.glade.h:379
+msgid "_Display"
+msgstr "_Afişare"
+
+#: ../data/gtkpod.glade.h:380
+msgid "_Displayed Tracks"
+msgstr "_Piese afişate"
+
+#: ../data/gtkpod.glade.h:381
+msgid "_Edit"
+msgstr "_Editare"
+
+#: ../data/gtkpod.glade.h:382
+msgid "_Encoding (ID3, files):"
+msgstr "_Encodare (ID3, fişiere):"
+
+#: ../data/gtkpod.glade.h:383
+msgid "_Enqueue"
+msgstr "_Adaugă în coadă"
+
+#: ../data/gtkpod.glade.h:384
+msgid "_Export Tracks from Database"
+msgstr "_Exportă piesele din baza de date"
+
+#: ../data/gtkpod.glade.h:385
+msgid "_File"
+msgstr "_Fişier"
+
+#: ../data/gtkpod.glade.h:386
+msgid "_General"
+msgstr "_General"
+
+#: ../data/gtkpod.glade.h:387
+msgid "_Help"
+msgstr "_Ajutor"
+
+#: ../data/gtkpod.glade.h:388
+msgid "_Ignore rules"
+msgstr "_Ignoră reguli"
+
+#: ../data/gtkpod.glade.h:389
+msgid "_Image"
+msgstr "_Imagine"
+
+#: ../data/gtkpod.glade.h:390
+msgid "_Info Window"
+msgstr "_Fereastră informaţii"
+
+#: ../data/gtkpod.glade.h:391
+msgid "_Last.FM"
+msgstr "_Last.FM"
+
+#: ../data/gtkpod.glade.h:392
+msgid "_Less Sort Tabs"
+msgstr "Mai _puţine categorii"
+
+#: ../data/gtkpod.glade.h:393
+msgid "_Limit to"
+msgstr "_Limitează la"
+
+#: ../data/gtkpod.glade.h:394
+msgid "_Load iPod(s)"
+msgstr "Încarcă i_Pod(urile)"
+
+#: ../data/gtkpod.glade.h:395
+msgid "_Local"
+msgstr "_Local"
+
+#: ../data/gtkpod.glade.h:396
+msgid "_M3U"
+msgstr "_M3U"
+
+#: ../data/gtkpod.glade.h:397
+msgid "_Misc."
+msgstr "_Misc."
+
+#: ../data/gtkpod.glade.h:398
+msgid "_More Sort Tabs"
+msgstr "Mai _multe categorii"
+
+#: ../data/gtkpod.glade.h:399
+msgid "_Newly Added Tracks"
+msgstr "Piese adăugate _recent"
+
+#: ../data/gtkpod.glade.h:400
+msgid "_Normalize Volume"
+msgstr "_Normalizare volum"
+
+#: ../data/gtkpod.glade.h:401
+msgid "_Number of sort tabs:"
+msgstr "_Număr categorii"
+
+#: ../data/gtkpod.glade.h:402
+msgid "_PLS"
+msgstr "_PLS"
+
+#: ../data/gtkpod.glade.h:403
+msgid "_Play Now"
+msgstr "_Redă acum"
+
+#: ../data/gtkpod.glade.h:404
+msgid "_Podcasts"
+msgstr "_Podcasturi"
+
+#: ../data/gtkpod.glade.h:405
+msgid "_Prefer Local"
+msgstr "_Preferă local"
+
+#: ../data/gtkpod.glade.h:406
+msgid "_Remove Album"
+msgstr "Ște_rge album"
+
+#: ../data/gtkpod.glade.h:407
+msgid "_Remove Cover Art"
+msgstr "_Şterge coperta"
+
+#: ../data/gtkpod.glade.h:408
+msgid "_Remove Images"
+msgstr "Ște_rge imagini"
+
+#: ../data/gtkpod.glade.h:409
+msgid "_Save Changes"
+msgstr "_Salvează modificările"
+
+#: ../data/gtkpod.glade.h:410
+msgid "_Save Displayed Track Order"
+msgstr "Sal_vează ordinea afişată a pieselor"
+
+#: ../data/gtkpod.glade.h:411
+msgid "_Sorting"
+msgstr "_Sortare"
+
+#: ../data/gtkpod.glade.h:412
+msgid "_Synchronize Playlist with Dir(s)"
+msgstr "Sincroni_zează lista de redare cu dosarul(ele)"
+
+#: ../data/gtkpod.glade.h:413
+msgid "_Toolbar"
+msgstr "Bară de unel_te"
+
+#: ../data/gtkpod.glade.h:414
+msgid "_Tools"
+msgstr "_Unelte"
+
+#: ../data/gtkpod.glade.h:415
+msgid "_Tooltips"
+msgstr "_Indicii"
+
+#: ../data/gtkpod.glade.h:416
+msgid "_Track Info"
+msgstr "Informaţii _piesă"
+
+#: ../data/gtkpod.glade.h:417
+msgid "_Undo All"
+msgstr "_Refacere toate"
+
+#: ../data/gtkpod.glade.h:418
+msgid "_Update Tracks from File"
+msgstr "Act_ualizează piesele din fişier"
+
+#: ../data/gtkpod.glade.h:419
+msgid "_Video"
+msgstr "_Video"
+
+#: ../data/gtkpod.glade.h:420
+msgid "_View"
+msgstr "_Vizualizare"
+
+#: ../data/gtkpod.glade.h:421
+msgid "_iPod"
+msgstr "_iPod"
+
+#: ../data/gtkpod.glade.h:423
+#, no-c-format
+msgid ""
+"artist: %a, album: %A, composer: %c, title: %t, genre: %G, track nr: %T, CD "
+"nr: %C, year: %Y, skip data: %*, the character '%': %%. You can separate "
+"several templates by a ';'. The first one matching the filename will be "
+"used. Example: '%a - %A/%T %t.mp3;%t.wav'."
+msgstr ""
+"artist: %a, album: %A, compozitor: %c, titlu: %t, gen: %G, nr pistă: %T, nr "
+"CD: %C, an: %Y, data sărit: %*, caracterul '%': %%. Puteţi separa mai multe "
+"şabloane pritnr-un ';'. Primul şablon care se potriveşte numelui de fişier "
+"va fi folosit. Exemplu: '%a - %A/%T %t.mp3;%t.wav'."
+
+#: ../data/gtkpod.glade.h:424
+msgid "folder"
+msgstr "dosar"
+
+#: ../data/gtkpod.glade.h:425
+msgid "folder.jpg"
+msgstr "dosar.jpg"
+
+#: ../data/gtkpod.glade.h:427
+#, no-c-format
+msgid "folder.jpg;%a.jpg"
+msgstr "dosar.jpg;%a.jpg"
+
+#: ../data/gtkpod.glade.h:428
+msgid "gtkpod"
+msgstr "gtkpod"
+
+#: ../data/gtkpod.glade.h:429
+msgid "gtkpod Info"
+msgstr "Informaţii gtkpod"
+
+#: ../data/gtkpod.glade.h:430
+msgid ""
+"gtkpod expects the ID3 tags and the filenames to be in the encoding "
+"specified here. You can change it for consecutive 'Add Files' and 'Add Dirs' "
+"operation. 'System Charset' is the charset used by your current locale."
+msgstr ""
+"gtkpod aşteaptă ca etichetele ID3 şi numele de fişiere să fie în codarea "
+"specificată aici. Puteţi schimba acest lucru pentru operaţii 'Adaugă "
+"fişiere' şi 'Adaugă dosare'. 'Setul de caractere implicit' este setul de "
+"caractere folosit de setările dvs locale."
+
+#: ../data/gtkpod.glade.h:431
+msgid "gtkpod options"
+msgstr "Opţiuni gtkpod"
+
+#. These are the items for the 'Repository type' combo in the 'Create Repository' dialog. Keep the three items in order!
+#: ../data/gtkpod.glade.h:433
+msgid ""
+"iPod\n"
+"Local Repository (Standard)\n"
+"Local Repository (Podcasts)\n"
+msgstr ""
+"iPod\n"
+"Depozit local (standard)\n"
+"Depozit local (podcasturi)\n"
+
+#: ../data/gtkpod.glade.h:437
+msgid "iPod mountpoint:"
+msgstr "Punct de montare:"
+
+#: ../data/gtkpod.glade.h:438
+msgid "iTunesDB backup:"
+msgstr "Copie iTunesDB"
+
+#: ../data/gtkpod.glade.h:439
+msgid "mserv Root:"
+msgstr "Rădăcină mserv:"
+
+#: ../data/gtkpod.glade.h:440
+msgid "mserv database lookup will be done for music in this directory."
+msgstr ""
+"căutarea prin baza de date mserv va fi realizată pentru muzica din acest "
+"dosar."
+
+#: ../data/gtkpod.glade.h:441 ../src/details.c:1347
+msgid "n/a"
+msgstr "n/a"
+
+#: ../data/gtkpod.glade.h:442
+msgid "special_sorttab -- Don't translate!"
+msgstr "special_sorttab -- Don't translate!"
+
+#: ../src/autodetection.c:310
+msgid "Could not initialize GnomeVFS\n"
+msgstr "Nu am putut iniţializa GnomeVFS\n"
+
+#: ../src/autodetection.c:397
+#, c-format
+msgid ""
+"Newly mounted iPod at '%s' could not be loaded into gtkpod.\n"
+"\n"
+msgstr ""
+"iPod-ul montat de curând la '%s' nu a putut fi încărcat în gtkpod\n"
+"\n"
+
+#: ../src/autodetection.c:403
+#, c-format
+msgid ""
+"Newly mounted iPod at '%s' appears to be already loaded!\n"
+"\n"
+msgstr ""
+"iPod-ul montat de curând la '%s' pare să fie deja încărcat!\n"
+"\n"
+
+#: ../src/autodetection.c:416
+msgid "New iPod"
+msgstr "iPod nou"
+
+#: ../src/charset.c:53
+msgid "Arabic (IBM-864)"
+msgstr "Arabic (IBM-864)"
+
+#: ../src/charset.c:54
+msgid "Arabic (ISO-8859-6)"
+msgstr "Arabic (ISO-8859-6)"
+
+#: ../src/charset.c:55
+msgid "Arabic (Windows-1256)"
+msgstr "Arabic (Windows-1256)"
+
+#: ../src/charset.c:56
+msgid "Baltic (ISO-8859-13)"
+msgstr "Baltic (ISO-8859-13)"
+
+#: ../src/charset.c:57
+msgid "Baltic (ISO-8859-4)"
+msgstr "Baltic (ISO-8859-4)"
+
+#: ../src/charset.c:58
+msgid "Baltic (Windows-1257)"
+msgstr "Baltic (Windows-1257)"
+
+#: ../src/charset.c:59
+msgid "Celtic (ISO-8859-14)"
+msgstr "Celtic (ISO-8859-14)"
+
+#: ../src/charset.c:60
+msgid "Central European (IBM-852)"
+msgstr "Central European (IBM-852)"
+
+#: ../src/charset.c:61
+msgid "Central European (ISO-8859-2)"
+msgstr "Central European (ISO-8859-2)"
+
+#: ../src/charset.c:62
+msgid "Central European (Windows-1250)"
+msgstr "Central European (Windows-1250)"
+
+#: ../src/charset.c:63
+msgid "Chinese Simplified (GB18030)"
+msgstr "Chinese Simplified (GB18030)"
+
+#: ../src/charset.c:64
+msgid "Chinese Simplified (GB2312)"
+msgstr "Chinese Simplified (GB2312)"
+
+#: ../src/charset.c:65
+msgid "Chinese Traditional (Big5)"
+msgstr "Chinese Traditional (Big5)"
+
+#: ../src/charset.c:66
+msgid "Chinese Traditional (Big5-HKSCS)"
+msgstr "Chinese Traditional (Big5-HKSCS)"
+
+#: ../src/charset.c:67
+msgid "Cyrillic (IBM-855)"
+msgstr "Cyrillic (IBM-855)"
+
+#: ../src/charset.c:68
+msgid "Cyrillic (ISO-8859-5)"
+msgstr "Cyrillic (ISO-8859-5)"
+
+#: ../src/charset.c:69
+msgid "Cyrillic (ISO-IR-111)"
+msgstr "Cyrillic (ISO-IR-111)"
+
+#: ../src/charset.c:70
+msgid "Cyrillic (KOI8-R)"
+msgstr "Cyrillic (KOI8-R)"
+
+#: ../src/charset.c:71
+msgid "Cyrillic (Windows-1251)"
+msgstr "Cyrillic (Windows-1251)"
+
+#: ../src/charset.c:72
+msgid "Cyrillic/Russian (CP-866)"
+msgstr "Cyrillic/Russian (CP-866)"
+
+#: ../src/charset.c:73
+msgid "Cyrillic/Ukrainian (KOI8-U)"
+msgstr "Cyrillic/Ukrainian (KOI8-U)"
+
+#: ../src/charset.c:74
+msgid "English (US-ASCII)"
+msgstr "English (US-ASCII)"
+
+#: ../src/charset.c:75
+msgid "Greek (ISO-8859-7)"
+msgstr "Greek (ISO-8859-7)"
+
+#: ../src/charset.c:76
+msgid "Greek (Windows-1253)"
+msgstr "Greek (Windows-1253)"
+
+#: ../src/charset.c:77
+msgid "Hebrew (IBM-862)"
+msgstr "Hebrew (IBM-862)"
+
+#: ../src/charset.c:78
+msgid "Hebrew (Windows-1255)"
+msgstr "Hebrew (Windows-1255)"
+
+#: ../src/charset.c:79
+msgid "Japanese (automatic detection)"
+msgstr "Japanese (automatic detection)"
+
+#: ../src/charset.c:80
+msgid "Japanese (EUC-JP)"
+msgstr "Japanese (EUC-JP)"
+
+#: ../src/charset.c:81
+msgid "Japanese (ISO-2022-JP)"
+msgstr "Japanese (ISO-2022-JP)"
+
+#: ../src/charset.c:82
+msgid "Japanese (Shift_JIS)"
+msgstr "Japanese (Shift_JIS)"
+
+#: ../src/charset.c:83
+msgid "Korean (EUC-KR)"
+msgstr "Korean (EUC-KR)"
+
+#: ../src/charset.c:84
+msgid "Nordic (ISO-8859-10)"
+msgstr "Nordic (ISO-8859-10)"
+
+#: ../src/charset.c:85
+msgid "South European (ISO-8859-3)"
+msgstr "South European (ISO-8859-3)"
+
+#: ../src/charset.c:86
+msgid "Thai (TIS-620)"
+msgstr "Thai (TIS-620)"
+
+#: ../src/charset.c:87
+msgid "Turkish (IBM-857)"
+msgstr "Turkish (IBM-857)"
+
+#: ../src/charset.c:88
+msgid "Turkish (ISO-8859-9)"
+msgstr "Turkish (ISO-8859-9)"
+
+#: ../src/charset.c:89
+msgid "Turkish (Windows-1254)"
+msgstr "Turkish (Windows-1254)"
+
+#: ../src/charset.c:90
+msgid "Unicode (UTF-7)"
+msgstr "Unicode (UTF-7)"
+
+#: ../src/charset.c:91
+msgid "Unicode (UTF-8)"
+msgstr "Unicode (UTF-8)"
+
+#: ../src/charset.c:92
+msgid "Unicode (UTF-16BE)"
+msgstr "Unicode (UTF-16BE)"
+
+#: ../src/charset.c:93
+msgid "Unicode (UTF-16LE)"
+msgstr "Unicode (UTF-16LE)"
+
+#: ../src/charset.c:94
+msgid "Unicode (UTF-32BE)"
+msgstr "Unicode (UTF-32BE)"
+
+#: ../src/charset.c:95
+msgid "Unicode (UTF-32LE)"
+msgstr "Unicode (UTF-32LE)"
+
+#: ../src/charset.c:96
+msgid "Vietnamese (VISCII)"
+msgstr "Vietnamese (VISCII)"
+
+#: ../src/charset.c:97
+msgid "Vietnamese (Windows-1258)"
+msgstr "Vietnamese (Windows-1258)"
+
+#: ../src/charset.c:98
+msgid "Visual Hebrew (ISO-8859-8)"
+msgstr "Visual Hebrew (ISO-8859-8)"
+
+#: ../src/charset.c:99
+msgid "Western (IBM-850)"
+msgstr "Western (IBM-850)"
+
+#: ../src/charset.c:100
+msgid "Western (ISO-8859-1)"
+msgstr "Western (ISO-8859-1)"
+
+#: ../src/charset.c:101
+msgid "Western (ISO-8859-15)"
+msgstr "Western (ISO-8859-15)"
+
+#: ../src/charset.c:102
+msgid "Western (Windows-1252)"
+msgstr "Western (Windows-1252)"
+
+#. sanity!
+#. check for "System Charset" and return NULL
+#: ../src/charset.c:160 ../src/charset.c:170 ../src/charset.c:223
+msgid "System Charset"
+msgstr "Setul de caractere implicit"
+
+#. we are not the first instance of gtkpod -- the socket is
+#. already being used, so we pass
+#: ../src/clientserver.c:214
+msgid ""
+"Another instance of gtkpod was detected. Playcount server not started.\n"
+msgstr ""
+"O altă instanţă a gtkpod a fost detectată. Serverul de numărare a redărilor "
+"nu este pornit.\n"
+
+#: ../src/confirmation.c:377
+msgid "Confirmation Dialogue"
+msgstr "Dialog confirmare"
+
+#: ../src/context_menus.c:362
+#, c-format
+msgid "Copied \"%s\" playlist to %s"
+msgstr "Am copiat lista de redare \"%s\" la %s"
+
+#: ../src/context_menus.c:401
+#, c-format
+msgid "Copied %d track to '%s'"
+msgid_plural "Copied %d tracks to '%s'"
+msgstr[0] "Am copiat %d piesă la '%s'"
+msgstr[1] "Am copiat %d piese la '%s'"
+
+#: ../src/context_menus.c:429
+#, c-format
+msgid "Copied '%s' playlist to '%s' in '%s'"
+msgstr "Am copiat lista de redare '%s' la '%s' în '%s'"
+
+#: ../src/context_menus.c:462
+#, c-format
+msgid "Copied %d track to '%s' in '%s'"
+msgid_plural "Copied %d tracks to %s in '%s'"
+msgstr[0] "Am copiat %d piesă la '%s' în '%s'"
+msgstr[1] "Am copiat %d piese la '%s' în '%s'"
+
+#: ../src/context_menus.c:622 ../src/tools.c:854
+msgid "Play Now"
+msgstr "Redă acum"
+
+#: ../src/context_menus.c:628 ../src/tools.c:867
+msgid "Enqueue"
+msgstr "Adaugă în coadă"
+
+#: ../src/context_menus.c:634
+msgid "Copy Tracks to Filesystem"
+msgstr "Copiază piesele către sistemul de fişiere"
+
+#: ../src/context_menus.c:641 ../src/file_export.c:1085
+msgid "Create Playlist File"
+msgstr "Creează fişier listă de redare"
+
+#: ../src/context_menus.c:648
+msgid "Create new Playlist"
+msgstr "Creează listă de redare nouă"
+
+#: ../src/context_menus.c:655
+msgid "Update Tracks from File"
+msgstr "Actualizeză piesele din fişier"
+
+#: ../src/context_menus.c:669
+msgid "Sync Playlist with Dir(s)"
+msgstr "Sincronizează lista de redare cu dosar(e)"
+
+#: ../src/context_menus.c:679
+msgid "Remove All Tracks from iPod"
+msgstr "Şterge toate piesele de pe iPod"
+
+#: ../src/context_menus.c:697
+msgid "Remove All Podcasts from iPod"
+msgstr "Şterge toate podcasturile de pe iPod"
+
+#: ../src/context_menus.c:712
+msgid "Delete Including Tracks"
+msgstr "Şterge incluzând piesele"
+
+#: ../src/context_menus.c:720
+msgid "Delete But Keep Tracks"
+msgstr "Şterge dar păstrează piesele"
+
+#: ../src/context_menus.c:728
+msgid "Edit iPod Properties"
+msgstr "Editează proprietăţile iPod-ului"
+
+#: ../src/context_menus.c:735
+msgid "Edit Repository Properties"
+msgstr "Editează proprietăţile depozitului"
+
+#: ../src/context_menus.c:742
+msgid "Edit Playlist Properties"
+msgstr "Editează proprietăţile listei de redare"
+
+#: ../src/context_menus.c:770
+msgid "View Full Size Artwork"
+msgstr "Vizualizeză coperta la dimensiunea reală"
+
+#: ../src/context_menus.c:777
+msgid "Select Cover From File"
+msgstr "Selectează coperta din fişier"
+
+#: ../src/context_menus.c:790
+msgid "Load iPod"
+msgstr "Încarcă iPod"
+
+#: ../src/context_menus.c:797
+msgid "Eject iPod"
+msgstr "Deconectează iPod"
+
+#: ../src/context_menus.c:814
+msgid "Remove All Tracks from Database"
+msgstr "Şterge toate piesele din baza de date"
+
+#: ../src/context_menus.c:829
+msgid "Delete Including Tracks (Harddisk)"
+msgstr "Şterge incluzând piesele (disc dur)"
+
+#: ../src/context_menus.c:837
+msgid "Delete Including Tracks (Database)"
+msgstr "Şterge incluzând piesele (bază de date)"
+
+#: ../src/context_menus.c:845
+msgid "Delete From iPod"
+msgstr "Şterge de pe iPod"
+
+#: ../src/context_menus.c:853
+msgid "Delete From Playlist"
+msgstr "Şterge din lista de redare"
+
+#: ../src/context_menus.c:861
+msgid "Delete From Harddisk"
+msgstr "Şterge de pe discul dur"
+
+#: ../src/context_menus.c:869
+msgid "Delete From Database"
+msgstr "Şterge din baza de date"
+
+#: ../src/context_menus.c:877
+msgid "Alphabetize"
+msgstr "Sortează alfabetic"
+
+#: ../src/context_menus.c:895
+msgid "Remove Album"
+msgstr "Șterge album"
+
+#: ../src/context_menus.c:905
+msgid "Remove Photo"
+msgstr "_Şterge imagine"
+
+#: ../src/context_menus.c:922
+msgid "Rename Album"
+msgstr "Redenumește album"
+
+#: ../src/context_menus.c:981 ../src/context_menus.c:1030
+msgid "Copy selected playlist to..."
+msgstr "Copiază lista de redare selectată către..."
+
+#: ../src/context_menus.c:1083
+msgid "Copy selected track(s) to..."
+msgstr "Copiază piesa(piesele) selectat(e) către..."
+
+#: ../src/date_parser.l:269
+#, c-format
+msgid "Date format error: unrecognized character: '%s'\n"
+msgstr "Eroare format dată: caracter nerecunoscut: '%s'\n"
+
+#: ../src/details.c:82
+msgid "Audio/Video"
+msgstr "Audio/Video"
+
+#: ../src/details.c:83
+msgid "Audio"
+msgstr "Audio"
+
+#: ../src/details.c:84
+msgid "Video"
+msgstr "Video"
+
+#: ../src/details.c:85
+msgid "Podcast"
+msgstr "Podcast"
+
+#: ../src/details.c:86
+msgid "Video Podcast"
+msgstr "Podcast video"
+
+#: ../src/details.c:87
+msgid "Audiobook"
+msgstr "Carte audio"
+
+#: ../src/details.c:88 ../src/display_spl.c:209 ../src/display_spl.c:218
+msgid "Music Video"
+msgstr "Videoclip"
+
+#: ../src/details.c:89 ../src/display_spl.c:107 ../src/display_spl.c:210
+#: ../src/display_spl.c:219 ../src/misc_conversion.c:101
+msgid "TV Show"
+msgstr "Emisiune TV"
+
+#: ../src/details.c:90
+msgid "TV Show & Music Video"
+msgstr "Emisiune TV şi videoclip"
+
+#: ../src/details.c:836
+#, c-format
+msgid "%s (image data corrupted or unreadable)"
+msgstr "%s (date imagine corupte sau imposibil de citit)"
+
+#: ../src/details.c:973
+#, c-format
+msgid "Please report unknown mediatype %x\n"
+msgstr "Vă rugăm raportaţi tip media necunoscut %x\n"
+
+#: ../src/details.c:1418
+msgid "<b>n/a</b>"
+msgstr "<b>n/a</b>"
+
+#: ../src/details.c:1906
+#, c-format
+msgid "Error occurred dropping an image onto the details window: %s\n"
+msgstr "Eroare la tragerea unei imagini în fereastra de detalii: %s\n"
+
+#: ../src/details.c:1952 ../src/display_coverart.c:2128
+msgid "Successfully set new coverart for selected tracks"
+msgstr "Copertă nouă stabilită cu succes pentru piesele selectate"
+
+#: ../src/display.c:490
+#, c-format
+msgid "<b>Image Dimensions: %s</b>"
+msgstr "<b>Dimensiuni imagine: %s</b>"
+
+#: ../src/display.c:744
+msgid "Edit selected entry of which sort tab?"
+msgstr "Editează înregistrarea selectată a cărei categorii?"
+
+#. no entry selected
+#: ../src/display.c:751 ../src/misc_confirm.c:435 ../src/misc_track.c:2138
+msgid "No entry selected."
+msgstr "Nici o înregistrare selectată."
+
+#: ../src/display.c:910 ../src/display.c:1230 ../src/display.c:1286
+#: ../src/display.c:1340 ../src/display.c:1395 ../src/display.c:1656
+#, c-format
+msgid "No entry selected in Sort Tab %d"
+msgstr "Nici o înregistrare selectată în categoria %d"
+
+#: ../src/display.c:949
+msgid "Remove entry of which sort tab from database?"
+msgstr "Şterge înregistrarea cărei categorii din baza de date?"
+
+#: ../src/display.c:957
+msgid "Remove tracks in selected entry of which filter tab from the iPod?"
+msgstr "Şterge piesele din înregistrarea cărei categorii de pe iPod?"
+
+#: ../src/display.c:979
+msgid "Remove tracks in selected entry of which filter tab from the harddisk?"
+msgstr "Şterge de pe discul dur piesele din înregistrarea cărei categorii?"
+
+#: ../src/display.c:1009
+msgid "Remove tracks in selected entry of which filter tab from playlist?"
+msgstr "Şterge din lista de redare piesele din înregistrarea cărei categorii?"
+
+#: ../src/display.c:1036 ../src/display.c:1074
+#, c-format
+msgid ""
+"iPod at '%s' is not loaded.\n"
+"Please load it first."
+msgstr ""
+"iPod la '%s' nu este încărcat.\n"
+"Vă rugăm încărcaţi-l mai întâi."
+
+#: ../src/display.c:1111 ../src/display.c:1138
+msgid "Update selected entry of which sort tab?"
+msgstr "Actualizează înregistrarea selectată a cărei categorii?"
+
+#: ../src/display.c:1224
+msgid "Export selected entry of which sort tab?"
+msgstr "Exportă înregistrarea selectată a cărei categorii?"
+
+#: ../src/display.c:1280
+msgid "Create playlist file from selected entry of which sort tab?"
+msgstr ""
+"Creează fişierul listă de redare din înregistrarea selectată a cărei "
+"categorii?"
+
+#: ../src/display.c:1334
+msgid "Play tracks in selected entry of which sort tab?"
+msgstr "Redă piesele din înregistrarea selectată a cărei categorii?"
+
+#: ../src/display.c:1389
+msgid "Enqueue tracks in selected entry of which sort tab?"
+msgstr "Adaugă la coadă înregistrarea selectată a cărei categorii?"
+
+#: ../src/display.c:1646
+msgid "Normalize tracks in selected entry of which sort tab?"
+msgstr ""
+"Normalizează volumul pieselor din înregistrarea selectată a cărei categorii?"
+
+#: ../src/display_coverart.c:1713
+msgid "Failed to remove the album from the album hash store."
+msgstr "Ştergerea albumului din memoria hash a albumelor eşuată."
+
+#: ../src/display_coverart.c:2098
+#, c-format
+msgid "Error occurred dropping an image onto the coverart display: %s\n"
+msgstr "Eroare la tragerea unei imagini în căsuța afișare copertă: %s\n"
+
+#: ../src/display_itdb.c:376
+#, c-format
+msgid "Failed to set cover art: '%s'\n"
+msgstr "Stabilirea coperţii: '%s' eşuată\n"
+
+#: ../src/display_itdb.c:858 ../src/display_itdb.c:991
+msgid "Local"
+msgstr "Local"
+
+#. add podcast playlist
+#: ../src/display_itdb.c:866 ../src/display_itdb.c:989
+#: ../src/display_itdb.c:1025
+msgid "Podcasts"
+msgstr "Podcasturi"
+
+#: ../src/display_itdb.c:875 ../src/display_itdb.c:993
+#: ../src/repository.c:1186
+msgid "iPod"
+msgstr "iPod"
+
+#: ../src/display_itdb.c:1084
+#, c-format
+msgid "Increased playcount for '%s'"
+msgstr "Număr redări incrementat pentru '%s'"
+
+#: ../src/display_photo.c:163
+#, c-format
+msgid "Error reading iPod photo database (%s).\n"
+msgstr "Eroare la citirea bazei de date foto a iPod-ului (%s).\n"
+
+#: ../src/display_photo.c:168
+msgid "Error reading iPod photo database.\n"
+msgstr "Eroare la citirea bazei de date foto a iPod-ului.\n"
+
+#: ../src/display_photo.c:238
+msgid "Could not access the iPod's photo database."
+msgstr "Nu am putut accesa baza de date foto a iPod-ului"
+
+#: ../src/display_photo.c:441
+msgid "Photo Albums"
+msgstr "Albume foto"
+
+#: ../src/display_photo.c:451 ../src/display_photo.c:1685
+msgid "<Unnamed>"
+msgstr "<Fără nume>"
+
+#: ../src/display_photo.c:939
+msgid "The Photo Library album cannot be removed"
+msgstr "Albumul Bibliotecă foto nu poate fi șters"
+
+#: ../src/display_photo.c:961
+msgid "Do you want to remove the album's photos too?"
+msgstr "Sunteţi sigur că doriţi să ştergeţi de asemenea imaginile din album?"
+
+#: ../src/display_photo.c:967
+msgid "Yes. Do Not Display Again"
+msgstr "Da. Nu afișa mesajul din nou"
+
+#: ../src/display_photo.c:1038
+msgid ""
+"This will remove the photo selection from the selected album.\n"
+" Do you want to delete them from the database as well?"
+msgstr ""
+"Veți șterge selecția de imagini din albumul curent.\n"
+" Doriți ștergerea selecției și din baza de date?"
+
+#: ../src/display_photo.c:1053
+msgid ""
+"This will delete the photo selection from the Photo Library and all albums. "
+"Are you sure?"
+msgstr ""
+"Veți șterge selecția de imagini din Biblioteca foto și din toate albumele. "
+"Sigur doriți acest lucru?"
+
+#: ../src/display_photo.c:1128
+msgid "New Photo Album Name"
+msgstr "Nume album foto nou"
+
+#: ../src/display_photo.c:1129
+msgid "Please enter a new name for the photo album"
+msgstr "Vă rugăm să introduceţi un nume nou pentru albumul foto"
+
+#: ../src/display_photo.c:1141 ../src/display_photo.c:1223
+msgid "An album with that name already exists."
+msgstr "Un album cu același nume există deja."
+
+#: ../src/display_photo.c:1210
+msgid "New Photo Album"
+msgstr "Album foto nou"
+
+#: ../src/display_photo.c:1211
+msgid "Please enter a name for the new photo album"
+msgstr "Vă rugăm să introduceţi un nume pentru albumul foto"
+
+#: ../src/display_photo.c:1232
+msgid "The new album failed to be created."
+msgstr "Noul album nu a putut fi creat."
+
+#: ../src/display_photo.c:1256
+msgid "Add Image to iPod"
+msgstr "Adaugă imagine la iPod"
+
+#. Open a dialog directory chooser window
+#: ../src/display_photo.c:1311
+msgid "Add a Directory of Images to the iPod. Select the Directory."
+msgstr "Adaugare dosar cu imagini la iPod. Selectați dosarul."
+
+#: ../src/display_photo.c:1699
+#, c-format
+msgid "<No members>\n"
+msgstr "<Lipsă membri>\n"
+
+#. give a notice on the statusbar -- otherwise the user
+#. * will never know why the drag is not possible
+#: ../src/display_playlists.c:516 ../src/display_playlists.c:558
+msgid "Error: drag from iPod not possible in offline mode."
+msgstr "Eroare: tragerea de pe iPod nu este posibilă în modul offline"
+
+#: ../src/display_playlists.c:585 ../src/display_tracks.c:286
+#, c-format
+msgid "Copied one track"
+msgid_plural "Copied %d tracks"
+msgstr[0] "Am copiat o piesă"
+msgstr[1] "Am copiat %d piese"
+
+#: ../src/display_playlists.c:865 ../src/display_playlists.c:877
+msgid "Can't reorder sorted treeview."
+msgstr "Nu pot reordona afişarea în arbore sortat"
+
+#: ../src/display_playlists.c:954
+#, c-format
+msgid ""
+"This DND type (%d) is not (yet) supported. If you feel implementing this "
+"would be useful, please contact the author.\n"
+"\n"
+msgstr ""
+"Acest tip DND (%d) nu este (încă) suportat. Dacă consideraţi implementarea "
+"acestuia utilă, vă rugam contactaţi autorul.\n"
+"\n"
+
+#. no existing photo playlist found so add one
+#. * either itdb had no children or none of them
+#. * were of the photo type.
+#.
+#: ../src/display_playlists.c:1569
+msgid "Photos"
+msgstr "Fotografii"
+
+#: ../src/display_sorttabs.c:473
+msgid "'Played' condition ignored because of error."
+msgstr "Condiţia 'redat' a fost ignorată din cauza unei erori."
+
+#: ../src/display_sorttabs.c:476
+msgid "'Modified' condition ignored because of error."
+msgstr "Condiţia 'modificat' a fost ignorată din cauza unei erori."
+
+#: ../src/display_sorttabs.c:479
+msgid "'Added' condition ignored because of error."
+msgstr "Condiţia 'adăugat' a fost ignorată din cauza unei erori."
+
+#: ../src/display_sorttabs.c:1562 ../src/misc_conversion.c:59
+msgid "All"
+msgstr "Toate"
+
+#: ../src/display_sorttabs.c:1588
+msgid "Compilations"
+msgstr "Compilaţii"
+
+#: ../src/display_sorttabs.c:2988
+msgid "Comp."
+msgstr "Comp."
+
+#: ../src/display_sorttabs.c:2994 ../src/display_spl.c:88
+#: ../src/display_tracks.c:2109 ../src/misc_conversion.c:84
+msgid "Year"
+msgstr "An"
+
+#: ../src/display_sorttabs.c:2997
+msgid "Special"
+msgstr "Special"
+
+#: ../src/display_sorttabs.c:3245
+msgid "Last Played"
+msgstr "Ultima redare"
+
+#: ../src/display_sorttabs.c:3246
+msgid "Last Modified"
+msgstr "Ultima modificare"
+
+#: ../src/display_spl.c:64
+msgid "days"
+msgstr "zile"
+
+#: ../src/display_spl.c:65
+msgid "weeks"
+msgstr "săptămâni"
+
+#: ../src/display_spl.c:66
+msgid "months"
+msgstr "luni"
+
+#: ../src/display_spl.c:73
+msgid "kbps"
+msgstr "kops"
+
+#: ../src/display_spl.c:74
+msgid "Hz"
+msgstr "Hz"
+
+#: ../src/display_spl.c:75 ../src/display_spl.c:179 ../src/info.c:780
+msgid "MB"
+msgstr "MO"
+
+#: ../src/display_spl.c:76
+msgid "secs"
+msgstr "secunde"
+
+#: ../src/display_spl.c:86 ../src/misc_conversion.c:74
+msgid "Bitrate"
+msgstr "Bitrate"
+
+#. 15
+#: ../src/display_spl.c:87 ../src/misc_conversion.c:75
+msgid "Samplerate"
+msgstr "Samplerate"
+
+#: ../src/display_spl.c:90
+msgid "Kind"
+msgstr "Tip"
+
+#: ../src/display_spl.c:91 ../src/misc_conversion.c:81
+msgid "Date modified"
+msgstr "Data modificării"
+
+#: ../src/display_spl.c:92
+msgid "Track number"
+msgstr "Număr pistă"
+
+#: ../src/display_spl.c:93
+msgid "Size"
+msgstr "Dimensiune"
+
+#: ../src/display_spl.c:95 ../src/misc_conversion.c:64
+msgid "Comment"
+msgstr "Comentariu"
+
+#: ../src/display_spl.c:96 ../src/misc_conversion.c:79
+msgid "Date added"
+msgstr "Data adăugării"
+
+#: ../src/display_spl.c:99
+msgid "Last played"
+msgstr "Ultima redare"
+
+#: ../src/display_spl.c:100
+msgid "Disc number"
+msgstr "Număr disc"
+
+#: ../src/display_spl.c:102 ../src/misc_conversion.c:87
+msgid "Compilation"
+msgstr "Compilaţie"
+
+#: ../src/display_spl.c:103 ../src/misc_conversion.c:76
+msgid "BPM"
+msgstr "BPM"
+
+#: ../src/display_spl.c:104 ../src/misc_conversion.c:86
+msgid "Grouping"
+msgstr "Grupare"
+
+#: ../src/display_spl.c:105
+msgid "Playlist"
+msgstr "Listă de redare"
+
+#: ../src/display_spl.c:106
+msgid "Video Kind"
+msgstr "Tip video"
+
+#: ../src/display_spl.c:108
+msgid "Season number"
+msgstr "Număr sezon"
+
+#: ../src/display_spl.c:109
+msgid "Skip count"
+msgstr "Număr săriri peste"
+
+#: ../src/display_spl.c:110
+msgid "Last skipped"
+msgstr "Ultima sărire peste"
+
+#: ../src/display_spl.c:111
+msgid "Album artist"
+msgstr "Artist album"
+
+#: ../src/display_spl.c:117
+msgid "contains"
+msgstr "conţine"
+
+#: ../src/display_spl.c:118
+msgid "does not contain"
+msgstr "nu conţine"
+
+#: ../src/display_spl.c:119 ../src/display_spl.c:128 ../src/display_spl.c:138
+#: ../src/display_spl.c:157 ../src/display_spl.c:164
+msgid "is"
+msgstr "este"
+
+#: ../src/display_spl.c:120 ../src/display_spl.c:129 ../src/display_spl.c:139
+#: ../src/display_spl.c:158 ../src/display_spl.c:165
+msgid "is not"
+msgstr "nu este"
+
+#: ../src/display_spl.c:121
+msgid "starts with"
+msgstr "începe cu"
+
+#: ../src/display_spl.c:122
+msgid "ends with"
+msgstr "se termină cu"
+
+#: ../src/display_spl.c:130
+msgid "is greater than"
+msgstr "este mai mare decât"
+
+#: ../src/display_spl.c:131
+msgid "is less than"
+msgstr "este mai mic decât"
+
+#: ../src/display_spl.c:132 ../src/display_spl.c:144
+msgid "is in the range"
+msgstr "este în intervalul"
+
+#: ../src/display_spl.c:140
+msgid "is after"
+msgstr "este după"
+
+#: ../src/display_spl.c:141
+msgid "is before"
+msgstr "este înainte"
+
+#: ../src/display_spl.c:142
+msgid "in the last"
+msgstr "este între ultimele"
+
+#: ../src/display_spl.c:143
+msgid "not in the last"
+msgstr "nu este între ultimele"
+
+#: ../src/display_spl.c:150
+msgid "is set"
+msgstr "este stabilit"
+
+#: ../src/display_spl.c:151
+msgid "is not set"
+msgstr "nu este stabilit"
+
+#: ../src/display_spl.c:171
+msgid "Not supported"
+msgstr "Nu este suportat"
+
+#: ../src/display_spl.c:178
+msgid "minutes"
+msgstr "minute"
+
+#: ../src/display_spl.c:180
+msgid "tracks"
+msgstr "piese"
+
+#: ../src/display_spl.c:181
+msgid "hours"
+msgstr "ore"
+
+#: ../src/display_spl.c:182 ../src/info.c:780
+msgid "GB"
+msgstr "GO"
+
+#: ../src/display_spl.c:189
+msgid "random order"
+msgstr "ordine aleatoare"
+
+#: ../src/display_spl.c:190
+msgid "title"
+msgstr "titlu"
+
+#: ../src/display_spl.c:191
+msgid "album"
+msgstr "album"
+
+#: ../src/display_spl.c:192
+msgid "artist"
+msgstr "artist"
+
+#: ../src/display_spl.c:193
+msgid "genre"
+msgstr "gen"
+
+#: ../src/display_spl.c:194
+msgid "most recently added"
+msgstr "adăugate recent"
+
+#: ../src/display_spl.c:195
+msgid "least recently added"
+msgstr "adăugate mai demult"
+
+#: ../src/display_spl.c:196
+msgid "most often played"
+msgstr "cele mai des redate"
+
+#: ../src/display_spl.c:197
+msgid "least often played"
+msgstr "cele mai rar redate"
+
+#: ../src/display_spl.c:198
+msgid "most recently played"
+msgstr "redate recent"
+
+#: ../src/display_spl.c:199
+msgid "least recently played"
+msgstr "redate mai demult"
+
+#: ../src/display_spl.c:200
+msgid "highest rating"
+msgstr "aprecierea cea mai mare"
+
+#: ../src/display_spl.c:201
+msgid "lowest rating"
+msgstr "aprecierea cea mai mică"
+
+#: ../src/display_spl.c:208 ../src/display_spl.c:217
+msgid "Movie"
+msgstr "Film"
+
+#: ../src/display_spl.c:1192 ../src/display_spl.c:1207
+msgid "to"
+msgstr "până la"
+
+#: ../src/display_spl.c:1485
+msgid "-"
+msgstr "-"
+
+#: ../src/display_spl.c:1500
+msgid "+"
+msgstr "+"
+
+#: ../src/display_tracks.c:281
+#, c-format
+msgid "Moved one track"
+msgid_plural "Moved %d tracks"
+msgstr[0] "O piesă mutată."
+msgstr[1] "%d piese mutate."
+
+#: ../src/display_tracks.c:1810
+#, c-format
+msgid ""
+"Cannot unsort track view because of a bug in the GTK lib you are using (%d.%"
+"d.%d < 2.5.4). Once you sort the track view, you cannot go back to the "
+"unsorted state.\n"
+"\n"
+msgstr ""
+"Nu pot reface acţiune de sortare din cauza unui bug în biblioteca GTK pe "
+"care o folosiţi  (%d.%d.%d < 2.5.4). O dată ce aţi sortat piesele, nu vă "
+"puteţi întoarce în starea anterioară sortării.\n"
+"\n"
+
+#: ../src/display_tracks.c:2069
+msgid "Rtng"
+msgstr "Aprec."
+
+#: ../src/display_tracks.c:2072
+msgid "#"
+msgstr "#"
+
+#: ../src/display_tracks.c:2075
+msgid "CD"
+msgstr "CD"
+
+#: ../src/display_tracks.c:2078
+msgid "ID"
+msgstr "ID"
+
+#: ../src/display_tracks.c:2081
+msgid "Trnsfrd"
+msgstr "Trnsfrt"
+
+#: ../src/display_tracks.c:2085
+msgid "Cmpl"
+msgstr "Cmpl"
+
+#: ../src/display_tracks.c:2091
+msgid "Time"
+msgstr "Timp"
+
+#: ../src/display_tracks.c:2094
+msgid "Plycnt"
+msgstr "Red"
+
+#: ../src/display_tracks.c:2106
+msgid "Released"
+msgstr "Lansat"
+
+#: ../src/display_tracks.c:2112
+msgid "Vol."
+msgstr "Vol."
+
+#: ../src/display_tracks.c:2115
+msgid "Sndchk."
+msgstr "Verif."
+
+#: ../src/fetchcover.c:358
+msgid "Coverart file already exists"
+msgstr "Fișierul copertă există deja"
+
+#: ../src/fetchcover.c:371
+#, c-format
+msgid ""
+"The picture file %s already exists.\n"
+"This may be associated with other music files in the directory.\n"
+"\n"
+"-  Clicking Yes will overwrite the existing file, possibly associating\n"
+"   other music files in the same directory with this coverart file.\n"
+"-  Clicking No will save the file with a unique file name.\n"
+"-  Clicking Cancel will abort the fetchcover operation."
+msgstr ""
+"Fişierul imagine %s există deja. \n"
+"Acesta poate fi asociat cu alte fişiere muzicale în dosar.\n"
+"\n"
+"- Dând click pe Da se va suprascrie fişierul existent, fiind posibilă \n"
+"  asocierea altor fişiere muzicale din acelaşi dosar cu acesta. \n"
+"- Dând click pe Nu se va salva fişierul cu un nume unic.\n"
+"- Dând click pe Revocare se va abandona obţinerea coperţii."
+
+#: ../src/file.c:236
+#, c-format
+msgid ""
+"'%s' is a directory, not a playlist file.\n"
+"\n"
+msgstr ""
+"'%s' este un dosar, nu un fişier listă de redare.\n"
+"\n"
+
+#: ../src/file.c:266
+#, c-format
+msgid ""
+"'%s' is a not a known playlist file.\n"
+"\n"
+msgstr ""
+"'%s' nu este un fişier listă de redare cunoscut.\n"
+"\n"
+
+#: ../src/file.c:283 ../src/file_export.c:217 ../src/oggfile.c:62
+#: ../src/wavfile.c:107
+#, c-format
+msgid "Could not open '%s' for reading.\n"
+msgstr "Nu am putut deschide '%s' pentru citire.\n"
+
+#: ../src/file.c:369
+#, c-format
+msgid "Skipping '%s' because it is a directory.\n"
+msgstr "Sar peste '%s' pentru că este un dosar.\n"
+
+#: ../src/file.c:374
+#, c-format
+msgid "Skipping '%s' to avoid adding playlist file recursively\n"
+msgstr ""
+"Sar peste '%s' pentru a evita adăugarea recursivă a fişierelor listă de "
+"redare\n"
+
+#: ../src/file.c:629
+#, c-format
+msgid "Unknown token '%s' in template '%s'\n"
+msgstr "Bucată '%s' necunoscută în şablonul '%s'\n"
+
+#: ../src/file.c:923
+#, c-format
+msgid "Local filename not valid (%s)"
+msgstr "Nume de fişier local nevalid (%s)"
+
+#: ../src/file.c:982
+#, c-format
+msgid "No information found for user '%s' in '%s'"
+msgstr "Informaţie negăsită pentru utilizatorul '%s' în '%s'"
+
+#: ../src/file.c:991
+#, c-format
+msgid "mserv data file (%s) not available for track (%s)"
+msgstr "Fişierul date mserv (%s) nu este disponibil pentru piesa (%s)"
+
+#: ../src/file.c:999
+#, c-format
+msgid "Track (%s) not in mserv music root directory (%s)"
+msgstr "Piesa (%s) nu este în dosarul rădăcină de muzică a mserv (%s)"
+
+#: ../src/file.c:1123
+#, c-format
+msgid ""
+"The following track could not be processed (file does not exist): '%s'\n"
+msgstr "Următoarea piesă nu a putut fi procesată (fişierul nu există): '%s'\n"
+
+#: ../src/file.c:1209
+#, c-format
+msgid "The following track could not be processed (filetype unknown): '%s'\n"
+msgstr ""
+"Următoarea piesă nu a putut fi procesată (tip fişier necunoscut): '%s'\n"
+
+#: ../src/file.c:1307
+#, c-format
+msgid ""
+"The following track could not be processed (filetype is known but analysis "
+"failed): '%s'\n"
+msgstr ""
+"Următoarea piesă nu a putut fi procesată (tip fişier cunoscut, dar analiza "
+"eşuată): '%s'\n"
+
+#: ../src/file.c:1337 ../src/file.c:1391
+msgid "Nothing to update"
+msgstr "Nimic de actualizat"
+
+#: ../src/file.c:1358
+#, c-format
+msgid "Updating %s"
+msgstr "Actualizez %s"
+
+#: ../src/file.c:1372
+msgid "Updated selected tracks with info from file."
+msgstr "Am actualizat piesele selectate cu informaţii din fişier."
+
+#: ../src/file.c:1406
+#, c-format
+msgid "Retrieving mserv data %s"
+msgstr "Primind date de la mserv %s"
+
+#: ../src/file.c:1411
+msgid "no filename available"
+msgstr "nume de fişier indisponibil"
+
+#: ../src/file.c:1416
+msgid "Updated selected tracks with data from mserv."
+msgstr "Am actualizat piesele selectate cu date de la mserv."
+
+#: ../src/file.c:1437
+#, c-format
+msgid "The following track could not be updated"
+msgid_plural "The following %d tracks could not be updated"
+msgstr[0] "Următoarea piesă nu a putut fi actualizată"
+msgstr[1] "Următoarele %d piese nu au putut fi actualizate"
+
+#. gint id,
+#. gboolean modal,
+#: ../src/file.c:1443
+msgid "Failed Track Update"
+msgstr "Actualizare piesă eşuată"
+
+#: ../src/file.c:1501
+#, c-format
+msgid "The following track has been updated"
+msgid_plural "The following %d tracks have been updated"
+msgstr[0] "Următoarea piesă a fost actualizată"
+msgstr[1] "Următoarele %d piese au fost actualizate"
+
+#. gint id,
+#. gboolean modal,
+#: ../src/file.c:1507
+msgid "Successful Track Update"
+msgstr "Actualizare piesă reuşită"
+
+#: ../src/file.c:1566
+#, c-format
+msgid "No mserv information could be retrieved for the following track"
+msgid_plural ""
+"No mserv information could be retrieved for the following %d tracks"
+msgstr[0] "Nu am putut obţine informaţii de la mserv pentru următoarea piesă."
+msgstr[1] ""
+"Nu am putut obţine informaţii de la mserv pentru următoarele %d piese."
+
+#. gint id,
+#. gboolean modal,
+#: ../src/file.c:1572
+msgid "mserv data retrieval problem"
+msgstr "Problemă primire date de la mserv"
+
+#: ../src/file.c:1661
+msgid "no local filename available, file on the iPod will be used instead"
+msgstr ""
+"nume de fişier local indisponibil, în schimb utilizez fişierul de pe iPod"
+
+#: ../src/file.c:1667
+msgid "no local filename available and copy on iPod cannot be found"
+msgstr ""
+"nume de fişier local indisponibil şi copia de pe iPod nu poate fi găsită"
+
+#: ../src/file.c:1671 ../src/file.c:1689
+msgid "no local filename available"
+msgstr "nume de fişier local indisponibil"
+
+#: ../src/file.c:1679
+msgid "local file could not be found, file on the iPod will be used instead"
+msgstr "fişierul local nu a fost găsit, utilizez în schimb fişierul de pe iPod"
+
+#: ../src/file.c:1685
+msgid "local file as well as copy on the iPod cannot be found"
+msgstr "nici fişierul local nici copia de pe iPod nu au putut fi găsite"
+
+#. update not successful -- log this track for later display
+#: ../src/file.c:1788
+msgid "update failed (format not supported?)"
+msgstr "actualizare eşuată (format nesuportat?)"
+
+#: ../src/file.c:1873 ../src/misc_playlist.c:916
+#, c-format
+msgid "Processing '%s'..."
+msgstr "Procesare '%s'..."
+
+#: ../src/file.c:1879
+#, c-format
+msgid "Skipping '%s' because it matches exclude masks.\n"
+msgstr "Sar peste '%s' pentru că se potriveşte cu măşti de excludere.\n"
+
+#: ../src/file.c:1999 ../src/misc_track.c:1773 ../src/misc_track.c:1878
+#, c-format
+msgid ""
+"Podcast already present: '%s'\n"
+"\n"
+msgstr ""
+"Podcast deja prezent: '%s'\n"
+"\n"
+
+#: ../src/file.c:2064
+#, c-format
+msgid ""
+"Writing to video files not yet supported (%s).\n"
+"\n"
+msgstr ""
+"Scrierea în fişiere video nu este încă suportată (%s).\n"
+"\n"
+
+#: ../src/file.c:2116 ../src/file.c:2130
+#, c-format
+msgid "Couldn't change tags of file: %s\n"
+msgstr "Nu am putut modifica etichetele fişierului: %s\n"
+
+#: ../src/file.c:2232
+#, c-format
+msgid "Could not open '%s' for reading and writing.\n"
+msgstr "Nu am putut deschide '%s' pentru citire şi scriere.\n"
+
+#: ../src/file.c:2239
+#, c-format
+msgid "Could not obtain lock on '%s'.\n"
+msgstr "Nu am putut obţine blocare pentru '%s'.\n"
+
+#. error!
+#: ../src/file.c:2256 ../src/file.c:2265 ../src/file.c:2276 ../src/file.c:2286
+#, c-format
+msgid "Malformed line in '%s': %s\n"
+msgstr "Linie malformată în '%s': %s\n"
+
+#. gint id,
+#. gboolean modal,
+#: ../src/file.c:2315
+msgid "Remove offline playcounts?"
+msgstr "Elimin contoarele de redare în mod deconectat?"
+
+#. title
+#: ../src/file.c:2316
+msgid ""
+"Some tracks played offline could not be found in the iTunesDB. Press 'OK' to "
+"remove them from the offline playcount file, 'Cancel' to keep them."
+msgstr ""
+"Unele piese redate în mod deconectat nu au putut fi găsite în iTunesDB. "
+"Apăsaţi 'OK' penru a le şterge din fişierul contor redări în mod deconectat, "
+"'Revocare' pentru a le păstra."
+
+#: ../src/file.c:2333
+#, c-format
+msgid "Error writing to '%s'.\n"
+msgstr "Eroare la scrierea către '%s'.\n"
+
+#: ../src/file.c:2390 ../src/tools.c:270
+#, c-format
+msgid ""
+"Normalization failed: file type not supported (%s).\n"
+"\n"
+msgstr ""
+"Normalizare eşuată: tip fişier nesuportat (%s).\n"
+"\n"
+
+#: ../src/file.c:2406 ../src/tools.c:287
+#, c-format
+msgid ""
+"Normalization failed: file not available (%s).\n"
+"\n"
+msgstr ""
+"Normalizare eşuată: fişier indisponibil (%s).\n"
+"\n"
+
+#: ../src/file_convert.c:316
+msgid "Summary status of conversion processes"
+msgstr "Rezumat al stării procesului de conversie"
+
+#: ../src/file_convert.c:564
+msgid "active"
+msgstr "activ"
+
+#: ../src/file_convert.c:569
+msgid "inactive"
+msgstr "inactiv"
+
+#: ../src/file_convert.c:580
+#, c-format
+msgid "Active threads: %d. Scheduled tracks: %d."
+msgstr "Fire de execuţie active: %d. Piese programate: %d."
+
+#: ../src/file_convert.c:1071
+#, c-format
+msgid "Original filename not available for '%s.'\n"
+msgstr "Nume de fişier original indisponibil pentru '%s'.\n"
+
+#: ../src/file_convert.c:1086
+#, c-format
+msgid "Filename '%s' is no longer valid for '%s'.\n"
+msgstr "Numele de fişier '%s' nu mai este valid pentru '%s'.\n"
+
+#: ../src/file_convert.c:1137
+msgid "Ogg Vorbis"
+msgstr "Ogg Vorbis"
+
+#: ../src/file_convert.c:1143
+msgid "FLAC"
+msgstr "FLAC"
+
+#: ../src/file_convert.c:1198
+#, c-format
+msgid ""
+"Files of type '%s' are not supported by the iPod. Please go to the "
+"Preferences to set up and turn on a suitable conversion script for '%s'.\n"
+"\n"
+msgstr ""
+"Fişierele de tipul '%s' nu sunt suportate de către iPod. Vă rugăm mergeţi la "
+"Preferinţe şi stabiliţi şi activaţi un script potrivit de conversie pentru '%"
+"s'.\n"
+"\n"
+
+#: ../src/file_convert.c:1284
+msgid "No information available"
+msgstr "Nici o informaţie nu este disponibilă"
+
+#: ../src/file_convert.c:1323
+#, c-format
+msgid "Could not create '%s'. Filetype conversion will not work.\n"
+msgstr "Nu am putut crea '%s'. Conversia tipului de fişier nu va funcţiona.\n"
+
+#: ../src/file_convert.c:1641 ../src/file_convert.c:3049
+#, c-format
+msgid ""
+"Transfer of '%s' failed. %s\n"
+"\n"
+msgstr ""
+"Transferul '%s' a eşuat. %s\n"
+"\n"
+
+#: ../src/file_convert.c:2047 ../src/file_convert.c:2325
+#, c-format
+msgid ""
+"Conversion of '%s' failed: '%s'.\n"
+"\n"
+msgstr ""
+"Conversia '%s' a eşuat: '%s'.\n"
+"\n"
+
+#: ../src/file_convert.c:2062
+#, c-format
+msgid ""
+"Conversion of '%s' failed: '%s %s' returned exit status %d.\n"
+"\n"
+msgstr ""
+"Conversia '%s' a eşuat: '%s %s' e returnat statusul de ieşire %d.\n"
+"\n"
+
+#: ../src/file_convert.c:2091
+#, c-format
+msgid ""
+"Conversion of '%s' failed: '\"%s\" %s' did not return filename extension as "
+"expected.\n"
+"\n"
+msgstr ""
+"Conversia '%s' eşuată: '\"%s\" %s' nu a returnat extensia de fişier "
+"aşteptată.\n"
+"\n"
+
+#: ../src/file_convert.c:2167
+#, c-format
+msgid ""
+"Conversion of '%s' failed: Could not access original file '%s' (%s).\n"
+"\n"
+msgstr ""
+"Conversia '%s' eşuată: nu am putut accesa fişierul original '%s' (%s).\n"
+"\n"
+
+#: ../src/file_convert.c:2222
+#, c-format
+msgid ""
+"Conversion of '%s' failed: Could not create directory '%s'.\n"
+"\n"
+msgstr ""
+"Conversia '%s' eşuată: nu am putut crea dosarul '%s'.\n"
+"\n"
+
+#: ../src/file_convert.c:2356
+#, c-format
+msgid ""
+"Conversion of '%s' failed: '%s' returned exit status %d.\n"
+"\n"
+msgstr ""
+"Conversia '%s' eşuată: '%s' a returnat statusul de ieşire %d.\n"
+"\n"
+
+#: ../src/file_convert.c:2395
+#, c-format
+msgid ""
+"Conversion of '%s' failed: could not stat the converted file '%s'.\n"
+"\n"
+msgstr ""
+"Conversia '%s' eşuată: nu am putut obţine informaţii (stat) despre fişierul "
+"convertit '%s'.\n"
+"\n"
+
+#: ../src/file_export.c:182
+#, c-format
+msgid "Skipping existing file with same length: '%s'\n"
+msgstr "Sar peste fişier deja existent cu aceeaşi lungime: '%s'\n"
+
+#: ../src/file_export.c:190
+#, c-format
+msgid "Overwriting existing file: '%s'\n"
+msgstr "Suprascriu fişierul existent: '%s'\n"
+
+#: ../src/file_export.c:207
+#, c-format
+msgid "Error copying '%s' to '%s': Permission Error (%s)\n"
+msgstr "Eroare la copierea '%s' către '%s': eroare de permisiune (%s)\n"
+
+#: ../src/file_export.c:209
+#, c-format
+msgid "Error copying '%s' to '%s' (%s)\n"
+msgstr "Eroare la copierea '%s' către '%s' (%s)\n"
+
+#: ../src/file_export.c:327
+#, c-format
+msgid "Could find file for '%s' on the iPod\n"
+msgstr "Nu am putut găsi fişierul pentru '%s' pe iPod\n"
+
+#. create the dialog window
+#: ../src/file_export.c:395 ../src/tools.c:360
+msgid "Information"
+msgstr "Informaţie"
+
+#: ../src/file_export.c:406 ../src/tools.c:372
+msgid "Press button to abort."
+msgstr "Apăsaţi butonul pentru a abandona."
+
+#: ../src/file_export.c:419
+msgid "copying..."
+msgstr "copiez..."
+
+#: ../src/file_export.c:476
+#, c-format
+msgid "Failed to write '%s-%s'\n"
+msgstr "Scriere eşuată '%s-%s'\n"
+
+#: ../src/file_export.c:489
+#, c-format
+msgid "Copied %d of %d track."
+msgid_plural "Copied %d of %d tracks."
+msgstr[0] "Am copiat %d piesă din %d."
+msgstr[1] "Am copiat %d piese din %d."
+
+#: ../src/file_export.c:505 ../src/tools.c:518
+#, c-format
+msgid "%d%% (%d:%02d:%02d left)"
+msgstr "%d%% (%d:%02d:%02d rămas)"
+
+#: ../src/file_export.c:514
+msgid "Some tracks were not copied."
+msgstr "Unele piese nu au fost copiate."
+
+#: ../src/file_export.c:579
+msgid "Export from iPod database not possible in offline mode."
+msgstr "Exportarea din baza de date iPod nu este posibilă în mod deconectat."
+
+#: ../src/file_export.c:587
+msgid "Select Export Destination Directory"
+msgstr "Selectaţi dosarul destinaţie pentru exportare"
+
+#: ../src/file_export.c:736
+msgid "Drag from iPod database not possible in offline mode."
+msgstr "Tragerea din baza de date a iPod nu este posibilă în mod deconectat."
+
+#: ../src/file_export.c:770
+msgid "The following tracks have to be copied to your harddisk"
+msgstr "Următoarele piese trebuie copiate pe discul dvs dur."
+
+#: ../src/file_export.c:815
+msgid ""
+"Some tracks were not copied to your harddisk. Only the copied tracks will be "
+"included in the current drag and drop operation.\n"
+"\n"
+msgstr ""
+"Unele piese nu au fost copiate pe discul dvs dur. Numai piesel copiate vor "
+"fi incluse în operaţia curentă trage şi aruncă.\n"
+"\n"
+
+#: ../src/file_export.c:1010
+#, c-format
+msgid ""
+"No valid filename for: %s\n"
+"\n"
+msgstr ""
+"Nume de fişier invalid: %s\n"
+"\n"
+
+#: ../src/file_export.c:1026
+#, c-format
+msgid "Created playlist with one track."
+msgid_plural "Created playlist with %d tracks."
+msgstr[0] "Am creat o listă de redare cu o piesă."
+msgstr[1] "Am creat o listă de redare cu %d piese."
+
+#: ../src/file_export.c:1031
+#, c-format
+msgid ""
+"Could not open '%s' for writing (%s).\n"
+"\n"
+msgstr ""
+"Nu am putut deschide '%s' pentru scriere (%s).\n"
+"\n"
+
+#: ../src/file_itunesdb.c:129
+#, c-format
+msgid "Matching SHA1 checksum for file %d/%d"
+msgstr "Potrivesc suma de control SHA1 pentru fişierul %d/%d"
+
+#: ../src/file_itunesdb.c:236
+#, c-format
+msgid "Could not open \"%s\" for reading extended info.\n"
+msgstr "Nu am putut deschide \"%s\" pentru citirea informaţiilor extinse.\n"
+
+#: ../src/file_itunesdb.c:243
+msgid "Could not create hash value from itunesdb\n"
+msgstr "Nu am putut crea valori hash din itunesdb\n"
+
+#: ../src/file_itunesdb.c:259
+#, c-format
+msgid "Error while reading extended info: %s\n"
+msgstr "Eroare la citirea informaţiilor extinse: %s\n"
+
+#: ../src/file_itunesdb.c:276
+#, c-format
+msgid ""
+"iTunesDB '%s' does not match checksum in extended information file '%s'\n"
+"gtkpod will try to match the information using SHA1 checksums. This may take "
+"a long time.\n"
+"\n"
+msgstr ""
+"iTunesDB '%s' nu se potriveşte cu suma de control din fişierul de informaţii "
+"extinse '%s'\n"
+"gtkpod va încerca să potrivească sumele de siguranţă SHA1. Acest lucru s-ar "
+"putea să dureze destul de mult.\n"
+"\n"
+
+#: ../src/file_itunesdb.c:288
+#, c-format
+msgid ""
+"%s:\n"
+"Expected \"itunesdb_hash=\" but got:\"%s\"\n"
+msgstr ""
+"%s:\n"
+"Aşteptat \"itunesdb_hash=\" dar găsit:\"%s\"\n"
+
+#: ../src/file_itunesdb.c:348
+#, c-format
+msgid ""
+"%s:\n"
+"Format error: %s\n"
+msgstr ""
+"%s:\n"
+"Eroare format: %s\n"
+
+#: ../src/file_itunesdb.c:393
+msgid ""
+"No SHA1 checksums on individual tracks are available.\n"
+"\n"
+"To avoid this situation in the future either switch on duplicate detection "
+"(will provide SHA1 checksums) or avoid using the iPod with programs other "
+"than gtkpod.\n"
+"\n"
+msgstr ""
+"Suma de control SHA1 a unor piese nu este disponibilă.\n"
+"\n"
+"Pentru a evita această situaţie pe viitor fie activați detecţia dublurilor "
+"(va oferi sumele de siguranţă SHA1) sau evitaţi să folosiţi iPod-ul cu alte "
+"programe decât gtkpod.\n"
+"\n"
+
+#: ../src/file_itunesdb.c:457
+msgid ""
+"Extended info will not be used. If you have non-transferred tracks,\n"
+"these will be lost.\n"
+msgstr ""
+"Informaţiile extinse nu vor fi utilizate. Dacă aveţi piese netransferate, \n"
+" acestea vor fi pierdute.\n"
+
+#: ../src/file_itunesdb.c:465
+msgid "Offline iPod database successfully imported"
+msgstr "Baza de date iPod deconectată a fost importată cu succes"
+
+#: ../src/file_itunesdb.c:468
+msgid "Local database successfully imported"
+msgstr "Baza de date locală a fost importată cu succes"
+
+#: ../src/file_itunesdb.c:476
+#, c-format
+msgid ""
+"Offline iPod database import failed: '%s'\n"
+"\n"
+msgstr ""
+"Importarea bazei de date iPod deconectată eşuată: '%s'\n"
+"\n"
+
+#: ../src/file_itunesdb.c:480
+#, c-format
+msgid ""
+"Local database import failed: '%s'\n"
+"\n"
+msgstr ""
+"Importarea bazei de date locală eşuată: '%s'\n"
+"\n"
+
+#: ../src/file_itunesdb.c:487
+msgid ""
+"Offline iPod database import failed: \n"
+"\n"
+msgstr ""
+"Importarea bazei de date iPod în mod deconectat eşuată: \n"
+"\n"
+
+#: ../src/file_itunesdb.c:490
+msgid ""
+"Local database import failed: \n"
+"\n"
+msgstr ""
+"Importarea bazei de date locală eşuată: \n"
+"\n"
+
+#: ../src/file_itunesdb.c:497
+#, c-format
+msgid ""
+"'%s' does not exist. Import aborted.\n"
+"\n"
+msgstr ""
+"'%s' nu există. Importare abandondată.\n"
+"\n"
+
+#: ../src/file_itunesdb.c:520
+msgid "Extended info will not be used.\n"
+msgstr "Informaţiile extinse nu vor fi folosite.\n"
+
+#: ../src/file_itunesdb.c:527
+msgid "iPod Database Successfully Imported"
+msgstr "Baza de date iPod importată cu succes"
+
+#: ../src/file_itunesdb.c:534
+#, c-format
+msgid ""
+"iPod Database Import Failed: '%s'\n"
+"\n"
+msgstr ""
+"Importul bazei de date iPod eşuat: '%s'\n"
+"\n"
+
+#: ../src/file_itunesdb.c:540
+msgid ""
+"iPod Database Import Failed.\n"
+"\n"
+msgstr ""
+"Importul bazei de date iPod eşuat.\n"
+"\n"
+
+#: ../src/file_itunesdb.c:549
+#, c-format
+msgid ""
+"'%s' (or similar) does not exist. Import aborted.\n"
+"\n"
+msgstr ""
+"'%s' (sau similar) nu există. Importare abandonată.\n"
+"\n"
+
+#: ../src/file_itunesdb.c:865
+#, c-format
+msgid ""
+"Could not find iPod directory structure at '%s'.\n"
+"If you are sure that the iPod is properly mounted at '%s', gtkpod can create "
+"the directory structure for you.\n"
+"\n"
+"Do you want to create the directory structure now?\n"
+msgstr ""
+"Nu am putut găsi structura de directoare a iPod la '%s'.\n"
+"Dacă sunteţi sigur că iPod-ul este montat corect la '%s', gtkpod poate crea "
+"structura de directoare pentru dvs.\n"
+"\n"
+"Doriţi să creaţi structura de directoare acum?\n"
+
+#: ../src/file_itunesdb.c:1180
+#, c-format
+msgid "Could not open \"%s\" for writing extended info.\n"
+msgstr "Nu am putut deschide \"%s\" pentru scrierea informaţiilor extinse.\n"
+
+#: ../src/file_itunesdb.c:1195
+msgid "Aborted writing of extended info.\n"
+msgstr "Scrierea informaţiilor extinse abandonată.\n"
+
+#: ../src/file_itunesdb.c:1397
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: ../src/file_itunesdb.c:1411
+#, c-format
+msgid "%d%% (%d/%d  %d:%02d:%02d left)"
+msgstr "%d%% (%d/%d  %d:%02d:%02d rămas)"
+
+#: ../src/file_itunesdb.c:1463
+msgid "Status: Deleting File"
+msgstr "Status: şterg fişier"
+
+#: ../src/file_itunesdb.c:1524
+#, c-format
+msgid ""
+"Could not remove the following file: '%s'\n"
+"\n"
+msgstr ""
+"Nu am putut şterge următorul fişier: '%s'\n"
+"\n"
+
+#: ../src/file_itunesdb.c:1632
+msgid ""
+"The following track could not be converted successfully:\n"
+"\n"
+msgid_plural ""
+"The following tracks could not be converted successfully:\n"
+"\n"
+msgstr[0] ""
+"Următoarea piesă nu a putut fi convertită cu succes:\n"
+"\n"
+msgstr[1] ""
+"Următoarele piese nu au putut fi convertite cu succes:\n"
+"\n"
+
+#: ../src/file_itunesdb.c:1642
+msgid ""
+"The following track could not be transferred successfully:\n"
+"\n"
+msgid_plural ""
+"The following tracks could not be transferred successfully:\n"
+"\n"
+msgstr[0] ""
+"Următoarea piesă nu a putut fi transferată cu succes:\n"
+"\n"
+msgstr[1] ""
+"Următoarele piese nu au putut fi transferate cu succes:\n"
+"\n"
+
+#. ID
+#. modal,
+#. gint id,
+#. gboolean modal,
+#: ../src/file_itunesdb.c:1651 ../src/misc_confirm.c:70
+msgid "Warning"
+msgstr "Avertizare"
+
+#. title
+#: ../src/file_itunesdb.c:1652
+msgid ""
+"The iPod could not be ejected. Please fix the problems mentioned below and "
+"then eject the iPod again. Pressing 'OK' will re-schedule the failed tracks "
+"for conversion and transfer."
+msgstr ""
+"iPod-ul nu a putut fi deconectat. Vă rugăm reparaţi problemele menţionate "
+"mai jos şi apoi deconectaţi iPod din nou. Apăsând 'Ok' va re-programa "
+"piesele eşuate pentru conversie şi transfer."
+
+#: ../src/file_itunesdb.c:1715
+#, c-format
+msgid "Status: Copying track"
+msgstr "Status: copiez piesă"
+
+#: ../src/file_itunesdb.c:1721
+#, c-format
+msgid "Status: Waiting for conversion to complete"
+msgstr "Status: aştept finalizarea conversiei"
+
+#: ../src/file_itunesdb.c:1725
+#, c-format
+msgid "Status: Finished transfer"
+msgstr "Status: transfer terminat"
+
+#: ../src/file_itunesdb.c:1770
+#, c-format
+msgid ""
+"One track could not be transferred because your iPod is full. Either delete "
+"some tracks or otherwise create space on the iPod before ejecting the iPod "
+"again."
+msgid_plural ""
+"%d tracks could not be transferred because your iPod is full. Either delete "
+"some tracks or otherwise create space on the iPod before ejecting the iPod "
+"again."
+msgstr[0] ""
+"O piesă nu a putut fi transferată deoarece iPod-ul este plin. Fie ştergeţi "
+"nişte piese sau creaţi spaţiu într-un alt mod pe iPod înainte de a deconecta "
+"iPod-ul din nou."
+msgstr[1] ""
+"%d piese nu au putut fi transferate deoarece iPod-ul este plin. Fie ştergeţi "
+"nişte piese sau creaţi spaţiu într-un alt mod pe iPod înainte de a deconecta "
+"iPod-ul din nou."
+
+#: ../src/file_itunesdb.c:1852
+#, c-format
+msgid ""
+"You did not import the existing iTunesDB ('%s'). This is most likely "
+"incorrect and will result in the loss of the existing database.\n"
+"\n"
+"Press 'OK' if you want to proceed anyhow or 'Cancel' to skip storing. If you "
+"cancel, you can import the existing database before calling this function "
+"again.\n"
+msgstr ""
+"Nu aţi importat iTunesDB existentă ('%s'). Acest lucru este cel mai probabil "
+"incorect, iar rezultatul va fi pierderea bazei de date existentă.\n"
+"\n"
+"Apăsaţi 'Ok' dacă doriţi să continuaţi oricum sau 'Revocare' ca să săriţi "
+"peste memorare. Dacă revocaţi, puteţi importa baza de date existentă înainte "
+"de a apela această funcţie din nou.\n"
+
+#: ../src/file_itunesdb.c:1887
+msgid ""
+"iPod directory structure must be present before synching to the iPod can be "
+"performed.\n"
+msgstr ""
+"Structura de dosare a iPod trebuie să fie prezentă înainte de a putea "
+"efectua sincronizarea iPod.\n"
+
+#: ../src/file_itunesdb.c:1896
+msgid "Some tracks could not be deleted from the iPod. Export aborted!"
+msgstr "Unele piese nu au putut fi şterse de pe iPod. Exportare abandonată!"
+
+#: ../src/file_itunesdb.c:1914
+#, c-format
+msgid "Now writing database '%s'. Please wait..."
+msgstr "Scriu în baza de date '%s'. Vă rugăm aşteptaţi..."
+
+#: ../src/file_itunesdb.c:1963
+#, c-format
+msgid "Extended information file not deleted: '%s'"
+msgstr "Fişierul de informaţii extinse nu a fost şters: '%s'"
+
+#: ../src/file_itunesdb.c:2070
+#, c-format
+msgid "%s: Database saved"
+msgstr "%s: bază de date salvată"
+
+#: ../src/file_itunesdb.c:2074
+#, c-format
+msgid "%s: Changes saved"
+msgstr "%s: schimbări salvate"
+
+#: ../src/fileselection.c:129
+msgid "Successfully added files"
+msgstr "Fişiere adăugate cu succes"
+
+#: ../src/fileselection.c:131
+msgid "Some files were not added successfully"
+msgstr "Unele fişiere nu au fost adăugate cu succes"
+
+#: ../src/fileselection.c:164 ../src/fileselection.c:305
+#: ../src/fileselection.c:792
+msgid "Please select a playlist or repository before adding tracks."
+msgstr ""
+"Vă rugăm selectaţi o listă de redare sau un depozit înainte de a adăuga "
+"piese."
+
+#: ../src/fileselection.c:175 ../src/fileselection.c:314
+#: ../src/fileselection.c:803
+msgid "Please load the iPod before adding tracks."
+msgstr "Vă rugăm încărcaţi iPod-ul înainte de a adăuga piese."
+
+#: ../src/fileselection.c:185
+#, c-format
+msgid "Add files to '%s'"
+msgstr "Adaugă fişiere la '%s'"
+
+#: ../src/fileselection.c:189
+#, c-format
+msgid "Add files to '%s/%s'"
+msgstr "Adaugă fişiere la '%s/%s'"
+
+#. Create window title
+#: ../src/fileselection.c:322
+#, c-format
+msgid "Add playlist files to '%s'"
+msgstr "Adaugă fişiere listă de redare la '%s'"
+
+#. Create the file chooser, and handle the response
+#: ../src/fileselection.c:378
+msgid "Set Cover"
+msgstr "Stabileşte coperta"
+
+#: ../src/fileselection.c:816
+#, c-format
+msgid "Add directories to '%s'"
+msgstr "Adaugă dosare la '%s'"
+
+#: ../src/fileselection.c:820
+#, c-format
+msgid "Add directories to '%s/%s'"
+msgstr "Adaugă dosare la '%s/%s'"
+
+#: ../src/fileselection.c:1097
+msgid "Ok"
+msgstr "Ok"
+
+#: ../src/fileselection.c:1106
+msgid "Cancel"
+msgstr "Revocare"
+
+#: ../src/flacfile.c:62
+#, c-format
+msgid "'%s' does not appear to be an FLAC audio file.\n"
+msgstr "'%s' nu pare să fie un fişier audio FLAC.\n"
+
+#: ../src/flacfile.c:78
+#, c-format
+msgid "Error retrieving tags for '%s'.\n"
+msgstr "Eroare la primirea etichetelor pentru '%s'.\n"
+
+#: ../src/flacfile.c:165
+#, c-format
+msgid ""
+"Import of '%s' failed: FLAC not supported without the FLAC library. You must "
+"compile the gtkpod source together with the FLAC library.\n"
+msgstr ""
+"Importarea '%s' eşuată: FLAC nu este suportat fără biblioteca FLAC. Trebuie "
+"să compilaţi sursa gtkpod împreună cu biblioteca FLAC.\n"
+
+#: ../src/flacfile.c:171
+#, c-format
+msgid ""
+"FLAC metadata update for '%s' failed: FLAC not supported without the FLAC "
+"library. You must compile the gtkpod source together with the FLAC library.\n"
+msgstr ""
+"Actualizarea metadata FLAC pentru '%s' eşuată: FLAC nu este suportat fără "
+"biblioteca FLAC. Trebuie să compilaţi sursa gtkpod împreună cu biblioteca "
+"FLAC.\n"
+
+#: ../src/getopt.c:681
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: opţiunea `%s' este ambiguă\n"
+
+#: ../src/getopt.c:706
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: opţiunea `--%s' nu permite niciun argument\n"
+
+#: ../src/getopt.c:711
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: opţiunea `%c%s' nu permite niciun argument\n"
+
+#: ../src/getopt.c:729 ../src/getopt.c:902
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: opţiunea `%s' necesită un argument\n"
+
+#. --option
+#: ../src/getopt.c:758
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: opţiune nerecunoscută `--%s'\n"
+
+#. +option or -option
+#: ../src/getopt.c:762
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: opţiune nerecunoscută `%c%s'\n"
+
+#. 1003.2 specifies the format of this message.
+#: ../src/getopt.c:788
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: opţiune ilegală -- %c\n"
+
+#: ../src/getopt.c:791
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: opţiune invalidă -- %c\n"
+
+#. 1003.2 specifies the format of this message.
+#: ../src/getopt.c:821 ../src/getopt.c:951
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: opţiunea necesită un argument --%c\n"
+
+#: ../src/getopt.c:868
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: opţiunea `-W %s' este ambiguă\n"
+
+#: ../src/getopt.c:886
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: opţiunea `-W %s' nu permite argumente\n"
+
+#: ../src/info.c:383
+msgid "n/c"
+msgstr "n/c"
+
+#: ../src/info.c:388 ../src/info.c:838
+msgid "offline"
+msgstr "deconectat"
+
+#: ../src/info.c:486
+#, c-format
+msgid " P:%d T:%d/%d"
+msgstr " L:%d P:%d/%d"
+
+#: ../src/info.c:780
+msgid "B"
+msgstr "O"
+
+#: ../src/info.c:780
+msgid "kB"
+msgstr "kO"
+
+#: ../src/info.c:780
+msgid "TB"
+msgstr "TB"
+
+#: ../src/info.c:823
+#, c-format
+msgid " %s Free"
+msgstr "%s liber"
+
+#: ../src/info.c:828
+#, c-format
+msgid " %s Pending"
+msgstr "%s în aşteptare"
+
+#: ../src/info.c:833
+msgid " disconnected"
+msgstr "deconectat"
+
+#: ../src/info.c:884
+msgid "No database or playlist selected"
+msgstr "Nici o bază de date sau listă de redare selectată"
+
+#: ../src/info.c:889
+msgid "No tracks selected"
+msgstr "Nici o piesă selectată"
+
+#: ../src/info.c:894
+msgid "No playlist selected"
+msgstr "Nici o listă de redare selectată"
+
+#: ../src/info.c:899
+msgid "No iPod or iPod playlist selected"
+msgstr "Nici un iPod sau listă de redare de pe iPod selectat(ă)"
+
+#. Strings used several times
+#: ../src/ipod_init.c:48
+msgid "Select or enter your model"
+msgstr "Selectaţi sau introduceţi modelul dvs"
+
+#: ../src/ipod_init.c:79 ../src/repository.c:546 ../src/repository.c:2369
+msgid "Select mountpoint"
+msgstr "Selectează punct de montare"
+
+#: ../src/ipod_init.c:359
+#, c-format
+msgid "Error initialising iPod: %s\n"
+msgstr "Eroare la iniţializarea iPod: %s\n"
+
+#: ../src/ipod_init.c:366
+msgid "Error initialising iPod, unknown error\n"
+msgstr "Eroare la iniţializarea iPod, eroare necunoscută\n"
+
+#: ../src/ipod_init.c:422
+#, c-format
+msgid "<b>Please select your iPod model at </b><i>%s</i>"
+msgstr "<b>Vă rugăm selectaţi modelul dvs de iPod conectat la </b><i>%s</i>"
+
+#: ../src/ipod_init.c:463
+msgid ""
+"Could not determine the model you selected -- this could be a bug or "
+"incompatibilty in the GTK+ or glade library.\n"
+"\n"
+msgstr ""
+"Nu am putut determina modelul pe care l-aţi selecta -- acest lucru poate fi "
+"un bug sau o incompatibilitate în bibliotecile GTK+ sau glade.\n"
+"\n"
+
+#: ../src/misc.c:70
+msgid ""
+"© 2002 - 2007\n"
+"Jorg Schuler (jcsjcs at users dot sourceforge dot net)\n"
+"Corey Donohoe (atmos at atmos dot org)\n"
+msgstr ""
+"© 2002 - 2007\n"
+"Jorg Schuler (jcsjcs at users dot sourceforge dot net)\n"
+"Corey Donohoe (atmos at atmos dot org)\n"
+
+#: ../src/misc.c:74
+msgid ""
+"Patches were supplied by the following people (list may be incomplete -- "
+"please contact me)\n"
+msgstr ""
+"Petice şi îmbunăţiri au fost oferite de către următoarele persoane (lista "
+"poate fi incompletă, vă rog contactaţi-mă)\n"
+
+#: ../src/misc.c:75
+msgid "Ramesh Dharan: Multi-Edit (edit tags of several tracks in one run)"
+msgstr "Ramesh Dharan: Multi-Edit (edit tags of several tracks in one run)"
+
+#: ../src/misc.c:76
+msgid "Hiroshi Kawashima: Japanese charset autodetection feature"
+msgstr "Hiroshi Kawashima: Japanese charset autodetecion feature"
+
+#: ../src/misc.c:77
+msgid "Adrian Ulrich: porting of playlist code from mktunes.pl to itunesdb.c"
+msgstr "Adrian Ulrich: porting of playlist code from mktunes.pl to itunesdb.c"
+
+#: ../src/misc.c:78
+msgid ""
+"Walter Bell: correct handling of DND URIs with escaped characters and/or cr/"
+"newlines at the end"
+msgstr ""
+"Walter Bell: correct handling of DND URIs with escaped characters and/or cr/"
+"newlines at the end"
+
+#: ../src/misc.c:79
+msgid "Sam Clegg: user defined filenames when exporting tracks from the iPod"
+msgstr "Sam Clegg: user defined filenames when exporting tracks from the iPod"
+
+#: ../src/misc.c:80
+msgid "Chris Cutler: automatic creation of various playlist types"
+msgstr "Chris Cutler: automatic creation of various playlist types"
+
+#: ../src/misc.c:81
+msgid ""
+"Graeme Wilford: reading and writing of the 'Composer' ID3 tags, progress "
+"dialogue during sync"
+msgstr ""
+"Graeme Wilford: reading and writing of the 'Composer' ID3 tags, progress "
+"dialogue during sync"
+
+#: ../src/misc.c:82
+msgid ""
+"Edward Matteucci: debugging, special playlist creation, most of the volume "
+"normalizing code"
+msgstr ""
+"Edward Matteucci: debugging, special playlist creation, most of the volume "
+"normalizing code"
+
+#: ../src/misc.c:83
+msgid "Jens Lautenbach: some optical improvements"
+msgstr "Jens Lautenbach: some optical improvements"
+
+#: ../src/misc.c:84
+msgid "Alex Tribble: iPod eject patch"
+msgstr "Alex Tribble: iPod eject patch"
+
+#: ../src/misc.c:85
+msgid "Yaroslav Halchenko: Orphaned and dangling tracks handling"
+msgstr "Yaroslav Halchenko: Orphaned and dangling tracks handling"
+
+#: ../src/misc.c:86
+msgid ""
+"Andrew Huntwork: Filename case sensitivity fix and various other bugfixes"
+msgstr ""
+"Andrew Huntwork: Filename case sensitivity fix and various other bugfixes"
+
+#: ../src/misc.c:87
+msgid ""
+"Ero Carrera: Filename validation and quick sync when copying tracks from the "
+"iPod"
+msgstr ""
+"Ero Carrera: Filename validation and quick sync when copying tracks from the "
+"iPod"
+
+#: ../src/misc.c:88
+msgid "Jens Taprogge: Support for LAME's replay gain tag to normalize volume"
+msgstr "Jens Taprogge: Support for LAME's replay gain tag to normalize volume"
+
+#: ../src/misc.c:89
+msgid "Armando Atienza: Support with external playcounts"
+msgstr "Armando Atienza: Support with external playcounts"
+
+#: ../src/misc.c:90
+msgid "D.L. Sharp: Support for m4b files (bookmarkable AAC files)"
+msgstr "D.L. Sharp: Support for m4b files (bookmarkable AAC files)"
+
+#: ../src/misc.c:91
+msgid "Jim Hall: Decent INSTALL file"
+msgstr "Jim Hall: Decent INSTALL file"
+
+#: ../src/misc.c:92
+msgid ""
+"Juergen Helmers, Markus Gaugusch: Conversion scripts to sync calendar/"
+"contacts to the iPod"
+msgstr ""
+"Juergen Helmers, Markus Gaugusch: Conversion scripts to sync calendar/"
+"contacts to the iPod"
+
+#. J"urgen!
+#: ../src/misc.c:93
+msgid "Flavio Stanchina: bugfixes"
+msgstr "Flavio Stanchina: bugfixes"
+
+#: ../src/misc.c:94
+msgid ""
+"Chris Micacchi: when sorting ignore 'the' and similar at the beginning of "
+"the title"
+msgstr ""
+"Chris Micacchi: when sorting ignore 'the' and similar at the beginning of "
+"the title"
+
+#: ../src/misc.c:95
+msgid "Steve Jay: use statvfs() instead of df (better portability, faster)"
+msgstr "Steve Jay: use statvfs() instead of df (better portability, faster)"
+
+#: ../src/misc.c:97
+msgid ""
+"Christoph Kunz: address compatibility issues when writing id3v2.4 type mp3 "
+"tags"
+msgstr ""
+"Christoph Kunz: address compatibility issues when writing id3v2.4 type mp3 "
+"tags"
+
+#: ../src/misc.c:99
+msgid ""
+"James Liggett:\n"
+"replacement of old GTK file selection dialogs with new GTK filechooser "
+"dialogs\n"
+"refactored user preferences system."
+msgstr ""
+"James Liggett:\n"
+"replacement of old GTK file selection dialogs with new GTK filechooser "
+"dialogs\n"
+"refactored user preferences system."
+
+#: ../src/misc.c:103
+msgid "Daniel Kercher: sync scripts for abook and webcalendar"
+msgstr "Daniel Kercher: sync scripts for abook and webcalendar"
+
+#: ../src/misc.c:105
+msgid "Clinton Gormley: sync scripts for thunderbird"
+msgstr "Clinton Gormley: sync scripts for thunderbird"
+
+#: ../src/misc.c:107
+msgid "Sebastien Beridot: sync script for ldif addressbook format"
+msgstr "Sebastien Beridot: sync script for ldif addressbook format"
+
+#: ../src/misc.c:109
+msgid "Sebastian Scherer: sync script for kNotes"
+msgstr "Sebastian Scherer: sync script for kNotes"
+
+#: ../src/misc.c:111
+msgid "Nick Piper: sync script for Palm, type-ahead search"
+msgstr "Nick Piper: sync script for Palm, type-ahead search"
+
+#: ../src/misc.c:113
+msgid "Uwe Hermann: help with support for iPod Video"
+msgstr "Uwe Hermann: help with support for iPod Video"
+
+#: ../src/misc.c:115
+msgid ""
+"Iain Benson: support for compilation tag in mp3 files and separate display "
+"of compilations in the sort tab."
+msgstr ""
+"Iain Benson: support for compilation tag in mp3 files and separate display "
+"of compilations in the sort tab."
+
+#: ../src/misc.c:116
+msgid ""
+"Nicolas Chariot: icons of buttons\n"
+"\n"
+msgstr ""
+"Nicolas Chariot: iconurile butoanelor\n"
+"\n"
+
+#: ../src/misc.c:118
+msgid "This program borrows code from the following projects:"
+msgstr "Programul împrumută cod de la următoarele proiecte:"
+
+#: ../src/misc.c:119
+msgid ""
+"gnutools: (mktunes.pl, ported to C) reading and writing of iTunesDB  (http://"
+"www.gnu.org/software/gnupod/)"
+msgstr ""
+"gnutools: (mktunes.pl, ported to C) reading and writing of iTunesDB (http://"
+"www.gnu.org/software/gnupod/)"
+
+#: ../src/misc.c:120
+msgid ""
+"iPod.cpp, iPod.h by Samuel Wood (sam dot wood at gmail dot com): some code "
+"for smart playlists is based on his C++-classes."
+msgstr ""
+"iPod.cpp, iPod.h by Samuel Wood (sam dot wood at gmail dot com): some code "
+"for smart playlists is based on his C++-classes."
+
+#: ../src/misc.c:121
+msgid "mp3info: mp3 playlength detection (http://ibiblio.org/mp3info/)"
+msgstr "mp3info: mp3 playlength detection (http://ibiblio.org/mp3info/)"
+
+#: ../src/misc.c:122
+msgid "xmms: dirbrowser, mp3 playlength detection (http://www.xmms.org)"
+msgstr "xmms: dirbrowser, mp3 playlength detection (http://www.xmms.org)"
+
+#: ../src/misc.c:124
+msgid "The GUI was created with the help of glade-2 (http://glade.gnome.org/)."
+msgstr ""
+"Interfaţa utilizator grafică (GUI) a fost creată cu ajutorul glade-2 (http://"
+"glade.gnome.org/)."
+
+#: ../src/misc.c:128
+msgid "French: David Le Brun (david at dyn-ns dot net)"
+msgstr "Franceză:   David Le Brun (david at dyn-ns dot net)"
+
+#: ../src/misc.c:129
+msgid "French: Éric Lassauge (rpmfarm at free dot fr)"
+msgstr "Franceză: Éric Lassauge (rpmfarm at free dot fr)"
+
+#: ../src/misc.c:130
+msgid "German: Jorg Schuler (jcsjcs at users dot sourceforge dot net)"
+msgstr "Germană:   Jorg Schuler (jcsjcs at users dot sourceforge dot net)"
+
+#: ../src/misc.c:131
+msgid "German: Kai-Ove"
+msgstr "Germană: Kai-Ove"
+
+#: ../src/misc.c:132
+msgid "Hebrew: Assaf Gillat (gillata at gmail dot com)"
+msgstr "Ebraică: Assaf Gillat (gillata at gmail dot com)"
+
+#: ../src/misc.c:133
+msgid ""
+"Italian: Edward Matteucci (edward_matteucc at users dot sourceforge dot net)"
+msgstr ""
+"Italiană:  Edward Matteucci (edward_matteucc at users dot sourceforge dot "
+"net)"
+
+#: ../src/misc.c:134
+msgid "Italian: Daniele Forsi (dforsi at gmail dot com)"
+msgstr "Italiană: Daniele Forsi (dforsi at gmail dot com)"
+
+#: ../src/misc.c:135
+msgid "Japanese: Ayako Sano"
+msgstr "Japoneză: Ayako Sano"
+
+#: ../src/misc.c:136
+msgid "Japanese: Kentaro Fukuchi (fukuchi at users dot sourceforge dot net)"
+msgstr "Japoneză: Kentaro Fukuchi (fukuchi at users dot sourceforge dot net)"
+
+#: ../src/misc.c:137
+msgid "Romanian: Alex Eftimie (alexeftimie at gmail dot com)"
+msgstr "Română: Alex Eftimie (alexeftimie at gmail dot com)"
+
+#: ../src/misc.c:138
+msgid "Spanish: Alejandro Lamas Daviña (alejandro.lamas at ific dot uv dot es)"
+msgstr ""
+"Spaniolă: Alejandro Lamas Daviña (alejandro.lamas at ific dot uv dot es)"
+
+#: ../src/misc.c:139
+msgid "Swedish: Stefan Asserhall (stefan.asserhall at comhem dot se)"
+msgstr "Suedeză: Stefan Asserhall (stefan asserhall at comhem dot se)"
+
+#: ../src/misc.c:144
+msgid ""
+"This program is free software; you can redistribute it and/or\n"
+"modify it under the terms of the GNU General Public License as\n"
+"published by the Free Software Foundation; either version 2 of the\n"
+"License, or (at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful, but\n"
+"WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See\n"
+"the GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public\n"
+"License along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA\n"
+"02111-1307, USA."
+msgstr ""
+"Acest program este liber; îl puteţi redistribui şi/sau modifica în     "
+"conformitate cu termenii Licenţei Publice Generale GNU aşa cum este "
+"publicată de Free Software Foundation; fie versiunea 2 a Licenţei, fie (la "
+"latitudinea dumneavoastră) orice versiune ulterioară.\n"
+"\n"
+"Acest program este distribuit cu speranţa că va fi util, dar FĂRĂ NICI O "
+"GARANŢIE, fără garanţie implicită de vandabilitate şi conformitate unui "
+"anumit scop.  Citiţi Licenţa Publică Generală GNU pentru detalii.\n"
+"\n"
+"Ar trebui să fi primit o copie a Licenței Publice Generale GNU\n"
+"alături de acest program; dacă nu, puteți scrie către Free Software\n"
+"Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA\n"
+"02111-1307, USA."
+
+#: ../src/misc.c:159
+msgid ""
+"© 2002-2007\n"
+"Jorg Schuler <jcsjcs at users.sourceforge.net>\n"
+"Corey Donohoe <atmos at atmos.org>"
+msgstr ""
+"© 2002 - 2007\n"
+"Jorg Schuler <jcsjcs at users dot sourceforge dot net>\n"
+"Corey Donohoe <atmos at atmos dot org>"
+
+#: ../src/misc.c:167
+msgid "Cross-platform multilingual interface to Apple's iPod™"
+msgstr "Interfaţă multiplatformă multilingvă pentru iPod-ul Apple™"
+
+#: ../src/misc.c:934
+#, c-format
+msgid "Could not process '%s' (no filename available)"
+msgstr "Nu am putut procesa '%s' (numele de fişier indisponibil)"
+
+#: ../src/misc.c:1088
+#, c-format
+msgid "Unknown token '%%%c' in template '%s'"
+msgstr "Bucată '%%%c' necunoscută în şablonul '%s'"
+
+#: ../src/misc.c:1171
+#, c-format
+msgid "Template ('%s') does not match file type '%s'\n"
+msgstr "Şablonul ('%s') nu se potriveşte cu tipul de fişier '%s'\n"
+
+#: ../src/misc.c:1257
+#, c-format
+msgid "Error creating %s: %s\n"
+msgstr "Eroare la crearea %s: %s\n"
+
+#: ../src/misc.c:1691
+#, c-format
+msgid ""
+"Writing preferences file '%s' failed (%s).\n"
+"\n"
+msgstr ""
+"Scrierea fişierului de preferinţe '%s' eşuată (%s).\n"
+"\n"
+
+#: ../src/misc.c:1693
+msgid "unspecified error"
+msgstr "eroare nespecificată"
+
+#: ../src/misc.c:1701
+#, c-format
+msgid ""
+"Writing preferences to the iPod (%s) failed: could not get path to Control "
+"Directory.\n"
+"\n"
+msgstr ""
+"Scrierea preferinţelor pe iPod (%s) eşuată: nu am putut obţine calea către "
+"Control Directory.\n"
+"\n"
+
+#. title
+#: ../src/misc_confirm.c:71
+msgid "The following has occurred:"
+msgstr "S-au petrecut următoarele:"
+
+#: ../src/misc_confirm.c:122
+msgid ""
+"Are you sure you want to delete the following track completely from your "
+"iPod? The number of playlists this track is a member of is indicated in "
+"parentheses."
+msgid_plural ""
+"Are you sure you want to delete the following tracks completely from your "
+"iPod? The number of playlists the tracks are member of is indicated in "
+"parentheses."
+msgstr[0] ""
+"Sunteţi sigur că doriţi să ştergeţi complet următoarea piesă de pe iPod? "
+"Numărul listelor de redare în care această piesă este prezentă, este indicat "
+"în paranteză."
+msgstr[1] ""
+"Sunteţi sigur că doriţi să ştergeţi complet următoarele piese de pe iPod? "
+"Numărul listelor de redare în care aceste piese sunt prezente, este indicat "
+"în paranteză."
+
+#: ../src/misc_confirm.c:126
+msgid "Delete Track Completely from iPod?"
+msgid_plural "Delete Tracks Completely from iPod?"
+msgstr[0] "Şterg complet piesa de pe iPod?"
+msgstr[1] "Şterg complet piesele de pe iPod?"
+
+#: ../src/misc_confirm.c:137 ../src/misc_confirm.c:178
+#, c-format
+msgid ""
+"Are you sure you want to remove the following track from the playlist \"%s\"?"
+msgid_plural ""
+"Are you sure you want to remove the following tracks from the playlist \"%s"
+"\"?"
+msgstr[0] ""
+"Sunteţi sigur că doriţi să ştergeţi următoarea piesă din lista de redare \"%s"
+"\"?"
+msgstr[1] ""
+"Sunteţi sigur că doriţi să ştergeţi următoarele piese din lista de redare \"%"
+"s\"?"
+
+#: ../src/misc_confirm.c:141 ../src/misc_confirm.c:182
+msgid "Remove Track From Playlist?"
+msgid_plural "Remove Tracks From Playlist?"
+msgstr[0] "Şterg piesa din lista de redare?"
+msgstr[1] "Şterg piesele din lista de redare?"
+
+#: ../src/misc_confirm.c:163
+msgid ""
+"Are you sure you want to delete the following track completely from your "
+"harddisk? The number of playlists this track is a member of is indicated in "
+"parentheses."
+msgid_plural ""
+"Are you sure you want to delete the following tracks completely from your "
+"harddisk? The number of playlists the tracks are member of is indicated in "
+"parentheses."
+msgstr[0] ""
+"Sunteţi sigur că doriţi să ştergeţi complet următoarea piesă de pe discul "
+"dur? Numărul listelor de redare în care această piesă este prezentă, este "
+"indicat în paranteză."
+msgstr[1] ""
+"Sunteţi sigur că doriţi să ştergeţi complet următoarele piese de pe discul "
+"dur? Numărul listelor de redare în care aceste piese sunt prezente, este "
+"indicat în paranteză."
+
+#: ../src/misc_confirm.c:167
+msgid "Delete Track from Harddisk?"
+msgid_plural "Delete Tracks from Harddisk?"
+msgstr[0] "Şterg complet piesa de pe discul dur?"
+msgstr[1] "Şterg complet piesele de pe discul dur?"
+
+#: ../src/misc_confirm.c:192
+msgid ""
+"Are you sure you want to remove the following track completely from your "
+"local database? The number of playlists this track is a member of is "
+"indicated in parentheses."
+msgid_plural ""
+"Are you sure you want to remove the following tracks completely from your "
+"local database? The number of playlists the tracks are member of is "
+"indicated in parentheses."
+msgstr[0] ""
+"Sunteţi sigur că doriţi să ştergeţi complet următoarea piesă din baza de "
+"date locală? Numărul listelor de redare în care această piesă este prezentă, "
+"este indicat în paranteză."
+msgstr[1] ""
+"Sunteţi sigur că doriţi să ştergeţi complet următoarele piese din baza de "
+"date locală? Numărul listelor de redare în care aceste piese sunt prezente, "
+"este indicat în paranteză."
+
+#: ../src/misc_confirm.c:196
+msgid "Remove Track from Local Database?"
+msgid_plural "Remove Tracks from Local Database?"
+msgstr[0] "Şterg piesa din baza de date locală?"
+msgstr[1] "Şterg piesele din baza de date locală?"
+
+#: ../src/misc_confirm.c:261
+#, c-format
+msgid "Deleted one track completely from iPod"
+msgid_plural "Deleted %d tracks completely from iPod"
+msgstr[0] "\t\t\t\t"
+msgstr[1] "Am şters complet %d piese de pe iPod"
+
+#: ../src/misc_confirm.c:267 ../src/misc_confirm.c:291
+#, c-format
+msgid "Deleted %d track from playlist '%s'"
+msgid_plural "Deleted %d tracks from playlist '%s'"
+msgstr[0] "Am şters complet %d piesă din lista de redare '%s'"
+msgstr[1] "Am şters complet %d piese din lista de redare '%s'"
+
+#: ../src/misc_confirm.c:285
+#, c-format
+msgid "Deleted one track from harddisk"
+msgid_plural "Deleted %d tracks from harddisk"
+msgstr[0] "Am şters o piesă de pe discul dur"
+msgstr[1] "Am şters %d piese de pe discul dur"
+
+#: ../src/misc_confirm.c:297
+#, c-format
+msgid "Deleted track from local database"
+msgid_plural "Deleted %d tracks from local database"
+msgstr[0] "Am şters o piesă din baza de date locală"
+msgstr[1] "Am şters %d piese din baza de date locală"
+
+#: ../src/misc_confirm.c:442
+msgid "Cannot remove entry 'All'"
+msgstr "Nu pot şterge înregistrarea 'Toate'"
+
+#: ../src/misc_confirm.c:536
+#, c-format
+msgid "Removed all %d tracks from the iPod"
+msgstr "Am eliminat toate %d piese de pe iPod"
+
+#: ../src/misc_confirm.c:541
+#, c-format
+msgid "Removed all podcasts from the iPod"
+msgstr "Am şters toate podcasturile de pe iPod"
+
+#: ../src/misc_confirm.c:550 ../src/misc_confirm.c:624
+#, c-format
+msgid "Deleted playlist '%s' including %d member track"
+msgid_plural "Deleted playlist '%s' including %d member tracks"
+msgstr[0] "Am şters lista de redare '%s' incluzând %d piesă membru."
+msgstr[1] "Am şters lista de redare '%s' incluzând %d piese membre."
+
+#. first use playlist name
+#: ../src/misc_confirm.c:566 ../src/misc_confirm.c:640
+#, c-format
+msgid "Deleted playlist '%s'"
+msgstr "Am şters lista de redare '%s'"
+
+#: ../src/misc_confirm.c:600
+#, c-format
+msgid "Deleted playlist '%s' including %d member track on harddisk"
+msgid_plural "Deleted playlist '%s' including %d member tracks on harddisk"
+msgstr[0] ""
+"Am şters lista de redare '%s' incluzând %d piesă membru pe discul dur."
+msgstr[1] ""
+"Am şters lista de redare '%s' incluzând %d piese membre pe discul dur."
+
+#: ../src/misc_confirm.c:617
+#, c-format
+msgid "Removed all %d tracks from the database"
+msgstr "Am şters toate %d piese din baza de date"
+
+#: ../src/misc_confirm.c:695
+#, c-format
+msgid "Are you sure you want to remove all tracks from your iPod?"
+msgstr "Sunteţi sigur că doriţi să ştergeţi toate piesele de pe iPod-ul dvs?"
+
+#: ../src/misc_confirm.c:700
+#, c-format
+msgid "Are you sure you want to remove all podcasts from your iPod?"
+msgstr ""
+"Sunteţi sigur că doriţi să ştergeţi toate podcasturile de pe iPod-ul dvs?"
+
+#: ../src/misc_confirm.c:708
+#, c-format
+msgid ""
+"Are you sure you want to delete playlist '%s' and the following track "
+"completely from your iPod? The number of playlists this track is a member of "
+"is indicated in parentheses."
+msgid_plural ""
+"Are you sure you want to delete playlist '%s' and the following tracks "
+"completely from your iPod? The number of playlists the tracks are member of "
+"is indicated in parentheses."
+msgstr[0] ""
+"Sunteţi sigur că doriţi să ştergeţi lista de redare '%s' şi următoarea piesă "
+"de pe iPod? Numărul listelor de redare în care această piesă este membră "
+"este indicat între paranteze."
+msgstr[1] ""
+"Sunteţi sigur că doriţi să ştergeţi lista de redare '%s' şi următoarele "
+"piese de pe iPod? Numărul listelor de redare în care aceste piese sunt "
+"membre este indicat între paranteze."
+
+#: ../src/misc_confirm.c:719 ../src/misc_confirm.c:774
+#, c-format
+msgid "Are you sure you want to delete the playlist '%s'?"
+msgstr "Sunteţi sigur că doriţi să ştergeţi lista de redare '%s'?"
+
+#: ../src/misc_confirm.c:745
+#, c-format
+msgid ""
+"Are you sure you want to delete playlist '%s' and remove the following track "
+"from your harddisk? The number of playlists this track is a member of is "
+"indicated in parentheses."
+msgid_plural ""
+"Are you sure you want to delete playlist '%s' and remove the following "
+"tracks from your harddisk? The number of playlists the tracks are member of "
+"is indicated in parentheses."
+msgstr[0] ""
+"Sunteţi sigur că doriţi să ştergeţi lista de redare '%s' şi următoarea piesă "
+"de pe discul dur? Numărul listelor de redare în care această piesă este "
+"membră este indicat în paranteze."
+msgstr[1] ""
+"Sunteţi sigur că doriţi să ştergeţi lista de redare '%s' şi următoarele "
+"piese de pe discul dur? Numărul listelor de redare în care aceste piese sunt "
+"membre este indicat în paranteze."
+
+#: ../src/misc_confirm.c:753
+#, c-format
+msgid "Are you sure you want to remove all tracks from the database?"
+msgstr "Sunteţi sigur că doriţi să ştergeţi toate piesele din baza de date?"
+
+#: ../src/misc_confirm.c:762
+#, c-format
+msgid ""
+"Are you sure you want to delete playlist '%s' and remove the following track "
+"from the database? The number of playlists this track is a member of is "
+"indicated in parentheses."
+msgid_plural ""
+"Are you sure you want to delete playlist '%s' and remove the following "
+"tracks from the database? The number of playlists the tracks are member of "
+"is indicated in parentheses."
+msgstr[0] ""
+"Sunteţi sigur că doriţi să ştergeţi lista de redare '%s' şi următoarea piesă "
+"din baza de date? Numărul listelor de redare în care această piesă este "
+"membră este indicat în paranteze."
+msgstr[1] ""
+"Sunteţi sigur că doriţi să ştergeţi lista de redare '%s' şi următoarele "
+"piese din baza de date? Numărul listelor de redare în care aceste piese sunt "
+"membre este indicat în paranteze."
+
+#: ../src/misc_confirm.c:841
+msgid ""
+"Data has been changed and not been saved.\n"
+"OK to exit gtkpod?"
+msgstr ""
+"Au fost modificate date, dar nu au fost şi salvate.\n"
+"Da pentru a părăsi gtkpod?"
+
+#: ../src/misc_conversion.c:66
+msgid "File type"
+msgstr "Tip fişier"
+
+#: ../src/misc_conversion.c:67
+msgid "PC File"
+msgstr "Fişier PC"
+
+#: ../src/misc_conversion.c:68
+msgid "iPod File"
+msgstr "Fişier iPod"
+
+#: ../src/misc_conversion.c:69
+msgid "iPod ID"
+msgstr "iPod ID"
+
+#. 10
+#: ../src/misc_conversion.c:70
+msgid "Track Nr (#)"
+msgstr "Nr pistă"
+
+#: ../src/misc_conversion.c:71
+msgid "Transferred"
+msgstr "Transferat"
+
+#: ../src/misc_conversion.c:72
+msgid "File Size"
+msgstr "Dimensiune"
+
+#: ../src/misc_conversion.c:73
+msgid "Play Time"
+msgstr "Durată"
+
+#. 20
+#: ../src/misc_conversion.c:80
+msgid "Date played"
+msgstr "Data redării"
+
+#: ../src/misc_conversion.c:82
+msgid "Volume"
+msgstr "Volum"
+
+#: ../src/misc_conversion.c:83
+msgid "Soundcheck"
+msgstr "Verificare sunet"
+
+#. 25
+#: ../src/misc_conversion.c:85
+msgid "CD Nr"
+msgstr "Nr CD"
+
+#: ../src/misc_conversion.c:88
+msgid "Category"
+msgstr "Categorie"
+
+#: ../src/misc_conversion.c:89
+msgid "Description"
+msgstr "Descriere"
+
+#. 30
+#: ../src/misc_conversion.c:90
+msgid "Podcast URL"
+msgstr "URL podcast"
+
+#: ../src/misc_conversion.c:91
+msgid "Podcast RSS"
+msgstr "RSS podcast"
+
+#: ../src/misc_conversion.c:92
+msgid "Subtitle"
+msgstr "Subtitrare"
+
+#: ../src/misc_conversion.c:93
+msgid "Date released"
+msgstr "Data lansării"
+
+#: ../src/misc_conversion.c:94
+msgid "Checked"
+msgstr "Bifat"
+
+#. 35
+#: ../src/misc_conversion.c:95
+msgid "Start time"
+msgstr "Timp pornire"
+
+#: ../src/misc_conversion.c:96
+msgid "Stop time"
+msgstr "Timp oprire"
+
+#: ../src/misc_conversion.c:97
+msgid "Remember Playback Position"
+msgstr "Reţine poziţia redării"
+
+#: ../src/misc_conversion.c:98
+msgid "Skip when Shuffling"
+msgstr "Sari peste în mod Shuffle"
+
+#: ../src/misc_conversion.c:99
+msgid "Artwork Path"
+msgstr "Cale copertă"
+
+#. 40
+#: ../src/misc_conversion.c:100
+msgid "Media Type"
+msgstr "Tip media"
+
+#: ../src/misc_conversion.c:102
+msgid "TV Episode"
+msgstr "Episod TV"
+
+#: ../src/misc_conversion.c:103
+msgid "TV Network"
+msgstr "Reţea TV"
+
+#: ../src/misc_conversion.c:104
+msgid "Season Nr"
+msgstr "Nr Sezon"
+
+#. 45
+#: ../src/misc_conversion.c:105
+msgid "Episode Nr"
+msgstr "Nr Episod"
+
+#: ../src/misc_conversion.c:106
+msgid "Album Artist"
+msgstr "Artist album"
+
+#: ../src/misc_conversion.c:107
+msgid "Sort Artist"
+msgstr "Artist sortare"
+
+#: ../src/misc_conversion.c:108
+msgid "Sort Title"
+msgstr "Titlu sortare"
+
+#: ../src/misc_conversion.c:109
+msgid "Sort Album"
+msgstr "Album sortare"
+
+#. 50
+#: ../src/misc_conversion.c:110
+msgid "Sort Album Artist"
+msgstr "Artist album sortare"
+
+#: ../src/misc_conversion.c:111
+msgid "Sort Composer"
+msgstr "Compozitor sortare"
+
+#: ../src/misc_conversion.c:112
+msgid "Sort TV Show"
+msgstr "Emisiune TV sortare"
+
+#: ../src/misc_conversion.c:113
+msgid "Gapless Track Flag"
+msgstr "Indicator de piesă gapless"
+
+#: ../src/misc_conversion.c:126
+msgid "Name of file on PC, if available"
+msgstr "Numele fişierului pe PC, dacă este disponibil"
+
+#: ../src/misc_conversion.c:127
+msgid "Name of file on the iPod"
+msgstr "Numele fişierului pe iPod"
+
+#. 10
+#: ../src/misc_conversion.c:129
+msgid "Track Nr. and total number of tracks on CD"
+msgstr "Nr pistei şi numărul total de piese pe CD"
+
+#: ../src/misc_conversion.c:130
+msgid "Whether the file has already been transferred to the iPod or not"
+msgstr "Dacă fişierul a fost transferat deja pe iPod sau nu"
+
+#: ../src/misc_conversion.c:136
+msgid "Beats per minute"
+msgstr "Bătăi pe minut"
+
+#: ../src/misc_conversion.c:137
+msgid "Number of times the track has been played"
+msgstr "De câte ori a fost redată piesa"
+
+#: ../src/misc_conversion.c:138
+msgid "Star rating from 0 to 5"
+msgstr "Apreciere cu steluţe de la 0 la 5"
+
+#: ../src/misc_conversion.c:139
+msgid "Date and time track has been added"
+msgstr "Data şi ora la care a fost adăugat"
+
+#. 20
+#: ../src/misc_conversion.c:140
+msgid "Date and time track has last been played"
+msgstr "Data şi ora la care a fost redat"
+
+#: ../src/misc_conversion.c:141
+msgid "Date and time track has last been modified"
+msgstr "Data şi ora la care a fost modificat"
+
+#: ../src/misc_conversion.c:142
+msgid "Manual volume adjust"
+msgstr "Ajustare manuală a volumului"
+
+#: ../src/misc_conversion.c:143
+msgid ""
+"Volume adjust in dB (replay gain) -- you need to activate 'soundcheck' on "
+"the iPod"
+msgstr "Ajustare volum în dB -- trebuie să activaţi 'soundcheck' pe iPod"
+
+#. 25
+#: ../src/misc_conversion.c:146
+msgid "CD Nr. and total number of CDS in set"
+msgstr "Nr CD şi numărul total de CD-uri în set"
+
+#: ../src/misc_conversion.c:149
+msgid ""
+"The category (e.g. 'Technology' or 'Music') where the podcast was located."
+msgstr ""
+"Categoria (e.g. 'Tehnologie' sau 'Muzică') în care a fost localizat "
+"podcastul."
+
+#: ../src/misc_conversion.c:150
+msgid "Accessible by selecting the center button on the iPod."
+msgstr "Accesibil prin selecatarea butonului central al iPod-ului."
+
+#: ../src/misc_conversion.c:154
+msgid "Release date (for podcasts displayed next to the title on the iPod)"
+msgstr "Data lansării (pentru podcasturi afişate imediat după titlu pe iPod)"
+
+#. 50
+#: ../src/misc_conversion.c:168 ../src/misc_conversion.c:169
+#: ../src/misc_conversion.c:170 ../src/misc_conversion.c:171
+#: ../src/misc_conversion.c:172 ../src/misc_conversion.c:173
+msgid "Used for sorting on the iPod"
+msgstr "Folosite pentru sortarea pe iPod"
+
+#: ../src/misc_conversion.c:735
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the file scheme"
+msgstr "URI '%s' nu este un URI absolut folosind schema de fişiere"
+
+#: ../src/misc_conversion.c:745
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "URI-ul fişierului local '%s' nu poate include un '#'"
+
+#: ../src/misc_conversion.c:762
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "URI '%s' este invalid"
+
+#: ../src/misc_conversion.c:774
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Numele de host al URI '%s' este invalid"
+
+#: ../src/misc_conversion.c:790
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "URI '%s' conţine caractere întârziate invalid"
+
+#: ../src/misc_playlist.c:67 ../src/misc_playlist.c:94
+#: ../src/misc_playlist.c:429
+msgid "Please enter a name for the new playlist"
+msgstr "Vă rugăm să introduceţi un nume pentru lista de redare nouă"
+
+#: ../src/misc_playlist.c:154
+msgid "AR:"
+msgstr "AR:"
+
+#: ../src/misc_playlist.c:157
+msgid "AL:"
+msgstr "AL:"
+
+#: ../src/misc_playlist.c:160
+msgid "GE:"
+msgstr "GE:"
+
+#: ../src/misc_playlist.c:163
+msgid "CO:"
+msgstr "CO:"
+
+#: ../src/misc_playlist.c:166
+msgid "YE:"
+msgstr "AN:"
+
+#: ../src/misc_playlist.c:194
+msgid "Unknown"
+msgstr "Necunoscut"
+
+#: ../src/misc_playlist.c:272
+#, c-format
+msgid "Random (%d)"
+msgstr "Aleator (%d)"
+
+#: ../src/misc_playlist.c:297
+msgid ""
+"Auto Store of track view disabled.\n"
+"\n"
+msgstr ""
+"Memorare automată a vizualizării pieselor dezactivată.\n"
+"\n"
+
+#: ../src/misc_playlist.c:356
+msgid "Not Listed"
+msgstr "Nelistat"
+
+#: ../src/misc_playlist.c:406
+#, c-format
+msgid "Created playlist '%s' with %d track."
+msgid_plural "Created playlist '%s' with %d tracks."
+msgstr[0] "Am creat lista de redare '%s' cu %d piesă."
+msgstr[1] "Am creat lista de redare '%s' cu %d piese."
+
+#. n==0
+#: ../src/misc_playlist.c:417
+msgid "No tracks available, playlist not created"
+msgstr "Nicio piesă disponibilă, lista de redare nu a fost creată"
+
+#: ../src/misc_playlist.c:543
+#, c-format
+msgid "Most Listened (%d)"
+msgstr "Cele mai ascultate (%d)"
+
+#: ../src/misc_playlist.c:584
+#, c-format
+msgid "Never Listened"
+msgstr "Niciodată ascultate"
+
+#: ../src/misc_playlist.c:624
+#, c-format
+msgid "Best Rated (%d)"
+msgstr "Cele mai apreciate (%d)"
+
+#: ../src/misc_playlist.c:666
+msgid "Unrated tracks"
+msgstr "Piese fără apreciere"
+
+#: ../src/misc_playlist.c:671
+#, c-format
+msgid "Rated %d"
+msgstr "Apreciat %d"
+
+#: ../src/misc_playlist.c:714
+#, c-format
+msgid "Recent (%d)"
+msgstr "Recent (%d)"
+
+#: ../src/misc_playlist.c:753
+msgid "Last Time"
+msgstr "Ultima dată"
+
+#: ../src/misc_playlist.c:844
+msgid "Removal of dangling tracks with no files on PC was canceled."
+msgstr "Ştergerea pieselor agăţate fără fişiere pe PC a fost revocată."
+
+#: ../src/misc_playlist.c:854
+msgid "Handling of dangling tracks with files on PC was canceled."
+msgstr "Manipularea pieselor agăţate fără fişiere pe PC a fost revocată."
+
+#: ../src/misc_playlist.c:882
+msgid "Dangling tracks with no files on PC were removed."
+msgstr "Piesele agăţate fără fişiere pe PC au fost şterse."
+
+#: ../src/misc_playlist.c:943
+msgid "Dangling tracks with files on PC were handled."
+msgstr "Piesele agăţate fără fişiere pe PC au fost manipulate."
+
+#: ../src/misc_playlist.c:976
+msgid "Track"
+msgstr "Piesă"
+
+#: ../src/misc_playlist.c:1019
+msgid ""
+"You did not import the existing iTunesDB. This is most likely incorrect and "
+"will result in the loss of the existing database.\n"
+"\n"
+"Press 'OK' if you want to proceed anyhow or 'Cancel' to abort. If you "
+"cancel, you can import the existing database before calling this function "
+"again.\n"
+msgstr ""
+"Nu aţi importat iTunesDB existentă ('%s'). Acest lucru este cel mai probabil "
+"incorect, iar rezultatul va fi pierderea bazei de date existentă.\n"
+"\n"
+"Apăsaţi 'Ok' dacă doriţi să continuaţi oricum sau 'Revocare' ca să săriţi "
+"peste memorare. Dacă revocaţi, puteţi importa baza de date existentă înainte "
+"de a apela această funcţie din nou.\n"
+
+#: ../src/misc_playlist.c:1033
+msgid "Creating a tree of known files"
+msgstr "Creez un arbore de fişiere cunoscute"
+
+#: ../src/misc_playlist.c:1077
+msgid "Checking iPOD files against known files in DB"
+msgstr "Verific fişierel iPod faţă de fişierele cunoscute în DB"
+
+#: ../src/misc_playlist.c:1120
+msgid "Orphaned"
+msgstr "Făcut orfan"
+
+#: ../src/misc_playlist.c:1147
+#, c-format
+msgid ""
+"The following orphaned file had already been added to the iPod again. It "
+"will be removed with the next sync:\n"
+"%s\n"
+"\n"
+msgstr ""
+"Următoarele fişiere orfane au fost deja adăugate pe iPod. Vor fi şterse la "
+"următoarea sincronizare:\n"
+"%s\n"
+"\n"
+
+#: ../src/misc_playlist.c:1175
+#, c-format
+msgid "Found %d orphaned and %d dangling files. Processing..."
+msgstr "Am găsit %d fişiere orfane şi %d fişiere agăţate. Procesez..."
+
+#: ../src/misc_playlist.c:1199
+#, c-format
+msgid ""
+"The following dangling track has a file on PC.\n"
+"Press OK to have them transfered from the file on next Sync, CANCEL to leave "
+"it as is."
+msgid_plural ""
+"The following %d dangling tracks have files on PC.\n"
+"Press OK to have them transfered from the files on next Sync, CANCEL to "
+"leave them as is."
+msgstr[0] ""
+"Următoarea piesă agăţata are fişier pe PC.\n"
+"Apăsaţi OK pentru a o transfera din fişier la următoarea sincronizare, sau "
+"Revocare pentru a o lăsa aşa cum este."
+msgstr[1] ""
+"Următoarele %d piese agăţate au fişiere pe PC.\n"
+"Apăsaţi OK pentru a le transfera din fişier la următoarea sincronizare, sau "
+"Revocare pentru a le lăsa aşa cum sunt."
+
+#: ../src/misc_playlist.c:1204
+#, c-format
+msgid ""
+"The following dangling track doesn't have file on PC. \n"
+"Press OK to remove it, CANCEL to leave it as is."
+msgid_plural ""
+"The following %d dangling tracks do not have files on PC. \n"
+"Press OK to remove them, CANCEL to leave them. as is"
+msgstr[0] ""
+"Următoarea %d piesă agăţată nu are fişier pe PC.\n"
+"Apăsaţi OK pentru a o şterge, sau Revocare pentru a o lăsa aşa cum este."
+msgstr[1] ""
+"Următoarele %d piese agăţate nu au fişiere pe PC.\n"
+"Apăsaţi OK pentru a le şterge, sau Revocare pentru a le lăsa aşa cum sunt."
+
+#. we want unique window for each
+#. gboolean modal,
+#: ../src/misc_playlist.c:1211
+msgid "Dangling Tracks"
+msgstr "Piese agăţate"
+
+#: ../src/misc_playlist.c:1234
+#, c-format
+msgid "Found %d orphaned and %d dangling files. Done."
+msgstr "Am găsit %d fişiere orfane şi %d fişiere agăţate. Terminat."
+
+#. update for count == 1, 21, 41 ... and for count == n
+#: ../src/misc_track.c:89
+#, c-format
+msgid "Hashed %d of %d track."
+msgid_plural "Hashed %d of %d tracks."
+msgstr[0] "Am făcut suma binară de căutare (hash) pentru %d piesă din %d."
+msgstr[1] "Am făcut sumă binară de căutare (hash) pentru %d piese din %d."
+
+#: ../src/misc_track.c:198
+#, c-format
+msgid "The following duplicate track has been removed."
+msgid_plural "The following %d duplicate tracks have been removed."
+msgstr[0] "Următoarea piesă cu dubluri a fost ştearsă"
+msgstr[1] "Următoarele %d piese cu dubluri au fost şterse"
+
+#: ../src/misc_track.c:205
+#, c-format
+msgid ""
+"The following duplicate track has not been added to the master play list."
+msgid_plural ""
+"The following %d duplicate tracks have not been added to the master play "
+"list."
+msgstr[0] ""
+"Următoarea piesă cu dubluri nu a fost adăugată la lista de redare principală."
+msgstr[1] ""
+"Următoarele %d piese cu dubluri nu au fost adăugate la lista de redare "
+"principală."
+
+#. gint id,
+#. gboolean modal,
+#: ../src/misc_track.c:212
+msgid "Duplicate detection"
+msgstr "Detecţie dubluri"
+
+#: ../src/misc_track.c:1339
+msgid "Local Database"
+msgstr "Bază de date locală"
+
+#. artwork is set
+#: ../src/misc_track.c:1350
+msgid "Embedded or filename was lost"
+msgstr "Înglobată sau numele de fişier s-a pierdut"
+
+#: ../src/misc_track.c:1354
+msgid "Artwork not set"
+msgstr "Coperta nu a fost stabilită"
+
+#: ../src/misc_track.c:1816
+#, c-format
+msgid "Could not find source file for '%s'. Track not copied."
+msgstr "Nu am putut găsi fişierul sursă pentru '%s'. Piesa nu a fost copiată."
+
+#: ../src/misc_track.c:2052
+#, c-format
+msgid "drag and drop: ignored '%s'\n"
+msgstr "trage şi aruncă: ignorat '%s'\n"
+
+#: ../src/mp3file.c:1336
+#, c-format
+msgid "Error setting ID3 field: %s\n"
+msgstr "Eroare la setarea câmpului ID3: %s\n"
+
+#: ../src/mp3file.c:1360 ../src/mp3file.c:1453 ../src/mp3file.c:1608
+#: ../src/mp3file.c:2733
+#, c-format
+msgid "ERROR while opening file: '%s' (%s).\n"
+msgstr "Eroare la deschiderea fişierului: '%s' (%s).\n"
+
+#: ../src/mp3file.c:1688
+#, c-format
+msgid "ERROR while writing tag to file: '%s' (%s).\n"
+msgstr "Eroare la scrierea etichetelor în fişier: '%s' (%s).\n"
+
+#. Tracks with zero play length are ignored by iPod...
+#: ../src/mp3file.c:2770
+#, c-format
+msgid "File \"%s\" has zero play length. Ignoring.\n"
+msgstr "Fişierul \"%s\" are timp de redare null. Îl ignor.\n"
+
+#: ../src/mp4file.c:243 ../src/mp4file.c:404
+#, c-format
+msgid "'%s' does not appear to be a mp4 audio or video file.\n"
+msgstr "'%s' nu pare să fie un fişier mp4 audio sau video.\n"
+
+#: ../src/mp4file.c:253 ../src/mp4file.c:414
+#, c-format
+msgid "Could not open '%s' for reading, or file is not an mp4 file.\n"
+msgstr ""
+"Nu am putut deschide '%s' pentru citire, sau fişierul nu este de tipul mp4.\n"
+
+#: ../src/mp4file.c:529
+#, c-format
+msgid "'%s' does not appear to be a mp4 audio file.\n"
+msgstr "'%s' nu pare să fie un fişier mp4 audio.\n"
+
+#: ../src/mp4file.c:540
+#, c-format
+msgid "Could not open '%s' for writing, or file is not an mp4 file.\n"
+msgstr ""
+"Nu am putut deschide '%s' pentru scriere, sau fişierul nu este de tipul "
+"mp4.\n"
+
+#: ../src/mp4file.c:553
+#, c-format
+msgid ""
+"Import of '%s' failed: m4a/m4p/m4b not supported without the mp4v2 library. "
+"You must compile the gtkpod source together with the mp4v2 library.\n"
+msgstr ""
+"Importarea '%s' eşuată: fişierele m4a/m4p/m4b nu sunt suportate în lipsa "
+"bibliotecii mp4v2. Trebuie să compilezi sursa gtkpod împreună cu biblioteca "
+"mp4v2.\n"
+
+#: ../src/mp4file.c:559
+#, c-format
+msgid ""
+"m4a/m4p/m4b metadata update for '%s' failed: m4a/m4p/m4b not supported "
+"without the mp4v2 library. You must compile the gtkpod source together with "
+"the mp4v2 library.\n"
+msgstr ""
+"Actualizare metadata m4a/m4p/m4b pentru '%s' eşuată: m4a/m4p/m4b nu sunt "
+"suportate fără biblioteca mp4v2. Trebuie să compilaţi sursa gtkpod împreună "
+"cu biblioteca mp4v2.\n"
+
+#: ../src/mp4file.c:565
+#, c-format
+msgid ""
+"m4a/m4p/m4b soundcheck update for '%s' failed: m4a/m4p/m4b not supported "
+"without the mp4v2 library. You must compile the gtkpod source together with "
+"the mp4v2 library.\n"
+msgstr ""
+"Verificare de sunet m4a/m4p/m4b pentru '%s' eşuată: m4a/m4p/m4b nu sunt "
+"suportate fără biblioteca mp4v2. Trebuie să compilaţi sursa gtkpod împreună "
+"cu biblioteca mp4v2.\n"
+
+#: ../src/oggfile.c:73
+#, c-format
+msgid "'%s' does not appear to be an ogg audio file.\n"
+msgstr "'%s' nu pare să fie un fişier audio ogg.\n"
+
+#: ../src/oggfile.c:154
+#, c-format
+msgid ""
+"Import of '%s' failed: ogg not supported without the ogg library. You must "
+"compile the gtkpod source together with the ogg library.\n"
+msgstr ""
+"Importarea '%s' eşuată: fişierele ogg nu sunt suportate în lipsa bibliotecii "
+"ogg. Trebuie să compilezi sursa gtkpod împreună cu biblioteca ogg.\n"
+
+#: ../src/oggfile.c:160
+#, c-format
+msgid ""
+"ogg metadata update for '%s' failed: ogg not supported without the ogg "
+"library. You must compile the gtkpod source together with the ogg library.\n"
+msgstr ""
+"Actualizare metadata ogg pentru '%s' eşuată: fişierele ogg nu sunt suportate "
+"fără biblioteca ogg. Trebuie să compilaţi sursa gtkpod împreună cu "
+"biblioteca ogg.\n"
+
+#: ../src/prefs.c:357
+#, c-format
+msgid "gtkpod version %s usage:\n"
+msgstr "gtkpod versiunea %s utilizare:\n"
+
+#: ../src/prefs.c:358
+msgid "  -h, --help:   display this message\n"
+msgstr " -h, --help:  afişează acest mesaj\n"
+
+#: ../src/prefs.c:359
+msgid "  -p <file>:    increment playcount for file by one\n"
+msgstr "  -p <fişier>:   incrementează contorul de redări pentru fişier\n"
+
+#: ../src/prefs.c:360
+msgid "  --hash <file>:print gtkpod hash for file\n"
+msgstr "  -- hash <fişier>: afişează hashul gtkpod pentru fişier\n"
+
+#: ../src/prefs.c:361
+msgid "  -m path:      define the mountpoint of your iPod\n"
+msgstr "  -m cale:    defineşte punctul de montare al iPod-ului dvs\n"
+
+#: ../src/prefs.c:362
+msgid "  --mountpoint: same as '-m'.\n"
+msgstr "  --mountpoint: acelaşi lucru ca '-m'.\n"
+
+#: ../src/prefs.c:363
+msgid "  -a:           import database automatically after start.\n"
+msgstr "  -a:      importă baza de date automat după pornire.\n"
+
+#: ../src/prefs.c:364
+msgid "  --auto:       same as '-a'.\n"
+msgstr "  --auto:     la fel ca '-a'.\n"
+
+#: ../src/prefs.c:561
+#, c-format
+msgid "Couldn't create ~/.gtkpod\n"
+msgstr "Nu am putut crea ~/.gtkpod\n"
+
+#: ../src/prefs_window.c:133
+msgid "Please select command for 'Play Now'"
+msgstr "Vă rugăm selectaţi o comandă pentru 'Redă acum'"
+
+#: ../src/prefs_window.c:134
+msgid "Please select command for 'Enqueue'"
+msgstr "Vă rugăm selectaţi o comandă pentru 'Adaugă în coadă'"
+
+#: ../src/prefs_window.c:135
+msgid "Please select the mp3gain executable"
+msgstr "Vă rugăm selectaţi executabilul mp3gain"
+
+#: ../src/prefs_window.c:136
+msgid "Please select the aacgain executable"
+msgstr "Vă rugăm selectaţi executabilul aacgain"
+
+#: ../src/prefs_window.c:137
+msgid "Select the mserv music root directory"
+msgstr "Vă rugăm selectaţi dosarul rădăcină de muzică al mserv"
+
+#: ../src/prefs_window.c:138
+msgid "Select the mserv trackinfo root directory"
+msgstr ""
+"Vă rugăm selectaţi dosarul rădăcină de informaţii despre piese al mserv"
+
+#: ../src/prefs_window.c:139
+msgid "Select the ogg/vorbis converter command"
+msgstr "Selectaţi comanda de conversie ogg/vorbis"
+
+#: ../src/prefs_window.c:140
+msgid "Select the flac converter command"
+msgstr "Selectaţi comanda de conversie flac"
+
+#: ../src/prefs_window.c:141
+msgid "Select the m4a converter command."
+msgstr "Selectaţi comanda de conversie m4a."
+
+#: ../src/prefs_window.c:142
+msgid "Select the mp3 converter command."
+msgstr "Selectaţi comanda de conversie mp3."
+
+#: ../src/prefs_window.c:143
+msgid "Select the wav converter command."
+msgstr "Selectaţi comanda de conversie wav."
+
+#: ../src/prefs_window.c:201 ../src/repository.c:662
+#, c-format
+msgid ""
+"<i>Have a look at the scripts provided in '%s'. If you write a new script or "
+"improve an existing one, please send it to jcsjcs at users.sourceforge.net "
+"for inclusion into the next release.</i>"
+msgstr ""
+"<i>Aruncaţi o privire peste scripturile din '%s'. Dacă scrieţi un script "
+"nou, sau îmbunătăţiţi unul existent, vă rugăm trimiteţi-l la jcsjcs at users."
+"sourceforge.net pentru includerea lui în următoarea versiune.</i>"
+
+#: ../src/prefs_window.c:1205 ../src/prefs_window.c:1223
+msgid "Preferences not updated"
+msgstr "Preferinţele nu au fost actualizate"
+
+#: ../src/prefs_window.c:1232
+msgid "Preferences applied"
+msgstr "Preferinţele au fost aplicate"
+
+#: ../src/repository.c:573 ../src/repository.c:2395
+msgid "Set backup file"
+msgstr "Stabiliţi fişierul copie de siguranţă"
+
+#: ../src/repository.c:612
+msgid "Select directory for synchronization"
+msgstr "Selectaţi dosarul pentru sincronizare"
+
+#: ../src/repository.c:638
+msgid "Please select command to sync contacts"
+msgstr "Vă rugăm selectaţi comanda pentru sincronizarea agendei"
+
+#: ../src/repository.c:644
+msgid "Please select command to sync calendar"
+msgstr "Vă rugăm selectaţi comanda pentru sincronizarea calendarului"
+
+#: ../src/repository.c:650
+msgid "Please select command to sync notes"
+msgstr "Vă rugăm selectaţi comanda pentru sincronizarea notiţelor"
+
+#: ../src/repository.c:729
+msgid "Smart playlist updated."
+msgstr "Listă de redare inteligentă actualizată."
+
+#: ../src/repository.c:1190
+msgid "Podcasts Repository"
+msgstr "Depozit podcasturi"
+
+#: ../src/repository.c:1194
+msgid "Local Repository"
+msgstr "Depozit local"
+
+#: ../src/repository.c:1348
+msgid "Master Playlist"
+msgstr "Listă de redare principală"
+
+#: ../src/repository.c:1352
+msgid "Podcasts Playlist"
+msgstr "Listă de redare podcasturi"
+
+#: ../src/repository.c:1360
+msgid "Regular Playlist"
+msgstr "Listă de redare oarecare"
+
+#: ../src/repository.c:2423
+msgid "Set local repository file"
+msgstr "Stabiliţi fişierul depozitului local"
+
+#: ../src/repository.c:2522
+msgid "New Repository"
+msgstr "Depozit nou"
+
+#: ../src/sha1.c:186
+msgid "Hashed file is 0 bytes long\n"
+msgstr "Fişierul hash are lungime 0 octeţi\n"
+
+#: ../src/sha1.c:239
+#, c-format
+msgid "Could not open '%s' to calculate SHA1 checksum: %s\n"
+msgstr "Nu am putut deschide '%s' pentru a calcula suma de control SHA1: %s\n"
+
+#: ../src/syncdir.c:237
+#, c-format
+msgid "Sync summary for %s/%s\n"
+msgstr "Rezumat sincronizare pentru %s/%s\n"
+
+#: ../src/syncdir.c:246
+msgid "The following track has been added or updated:\n"
+msgid_plural "The following tracks have been added or updated:\n"
+msgstr[0] "Următoarea piesă a fost adăugată sau actualizată:\n"
+msgstr[1] "Următoarele piese au fost adăugate sau actualizate:\n"
+
+#: ../src/syncdir.c:255
+msgid "The following track has been completely removed from the iPod:\n"
+msgid_plural ""
+"The following tracks have been completely removed from the iPod:\n"
+msgstr[0] "Următoarea piesă a fost ştersă complet de pe iPod:\n"
+msgstr[1] "Următoarele piese au fost şterse complet de pe iPod:\n"
+
+#: ../src/syncdir.c:264
+msgid "The following track has been removed from the repository:\n"
+msgid_plural "The following tracks have been removed from the repository:\n"
+msgstr[0] "Următoarea piesă a fost eliminată din depozit:\n"
+msgstr[1] "Următoarele piese au fost eliminate din depozit:\n"
+
+#: ../src/syncdir.c:271
+msgid "The following track has been removed from the playlist:\n"
+msgid_plural "The following tracks have been removed from the playlist:\n"
+msgstr[0] "Următoarea piesă a fost eliminată din lista de redare:\n"
+msgstr[1] "Următoarele piese au fost eliminate din lista de redare:\n"
+
+#: ../src/syncdir.c:277
+msgid "Nothing was changed.\n"
+msgstr "Nu am modificat nimic.\n"
+
+#: ../src/syncdir.c:282
+msgid "Sync summary"
+msgstr "Rezumat sincronizare"
+
+#: ../src/tools.c:118
+#, c-format
+msgid ""
+"Could not find '%s'.\n"
+"Please specifiy the exact path in the Tools section of the preference dialog "
+"or install the program if it is not installed on your system.\n"
+"\n"
+msgstr ""
+"Nu am putut găsi '%s'.\n"
+"Vă rugăm specificaţi calea exactă în secţiunea Unelte a dialogului de "
+"preferinţe sau instalaţi programul dacă nu este instalat pe sistem.\n"
+"\n"
+
+#: ../src/tools.c:203
+#, c-format
+msgid ""
+"Execution of '%s' failed.\n"
+"\n"
+msgstr ""
+"Execuţia '%s' eşuată.\n"
+"\n"
+
+#: ../src/tools.c:248
+#, c-format
+msgid ""
+"Did not normalize '%s'. Set mp3gain path in the Tools section of the "
+"preferences.\n"
+msgstr ""
+"Nu am normalizat '%s'. Stabiliţi calea mp3gain în secţiunea Unelte a "
+"dialogului preferinţe.\n"
+
+#: ../src/tools.c:258
+#, c-format
+msgid ""
+"Did not normalize '%s'. Set aacgain path in the Tools section of the "
+"preferences.\n"
+msgstr ""
+"Nu am normalizat '%s'. Stabiliţi calea aacgain în secţiunea Unelte a "
+"dialogului preferinţe.\n"
+
+#: ../src/tools.c:385
+msgid "Normalizing..."
+msgstr "Normalizez..."
+
+#: ../src/tools.c:435
+#, c-format
+msgid "%s - %s"
+msgstr "%s - %s"
+
+#: ../src/tools.c:461
+msgid "Aborting..."
+msgstr "Renunţare..."
+
+#: ../src/tools.c:465
+msgid "Will abort after current mp3gain process ends."
+msgstr "Voi abandonda după ce procesul curent mp3gain se încheie."
+
+#: ../src/tools.c:491
+#, c-format
+msgid ""
+"'%s-%s' (%s) could not be normalized.\n"
+"\n"
+msgstr ""
+"'%s-%s' (%s) nu a putut fi normalizat.\n"
+"\n"
+
+#: ../src/tools.c:530
+#, c-format
+msgid "Normalized %d of %d tracks."
+msgid_plural "Normalized %d of %d tracks."
+msgstr[0] "Am normalizat %d din %d piese."
+msgstr[1] "Am normalizat %d din %d piese."
+
+#: ../src/tools.c:633
+msgid ""
+"Please specify the command to be called on the 'Tools' section of the "
+"preferences dialog.\n"
+msgstr ""
+"Vă rugăm specificaţi comanda de apelat în secţiunea 'Unelte' din dialogul "
+"preferinţe.\n"
+
+#: ../src/tools.c:645
+#, c-format
+msgid ""
+"Could not find the command '%s'.\n"
+"\n"
+"Please verify the setting in the 'Tools' section of the preferences dialog.\n"
+"\n"
+msgstr ""
+"Nu am găsit comanda '%s'.\n"
+"\n"
+"Vă rugăm verificaţi setările din secţiunea Unelte a dialogului preferinţe.\n"
+"\n"
+
+#: ../src/tools.c:687
+#, c-format
+msgid ""
+"'%s' returned the following output:\n"
+"%s\n"
+msgstr ""
+"'%s' a returnat următoarea ieşire:\n"
+"%s\n"
+
+#: ../src/tools.c:754
+#, c-format
+msgid "No command set for '%s'"
+msgstr "Nici o comandă stabilită pentru '%s'"
+
+#: ../src/tools.c:774
+#, c-format
+msgid "Could not find command '%s' specified for '%s'"
+msgstr "Nu am putut găsi comanda '%s' specificată pentru '%s'"
+
+#: ../src/wavfile.c:181
+#, c-format
+msgid "%s does not appear to be a supported wav file.\n"
+msgstr "%s nu pare să fie un fişier wav suportat.\n"
+
+#, fuzzy
+#~ msgid "<b>Resolution:</b>"
+#~ msgstr "<b>Indicii</b>"
+
+#~ msgid "label"
+#~ msgstr "etichetă"
+
+#~ msgid ""
+#~ "Cannot open '%s' for reading.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Nu am putut deschide '%s' pentru citire.\n"
+#~ "\n"
+
+#~ msgid "Unable to open '%s' for reading\n"
+#~ msgstr "Nu am putut deschide '%s' pentru citire\n"
+
+#~ msgid "Could not open \"iTunesDB.ext\" for reading extended info.\n"
+#~ msgstr ""
+#~ "Nu am putut deschide \"iTunesDB.ext\" pentru citirea informaţiilor "
+#~ "extinse.\n"
+
+#~ msgid "Add _Directory"
+#~ msgstr "Adaugă _dosar"
+
+#~ msgid "Dirs"
+#~ msgstr "Dosare"
+
+#~ msgid "Files"
+#~ msgstr "Fişiere"
+
+#~ msgid "New PL"
+#~ msgstr "LR nouă"
+
+#~ msgid "_About"
+#~ msgstr "_Despre"
+
+#~ msgid "Download Cover"
+#~ msgstr "Descarcă imaginea copertei"
+
+#~ msgid "Find _New"
+#~ msgstr "Găseşte _nou"
+
+#~ msgid "Set Cover Art from _Web"
+#~ msgstr "Stabileşte coperta de pe _web"
+
+#~ msgid "_Previous"
+#~ msgstr "_Precedent"
+
+#~ msgid "Find Cover on Web"
+#~ msgstr "Găseşte coperta pe web"

Added: trunk/po/ru.po
===================================================================
--- trunk/po/ru.po	                        (rev 0)
+++ trunk/po/ru.po	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,5489 @@
+# translation of gtkpod
+# Copyright (C) 2007 gtkpod developers
+# This file is distributed under the same license as the gtkpod package.
+# Matvey Kozhev <sikon at lucidfox.org>, 2007.
+# , fuzzy
+# <>, 2007.
+# 
+# 
+msgid ""
+msgstr ""
+"Project-Id-Version: gtkpod VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-12-13 00:57+0900\n"
+"PO-Revision-Date: 2007-12-15 21:53+0600\n"
+"Last-Translator: Matvey Kozhev <sikon at lucidfox.org>\n"
+"Language-Team: Russian <ru at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: ../data/gtkpod.desktop.in.h:1
+msgid "GtkPod"
+msgstr "GtkPod"
+
+#: ../data/gtkpod.desktop.in.h:2
+msgid "Manage music and video on an Apple iPod"
+msgstr "Менеджер музыки и видео для Apple iPod"
+
+#: ../data/gtkpod.desktop.in.h:3
+msgid "iPod Manager"
+msgstr "Менеджер iPod"
+
+#: ../data/gtkpod.glade.h:1
+msgid " "
+msgstr " "
+
+#: ../data/gtkpod.glade.h:2
+msgid "    "
+msgstr "    "
+
+#: ../data/gtkpod.glade.h:3
+msgid "     "
+msgstr "     "
+
+#: ../data/gtkpod.glade.h:4
+msgid "      "
+msgstr "      "
+
+#: ../data/gtkpod.glade.h:5
+msgid "   Sort by:"
+msgstr "   Сортировать по:"
+
+#: ../data/gtkpod.glade.h:6
+msgid " <= cts <= "
+msgstr " <= cts <= "
+
+#: ../data/gtkpod.glade.h:7
+msgid " Logic: "
+msgstr " Логика: "
+
+#: ../data/gtkpod.glade.h:9
+#, no-c-format
+msgid "%A"
+msgstr "%A"
+
+#: ../data/gtkpod.glade.h:10
+msgid ""
+"'DD/MM/YYYY HH:MM < d < DD/MM/YYYY HH:MM' or similar. Press 'enter' when "
+"finished."
+msgstr "\"ДД/ММ/ГГГГ ЧЧ/ММ < d < ДД/ММ/ГГГГ ЧЧ/ММ' или похожий. Нажмите Enter после"
+"завершения."
+
+#: ../data/gtkpod.glade.h:11
+msgid "'aacgain' executable:"
+msgstr "Исполняемый файл \"aacgain\":"
+
+#: ../data/gtkpod.glade.h:12
+msgid "'mp3gain' executable:"
+msgstr "Исполняемый файл \"mp3gain\":"
+
+#: ../data/gtkpod.glade.h:13
+msgid "(Checked)"
+msgstr "(Отмечено)"
+
+#: ../data/gtkpod.glade.h:14
+msgid "...as icons"
+msgstr "...как значки"
+
+#: ../data/gtkpod.glade.h:15
+msgid "...as text"
+msgstr "...как текст"
+
+#: ../data/gtkpod.glade.h:16
+msgid "...both as icons and text"
+msgstr "...как значки и текст"
+
+#: ../data/gtkpod.glade.h:17
+msgid "...entry 'All' in sort tab..."
+msgstr "...запись \"Все\" на вкладке сортировки"
+
+#: ../data/gtkpod.glade.h:18
+msgid "...master playlist"
+msgstr "...главный список воспроизведения"
+
+#: ../data/gtkpod.glade.h:20
+#, no-c-format
+msgid "../%A.jpg"
+msgstr "../%A.jpg"
+
+#: ../data/gtkpod.glade.h:21
+msgid "0"
+msgstr "0"
+
+#: ../data/gtkpod.glade.h:22
+msgid "1"
+msgstr "1"
+
+#: ../data/gtkpod.glade.h:23
+msgid "2"
+msgstr "2"
+
+#: ../data/gtkpod.glade.h:24
+msgid "3"
+msgstr "3"
+
+#: ../data/gtkpod.glade.h:25
+msgid "4"
+msgstr "4"
+
+#: ../data/gtkpod.glade.h:26
+msgid "5"
+msgstr "5"
+
+#: ../data/gtkpod.glade.h:27
+msgid ":"
+msgstr ":"
+
+#: ../data/gtkpod.glade.h:28
+msgid "<"
+msgstr "<"
+
+#: ../data/gtkpod.glade.h:29
+msgid "<b>Account Information</b>"
+msgstr "<b>Сведения об учётной записи</b>"
+
+#: ../data/gtkpod.glade.h:30
+msgid "<b>Adding/Updating/Syncing</b>"
+msgstr "<b>Добавление/обновление/синхронизация</b>"
+
+#: ../data/gtkpod.glade.h:31
+msgid "<b>Audioscrobbler</b>"
+msgstr "<b>Сборщик статистики</b>"
+
+#: ../data/gtkpod.glade.h:32
+msgid "<b>Auto-Generated Playlists</b>"
+msgstr "<b>Автоматически сгенерированные списки воспроизведения</b>"
+
+#: ../data/gtkpod.glade.h:33
+msgid "<b>Automatically select...</b>"
+msgstr "<b>Автоматически выбирать...</b>"
+
+#: ../data/gtkpod.glade.h:34
+msgid "<b>Calendar/Contacts/Notes</b>"
+msgstr "<b>Календарь/контакты/заметки</b>"
+
+#: ../data/gtkpod.glade.h:35
+msgid "<b>Coverart</b>"
+msgstr "<b>Coverart</b>"
+
+#: ../data/gtkpod.glade.h:36
+msgid "<b>Delete Confirmation</b>"
+msgstr "<b>Подтверждение удаления</b>"
+
+#: ../data/gtkpod.glade.h:37
+msgid "<b>Examples</b>"
+msgstr "<b>Примеры</b>"
+
+#: ../data/gtkpod.glade.h:38
+msgid "<b>Ignore Frequent Words</b>"
+msgstr "<b>Игнорировать часто встречающиеся слова</b>"
+
+#: ../data/gtkpod.glade.h:39
+msgid "<b>Misc</b>"
+msgstr "<b>Разное</b>"
+
+#: ../data/gtkpod.glade.h:40
+msgid "<b>Mountpoint and individual repository/playlist options</b>"
+msgstr "<b>Настройки точки монтирования и отдельных репозиториев/списков воспроизведения</b>"
+
+#: ../data/gtkpod.glade.h:41
+msgid "<b>On-the-fly Conversion</b>"
+msgstr "<b>Преобразование на лету</b>"
+
+#: ../data/gtkpod.glade.h:42
+msgid "<b>Play</b>"
+msgstr "<b>Воспроизведение</b>"
+
+#: ../data/gtkpod.glade.h:43
+msgid "<b>Playlists</b>"
+msgstr "<b>Списки воспроизведения</b>"
+
+#: ../data/gtkpod.glade.h:44
+msgid "<b>Please select mountpoint and your iPod model</b>"
+msgstr "<b>Пожалуйста, выберите точку монтирования и модель iPod</b>"
+
+#: ../data/gtkpod.glade.h:45
+msgid "<b>Repositories</b>"
+msgstr "<b>Репозитории</b>"
+
+#: ../data/gtkpod.glade.h:46
+msgid "<b>Resolution:</b>"
+msgstr "<b>Разрешение:</b>"
+
+#: ../data/gtkpod.glade.h:47
+msgid "<b>Sort Order</b>"
+msgstr "<b>Порядок сортировки</b>"
+
+#: ../data/gtkpod.glade.h:48
+msgid "<b>Sort Tabs</b>"
+msgstr "<b>Сортировочные вкладки</b>"
+
+#: ../data/gtkpod.glade.h:49
+msgid "<b>Sync</b>"
+msgstr "<b>Синхронизация</b>"
+
+#: ../data/gtkpod.glade.h:50
+msgid "<b>Synchronization</b>"
+msgstr "<b>Синхронизация</b>"
+
+#: ../data/gtkpod.glade.h:51
+msgid "<b>Tag Reading</b>"
+msgstr "<b>Чтение меток</b>"
+
+#: ../data/gtkpod.glade.h:52
+msgid "<b>Toolbar</b>"
+msgstr "<b>Панель инструментов</b>"
+
+#: ../data/gtkpod.glade.h:53
+msgid "<b>Tooltips</b>"
+msgstr "<b>Всплывающие подсказки</b>"
+
+#: ../data/gtkpod.glade.h:54
+msgid "<b>Track Attributes</b>"
+msgstr "<b>Атрибуты дорожки</b>"
+
+#: ../data/gtkpod.glade.h:55
+msgid "<b>Track Editing</b>"
+msgstr "<b>Редактирование дорожек</b>"
+
+#: ../data/gtkpod.glade.h:56
+msgid "<b>Volume Normalization</b>"
+msgstr "<b>Нормализация громкости</b>"
+
+#: ../data/gtkpod.glade.h:57
+msgid "<b>mserv</b>"
+msgstr "<b>mserv</b>"
+
+#: ../data/gtkpod.glade.h:58
+msgid ">"
+msgstr ">"
+
+#: ../data/gtkpod.glade.h:59
+msgid "About gtkpod"
+msgstr "О программе gtkpod"
+
+#: ../data/gtkpod.glade.h:60
+msgid "Add Directories Recursively"
+msgstr "Добавить папки рекурсивно"
+
+#: ../data/gtkpod.glade.h:61
+msgid "Add Files"
+msgstr "Добавить файлы"
+
+#: ../data/gtkpod.glade.h:62
+msgid "Add Files or Directories"
+msgstr "Добавить файлы или папки"
+
+#: ../data/gtkpod.glade.h:63
+msgid "Add Fol_der"
+msgstr "Добавить _папку"
+
+#: ../data/gtkpod.glade.h:64
+msgid "Add Folder"
+msgstr "Добавить папку"
+
+#: ../data/gtkpod.glade.h:65
+msgid "Add Image_s"
+msgstr "Добавить _изображения"
+
+#: ../data/gtkpod.glade.h:66
+msgid "Add Images from a Directory"
+msgstr "Добавить изображения из папки"
+
+#: ../data/gtkpod.glade.h:67
+msgid "Add Playlist"
+msgstr "Добавить список воспроизведения"
+
+#: ../data/gtkpod.glade.h:68
+msgid "Add _Files"
+msgstr "Добавить _файлы_"
+
+#: ../data/gtkpod.glade.h:69
+msgid "Add _Playlist"
+msgstr "Добавить _список воспроизведения"
+
+#: ../data/gtkpod.glade.h:70
+msgid "Add coverart from file using the following template"
+msgstr "Добавить изображение обложки из файла, используя следующий шаблон"
+
+#: ../data/gtkpod.glade.h:71
+msgid "Add directories recursively"
+msgstr "Добавить папки рекурсивно"
+
+#: ../data/gtkpod.glade.h:72
+msgid "Add new repository/iPod"
+msgstr "Добавить новый репозиторий/iPod"
+
+#: ../data/gtkpod.glade.h:73
+msgid "Add playlist from file"
+msgstr "Добавить список воспроизведения из файла"
+
+#: ../data/gtkpod.glade.h:74 ../src/display_sorttabs.c:3247
+#: ../src/display_tracks.c:2103
+msgid "Added"
+msgstr "Добавлено"
+
+#: ../data/gtkpod.glade.h:75
+msgid "Advanced Sorting Options"
+msgstr "Дополнительные параметры сортировки"
+
+#. 0
+#: ../data/gtkpod.glade.h:76 ../src/display_sorttabs.c:2982
+#: ../src/display_spl.c:84 ../src/misc_conversion.c:60
+msgid "Album"
+msgstr "Альбом"
+
+#: ../data/gtkpod.glade.h:77
+msgid "Album Art"
+msgstr "Обложка"
+
+#: ../data/gtkpod.glade.h:78
+msgid "All (AND)"
+msgstr "Все (И)"
+
+#: ../data/gtkpod.glade.h:79
+msgid "All Tracks Never Listened To"
+msgstr "Все дорожки, не прослушанные ни разу"
+
+#: ../data/gtkpod.glade.h:80
+msgid "All Tracks Played Since Last Time"
+msgstr "Все дорожки, прослушанные с прошлого раза"
+
+#: ../data/gtkpod.glade.h:81
+msgid "All Tracks not Listed in any Playlist"
+msgstr "Все дорожки, не включённые ни в один список воспроизведения"
+
+#: ../data/gtkpod.glade.h:82
+msgid "Also include tracks never played in \"Best Rated\" playlist"
+msgstr "Также включать никогда не воспроизведённые дорожки в список \"Наибольший рейтинг\""
+
+#: ../data/gtkpod.glade.h:83
+msgid "Always write ID3v2.4 tags (only applies to MP3)"
+msgstr "Всегда записывать метки ID3v2.4 (только для MP3)"
+
+#: ../data/gtkpod.glade.h:84
+msgid "Any (OR)"
+msgstr "Любые (ИЛИ)"
+
+#: ../data/gtkpod.glade.h:85 ../src/display_sorttabs.c:2979
+#: ../src/display_spl.c:85 ../src/misc_conversion.c:61
+msgid "Artist"
+msgstr "Исполнитель"
+
+#: ../data/gtkpod.glade.h:86
+msgid "Artwork Preview"
+msgstr "Предпросмотр изображения"
+
+#: ../data/gtkpod.glade.h:87
+msgid ""
+"As a last resort set the following tags to the\n"
+"filename if they are (still) empty:"
+msgstr "В качестве крайней меры, установить следующие метки в\n"
+"имя файла, если они (всё ещё) пусты"
+
+#: ../data/gtkpod.glade.h:89
+msgid "Ascending"
+msgstr "По возрастанию"
+
+#: ../data/gtkpod.glade.h:90
+msgid "Auto Store"
+msgstr "Автосохранение"
+
+#: ../data/gtkpod.glade.h:91
+msgid ""
+"Automatically start displaying tracks that match the criteria entered above. "
+"If not selected, you must press 'Display' to start displaying."
+msgstr "Автоматически начать отображение дорожек, отвечающих выбранным выше критериям."
+"Если не выбрано, вы должны нажать \"Отобразить\" для начала отображения."
+
+#: ../data/gtkpod.glade.h:92
+msgid "Available:"
+msgstr "Доступно:"
+
+#: ../data/gtkpod.glade.h:93
+msgid "Before removing playlists or tracks from a playlist"
+msgstr "Перед удалением списков воспроизведения или дорожек из списка"
+
+#: ../data/gtkpod.glade.h:94
+msgid "Before removing tracks from the harddisk"
+msgstr "Перед удалением дорожек с жёсткого диска"
+
+#: ../data/gtkpod.glade.h:95
+msgid "Before removing tracks from the iPod"
+msgstr "Перед удалением дорожек с iPod"
+
+#: ../data/gtkpod.glade.h:96
+msgid "Before removing tracks from the local database"
+msgstr "Перед удалением дорожек из локальной базы данных"
+
+#: ../data/gtkpod.glade.h:97
+msgid "Best Rated Tracks"
+msgstr "Дорожки с наибольшим рейтингом"
+
+#: ../data/gtkpod.glade.h:98
+msgid "Browse"
+msgstr "Обзор"
+
+#: ../data/gtkpod.glade.h:99
+msgid "Cache directory:"
+msgstr "Папка с кэшем:"
+
+#: ../data/gtkpod.glade.h:100
+msgid "Calendar"
+msgstr "Календарь"
+
+#: ../data/gtkpod.glade.h:101
+msgid "Calendar sync command:"
+msgstr "Команда синхронизации календаря:"
+
+#: ../data/gtkpod.glade.h:102
+msgid "Call automatically when synchronizing iTunesDB"
+msgstr "Вызывать автоматически при синхронизации iTunesDB"
+
+#: ../data/gtkpod.glade.h:103
+msgid "Category: "
+msgstr "Категория: "
+
+#: ../data/gtkpod.glade.h:104
+msgid ""
+"Change all tracks\n"
+"simultaneously"
+msgstr "Изменить все дорожки\n"
+"одновременно"
+
+#: ../data/gtkpod.glade.h:106
+msgid ""
+"Check before removing photos from a photo album whether\n"
+"they should be deleted from the Photo Database."
+msgstr "Перед удалением снимков из фотоальбома, проверять,\n"
+"должны ли они быть удалены из базы данных снимков."
+
+#: ../data/gtkpod.glade.h:108
+msgid "Check for existing files when copying from iPod."
+msgstr "Проверять наличие существующих файлов при копировании с iPod."
+
+#: ../data/gtkpod.glade.h:109
+msgid "Command for 'Enqueue':"
+msgstr "Команда \"Поставить в очередь\":"
+
+#: ../data/gtkpod.glade.h:110
+msgid "Command for 'Play now':"
+msgstr "Команда \"Воспроизвести сейчас\":"
+
+#. 5
+#: ../data/gtkpod.glade.h:111 ../src/display_spl.c:97
+#: ../src/misc_conversion.c:65
+msgid "Composer"
+msgstr "Композитор"
+
+#: ../data/gtkpod.glade.h:112
+msgid "Confirm before removing tracks from the iPod or repository"
+msgstr "Выводить подтверждение перед удалением дорожек с iPod или из репозитория"
+
+#: ../data/gtkpod.glade.h:113
+msgid ""
+"Confirm before removing tracks from the iPod or repository\n"
+"when syncing playlists"
+msgstr "Выводить подтверждение перед удалением дорожек с iPod или из репозитория\n"
+"при синхронизации списков воспроизведения"
+
+#: ../data/gtkpod.glade.h:115
+msgid "Confirm lists of directories"
+msgstr "Подтверждать списки папок"
+
+#: ../data/gtkpod.glade.h:116
+msgid "Contacts sync command:"
+msgstr "Команда синхронизации контактов:"
+
+#: ../data/gtkpod.glade.h:117
+msgid "Containing Displayed Tracks"
+msgstr "Содержащие отображаемые дорожки"
+
+#: ../data/gtkpod.glade.h:118
+msgid "Containing Selected Tracks"
+msgstr "Содержащие выбранные дорожки"
+
+#: ../data/gtkpod.glade.h:119
+msgid "Conversion Progress Display"
+msgstr "Отображение хода преобразования"
+
+#: ../data/gtkpod.glade.h:120
+msgid "Cover"
+msgstr "Обложка"
+
+#: ../data/gtkpod.glade.h:121
+msgid "Create New Playlist"
+msgstr "Создать новый список воспроизведения"
+
+#: ../data/gtkpod.glade.h:122
+msgid "Create Repository"
+msgstr "Создать репозитория"
+
+#: ../data/gtkpod.glade.h:123
+msgid "Create _Playlist File"
+msgstr "Создать _файл списка воспроизведения"
+
+#: ../data/gtkpod.glade.h:124
+msgid "Credits"
+msgstr "Авторы"
+
+#: ../data/gtkpod.glade.h:125
+msgid "Currently only rating is supported."
+msgstr "В настоящее время поддерживается только рейтинг."
+
+#: ../data/gtkpod.glade.h:126
+msgid "Delete repository"
+msgstr "Удалить репозиторий"
+
+#: ../data/gtkpod.glade.h:127
+msgid ""
+"Delete tracks that are no longer present from the\n"
+"iPod or repository"
+msgstr "Удалять отсутствующие дорожки с\n"
+"iPod или из репозитория"
+
+#: ../data/gtkpod.glade.h:129
+msgid "Deleted tracks"
+msgstr "Удалённые дорожки"
+
+#: ../data/gtkpod.glade.h:130
+msgid "Descending"
+msgstr "По убыванию"
+
+#: ../data/gtkpod.glade.h:131
+msgid "Details"
+msgstr "Подробности"
+
+#: ../data/gtkpod.glade.h:133
+#, no-c-format
+msgid ""
+"Determines how the string for the info field should be constructed, e.g '%a/%"
+"A/%T - %t.mp3' or '%o'.  You can separate several templates by semicolons -- "
+"gtkpod will determine which one to use by the filename extension given. "
+"Artist: %a, album: %A, composer: %c, title: %t, genre: %G, track nr: %T, CD "
+"nr: %C, year: %Y, original filename (requires extended information file): %"
+"o, the character '%': %%."
+msgstr ""
+"Определяет построение строки для поля сведений, например, '%a/%"
+"A/%T - %t.mp3' или '%o'.  Вы можете разделить несколько шаблонов точками с запятой -- "
+"gtkpod определит, какой из них использовать, по заданному расширению файла. "
+"Исполнитель: %a, альбом: %A, композитор: %c, название: %t, жанр: %G, номер дорожки: %T, номер CD: %C, год: %Y, оригинальное ися файла (требует расширенный файл сведений): %"
+"o, символ '%': %%."
+
+#: ../data/gtkpod.glade.h:135
+#, no-c-format
+msgid ""
+"Determines the filename of tracks you copy from the iPod, e.g '%a/%A/%T - %t."
+"mp3' or '%o'.  You can separate several patterns by semicolons -- gtkpod "
+"will determine which one to use by the filename extension given. Artist: %a, "
+"album: %A, composer: %c, title: %t, genre: %G, track nr: %T, CD nr: %C, "
+"year: %Y, original filename (requires extended information file): %o, "
+"current playlist: %p, the character '%': %%."
+msgstr ""
+"Определяет имя файла для дорожек, копируемых с iPod, например, '%a/%A/%T - %t."
+"mp3' or '%o'.  Вы можете разделить несколько шаблонов точками с запятой -- "
+"gtkpod определит, какой из них использовать, по заданному расширению файла. "
+"Исполнитель: %a, альбом: %A, композитор: %c, название: %t, жанр: %G, номер дорожки: %T, номер CD: %C, год: %Y, оригинальное ися файла (требует расширенный файл сведений): %o, текущий список воспроизведения: %p,  символ '%': %%."
+
+#: ../data/gtkpod.glade.h:137
+#, no-c-format
+msgid ""
+"Determines the name of the file with the cover art. You can separate several "
+"patterns by semicolons which will be tried in order. Artist: %a, album: %A, "
+"composer: %c, title: %t, genre: %G, track nr: %T, CD nr: %C, year: %Y, "
+"original filename (requires extended information file): %o, original "
+"filename without file extension: %O, current playlist: %p, the character "
+"'%': %%."
+msgstr ""
+"Определяет имя файла с изображением обложки. Вы можете разделить несколько шаблонов точками с запятой -- "
+"gtkpod определит, какой из них использовать, по заданному расширению файла. "
+"Исполнитель: %a, альбом: %A, композитор: %c, название: %t, жанр: %G, номер дорожки: %T, номер CD: %C, год: %Y, оригинальное ися файла (требует расширенный файл сведений): %o, текущий список воспроизведения: %p,  символ '%': %%."
+
+#: ../data/gtkpod.glade.h:138
+msgid ""
+"Directories to sync with are determined from the filenames of the tracks in "
+"the playlist."
+msgstr "Папки, подлежащие синхронизации, определяются по именам файлов дорожек в списке воспроизведения."
+
+#: ../data/gtkpod.glade.h:139
+msgid "Display a list of tracks that could actually be updated."
+msgstr "Отобразить список дорожек, которые могут быть обновлены."
+
+#: ../data/gtkpod.glade.h:140
+msgid "Display a list of tracks that could not be updated."
+msgstr "Отобразить список дорожек, которые не могут быть обновлены."
+
+#: ../data/gtkpod.glade.h:141
+msgid "Display conversion log"
+msgstr "Отобразить журнал сообщений преобразования"
+
+#: ../data/gtkpod.glade.h:142
+msgid "Display info about detected duplicates"
+msgstr "Отобразить сведения об обнаруженных дубликатах"
+
+#: ../data/gtkpod.glade.h:143
+msgid "Display info about non-updated tracks"
+msgstr "Отобразить сведения о необновлённых дорожках"
+
+#: ../data/gtkpod.glade.h:144
+msgid "Display info about updated tracks"
+msgstr "Отобразить сведения об обновлённых дорожках"
+
+#: ../data/gtkpod.glade.h:145
+msgid "Display messages and warnings at startup"
+msgstr "Отображать сообщения и предупреждения при запуске"
+
+#: ../data/gtkpod.glade.h:146
+msgid ""
+"Display the list of duplicates that have been detected after adding files."
+msgstr "Отобразить список дубликатов, обнаруженных после добавления файлов."
+
+#: ../data/gtkpod.glade.h:147
+msgid "Display toolbar..."
+msgstr "Отобразить панель инструментов..."
+
+#: ../data/gtkpod.glade.h:148
+msgid "Display tooltips in main window"
+msgstr "Отображать всплывающие подсказки в главном окне"
+
+#: ../data/gtkpod.glade.h:149
+msgid "Display tooltips in prefs window"
+msgstr "Отображать всплывающие подсказки в окне настроек"
+
+#: ../data/gtkpod.glade.h:150
+msgid "Display tracks that match the criteria entered above."
+msgstr "Отобразить дорожки, удовлетворяющие введённым выше критериям."
+
+#: ../data/gtkpod.glade.h:151
+msgid ""
+"Displayed\n"
+"Tracks"
+msgstr "Отображаемые\n"
+"дорожки"
+
+#: ../data/gtkpod.glade.h:153
+msgid "Displayed:"
+msgstr "Отображено:"
+
+#: ../data/gtkpod.glade.h:154
+msgid "Don't allow file duplication"
+msgstr "Запрещать появление дубликатов файлов"
+
+#: ../data/gtkpod.glade.h:155
+msgid "Don't automatically sync on startup"
+msgstr "Не синхронизироваться автоматически при запуске"
+
+#: ../data/gtkpod.glade.h:156
+msgid "Duplicate Recognition is based on a (modified) sha1 hash over the file."
+msgstr "Поиск дубликатов основан на (модифицированном) хэше SHA1 в отношении файла."
+
+#: ../data/gtkpod.glade.h:157
+msgid "Edit Repository/iPod Options"
+msgstr "Настройки репозиториев/iPod"
+
+#: ../data/gtkpod.glade.h:158 ../src/context_menus.c:662
+msgid "Edit Smart Playlist"
+msgstr "Изменить умный список воспроизведения"
+
+#: ../data/gtkpod.glade.h:159 ../src/context_menus.c:749
+msgid "Edit Track Details"
+msgstr "Изменить сведения о дорожке"
+
+#: ../data/gtkpod.glade.h:160
+msgid "Edit _Preferences"
+msgstr "_Параметры"
+
+#: ../data/gtkpod.glade.h:161
+msgid "Effective free space"
+msgstr "Эффективное свободное пространство"
+
+#: ../data/gtkpod.glade.h:162
+msgid "Empty Playlist"
+msgstr "Пустой список воспроизведения"
+
+#: ../data/gtkpod.glade.h:163
+msgid "Exclude file mask(s)"
+msgstr "Исключать маски файлов"
+
+#: ../data/gtkpod.glade.h:164
+msgid "Export can be continued at a later time if canceled."
+msgstr "Экспорт может быть возобновлён позднее в случае отмены."
+
+#: ../data/gtkpod.glade.h:165
+msgid "File size"
+msgstr "Размер файла"
+
+#: ../data/gtkpod.glade.h:166
+msgid "File size (deleted)"
+msgstr "Размер файла (удалённого)"
+
+#: ../data/gtkpod.glade.h:167
+msgid "File size (non-transferred)"
+msgstr "Размер файла (непереданного)"
+
+#: ../data/gtkpod.glade.h:168
+msgid "Filename Format: "
+msgstr "Формат имени файла: "
+
+#: ../data/gtkpod.glade.h:169
+msgid ""
+"Find orphan files (files with no track info in DB) and dangling tracks "
+"(tracks with no corresponding files on iPod)"
+msgstr "Найти осиротевшие файлы (файлы без сведений о дорожке в базе данных) и повисшие дорожки"
+"(дорожки без соответствующих файлов на iPod)"
+
+#: ../data/gtkpod.glade.h:170
+msgid "First try <i>folder.jpg</i>, then <i>&lt;artist&gt;.jpg</i>"
+msgstr "Сначала попробовать <i>folder.jpg</i>, затем <i>&lt;artist&gt;/jpg</i>"
+
+#: ../data/gtkpod.glade.h:171
+msgid "Flac with :"
+msgstr "FLAC с помощью:"
+
+#: ../data/gtkpod.glade.h:173
+#, no-c-format
+msgid ""
+"For example, 'xmms %s' will clear xmms' current playlist, add the selected "
+"tracks and start playing."
+msgstr "Например, \"xmms %s\" очистит текущий список воспроизведения XMMS, добавит выбранные "
+"дорожки и начнёт воспроизведение."
+
+#: ../data/gtkpod.glade.h:175
+#, no-c-format
+msgid ""
+"For example, 'xmms -e %s' will append (enqueue) the selected tracks to xmms' "
+"current playlist."
+msgstr "Например, \"xmms -e %s\" добавит (поставит в очередь) выбранные дорожки в "
+"текущий список воспроизведения XMMS."
+
+#: ../data/gtkpod.glade.h:176 ../src/display_sorttabs.c:2985
+#: ../src/display_spl.c:89 ../src/misc_conversion.c:63
+msgid "Genre"
+msgstr "Жанр"
+
+#: ../data/gtkpod.glade.h:177
+msgid "Group artists on compilation CDs"
+msgstr "Группировать по исполнителям на CD сборников"
+
+#: ../data/gtkpod.glade.h:178
+msgid ""
+"Highly recommended for faster import when taking advantage of the "
+"duplication recognition. Also, having the PC filenames allows writing "
+"changed ID3 tags to disk, and even to reconstruct your iPod's contents in "
+"case of file system corruption (change the \"transferred=\" entries in your "
+"backuped database)."
+msgstr "Настоятельно рекомендуется для увеличения скорости импорта при использовании "
+"распознавания дубликатов. Кроме того, использование имён файлов ПК позволяет записывать "
+"изменённые метки ID3 на диск и даже восстановить содержимое iPod в случае "
+"повреждения файловой системы (измените записи \"transferred=\" в своей "
+"резервной копии базы данных)."
+
+#: ../data/gtkpod.glade.h:179 ../src/context_menus.c:685
+#: ../src/context_menus.c:703 ../src/context_menus.c:820
+msgid "I'm sure"
+msgstr "Я уверен"
+
+#: ../data/gtkpod.glade.h:180
+msgid ""
+"If available, the local copy of the track is referenced in the playlist. "
+"Otherwise the file on the iPod is used."
+msgstr "Если доступна локальная копия дорожки, на неё создаётся ссылка в списке воспроизведения. "
+"В противном случае используется файл на iPod."
+
+#: ../data/gtkpod.glade.h:181
+msgid "If both options are selected, embedded APIC data takes precedence."
+msgstr "Если выбраны обе опции, внедрённые данные APIC имеют приоритет."
+
+#: ../data/gtkpod.glade.h:182
+msgid ""
+"If checked, sorting will be case sensitive. Please note that case sensitive "
+"sorting will not work well with most charsets."
+msgstr "Если опция включена, сортировка будет учитывать регистр. Имейте в виду, что сортировка "
+"с учётнм регистра не работает корректно с большинством кодировок."
+
+#: ../data/gtkpod.glade.h:183
+msgid ""
+"If the filename (full path) of an existing track matches that of a track to "
+"be added, this option allows you to update the information about the "
+"existing track rather than just skipping the track altogether. No update "
+"will take place if the file hasn't changed and you have selected the 'Don't "
+"allow file duplication' option above."
+msgstr "Если имя файла (полный путь) существующей дорожки совпадает с именем файла"
+"добавляемой дорожки, эта опция позволяет вам обновить сведения о существующей"
+"дорожке вместо её пропуска. Обновление не будет произведено, если файл не"
+"был изменён и вы выбрали опцию \"Запрещать появление дубликатов файлов\" выше."
+
+#: ../data/gtkpod.glade.h:184
+msgid "If you check this, gtkpod will descend into subdirectories recursively."
+msgstr "При выборе этой опции gtkpod будет просматривать папки рекурсивно."
+
+#: ../data/gtkpod.glade.h:185
+msgid ""
+"If you check this, information (cover art and meta information) changed for "
+"this track will be copied to all other selected tracks as well. Use with "
+"care."
+msgstr "При выборе этой опции сведения (обложка и метаданные), изменившиеся"
+"у данной дорожки, будут также скопированы во все остальные дорожки."
+"Используйте с осторожностью."
+
+#: ../data/gtkpod.glade.h:186
+msgid ""
+"If you don't select the master playlist automatically, the initial database "
+"import is much faster because the display dosn't have to be updated."
+msgstr "Если вы не выбираете главный список воспроизведения автоматически,"
+"первый импорт базы данных происходит значительно быстрее, поскольку"
+"отображаемые сведения не нуждаются в обновлении."
+
+#: ../data/gtkpod.glade.h:187
+msgid ""
+"If you select several tracks in the track list and edit a tag of the first "
+"track, the tags in the other tracks are updated as well."
+msgstr "Если вы выберете несколько дорожек в списке дорожек и измените"
+"метку первой дорожки, метки всех остальных дорожек также обновятся."
+
+#: ../data/gtkpod.glade.h:188
+msgid "Ignore these words when at the beginning of the following fields:"
+msgstr "Игнорировать эти слова в начале следующих полей:"
+
+#: ../data/gtkpod.glade.h:189
+msgid ""
+"In order to save the displayed track order to the iPod choose 'Save "
+"Displayed Track Order' from the 'Edit' menu or select 'Auto Store' below."
+msgstr "Чтобы сохранить отображаемый порядок дорожек на iPod, выберите пункт"
+"\"Сохранить отображаемый порядок дорожек\" в меню \"Правка\" или опцию"
+"\"Автосохранение\" ниже."
+
+#: ../data/gtkpod.glade.h:190
+msgid "Initialize iPod"
+msgstr "Инициализировать iPod"
+
+#: ../data/gtkpod.glade.h:191
+msgid ""
+"Insert before\n"
+"Insert after"
+msgstr "Вставить перед\n"
+"Вставить после"
+
+#: ../data/gtkpod.glade.h:193
+msgid "Keeps all compilation CDs grouped together in the artists sort tab."
+msgstr "Группирует вместе все CD сборников на вкладке сортировки по исполнителям."
+
+#: ../data/gtkpod.glade.h:194
+msgid "Live _updating"
+msgstr "&Обновление в реальном времени"
+
+#: ../data/gtkpod.glade.h:195
+msgid "Load iPod(s)"
+msgstr "Загрузить iPod"
+
+#: ../data/gtkpod.glade.h:196
+msgid "Lower Margin"
+msgstr "Нижняя граница"
+
+#: ../data/gtkpod.glade.h:197
+msgid "M4A with :"
+msgstr "M4A с помощью:"
+
+#: ../data/gtkpod.glade.h:198
+msgid "MP3 with :"
+msgstr "MP3 с помощью:"
+
+#: ../data/gtkpod.glade.h:199
+msgid "Match al_l of the following"
+msgstr "Совпадение со всеми указанными"
+
+#: ../data/gtkpod.glade.h:200
+msgid "Match an_y of the following"
+msgstr "Совпадение с любым из указанных"
+
+#: ../data/gtkpod.glade.h:201
+msgid "Match only _checked tracks"
+msgstr "Совпадение только с &отмеченными дорожками"
+
+#: ../data/gtkpod.glade.h:202
+msgid "Maximum number of background threads:"
+msgstr "Максимальное число фоновых потоков:"
+
+#: ../data/gtkpod.glade.h:203
+msgid "Maximum size of cache directory (in GB):"
+msgstr "Максимальный размер папки кэша (в ГБ):"
+
+#: ../data/gtkpod.glade.h:204
+msgid "Model:"
+msgstr "Модель:"
+
+#: ../data/gtkpod.glade.h:205 ../src/display_tracks.c:2100
+msgid "Modified"
+msgstr "Изменено"
+
+#: ../data/gtkpod.glade.h:206
+msgid "Most Recently Played Tracks"
+msgstr "Недавно воспроизведённые дорожки"
+
+#: ../data/gtkpod.glade.h:207
+msgid "Move selected attributes to the displayed list"
+msgstr "Переместить выбранные атрибуты в отображаемый список"
+
+#: ../data/gtkpod.glade.h:208
+msgid "Music Root:"
+msgstr "Корневая папка музыки:"
+
+#: ../data/gtkpod.glade.h:209
+msgid ""
+"Music files can have images embedded in the APIC tag. Currently this is only "
+"supported for MP3 files."
+msgstr "Музыкальные файлы могут иметь изображения, внедрённые в метку APIC."
+"В настоящее время это поддерживается только для файлов MP3."
+
+#: ../data/gtkpod.glade.h:210
+msgid "Never show this dialogue again"
+msgstr "Не показывать этот диалог снова"
+
+#: ../data/gtkpod.glade.h:211 ../src/display_spl.c:1719
+#: ../src/misc_playlist.c:66 ../src/misc_playlist.c:68
+#: ../src/misc_playlist.c:93 ../src/misc_playlist.c:95
+#: ../src/misc_playlist.c:428 ../src/misc_playlist.c:430
+msgid "New Playlist"
+msgstr "Создать список воспроизведения"
+
+#: ../data/gtkpod.glade.h:212
+msgid "No lower margin"
+msgstr "Без нижней границы"
+
+#: ../data/gtkpod.glade.h:213
+msgid "No upper margin"
+msgstr "Без верхней границы"
+
+#: ../data/gtkpod.glade.h:214
+msgid "Non-transferred tracks"
+msgstr "Непереданные дорожки"
+
+#: ../data/gtkpod.glade.h:215
+msgid "None"
+msgstr "Нет"
+
+#: ../data/gtkpod.glade.h:216
+msgid ""
+"Normally the charset specified when first importing the track will be used "
+"for the filename. If you set this option you can set a different charset "
+"with the charset selector (Preferences/'Adding/Updating/Syncing'). Note: the "
+"charset info is stored in the extended information file (see "
+"Preferences/'Writing of the iTunesDB'). Tracks imported before V0.51 will "
+"have no charset stored. Instead the charset specified will be used."
+msgstr "Как правило, для имени файла будет использована кодировка, выбранная"
+"при первом импорте дорожки. Если вы включите эту опцию, вы можете"
+"задать другую кодировку с помощью функции выбора кодировки"
+"(Параметры - Добавление/удаление/синхронизация). Замечание: выбор"
+"кодировки сохраняется в файле расширенных сведений (см."
+"Параметры - Запись в iTunesDB). Для дорожек, импортированных до версии"
+"0.51, кодировка сохранена не будет. Вместо этого будет использоваться"
+"заданная кодировка."
+
+#: ../data/gtkpod.glade.h:217
+msgid ""
+"Normally the charset specified when first importing the track will be used "
+"to update the track information. If you have chosen a wrong charset when "
+"first importing a track and want to correct it using the 'Update Track' "
+"function, you must check this option. Note: the charset info is stored in "
+"the extended information file (see 'Writing of iTunesDB' below) and tracks "
+"imported before V0.51 will have no charset stored. Instead the charset "
+"specified above will be used then."
+msgstr "Как правило, для обновления сведений о дорожке будет использована кодировка,"
+"выбранная при первом импорте дорожки. Если вы выбрали неверную кодировку"
+"при первом импорте и хотите исправить ошибку с помощью функции"
+"\"Обновить дорожку\", вы должны включить эту опцию. Замечание: выбор"
+"кодировки сохраняется в файле расширенных сведений (см."
+"Параметры - Запись в iTunesDB). Для дорожек, импортированных до версии"
+"0.51, кодировка сохранена не будет. Вместо этого будет использоваться"
+"заданная кодировка."
+
+#: ../data/gtkpod.glade.h:218
+msgid ""
+"Normally the charset specified when first importing the track will be used "
+"to write the tags. If you have chosen a wrong charset when first importing a "
+"track, you should select this option along with the correct charset.  Note: "
+"uses the extended information file to store the charset information (see "
+"'Writing of the iTunesDB' on the 'Input/Output' page) and tracks imported "
+"before V0.51 will have no charset stored -- the charset specified on the "
+"'Input/Output' page will be used."
+msgstr "Как правило, для записи меток будет использована кодировка, выбранная"
+"при первом импорте дорожки. Если вы выбрали неверную кодировку"
+"при первом импорте, вы должны включить эту опцию и выбрать верную"
+"дорожку. Замечание: выбор кодировки сохраняется в файле расширенных"
+"сведений (см. Параметры - Запись в iTunesDB). Для дорожек,"
+"импортированных до версии 0.51, кодировка сохранена не будет. Вместо"
+"этого будет использоваться заданная кодировка."
+
+#: ../data/gtkpod.glade.h:219
+msgid ""
+"Normally, if a track is no longer present in the sync directory, it will be "
+"removed from the playlist, but not from the iPod or local repository.\n"
+"If this option is checked, tracks will be completely removed from the iPod "
+"or local repository, unless the track is a member of other playlists as "
+"well.\n"
+"NOTE: if you sync with the master playlist, you must check this option if "
+"you want tracks to be removed, because removing from the master playlist "
+"means removing from the iPod."
+msgstr "Как правило, если дорожка больше не существует в папке для синхронизации,"
+"она будет удалена из списка воспроизведения, но не с iPod (из репозитория).\n"
+"Если эта опция включена, дорожки будут полностью удалены с iPod или из"
+"локального репозитория, кроме случаев, когда дорожка также содержится"
+"в других списках воспроизведения.\n"
+"ЗАМЕЧАНИЕ: если вы синхронизируетесь с главным списком воспроизведения,"
+"вы должны включить эту опцию, если вы хотите удалять дорожки, поскольку"
+"удаление из главного списка означает удаление с iPod."
+
+#: ../data/gtkpod.glade.h:222
+msgid "Notes sync command:"
+msgstr "Команда синхронизации заметок:"
+
+#: ../data/gtkpod.glade.h:223
+msgid "Number of playlists"
+msgstr "Число списков воспроизведения"
+
+#: ../data/gtkpod.glade.h:224
+msgid "Number of tracks"
+msgstr "Число дорожек"
+
+#: ../data/gtkpod.glade.h:225
+msgid "Number of tracks in generated playlists:"
+msgstr "Число дорожек в сгенерированных списках воспроизведения:"
+
+#: ../data/gtkpod.glade.h:226
+msgid ""
+"Number of tracks in the generated playlists 'Most Often Listened', 'Best "
+"Rated' and 'Most Recently Played'. Choose '0' for 'no limit'."
+msgstr "Число дорожек в сгенерированных списках воспроизведения"
+"\"Наиболее часто прослушиваемые\", \"Наибольший рейтинг\" и"
+"\"Последние воспроизведённые\". Выберите 0, чтобы убрать лимит."
+
+#: ../data/gtkpod.glade.h:227
+msgid "Ogg with :"
+msgstr "Ogg с помощью:"
+
+#: ../data/gtkpod.glade.h:228
+msgid "On startup automatically sync with playlist directories"
+msgstr "Автоматически синхронизироваться с папками списков воспроизведения при запуске"
+
+#: ../data/gtkpod.glade.h:229
+msgid "On startup automatically sync with the following directory"
+msgstr "Автоматически синхронизироваться со следующей директорией при запуске"
+
+#: ../data/gtkpod.glade.h:230
+msgid "On startup automatically update (Live Playlist)"
+msgstr "Автоматически обновлять при запуске (список воспроизведения реального времени)"
+
+#: ../data/gtkpod.glade.h:231
+msgid "One for each Album"
+msgstr "По одному для каждого альбома"
+
+#: ../data/gtkpod.glade.h:232
+msgid "One for each Artist"
+msgstr "По одному для каждого исполнителя"
+
+#: ../data/gtkpod.glade.h:233
+msgid "One for each Composer"
+msgstr "По одному для каждого композитора"
+
+#: ../data/gtkpod.glade.h:234
+msgid "One for each Genre"
+msgstr "По одному для каждого жанра"
+
+#: ../data/gtkpod.glade.h:235
+msgid "One for each Rating"
+msgstr "По одному для каждого рейтинга"
+
+#: ../data/gtkpod.glade.h:236
+msgid "One for each Year"
+msgstr "По одному для каждого года"
+
+#: ../data/gtkpod.glade.h:237
+msgid "Overwrite tags that are already set"
+msgstr "Перезаписывать уже заданные метки"
+
+#: ../data/gtkpod.glade.h:238
+msgid "Password:"
+msgstr "Пароль:"
+
+#: ../data/gtkpod.glade.h:239
+msgid "Path:"
+msgstr "Путь:"
+
+#: ../data/gtkpod.glade.h:240
+msgid "Photo Window"
+msgstr "Окно снимков"
+
+#: ../data/gtkpod.glade.h:241 ../src/display_spl.c:94
+msgid "Play time"
+msgstr "Длительность"
+
+#: ../data/gtkpod.glade.h:242 ../src/display_spl.c:98
+#: ../src/misc_conversion.c:77
+msgid "Playcount"
+msgstr "Число воспроизведений"
+
+#: ../data/gtkpod.glade.h:243 ../src/display_tracks.c:2097
+msgid "Played"
+msgstr "Воспроизведено"
+
+#: ../data/gtkpod.glade.h:244
+msgid "Playlist name:"
+msgstr "Имя списка воспроизведения:"
+
+#: ../data/gtkpod.glade.h:245
+msgid "Playlist type:"
+msgstr "Тип списка воспроизведения:"
+
+#: ../data/gtkpod.glade.h:246 ../src/display_playlists.c:2258
+msgid "Playlists"
+msgstr "Списки воспроизведения"
+
+#: ../data/gtkpod.glade.h:247
+msgid "Please refer to the notice below."
+msgstr "Пожалуйста, обратитесь к замечанию ниже."
+
+#: ../data/gtkpod.glade.h:248
+msgid "Please specify a time interval"
+msgstr "Пожалуйста, задайте временной интервал"
+
+#: ../data/gtkpod.glade.h:249
+msgid "Preferences"
+msgstr "Параметры"
+
+#: ../data/gtkpod.glade.h:250
+msgid "Progress Information"
+msgstr "Сведения о ходе операции"
+
+#: ../data/gtkpod.glade.h:251
+msgid "R_ename Album"
+msgstr "Пере&именовать альбом"
+
+#: ../data/gtkpod.glade.h:252
+msgid "Random Playlist from Displayed Tracks"
+msgstr "Случайный список воспроизведения из отображаемых дорожек"
+
+#: ../data/gtkpod.glade.h:253
+msgid "Randomize Current Playlist"
+msgstr "Перестроить текущий список воспроизведения случайным образом"
+
+#: ../data/gtkpod.glade.h:254 ../src/display_spl.c:101
+#: ../src/misc_conversion.c:78
+msgid "Rating"
+msgstr "Рейтинг"
+
+#: ../data/gtkpod.glade.h:255
+msgid "Read coverart from embedded APIC data"
+msgstr "Читать изображения обложек из внедрённых данных APIC"
+
+#: ../data/gtkpod.glade.h:256
+msgid "Read tags from file contents (e.g. ID3 tags in MP3 files)"
+msgstr "Читать метки из содержимого файлов (например, меток ID3 для файлов MP3)"
+
+#: ../data/gtkpod.glade.h:257
+msgid "Remove selected attributes from the displayed list"
+msgstr "Удалить выбранные атрибуты из отображаемого списка"
+
+#: ../data/gtkpod.glade.h:258
+msgid "Repository Options"
+msgstr "Настройки репозитория"
+
+#: ../data/gtkpod.glade.h:259
+msgid "Repository name:"
+msgstr "Название репозитория:"
+
+#: ../data/gtkpod.glade.h:260
+msgid "Repository type:"
+msgstr "Тип репозитория:"
+
+#: ../data/gtkpod.glade.h:261
+msgid "Root directory of mserv database (trackinfo root)."
+msgstr "Корневая папка базы данных mserv (trackinfo)."
+
+#: ../data/gtkpod.glade.h:262
+msgid "Rules"
+msgstr "Правила"
+
+#: ../data/gtkpod.glade.h:263 ../src/context_menus.c:804
+msgid "Save Changes"
+msgstr "Сохранить изменения"
+
+#: ../data/gtkpod.glade.h:264
+msgid "Scrobble Tracks?"
+msgstr "Собирать статистику о дорожках?"
+
+#: ../data/gtkpod.glade.h:265
+msgid "Select '-1' for no upper limit."
+msgstr "Выберите \"-1\" для отключения верхней границы."
+
+#: ../data/gtkpod.glade.h:266
+msgid "Select '0' for no lower limit."
+msgstr "Выберите \"0\" для отключения нижней границы."
+
+#: ../data/gtkpod.glade.h:267
+msgid ""
+"Selected\n"
+"Playlist"
+msgstr "Выбранный\n"
+"список воспроизведения"
+
+#: ../data/gtkpod.glade.h:269
+msgid ""
+"Selected\n"
+"Tracks"
+msgstr "Выбранные\n"
+"дорожки"
+
+#: ../data/gtkpod.glade.h:271
+msgid "Selected Filter Tab Entry from Database"
+msgstr "Выбранную запись вкладки фильтрации из базы данных"
+
+#: ../data/gtkpod.glade.h:272
+msgid "Selected Filter Tab Entry from Hard Disk"
+msgstr "Выбранную запись вкладки фильтрации с жёсткого диска"
+
+#: ../data/gtkpod.glade.h:273
+msgid "Selected Filter Tab Entry from Playlist"
+msgstr "Выбранную запись вкладки фильтрации из списка воспроизведения"
+
+#: ../data/gtkpod.glade.h:274
+msgid "Selected Filter Tab Entry from iPod"
+msgstr "Выбранную запись вкладки фильтрации с iPod"
+
+#: ../data/gtkpod.glade.h:275
+msgid "Selected Playlist Including Tracks from Database"
+msgstr "Выбранный список воспроизведения, включая дорожки, из базы данных"
+
+#: ../data/gtkpod.glade.h:276
+msgid "Selected Playlist Including Tracks from Hard Disk"
+msgstr "Выбранный список воспроизведения, включая дорожки, с жёсткого диска"
+
+#: ../data/gtkpod.glade.h:277
+msgid "Selected Playlist Including Tracks from iPod"
+msgstr "Выбранный список воспроизведения, включая дорожки, с iPod"
+
+#: ../data/gtkpod.glade.h:278
+msgid "Selected Tab _Entry"
+msgstr "Выбранную _запись вкладки"
+
+#: ../data/gtkpod.glade.h:279
+msgid "Selected Tracks from Database"
+msgstr "Выбранные дорожки из базы данных"
+
+#: ../data/gtkpod.glade.h:280
+msgid "Selected Tracks from Hard Disk"
+msgstr "Выбранные дорожки с жёсткого диска"
+
+#: ../data/gtkpod.glade.h:281
+msgid "Selected Tracks from Playlist"
+msgstr "Выбранные дорожки из списка воспроизведения"
+
+#: ../data/gtkpod.glade.h:282
+msgid "Selected Tracks from iPod"
+msgstr "Выбранные дорожки с iPod"
+
+#: ../data/gtkpod.glade.h:283
+msgid "Selected _Playlist"
+msgstr "Выбранный _список воспроизведения"
+
+#: ../data/gtkpod.glade.h:284
+msgid "Selected _Tracks"
+msgstr "Выбранные _дорожки"
+
+#: ../data/gtkpod.glade.h:285
+msgid "Selected playlist"
+msgstr "Выбранный список воспроизведения"
+
+#: ../data/gtkpod.glade.h:286
+msgid "Semicolon separated list of file exclusion masks, e.g. '*.mp3'"
+msgstr "Список файловых масок для исключения, разделённых точками с запятой, например, \"*.mp3\""
+
+#: ../data/gtkpod.glade.h:287
+msgid "Set Cover Art from _File"
+msgstr "Выбрать обложку из _файла"
+
+#: ../data/gtkpod.glade.h:288
+msgid "Set mountpoint or edit repository options"
+msgstr "Задать точку монтирования или изменить параметры репозитория"
+
+#: ../data/gtkpod.glade.h:289
+msgid "Set options for Calendar/Contacts/Notes"
+msgstr "Задать настройки календаря/контактов/заметок"
+
+#: ../data/gtkpod.glade.h:290
+msgid ""
+"Set this to 'aacgain -q -k' to use the 'Normalize volume' functionality in "
+"the Tools Menu. If this is set, missing normalization data for .m4a and .m4b "
+"files will be calculated and written to your music file using this command."
+msgstr "Установите это в \"aacgain -q -k, чтобы использовать функцию \"Нормализовать"
+"громкость\" в меню \"Сервис\". Если эта опция задана, отсутствующие данные"
+"о нормализации для файлов M4A и M4B будут вычислены и записаны в"
+"музыкальный файл с помощью этой команды."
+
+#: ../data/gtkpod.glade.h:291
+msgid ""
+"Set this to 'mp3gain -q -k' to use the 'Normalize volume' functionality in "
+"the Tools Menu. If this is set, missing normalization data for mp3 files "
+"will be calculated and written to your mp3 file using this command."
+msgstr "Установите это в \"aacgain -q -k, чтобы использовать функцию \"Нормализовать"
+"громкость\" в меню \"Сервис\". Если эта опция задана, отсутствующие данные"
+"о нормализации для файлов MP3 будут вычислены и записаны в файл MP3"
+"с помощью этой команды."
+
+#: ../data/gtkpod.glade.h:292
+msgid "Set this to your last.fm password"
+msgstr "Введите здесь ваш пароль last.fm"
+
+#: ../data/gtkpod.glade.h:293
+msgid "Set this to your last.fm username"
+msgstr "Введите здесь ваше имя пользователя last.fm"
+
+#: ../data/gtkpod.glade.h:294
+msgid ""
+"Set to 0 to effectively disable caching (a maximum of one track will be "
+"cached at a time)."
+msgstr "Установите в 0, чтобы де-факто отключить кэширование (будет"
+"кэшировано не более одной дорожки)."
+
+#: ../data/gtkpod.glade.h:295
+msgid ""
+"Set to 0 to use as many background threads as CPUs are available on your "
+"system."
+msgstr "Установите в 0, чтобы использовать максимально доступное на вашей"
+"системе число фоновых потоков."
+
+#: ../data/gtkpod.glade.h:296
+msgid "Show information about problems when accessing mserv"
+msgstr "Показывать сведения о проблемах при доступе к mserv"
+
+#: ../data/gtkpod.glade.h:297
+msgid "Show summary of sync result"
+msgstr "Показать сводную информацию о результате синхронизации"
+
+#: ../data/gtkpod.glade.h:298 ../src/misc_playlist.c:96
+#: ../src/repository.c:1356
+msgid "Smart Playlist"
+msgstr "Умный список воспроизведения"
+
+#: ../data/gtkpod.glade.h:299
+msgid "Sort tracks according to: "
+msgstr "Сортировать дорожки по:"
+
+#: ../data/gtkpod.glade.h:300
+msgid "Sorting Options"
+msgstr "Параметры сортировки"
+
+#: ../data/gtkpod.glade.h:301
+msgid "Sorting case sensitive"
+msgstr "Сортировка с учётом регистра"
+
+#: ../data/gtkpod.glade.h:302
+msgid "Sorttab: "
+msgstr "Вкладка сортировки: "
+
+#: ../data/gtkpod.glade.h:303
+msgid "Sorttabs"
+msgstr "Вкладки сортировки"
+
+#: ../data/gtkpod.glade.h:304
+msgid "Source:"
+msgstr "Источник:"
+
+#: ../data/gtkpod.glade.h:306
+#, no-c-format
+msgid ""
+"Specify exact path including command line options. '%i' will be replaced "
+"with the mount point of the iPod."
+msgstr "Задайте точный путь, включая параметры командной строки. \"%i\" будет"
+"заменено на точку монтирования iPod."
+
+#: ../data/gtkpod.glade.h:307
+msgid "Specify interval"
+msgstr "Задайте интервал"
+
+#: ../data/gtkpod.glade.h:308
+msgid "Start display automatically"
+msgstr "Начать отображение автоматически"
+
+#: ../data/gtkpod.glade.h:309
+msgid "Synchronise Contacts, Calendar and Notes"
+msgstr "Синхронизировать контакты, календарь и заметки"
+
+#: ../data/gtkpod.glade.h:310
+msgid "Synchronize All"
+msgstr "Синхронизировать всё"
+
+#: ../data/gtkpod.glade.h:311
+msgid "Synchronize Calendar"
+msgstr "Синхронизировать календарь"
+
+#: ../data/gtkpod.glade.h:312
+msgid "Synchronize Contacts"
+msgstr "Синхронизировать контакты"
+
+#: ../data/gtkpod.glade.h:313
+msgid "Synchronize Notes"
+msgstr "Синхронизировать заметки"
+
+#: ../data/gtkpod.glade.h:314
+msgid "Template for info field: "
+msgstr "Шаблон для поля сведений:"
+
+#: ../data/gtkpod.glade.h:315
+msgid ""
+"The local copy of the track is referenced in the playlist. If the track is "
+"not available locally, an error message is displayed."
+msgstr "Список воспроизведения ссылается на локальную копию дорожки Если"
+"дорожка недоступна локально, будет показано сообщение об ошибке."
+
+#: ../data/gtkpod.glade.h:316
+msgid ""
+"The output of the background conversion scripts is copied below. Each page "
+"of the notebook corresponds to one background thread."
+msgstr "Вывод фоновых сценариев преобразования копируется ниже. Каждая вкладка"
+"соответствует одному фоновому потоку."
+
+#: ../data/gtkpod.glade.h:317
+msgid ""
+"The tags are written to the files on your harddrive and on the iPod (if "
+"available)."
+msgstr "Метки записываются в файлы на вашем жёстком диске и на iPod"
+"(если доступно)."
+
+#: ../data/gtkpod.glade.h:318
+msgid "The track on the iPod is referenced in the playlist file."
+msgstr "Файл списка воспроизведения ссылается на дорожку на iPod."
+
+#: ../data/gtkpod.glade.h:319
+msgid "This is the same option as in 'Edit/Delete Confirmation'"
+msgstr "Это та же опция, что и в группе \"Подтверждение изменения/удаления\"."
+
+#: ../data/gtkpod.glade.h:320
+msgid ""
+"This is the way to go, but maybe not all programs support it yet. ID3v2.4 "
+"uses unicode to store the tags, so you won't have to worry about charsets "
+"any more. gtkpod will use UTF8 encoding as this will not increase the size "
+"of pure ASCII tags. ID3v2.2/4 tags will also be written if they are already "
+"present in the file to write to."
+msgstr "Это предпочтительный путь, но возможно, не все программы это поддерживают"
+"на данный момент. ID3v2.4 использует Unicode для сохранения меток, так что"
+"вам больше не надо будет беспокоиться о кодировках. gtkpod будет использовать"
+"кодирование в UTF-8, поскольку это не увеличит размер меток в чистом ASCII."
+"Метки ID3v2.2/4 также будут записаны, если они уже присутствуют в файле, в"
+"который производится запись."
+
+#: ../data/gtkpod.glade.h:321
+msgid "This option will be re-activated when you upgrade gtkpod."
+msgstr "Эта опция будет включена вновь после обновления gtkpod."
+
+#: ../data/gtkpod.glade.h:322
+msgid "Time:"
+msgstr "Время:"
+
+#: ../data/gtkpod.glade.h:323 ../src/display_sorttabs.c:2991
+#: ../src/display_spl.c:83 ../src/misc_conversion.c:62
+msgid "Title"
+msgstr "Название"
+
+#: ../data/gtkpod.glade.h:324
+msgid ""
+"Total\n"
+"(iPod)"
+msgstr "Всего\n"
+"(iPod)"
+
+#: ../data/gtkpod.glade.h:326
+msgid ""
+"Total\n"
+"(local)"
+msgstr "Всего\n"
+"(локально)"
+
+#: ../data/gtkpod.glade.h:328
+msgid "Tracks"
+msgstr "Дорожки"
+
+#: ../data/gtkpod.glade.h:329
+msgid "Tracks Most Often Listened To"
+msgstr "Наиболее часто прослушиваемые дорожки"
+
+#: ../data/gtkpod.glade.h:330
+msgid ""
+"Tracks can be transferred in the background as soon as they are added to an "
+"iPod repository. Otherwise they will be transferred when ejecting the "
+"contents of the iPod completely unchanged until then."
+msgstr "Дорожки могут быть переданы в фоновом режиме неспосредственно после"
+"добавления в репозиторий iPod. В противном случае они будут переданы при"
+"извлечении iPod, а до этого его содержимое не изменится."
+
+#: ../data/gtkpod.glade.h:331
+msgid "Tracks in Selected Tab _Entry"
+msgstr "Дорожки в выбранной _записи вкладки"
+
+#: ../data/gtkpod.glade.h:332
+msgid "Tracks in Selected _Playlist"
+msgstr "Дорожки в выбранном _списке воспроизведения"
+
+#: ../data/gtkpod.glade.h:333
+msgid "Transfer tracks to the iPod in the background"
+msgstr "Передавать дорожки на iPod в фоновом режиме"
+
+#: ../data/gtkpod.glade.h:334
+msgid "Translators"
+msgstr "Переводчики"
+
+#: ../data/gtkpod.glade.h:335
+msgid ""
+"Try to load contents of all connected iPods. For each iPod a separate "
+"repository must be set up."
+msgstr "Попытаться загрузить содержимое всех подключённых iPod. Для каждого"
+"iPod должен быть создан отдельный репозиторий."
+
+#: ../data/gtkpod.glade.h:336
+msgid "Undo _Track"
+msgstr "Отменить _дорожку"
+
+#: ../data/gtkpod.glade.h:337
+msgid "Update _mserv Data from File"
+msgstr "Обновить данные _mserv из файла"
+
+#: ../data/gtkpod.glade.h:338
+msgid "Update/Sync all playlists now"
+msgstr "Обновить/синхронизировать все списки воспроизведения сейчас"
+
+#: ../data/gtkpod.glade.h:339
+msgid "Update/Sync playlist now"
+msgstr "Обновить/синхронизировать список воспроизведения сейчас"
+
+#: ../data/gtkpod.glade.h:340
+msgid "Upper margin"
+msgstr "Верхняя граница"
+
+#: ../data/gtkpod.glade.h:341
+msgid "Use 'Multi-Edit' also for title field"
+msgstr "Использовать многострочный редактор также для поля \"Название\""
+
+#: ../data/gtkpod.glade.h:342
+msgid "Use 'Multi-Edit' for tracks selections"
+msgstr "Использовать многострочный редактор для выбора дорожек"
+
+#: ../data/gtkpod.glade.h:343
+msgid "Use <i>&lt;Album&gt;.jpg</i> in the parent directory"
+msgstr "Использовать <i>&lt;Album&gt;.jpg</i> в родительской папке"
+
+#: ../data/gtkpod.glade.h:344
+msgid "Use <i>&lt;Album&gt;.jpg</i>, <i>&lt;Album&gt;.png</i>..."
+msgstr "Использовать <i>&lt;Album&gt;.jpg</i>, <i>&lt;Album&gt;.png</i>..."
+
+#: ../data/gtkpod.glade.h:345
+msgid "Use <i>folder.jpg</i> as cover art."
+msgstr "Использовать <i>folder.jpg</i> как обложку."
+
+#: ../data/gtkpod.glade.h:346
+msgid "Use <i>folder.jpg</i>, <i>folder.png</i>..."
+msgstr "Использовать <i>folder.jpg</i>, <i>folder.png</i>..."
+
+#: ../data/gtkpod.glade.h:347
+msgid "Use mserv database to fill additional information"
+msgstr "Использовать базу данных mserv для заполнения дополнительных сведений"
+
+#: ../data/gtkpod.glade.h:348
+msgid ""
+"Use selected charset (Preferences/'Adding/Updating/ Syncing')\n"
+"for this filename."
+msgstr "Использовать выбранныю кодировку (Параметры - Добавление/обновление/синхронизация)\n"
+"для этого имени файла."
+
+#: ../data/gtkpod.glade.h:350
+msgid ""
+"Use selected encoding (on the 'General' page)\n"
+"when writing tags"
+msgstr "Использовать выбранную кодировку (на вкладке \"Общие\")\n"
+"при записи меток"
+
+#: ../data/gtkpod.glade.h:352
+msgid "Use selected encoding also when updating or syncing tracks"
+msgstr "Использовать выбранную кодировку также при обновлении или синхронизации дорожек"
+
+#: ../data/gtkpod.glade.h:353
+msgid "Use this template to parse filename for tag information:"
+msgstr "Использовать этот шаблон для разбора имени файла при заполнении меток:"
+
+#: ../data/gtkpod.glade.h:354
+msgid "Username to be used for mserv database lookup."
+msgstr "Имя пользователя, используемое для поиска в базе данных mserv."
+
+#: ../data/gtkpod.glade.h:355
+msgid "Username:"
+msgstr "Имя пользователя:"
+
+#: ../data/gtkpod.glade.h:356
+msgid ""
+"Usually you don't want to set the title of several tracks to the same text. "
+"This option might avoid unwanted results (especially since there is no "
+"'undo' yet)."
+msgstr "Присвоение нескольким дорожкам одного и того же названия обычно не приветствуется."
+"Эта опция поможет избежать нежелательных результатов (особенно учитывая, что функции"
+"\"Отмена\" пока не существует)."
+
+#: ../data/gtkpod.glade.h:357
+msgid "View Full Size"
+msgstr "Просмотреть в полном размере"
+
+#: ../data/gtkpod.glade.h:358
+msgid "WAV with :"
+msgstr "WAV с помощью:"
+
+#: ../data/gtkpod.glade.h:359
+msgid ""
+"When adding dirs/files, update information of\n"
+"existing tracks with identical filenames"
+msgstr "Обновлять сведения о существующих дорожках\n"
+"с одинаковыми именами файлов при добавлении папок/файлов"
+
+#: ../data/gtkpod.glade.h:361
+msgid ""
+"When copying from iPod no check is performed on whether the destination file "
+"exists. Enabling this option will make gtkpod check whether the length of "
+"the destination file is the same as the file in the iPod. If so the file is "
+"skipped, allowing a quick sync of the iPod's contents."
+msgstr "При копировании с iPod не производится проверка существования конечного файла."
+"При включении этой опции gtkpod будет проверять, соответствует ли длина конечного"
+"файла длине файла на iPod. Если это так, файл пропускается, позволяя быстро"
+"синхронизировать всё содержимое iPod."
+
+#: ../data/gtkpod.glade.h:362
+msgid "When syncing playlists"
+msgstr "При синхронизации списков воспроизведения"
+
+#: ../data/gtkpod.glade.h:363
+msgid ""
+"Will show a list of tracks removed and a list of tracks newly added or "
+"updated."
+msgstr "Показывает список удалённых дорожек, а также список новых и"
+"обновлённых дорожек."
+
+#: ../data/gtkpod.glade.h:364
+msgid "Write ID3 tags to disk when modified in gtkpod"
+msgstr "Записывать метки ID3 на диск при их изменении в gtkpod"
+
+#: ../data/gtkpod.glade.h:365
+msgid "Write all changes made to the disk and the iPod(s)."
+msgstr "Записать все сделанные изменения на диск и на iPod"
+
+#: ../data/gtkpod.glade.h:366
+msgid ""
+"Write extended information (PC filenames, SHA1 hashes,\n"
+"encoding...). Recommended."
+msgstr "Записывать расширенную информацию (имена файлов на ПК,"
+"хэши SHA1, кодировку...). Рекомендуется."
+
+#: ../data/gtkpod.glade.h:368
+msgid ""
+"You can also use the table headers, but this allows you to sort according to "
+"a column that is not displayed."
+msgstr "Вы также можете использовать столбцы таблицы, но это позволяет вам"
+"сортировать дорожки по полям, отсутствующим в таблице."
+
+#: ../data/gtkpod.glade.h:369
+msgid "_About gtkpod"
+msgstr "_О программе gtkpod"
+
+#: ../data/gtkpod.glade.h:370
+msgid "_Add Album"
+msgstr "_Добавить альбом"
+
+#: ../data/gtkpod.glade.h:371
+msgid "_Add Image"
+msgstr "_Добавить изображение"
+
+#: ../data/gtkpod.glade.h:372
+msgid "_Album"
+msgstr "_Альбом"
+
+#: ../data/gtkpod.glade.h:373
+msgid "_All Tracks"
+msgstr "_Все дорожки"
+
+#: ../data/gtkpod.glade.h:374
+msgid "_Arrange Sort Tabs"
+msgstr "_Упорядочить вкладки сортировки"
+
+#: ../data/gtkpod.glade.h:375
+msgid "_Check iPod's Files"
+msgstr "_Проверить файлы на iPod"
+
+#: ../data/gtkpod.glade.h:376
+msgid "_Conversion Log"
+msgstr "_Журнал сообщений преобразования"
+
+#: ../data/gtkpod.glade.h:377
+msgid "_Create Playlists"
+msgstr "_Создать списки воспроизведения"
+
+#: ../data/gtkpod.glade.h:378
+msgid "_Create iPod's Directories"
+msgstr "_Создать папки на iPod"
+
+#: ../data/gtkpod.glade.h:379
+msgid "_Delete"
+msgstr "_Удалить"
+
+#: ../data/gtkpod.glade.h:380
+msgid "_Display"
+msgstr "_Отображение"
+
+#: ../data/gtkpod.glade.h:381
+msgid "_Displayed Tracks"
+msgstr "_Отображаемые дорожки"
+
+#: ../data/gtkpod.glade.h:382
+msgid "_Edit"
+msgstr "_Правка"
+
+#: ../data/gtkpod.glade.h:383
+msgid "_Encoding (ID3, files):"
+msgstr "_Кодировка (ID3, файлы):"
+
+#: ../data/gtkpod.glade.h:384
+msgid "_Enqueue"
+msgstr "_Поставить в очередь"
+
+#: ../data/gtkpod.glade.h:385
+msgid "_Export Tracks from Database"
+msgstr "_Экспортировать дорожки из базы данных"
+
+#: ../data/gtkpod.glade.h:386
+msgid "_File"
+msgstr "_Файл"
+
+#: ../data/gtkpod.glade.h:387
+msgid "_General"
+msgstr "_Общие"
+
+#: ../data/gtkpod.glade.h:388
+msgid "_Help"
+msgstr "_Справка"
+
+#: ../data/gtkpod.glade.h:389
+msgid "_Ignore rules"
+msgstr "_Игнорировать правила"
+
+#: ../data/gtkpod.glade.h:390
+msgid "_Image"
+msgstr "_Изображение"
+
+#: ../data/gtkpod.glade.h:391
+msgid "_Info Window"
+msgstr "Окно _сведений"
+
+#: ../data/gtkpod.glade.h:392
+msgid "_Last.FM"
+msgstr "_Last.FM"
+
+#: ../data/gtkpod.glade.h:393
+msgid "_Less Sort Tabs"
+msgstr "_Меньше вкладок сортировки"
+
+#: ../data/gtkpod.glade.h:394
+msgid "_Limit to"
+msgstr "_Ограничить"
+
+#: ../data/gtkpod.glade.h:395
+msgid "_Load iPod(s)"
+msgstr "_Загрузить iPod"
+
+#: ../data/gtkpod.glade.h:396
+msgid "_Local"
+msgstr "_Локальный"
+
+#: ../data/gtkpod.glade.h:397
+msgid "_M3U"
+msgstr "_M3U"
+
+#: ../data/gtkpod.glade.h:398
+msgid "_Misc."
+msgstr "_Разное"
+
+#: ../data/gtkpod.glade.h:399
+msgid "_More Sort Tabs"
+msgstr "_Больше вкладок сортировки"
+
+#: ../data/gtkpod.glade.h:400
+msgid "_Newly Added Tracks"
+msgstr "_Вновь добавленные дорожки"
+
+#: ../data/gtkpod.glade.h:401
+msgid "_Normalize Volume"
+msgstr "_Нормализовать громкость"
+
+#: ../data/gtkpod.glade.h:402
+msgid "_Number of sort tabs:"
+msgstr "_Число вкладок сортировки:"
+
+#: ../data/gtkpod.glade.h:403
+msgid "_PLS"
+msgstr "_PLS"
+
+#: ../data/gtkpod.glade.h:404
+msgid "_Play Now"
+msgstr "_Воспроизвести сейчас"
+
+#: ../data/gtkpod.glade.h:405
+msgid "_Podcasts"
+msgstr "_Подкасты"
+
+#: ../data/gtkpod.glade.h:406
+msgid "_Prefer Local"
+msgstr "_Предпочитать локальные"
+
+#: ../data/gtkpod.glade.h:407
+msgid "_Remove Cover Art"
+msgstr "_Удалить обложку"
+
+#: ../data/gtkpod.glade.h:408
+msgid "_Remove Images"
+msgstr "_Удалить изображения"
+
+#: ../data/gtkpod.glade.h:409
+msgid "_Remove _Album"
+msgstr "_Удалить альбом"
+
+#: ../data/gtkpod.glade.h:410
+msgid "_Save Changes"
+msgstr "_Сохранить изменения"
+
+#: ../data/gtkpod.glade.h:411
+msgid "_Save Displayed Track Order"
+msgstr "_Сохранить отображаемый порядок дорожек"
+
+#: ../data/gtkpod.glade.h:412
+msgid "_Sorting"
+msgstr "_Сортировка"
+
+#: ../data/gtkpod.glade.h:413
+msgid "_Synchronize Playlist with Dir(s)"
+msgstr "_Синхронизировать список воспроизведения с папками"
+
+#: ../data/gtkpod.glade.h:414
+msgid "_Toolbar"
+msgstr "_Панель инструментов"
+
+#: ../data/gtkpod.glade.h:415
+msgid "_Tools"
+msgstr "_Инструменты"
+
+#: ../data/gtkpod.glade.h:416
+msgid "_Tooltips"
+msgstr "_Всплывающие подсказки"
+
+#: ../data/gtkpod.glade.h:417
+msgid "_Track Info"
+msgstr "_Сведения о дорожке"
+
+#: ../data/gtkpod.glade.h:418
+msgid "_Undo All"
+msgstr "_Отменить все"
+
+#: ../data/gtkpod.glade.h:419
+msgid "_Update Tracks from File"
+msgstr "_Обновить дорожки из файла"
+
+#: ../data/gtkpod.glade.h:420
+msgid "_Video"
+msgstr "_Видео"
+
+#: ../data/gtkpod.glade.h:421
+msgid "_View"
+msgstr "_Вид"
+
+#: ../data/gtkpod.glade.h:422
+msgid "_iPod"
+msgstr "_iPod"
+
+#: ../data/gtkpod.glade.h:424
+#, no-c-format
+msgid ""
+"artist: %a, album: %A, composer: %c, title: %t, genre: %G, track nr: %T, CD "
+"nr: %C, year: %Y, skip data: %*, the character '%': %%. You can separate "
+"several templates by a ';'. The first one matching the filename will be "
+"used. Example: '%a - %A/%T %t.mp3;%t.wav'."
+msgstr "исполнитель: %a, альбом: %A, композитор: %c, название: %t, жанр: %G, номер дорожки: %T,"
+"номер CD: %C, год: %Y, пропускать данные: %*, символ '%': %%. Вы можете разделить "
+"несколько шаблонов точками с запятой. Будет использован первый, отвечающий имени"
+"файла. Пример: '%a - %A/%T %t.mp3;%t.wav'."
+
+#: ../data/gtkpod.glade.h:425
+msgid "folder"
+msgstr "folder"
+
+#: ../data/gtkpod.glade.h:426
+msgid "folder.jpg"
+msgstr "folder.jpg"
+
+#: ../data/gtkpod.glade.h:428
+#, no-c-format
+msgid "folder.jpg;%a.jpg"
+msgstr "folder.jpg;%a.jpg"
+
+#: ../data/gtkpod.glade.h:429
+msgid "gtkpod"
+msgstr "gtkpod"
+
+#: ../data/gtkpod.glade.h:430
+msgid "gtkpod Info"
+msgstr "Сведения gtkpod"
+
+#: ../data/gtkpod.glade.h:431
+msgid ""
+"gtkpod expects the ID3 tags and the filenames to be in the encoding "
+"specified here. You can change it for consecutive 'Add Files' and 'Add Dirs' "
+"operation. 'System Charset' is the charset used by your current locale."
+msgstr "gtkpod ожидает, что метки ID3 и имена файлов будут в указанной здесь"
+"кодировке. Вы можете изменить её для последовательных операций"
+"\"Добавить файлы\" и \"Добавить папку\". \"Системная кодировка\" - это"
+"кодировка, заданная вашей текущей локалью."
+
+#: ../data/gtkpod.glade.h:432
+msgid "gtkpod options"
+msgstr "параметры gtkpod"
+
+#. These are the items for the 'Repository type' combo in the 'Create Repository' dialog. Keep the three items in order!
+#: ../data/gtkpod.glade.h:434
+msgid ""
+"iPod\n"
+"Local Repository (Standard)\n"
+"Local Repository (Podcasts)\n"
+msgstr "iPod\n"
+"Локальный репозиторий (стандартный)\n"
+"Локальный репозитория (подкасты)\n"
+
+#: ../data/gtkpod.glade.h:438
+msgid "iPod mountpoint:"
+msgstr "Точка монтирования iPod:"
+
+#: ../data/gtkpod.glade.h:439
+msgid "iTunesDB backup:"
+msgstr "Резервная копия iTunesDB:"
+
+#: ../data/gtkpod.glade.h:440
+msgid "label"
+msgstr "label"
+
+#: ../data/gtkpod.glade.h:441
+msgid "mserv Root:"
+msgstr "Корень mserv:"
+
+#: ../data/gtkpod.glade.h:442
+msgid "mserv database lookup will be done for music in this directory."
+msgstr "Поиск по базе данных mserv будет производиться для музыки в этой папке."
+
+#: ../data/gtkpod.glade.h:443 ../src/details.c:1347
+msgid "n/a"
+msgstr "н/д"
+
+#: ../data/gtkpod.glade.h:444
+msgid "special_sorttab -- Don't translate!"
+msgstr "special_sorryab -- Не переводить!"
+
+#: ../src/autodetection.c:310
+msgid "Could not initialize GnomeVFS\n"
+msgstr "Не удалось инициализировать GnomeVFS\n"
+
+#: ../src/autodetection.c:397
+#, c-format
+msgid ""
+"Newly mounted iPod at '%s' could not be loaded into gtkpod.\n"
+"\n"
+msgstr "Вновь примонтированный iPod \"%s\" не мог быть загружен в gtkpod.\n"
+"\n"
+
+#: ../src/autodetection.c:403
+#, c-format
+msgid ""
+"Newly mounted iPod at '%s' appears to be already loaded!\n"
+"\n"
+msgstr "Вновь примонтированный iPod \"%s\" выглядит уже загруженным!\n"
+"\n"
+
+#: ../src/autodetection.c:416
+msgid "New iPod"
+msgstr "Новый iPod"
+
+#: ../src/charset.c:53
+msgid "Arabic (IBM-864)"
+msgstr "Арабская (IBM-864)"
+
+#: ../src/charset.c:54
+msgid "Arabic (ISO-8859-6)"
+msgstr "Арабская (ISO-8859-6)"
+
+#: ../src/charset.c:55
+msgid "Arabic (Windows-1256)"
+msgstr "Арабская (Windows-1256)"
+
+#: ../src/charset.c:56
+msgid "Baltic (ISO-8859-13)"
+msgstr "Балтийская (ISO-8859-13)"
+
+#: ../src/charset.c:57
+msgid "Baltic (ISO-8859-4)"
+msgstr "Балтийская (ISO-8859-4)"
+
+#: ../src/charset.c:58
+msgid "Baltic (Windows-1257)"
+msgstr "Балтийская (Windows-1257)"
+
+#: ../src/charset.c:59
+msgid "Celtic (ISO-8859-14)"
+msgstr "Кельтская (ISO-8859-14)"
+
+#: ../src/charset.c:60
+msgid "Central European (IBM-852)"
+msgstr "Центральноевропейская (IBM-852)"
+
+#: ../src/charset.c:61
+msgid "Central European (ISO-8859-2)"
+msgstr "Центральноевропейская (ISO-8859-2)"
+
+#: ../src/charset.c:62
+msgid "Central European (Windows-1250)"
+msgstr "Центральноевропейская (Windows-1250)"
+
+#: ../src/charset.c:63
+msgid "Chinese Simplified (GB18030)"
+msgstr "Китайская упрощённая (GB18030)"
+
+#: ../src/charset.c:64
+msgid "Chinese Simplified (GB2312)"
+msgstr "Китайская традиционная (GB2312)"
+
+#: ../src/charset.c:65
+msgid "Chinese Traditional (Big5)"
+msgstr "Китайская традиционная (Big5)"
+
+#: ../src/charset.c:66
+msgid "Chinese Traditional (Big5-HKSCS)"
+msgstr "Китайская традиционная (Big5-HKSCS)"
+
+#: ../src/charset.c:67
+msgid "Cyrillic (IBM-855)"
+msgstr "Кириллическая (IBM-855)"
+
+#: ../src/charset.c:68
+msgid "Cyrillic (ISO-8859-5)"
+msgstr "Кириллическая (ISO-8859-5)"
+
+#: ../src/charset.c:69
+msgid "Cyrillic (ISO-IR-111)"
+msgstr "Кириллическая (ISO-IR-111)"
+
+#: ../src/charset.c:70
+msgid "Cyrillic (KOI8-R)"
+msgstr "Кириллическая (KOI8-R)"
+
+#: ../src/charset.c:71
+msgid "Cyrillic (Windows-1251)"
+msgstr "Кириллическая (Windows-1251)"
+
+#: ../src/charset.c:72
+msgid "Cyrillic/Russian (CP-866)"
+msgstr "Кириллическая/русская (CP-866)"
+
+#: ../src/charset.c:73
+msgid "Cyrillic/Ukrainian (KOI8-U)"
+msgstr "Кириллическая/украинская (KOI8-U)"
+
+#: ../src/charset.c:74
+msgid "English (US-ASCII)"
+msgstr "Английская (US-ASCII)"
+
+#: ../src/charset.c:75
+msgid "Greek (ISO-8859-7)"
+msgstr "Греческая (ISO-8859-7)"
+
+#: ../src/charset.c:76
+msgid "Greek (Windows-1253)"
+msgstr "Греческая (Windows-1253)"
+
+#: ../src/charset.c:77
+msgid "Hebrew (IBM-862)"
+msgstr "Иврит (IBM-862)"
+
+#: ../src/charset.c:78
+msgid "Hebrew (Windows-1255)"
+msgstr "Иврит (Windows-1255)"
+
+#: ../src/charset.c:79
+msgid "Japanese (automatic detection)"
+msgstr "Японская (автоопределение)"
+
+#: ../src/charset.c:80
+msgid "Japanese (EUC-JP)"
+msgstr "Японская (EUC-JP)"
+
+#: ../src/charset.c:81
+msgid "Japanese (ISO-2022-JP)"
+msgstr "Японская (ISO-2022-JP)"
+
+#: ../src/charset.c:82
+msgid "Japanese (Shift_JIS)"
+msgstr "Японская (Shift_JIS)"
+
+#: ../src/charset.c:83
+msgid "Korean (EUC-KR)"
+msgstr "Корейская (EUC-KR)"
+
+#: ../src/charset.c:84
+msgid "Nordic (ISO-8859-10)"
+msgstr "Нордическая (ISO-8859-10)"
+
+#: ../src/charset.c:85
+msgid "South European (ISO-8859-3)"
+msgstr "Южноевропейская (ISO-8859-3)"
+
+#: ../src/charset.c:86
+msgid "Thai (TIS-620)"
+msgstr "Тайская (TIS-620)"
+
+#: ../src/charset.c:87
+msgid "Turkish (IBM-857)"
+msgstr "Турецкая (IBM-857)"
+
+#: ../src/charset.c:88
+msgid "Turkish (ISO-8859-9)"
+msgstr "Турецкая (ISO-8859-9)"
+
+#: ../src/charset.c:89
+msgid "Turkish (Windows-1254)"
+msgstr "Турецкая (Windows-1254)"
+
+#: ../src/charset.c:90
+msgid "Unicode (UTF-7)"
+msgstr "Unicode (UTF-7)"
+
+#: ../src/charset.c:91
+msgid "Unicode (UTF-8)"
+msgstr "Unicode (UTF-8)"
+
+#: ../src/charset.c:92
+msgid "Unicode (UTF-16BE)"
+msgstr "Unicode (UTF-16BE)"
+
+#: ../src/charset.c:93
+msgid "Unicode (UTF-16LE)"
+msgstr "Unicode (UTF-16LE)"
+
+#: ../src/charset.c:94
+msgid "Unicode (UTF-32BE)"
+msgstr "Unicode (UTF-32BE)"
+
+#: ../src/charset.c:95
+msgid "Unicode (UTF-32LE)"
+msgstr "Unicode (UTF-32LE)"
+
+#: ../src/charset.c:96
+msgid "Vietnamese (VISCII)"
+msgstr "Вьетнамская (VISCII)"
+
+#: ../src/charset.c:97
+msgid "Vietnamese (Windows-1258)"
+msgstr "Вьетнамская (Windows-1258)"
+
+#: ../src/charset.c:98
+msgid "Visual Hebrew (ISO-8859-8)"
+msgstr "Визуальный иврит (ISO-8859-8)"
+
+#: ../src/charset.c:99
+msgid "Western (IBM-850)"
+msgstr "Западная (IBM-850)"
+
+#: ../src/charset.c:100
+msgid "Western (ISO-8859-1)"
+msgstr "Западная (ISO-8859-1)"
+
+#: ../src/charset.c:101
+msgid "Western (ISO-8859-15)"
+msgstr "Западная (ISO-8859-15)"
+
+#: ../src/charset.c:102
+msgid "Western (Windows-1252)"
+msgstr "Западная (Windows-1252)"
+
+#. sanity!
+#. check for "System Charset" and return NULL
+#: ../src/charset.c:160 ../src/charset.c:170 ../src/charset.c:223
+msgid "System Charset"
+msgstr "Системная кодировка"
+
+#. we are not the first instance of gtkpod -- the socket is
+#. already being used, so we pass
+#: ../src/clientserver.c:214
+msgid ""
+"Another instance of gtkpod was detected. Playcount server not started.\n"
+msgstr "Была обнаружена другая копия gtkpod. Сервер числа воспроизведений не был запущен.\n"
+
+#: ../src/confirmation.c:377
+msgid "Confirmation Dialogue"
+msgstr "Диалог подтверждения"
+
+#: ../src/context_menus.c:362
+#, c-format
+msgid "Copied \"%s\" playlist to %s"
+msgstr "Список воспроизведения \"%s\" скопирован в %s"
+
+#: ../src/context_menus.c:401
+#, c-format
+msgid "Copied %d track to '%s'"
+msgstr "Дорожка %d скопирована в \"%s\""
+
+#: ../src/context_menus.c:429
+#, c-format
+msgid "Copied '%s' playlist to '%s' in '%s'"
+msgstr "Список воспроизведения \"%s\" скопирован в \"%s\" в \"%s\""
+
+#: ../src/context_menus.c:462
+#, c-format
+msgid "Copied %d track to '%s' in '%s'"
+msgstr "Дорожка %d скопирована в \"%s\" в \"%s\""
+
+#: ../src/context_menus.c:622 ../src/tools.c:854
+msgid "Play Now"
+msgstr "Воспроизвести сейчас"
+
+#: ../src/context_menus.c:628 ../src/tools.c:867
+msgid "Enqueue"
+msgstr "Поставить в очередь"
+
+#: ../src/context_menus.c:634
+msgid "Copy Tracks to Filesystem"
+msgstr "Скопировать дорожки в файловую систему"
+
+#: ../src/context_menus.c:641 ../src/file_export.c:1085
+msgid "Create Playlist File"
+msgstr "Создать файл списка воспроизведения"
+
+#: ../src/context_menus.c:648
+msgid "Create new Playlist"
+msgstr "Создать новый список воспроизведения"
+
+#: ../src/context_menus.c:655
+msgid "Update Tracks from File"
+msgstr "Обновить дорожки из файла"
+
+#: ../src/context_menus.c:669
+msgid "Sync Playlist with Dir(s)"
+msgstr "Синхронизировать список воспроизведения с папками"
+
+#: ../src/context_menus.c:679
+msgid "Remove All Tracks from iPod"
+msgstr "Удалить все дорожки с iPod"
+
+#: ../src/context_menus.c:697
+msgid "Remove All Podcasts from iPod"
+msgstr "Удалить все подкасты с iPod"
+
+#: ../src/context_menus.c:712
+msgid "Delete Including Tracks"
+msgstr "Удалить, включая дорожки"
+
+#: ../src/context_menus.c:720
+msgid "Delete But Keep Tracks"
+msgstr "Удалить, но сохранить дорожки"
+
+#: ../src/context_menus.c:728
+msgid "Edit iPod Properties"
+msgstr "Свойства iPod"
+
+#: ../src/context_menus.c:735
+msgid "Edit Repository Properties"
+msgstr "Свойства репозитория"
+
+#: ../src/context_menus.c:742
+msgid "Edit Playlist Properties"
+msgstr "Свойства списка воспроизведения"
+
+#: ../src/context_menus.c:770
+msgid "View Full Size Artwork"
+msgstr "Просмотреть изображение в полном размере"
+
+#: ../src/context_menus.c:777
+msgid "Select Cover From File"
+msgstr "Выбрать обложку из файла"
+
+#: ../src/context_menus.c:790
+msgid "Load iPod"
+msgstr "Загрузить iPod"
+
+#: ../src/context_menus.c:797
+msgid "Eject iPod"
+msgstr "Извлечь iPod"
+
+#: ../src/context_menus.c:814
+msgid "Remove All Tracks from Database"
+msgstr "Удалить все дорожки из базы данных"
+
+#: ../src/context_menus.c:829
+msgid "Delete Including Tracks (Harddisk)"
+msgstr "Удалить, включая дорожки (жёсткий диск)"
+
+#: ../src/context_menus.c:837
+msgid "Delete Including Tracks (Database)"
+msgstr "Удалить, включая дорожки (база данных)"
+
+#: ../src/context_menus.c:845
+msgid "Delete From iPod"
+msgstr "Удалить с iPod"
+
+#: ../src/context_menus.c:853
+msgid "Delete From Playlist"
+msgstr "Удалить из списка воспроизведения"
+
+#: ../src/context_menus.c:861
+msgid "Delete From Harddisk"
+msgstr "Удалить с жёсткого диска"
+
+#: ../src/context_menus.c:869
+msgid "Delete From Database"
+msgstr "Удалить из базы данных"
+
+#: ../src/context_menus.c:877
+msgid "Alphabetize"
+msgstr "Упорядочить по алфавиту"
+
+#: ../src/context_menus.c:895
+msgid "Remove Album"
+msgstr "Удалить альбом"
+
+#: ../src/context_menus.c:905
+msgid "Remove Photo"
+msgstr "Удалить снимок"
+
+#: ../src/context_menus.c:915
+msgid "Rename Album"
+msgstr "Переименовать альбом"
+
+#: ../src/context_menus.c:974 ../src/context_menus.c:1023
+msgid "Copy selected playlist to..."
+msgstr "Копировать выбранный список воспроизведения в..."
+
+#: ../src/context_menus.c:1076
+msgid "Copy selected track(s) to..."
+msgstr "Копировать выбранные дорожки в..."
+
+#: ../src/date_parser.l:269
+#, c-format
+msgid "Date format error: unrecognized character: '%s'\n"
+msgstr "Ошибка формата даты: неопознанный символ: \"%s\"\n"
+
+#: ../src/details.c:82
+msgid "Audio/Video"
+msgstr "Аудио/Видео"
+
+#: ../src/details.c:83
+msgid "Audio"
+msgstr "Аудио"
+
+#: ../src/details.c:84
+msgid "Video"
+msgstr "Видео"
+
+#: ../src/details.c:85
+msgid "Podcast"
+msgstr "Подкаст"
+
+#: ../src/details.c:86
+msgid "Video Podcast"
+msgstr "Видеоподкаст"
+
+#: ../src/details.c:87
+msgid "Audiobook"
+msgstr "Аудиокнига"
+
+#: ../src/details.c:88 ../src/display_spl.c:209 ../src/display_spl.c:218
+msgid "Music Video"
+msgstr "Музыкальный видеоклип"
+
+#: ../src/details.c:89 ../src/display_spl.c:107 ../src/display_spl.c:210
+#: ../src/display_spl.c:219 ../src/misc_conversion.c:101
+msgid "TV Show"
+msgstr "Телепередача"
+
+#: ../src/details.c:90
+msgid "TV Show & Music Video"
+msgstr "Телепередача и музыкальный видеоклип"
+
+#: ../src/details.c:836
+#, c-format
+msgid "%s (image data corrupted or unreadable)"
+msgstr "%s (данные изображения повреждены или не читаются)"
+
+#: ../src/details.c:973
+#, c-format
+msgid "Please report unknown mediatype %x\n"
+msgstr "Пожалуйста, сообщите о неизвестном типе данных %x\n"
+
+#: ../src/details.c:1418
+msgid "<b>n/a</b>"
+msgstr "<b>н/д</b>"
+
+#: ../src/details.c:1906
+#, c-format
+msgid "Error occurred dropping an image onto the details window: %s\n"
+msgstr "Произошла ошибка при перетаскивании изображения на окно сведений: %s\n"
+
+#: ../src/details.c:1952 ../src/display_coverart.c:2128
+msgid "Successfully set new coverart for selected tracks"
+msgstr "Новая обложка успешно установлена для выбранных дорожек"
+
+#: ../src/display.c:743
+msgid "Edit selected entry of which sort tab?"
+msgstr "На какой вкладке сортировки редактировать выбранную запись?"
+
+#. no entry selected
+#: ../src/display.c:750 ../src/misc_confirm.c:435 ../src/misc_track.c:2138
+msgid "No entry selected."
+msgstr "Запись не выбрана."
+
+#: ../src/display.c:909 ../src/display.c:1229 ../src/display.c:1285
+#: ../src/display.c:1339 ../src/display.c:1394 ../src/display.c:1655
+#, c-format
+msgid "No entry selected in Sort Tab %d"
+msgstr "Не выбрана запись на вкладке сортировки %d"
+
+#: ../src/display.c:948
+msgid "Remove entry of which sort tab from database?"
+msgstr "На какой вкладке сортировки удалить запись из базы данных?"
+
+#: ../src/display.c:956
+msgid "Remove tracks in selected entry of which filter tab from the iPod?"
+msgstr "На какой вкладке фильтрации удалить дорожки из выбранной записи с iPod?"
+
+#: ../src/display.c:978
+msgid "Remove tracks in selected entry of which filter tab from the harddisk?"
+msgstr "На какой вкладке фильтрации удалить дорожки из выбранной записи с жёсткого диска?"
+
+#: ../src/display.c:1008
+msgid "Remove tracks in selected entry of which filter tab from playlist?"
+msgstr "На какой вкладке фильтрации удалить дорожки из выбранной записи из списка воспроизведения?"
+
+#: ../src/display.c:1035 ../src/display.c:1073
+#, c-format
+msgid ""
+"iPod at '%s' is not loaded.\n"
+"Please load it first."
+msgstr "iPod на \"%s\" не загружен.\n"
+"Пожалуйста, сначала загрузите его."
+
+#: ../src/display.c:1110 ../src/display.c:1137
+msgid "Update selected entry of which sort tab?"
+msgstr "На какой вкладке сортировки обновить выбранную запись?"
+
+#: ../src/display.c:1223
+msgid "Export selected entry of which sort tab?"
+msgstr "На какой вкладке сортировки экспортировать выбранную запись?"
+
+#: ../src/display.c:1279
+msgid "Create playlist file from selected entry of which sort tab?"
+msgstr "Из записи какой вкладки сортировки создать файл списка воспроизведения?"
+
+#: ../src/display.c:1333
+msgid "Play tracks in selected entry of which sort tab?"
+msgstr "На какой вкладке сортировки воспроизвести дорожки из выбранной записи?"
+
+#: ../src/display.c:1388
+msgid "Enqueue tracks in selected entry of which sort tab?"
+msgstr "На какой вкладке сортировки поставить в очередь дорожки из выбранной записи?"
+
+#: ../src/display.c:1645
+msgid "Normalize tracks in selected entry of which sort tab?"
+msgstr "На какой вкладке сортировки нормализовать дорожки из выбранной записи?"
+
+#: ../src/display_coverart.c:1713
+msgid "Failed to remove the album from the album hash store."
+msgstr "Не удалось удалить альбом из хранилища хэшей альбомов."
+
+#: ../src/display_coverart.c:2098
+#, c-format
+msgid "Error occurred dropping an image onto the coverart display: %s\n"
+msgstr "Произошла ошибка при попытке перетащить изображение на окно обложки: %s\n"
+
+#: ../src/display_itdb.c:376
+#, c-format
+msgid "Failed to set cover art: '%s'\n"
+msgstr "Не удалось задать обложку: \"%s\"\n"
+
+#: ../src/display_itdb.c:858 ../src/display_itdb.c:991
+msgid "Local"
+msgstr "Локальный"
+
+#. add podcast playlist
+#: ../src/display_itdb.c:866 ../src/display_itdb.c:989
+#: ../src/display_itdb.c:1025
+msgid "Podcasts"
+msgstr "Подкасты"
+
+#: ../src/display_itdb.c:875 ../src/display_itdb.c:993
+#: ../src/repository.c:1186
+msgid "iPod"
+msgstr "iPod"
+
+#: ../src/display_itdb.c:1084
+#, c-format
+msgid "Increased playcount for '%s'"
+msgstr "Увеличено число воспроизведений для \"%s\""
+
+#: ../src/display_photo.c:163
+#, c-format
+msgid "Error reading iPod photo database (%s).\n"
+msgstr "Ошибка при чтении базы данных снимков iPod (%s).\n"
+
+#: ../src/display_photo.c:168
+msgid "Error reading iPod photo database.\n"
+msgstr "Ошибка при чтении базы данных снимков iPod.\n"
+
+#: ../src/display_photo.c:238
+msgid "Could not access the ipod's photo database."
+msgstr "Не удалось обратиться к базе данных снимков iPod."
+
+#: ../src/display_photo.c:441
+msgid "Photo Albums"
+msgstr "Фотоальбомы"
+
+#: ../src/display_photo.c:451 ../src/display_photo.c:1666
+msgid "<Unnamed>"
+msgstr "<Безымянный>"
+
+#: ../src/display_photo.c:920
+msgid "The Photo Library album cannot be removed"
+msgstr "Альбом фотогалереи не может быть удалён"
+
+#: ../src/display_photo.c:942
+msgid "Do you want to remove the album's photos too?"
+msgstr "Желаете ли вы также удалить снимки альбома?"
+
+#: ../src/display_photo.c:948
+msgid "Yes. Do Not Display Again"
+msgstr "Да. Не показывать снова"
+
+#: ../src/display_photo.c:1019
+msgid ""
+"This will remove the photo selection from the selected album.\n"
+" Do you want to delete them from the database as well?"
+msgstr "Это удалит выбранные снимки из выбранного альбома.\n"
+" Желаете ли вы также удалить их из базы данных?"
+
+#: ../src/display_photo.c:1034
+msgid ""
+"This will delete the photo selection from the Photo Library and all albums. "
+"Are you sure?"
+msgstr "Это удалит выбранные снимки из фотогалереи и всех альбомов."
+"Вы уверены?"
+
+#: ../src/display_photo.c:1109
+msgid "New Photo Album Name"
+msgstr "Новое название фотоальбома"
+
+#: ../src/display_photo.c:1110
+msgid "Please enter a new name for the photo album"
+msgstr "Пожалуйста, введите новое название для фотоальбома"
+
+#: ../src/display_photo.c:1122 ../src/display_photo.c:1204
+msgid "An album with that name already exists."
+msgstr "Альбом с таким названием уже существует."
+
+#: ../src/display_photo.c:1191
+msgid "New Photo Album"
+msgstr "Новый фотоальбом"
+
+#: ../src/display_photo.c:1192
+msgid "Please enter a name for the new photo album"
+msgstr "Пожалуйста, введите название для нового фотоальбома"
+
+#: ../src/display_photo.c:1213
+msgid "The new album failed to be created."
+msgstr "Не удалось создать новый альбом."
+
+#: ../src/display_photo.c:1237
+msgid "Add Image to iPod"
+msgstr "Добавить изображение на iPod"
+
+#. Open a dialog directory chooser window
+#: ../src/display_photo.c:1292
+msgid "Add a Directory of Images to the iPod. Select the Directory."
+msgstr "Добавить папку с изображениями на iPod. Выбрать папку."
+
+#: ../src/display_photo.c:1680
+#, c-format
+msgid "<No members>\n"
+msgstr "<Нет членов>\n"
+
+#. give a notice on the statusbar -- otherwise the user
+#. * will never know why the drag is not possible
+#: ../src/display_playlists.c:516 ../src/display_playlists.c:558
+msgid "Error: drag from iPod not possible in offline mode."
+msgstr "Ошибка: перетаскивание с iPod невозможно в автономном режиме."
+
+#: ../src/display_playlists.c:585 ../src/display_tracks.c:286
+#, c-format
+msgid "Copied one track"
+msgstr "Одна дорожка скопирована"
+
+#: ../src/display_playlists.c:865 ../src/display_playlists.c:877
+msgid "Can't reorder sorted treeview."
+msgstr "Нельзя переупорядочить отсортированное дерево."
+
+#: ../src/display_playlists.c:954
+#, c-format
+msgid ""
+"This DND type (%d) is not (yet) supported. If you feel implementing this "
+"would be useful, please contact the author.\n"
+"\n"
+msgstr "Этот тип DND (%d) ещё не поддерживается. Если вы считаете, что"
+"его реализация может оказаться полезной, свяжитесь с разработчиком.\n"
+"\n"
+
+#. no existing photo playlist found so add one
+#. * either itdb had no children or none of them
+#. * were of the photo type.
+#.
+#: ../src/display_playlists.c:1569
+msgid "Photos"
+msgstr "Снимки"
+
+#: ../src/display_sorttabs.c:473
+msgid "'Played' condition ignored because of error."
+msgstr "Условие \"воспроизведено\" проигнорировано из-за ошибки."
+
+#: ../src/display_sorttabs.c:476
+msgid "'Modified' condition ignored because of error."
+msgstr "Условие \"изменено\" проигнорировано из-за ошибки."
+
+#: ../src/display_sorttabs.c:479
+msgid "'Added' condition ignored because of error."
+msgstr "Условие \"Добавлено\" проигнорировано из-за ошибки."
+
+#: ../src/display_sorttabs.c:1562 ../src/misc_conversion.c:59
+msgid "All"
+msgstr "Все"
+
+#: ../src/display_sorttabs.c:1588
+msgid "Compilations"
+msgstr "Сборники"
+
+#: ../src/display_sorttabs.c:2988
+msgid "Comp."
+msgstr "Сбор."
+
+#: ../src/display_sorttabs.c:2994 ../src/display_spl.c:88
+#: ../src/display_tracks.c:2109 ../src/misc_conversion.c:84
+msgid "Year"
+msgstr "Год"
+
+#: ../src/display_sorttabs.c:2997
+msgid "Special"
+msgstr "Особый"
+
+#: ../src/display_sorttabs.c:3245
+msgid "Last Played"
+msgstr "Последние воспроизведённые"
+
+#: ../src/display_sorttabs.c:3246
+msgid "Last Modified"
+msgstr "Последние изменённые"
+
+#: ../src/display_spl.c:64
+msgid "days"
+msgstr "дней"
+
+#: ../src/display_spl.c:65
+msgid "weeks"
+msgstr "недель"
+
+#: ../src/display_spl.c:66
+msgid "months"
+msgstr "месяцев"
+
+#: ../src/display_spl.c:73
+msgid "kbps"
+msgstr "кб/с"
+
+#: ../src/display_spl.c:74
+msgid "Hz"
+msgstr "Гц"
+
+#: ../src/display_spl.c:75 ../src/display_spl.c:179 ../src/info.c:780
+msgid "MB"
+msgstr "МБ"
+
+#: ../src/display_spl.c:76
+msgid "secs"
+msgstr "сек"
+
+#: ../src/display_spl.c:86 ../src/misc_conversion.c:74
+msgid "Bitrate"
+msgstr "Битрейт"
+
+#. 15
+#: ../src/display_spl.c:87 ../src/misc_conversion.c:75
+msgid "Samplerate"
+msgstr "Дискретизация"
+
+#: ../src/display_spl.c:90
+msgid "Kind"
+msgstr "Вид"
+
+#: ../src/display_spl.c:91 ../src/misc_conversion.c:81
+msgid "Date modified"
+msgstr "Дата изменения"
+
+#: ../src/display_spl.c:92
+msgid "Track number"
+msgstr "Номер дорожки"
+
+#: ../src/display_spl.c:93
+msgid "Size"
+msgstr "Размер"
+
+#: ../src/display_spl.c:95 ../src/misc_conversion.c:64
+msgid "Comment"
+msgstr "Примечание"
+
+#: ../src/display_spl.c:96 ../src/misc_conversion.c:79
+msgid "Date added"
+msgstr "Дата добавления"
+
+#: ../src/display_spl.c:99
+msgid "Last played"
+msgstr "Последние воспроизведённые"
+
+#: ../src/display_spl.c:100
+msgid "Disc number"
+msgstr "Номер диска"
+
+#: ../src/display_spl.c:102 ../src/misc_conversion.c:87
+msgid "Compilation"
+msgstr "Сборник"
+
+#: ../src/display_spl.c:103 ../src/misc_conversion.c:76
+msgid "BPM"
+msgstr "BPM"
+
+#: ../src/display_spl.c:104 ../src/misc_conversion.c:86
+msgid "Grouping"
+msgstr "Группировка"
+
+#: ../src/display_spl.c:105
+msgid "Playlist"
+msgstr "Список воспроизведения"
+
+#: ../src/display_spl.c:106
+msgid "Video Kind"
+msgstr "Тип видео"
+
+#: ../src/display_spl.c:108
+msgid "Season number"
+msgstr "Номер сезона"
+
+#: ../src/display_spl.c:109
+msgid "Skip count"
+msgstr "Число пропусков"
+
+#: ../src/display_spl.c:110
+msgid "Last skipped"
+msgstr "Последние пропущенные"
+
+#: ../src/display_spl.c:111
+msgid "Album artist"
+msgstr "Художник обложки"
+
+#: ../src/display_spl.c:117
+msgid "contains"
+msgstr "содержит"
+
+#: ../src/display_spl.c:118
+msgid "does not contain"
+msgstr "не содержит"
+
+#: ../src/display_spl.c:119 ../src/display_spl.c:128 ../src/display_spl.c:138
+#: ../src/display_spl.c:157 ../src/display_spl.c:164
+msgid "is"
+msgstr "является"
+
+#: ../src/display_spl.c:120 ../src/display_spl.c:129 ../src/display_spl.c:139
+#: ../src/display_spl.c:158 ../src/display_spl.c:165
+msgid "is not"
+msgstr "не является"
+
+#: ../src/display_spl.c:121
+msgid "starts with"
+msgstr "начинается с"
+
+#: ../src/display_spl.c:122
+msgid "ends with"
+msgstr "заканчивается на"
+
+#: ../src/display_spl.c:130
+msgid "is greater than"
+msgstr "больше, чем"
+
+#: ../src/display_spl.c:131
+msgid "is less than"
+msgstr "меньше, чем"
+
+#: ../src/display_spl.c:132 ../src/display_spl.c:144
+msgid "is in the range"
+msgstr "в диапазоне"
+
+#: ../src/display_spl.c:140
+msgid "is after"
+msgstr "после"
+
+#: ../src/display_spl.c:141
+msgid "is before"
+msgstr "перед"
+
+#: ../src/display_spl.c:142
+msgid "in the last"
+msgstr "в последних"
+
+#: ../src/display_spl.c:143
+msgid "not in the last"
+msgstr "не в последних"
+
+#: ../src/display_spl.c:150
+msgid "is set"
+msgstr "задан"
+
+#: ../src/display_spl.c:151
+msgid "is not set"
+msgstr "не задан"
+
+#: ../src/display_spl.c:171
+msgid "Not supported"
+msgstr "Не поддерживается"
+
+#: ../src/display_spl.c:178
+msgid "minutes"
+msgstr "минут"
+
+#: ../src/display_spl.c:180
+msgid "tracks"
+msgstr "дорожке"
+
+#: ../src/display_spl.c:181
+msgid "hours"
+msgstr "часов"
+
+#: ../src/display_spl.c:182 ../src/info.c:780
+msgid "GB"
+msgstr "ГБ"
+
+#: ../src/display_spl.c:189
+msgid "random order"
+msgstr "случайный порядок"
+
+#: ../src/display_spl.c:190
+msgid "title"
+msgstr "название"
+
+#: ../src/display_spl.c:191
+msgid "album"
+msgstr "альбом"
+
+#: ../src/display_spl.c:192
+msgid "artist"
+msgstr "исполнитель"
+
+#: ../src/display_spl.c:193
+msgid "genre"
+msgstr "жанр"
+
+#: ../src/display_spl.c:194
+msgid "most recently added"
+msgstr "последние добавленные"
+
+#: ../src/display_spl.c:195
+msgid "least recently added"
+msgstr "первые добавленные"
+
+#: ../src/display_spl.c:196
+msgid "most often played"
+msgstr "наиболее часто воспроизводимык"
+
+#: ../src/display_spl.c:197
+msgid "least often played"
+msgstr "наименее часто воспроизводимык"
+
+#: ../src/display_spl.c:198
+msgid "most recently played"
+msgstr "последние воспроизведённые"
+
+#: ../src/display_spl.c:199
+msgid "least recently played"
+msgstr "наиболее давно воспроизведённые"
+
+#: ../src/display_spl.c:200
+msgid "highest rating"
+msgstr "наибольший рейтинг"
+
+#: ../src/display_spl.c:201
+msgid "lowest rating"
+msgstr "наименьший рейтинг"
+
+#: ../src/display_spl.c:208 ../src/display_spl.c:217
+msgid "Movie"
+msgstr "Фильм"
+
+#: ../src/display_spl.c:1192 ../src/display_spl.c:1207
+msgid "to"
+msgstr "до"
+
+#: ../src/display_spl.c:1485
+msgid "-"
+msgstr "-"
+
+#: ../src/display_spl.c:1500
+msgid "+"
+msgstr "+"
+
+#: ../src/display_tracks.c:281
+#, c-format
+msgid "Moved one track"
+msgstr "Одна дорожка перемещена"
+
+#: ../src/display_tracks.c:1810
+#, c-format
+msgid ""
+"Cannot unsort track view because of a bug in the GTK lib you are using (%d.%"
+"d.%d < 2.5.4). Once you sort the track view, you cannot go back to the "
+"unsorted state.\n"
+"\n"
+msgstr "Не удалось отменить сортировку дорожек из-за ошибки в используемой"
+"библиотеке GTK (%d.%d.%d < 2.5.4). После сортировки окна дорожен невозможно"
+"вернуться в неотсортированное состояние.\n"
+"\n"
+
+#: ../src/display_tracks.c:2069
+msgid "Rtng"
+msgstr "Рейтинг"
+
+#: ../src/display_tracks.c:2072
+msgid "#"
+msgstr "No"
+
+#: ../src/display_tracks.c:2075
+msgid "CD"
+msgstr "CD"
+
+#: ../src/display_tracks.c:2078
+msgid "ID"
+msgstr "ID"
+
+#: ../src/display_tracks.c:2081
+msgid "Trnsfrd"
+msgstr "Передано"
+
+#: ../src/display_tracks.c:2085
+msgid "Cmpl"
+msgstr "Сборник"
+
+#: ../src/display_tracks.c:2091
+msgid "Time"
+msgstr "Время"
+
+#: ../src/display_tracks.c:2094
+msgid "Plycnt"
+msgstr "Воспроизв."
+
+#: ../src/display_tracks.c:2106
+msgid "Released"
+msgstr "Выпущено"
+
+#: ../src/display_tracks.c:2112
+msgid "Vol."
+msgstr "Том"
+
+#: ../src/display_tracks.c:2115
+msgid "Sndchk."
+msgstr "Sndchk."
+
+#: ../src/fetchcover.c:358
+msgid "Coverart file already exists"
+msgstr "Файл обложки уже существует"
+
+#: ../src/fetchcover.c:371
+#, c-format
+msgid ""
+"The picture file %s already exists. \t\t\t\t\n"
+"This may be associated with other music files in the directory. \t\t\t\t\n"
+"\n"
+"-  Clicking Yes will overwrite the existing file, possibly associating \t\t\t"
+"\t\n"
+"   other music files in the same directory with this coverart file. \t\t\t"
+"\t\n"
+"-  Clicking No will save the file with a unique file name. \t\t\t\t\n"
+"-  Clicking Cancel will abort the fetchcover operation."
+msgstr "Файл изображения %s уже существует.. \t\t\t\t\n"
+"Это может быть связано с другими музыкальными файлами в папке. \t\t\t\t\n"
+"\n"
+"-  Нажмите \"Да\", чтобы заменить существующий файл, возможно, связав\t\t\t"
+"\t\n"
+"другие музыкальные файлы в той же папке с этим файлом обложки.\t\t\t"
+"\t\n"
+"-  Нажмите \"Нет\", чтобы сохранить файл под уникальным именем.\t\t\t\t\n"
+"-  Нажмите \"Отмена\", чтобы отменить операцию получения обложки."
+
+#: ../src/file.c:236
+#, c-format
+msgid ""
+"'%s' is a directory, not a playlist file.\n"
+"\n"
+msgstr "\"%s\" - папка, а не файл списка воспроизведения.\n"
+"\n"
+
+#: ../src/file.c:266
+#, c-format
+msgid ""
+"'%s' is a not a known playlist file.\n"
+"\n"
+msgstr "\"%s\" не является известным файлом списка воспроизведения.\n"
+"\n"
+
+#: ../src/file.c:283
+#, c-format
+msgid ""
+"Cannot open '%s' for reading.\n"
+"\n"
+msgstr "Не ужалось открыть \"%s\" для чтения.\n"
+"\n"
+
+#: ../src/file.c:369
+#, c-format
+msgid "Skipping '%s' because it is a directory.\n"
+msgstr "Пропущено \"%s\", поскольку это папка.\n"
+
+#: ../src/file.c:374
+#, c-format
+msgid "Skipping '%s' to avoid adding playlist file recursively\n"
+msgstr "Пропущено \"%s\", чтобы предотвратить рекурсивное добавление файла списка воспроизведения.\n"
+
+#: ../src/file.c:629
+#, c-format
+msgid "Unknown token '%s' in template '%s'\n"
+msgstr "Неизвестная лексема \"%s\" в шаблоне \"%s\"\n"
+
+#: ../src/file.c:923
+#, c-format
+msgid "Local filename not valid (%s)"
+msgstr "Локальное имя файла недопустимо (%s)"
+
+#: ../src/file.c:982
+#, c-format
+msgid "No information found for user '%s' in '%s'"
+msgstr "Сведения о пользователе \"%s\" в \"%s\" не найдены."
+
+#: ../src/file.c:991
+#, c-format
+msgid "mserv data file (%s) not available for track (%s)"
+msgstr "Файл данных mserv (%s) не доступен для дорожки (%s)"
+
+#: ../src/file.c:999
+#, c-format
+msgid "Track (%s) not in mserv music root directory (%s)"
+msgstr "Дорожка (%s) отсутствует в корневой папке музыки mserv (%s)"
+
+#: ../src/file.c:1123
+#, c-format
+msgid ""
+"The following track could not be processed (file does not exist): '%s'\n"
+msgstr "Следующая дорожка не могла быть обработана (файл не существует): \"%s\"\n"
+
+#: ../src/file.c:1209
+#, c-format
+msgid "The following track could not be processed (filetype unknown): '%s'\n"
+msgstr "Следующая дорожка не могла быть обработана (неизвестный тип файла): \"%s\"\n"
+
+#: ../src/file.c:1307
+#, c-format
+msgid ""
+"The following track could not be processed (filetype is known but analysis "
+"failed): '%s'\n"
+msgstr "Следующая дорожка не могла быть обработана (тип файла известен, но его не удалось проанализировать): \"%s\"\n"
+
+#: ../src/file.c:1337 ../src/file.c:1391
+msgid "Nothing to update"
+msgstr "Нечего обновлять"
+
+#: ../src/file.c:1358
+#, c-format
+msgid "Updating %s"
+msgstr "Обновляется %s"
+
+#: ../src/file.c:1372
+msgid "Updated selected tracks with info from file."
+msgstr "Выбранные дорожки обновлены с использованием сведений из файла."
+
+#: ../src/file.c:1406
+#, c-format
+msgid "Retrieving mserv data %s"
+msgstr "Загружаются данные mserv %s"
+
+#: ../src/file.c:1411
+msgid "no filename available"
+msgstr "имя файла недоступно"
+
+#: ../src/file.c:1416
+msgid "Updated selected tracks with data from mserv."
+msgstr "Выбранные дорожки обновлены с использованием сведений из mserv."
+
+#: ../src/file.c:1437
+#, c-format
+msgid "The following track could not be updated"
+msgstr "Следующая дорожка не может быть обновлена"
+
+#. gint id,
+#. gboolean modal,
+#: ../src/file.c:1443
+msgid "Failed Track Update"
+msgstr "Ошибка при обновлении дорожки"
+
+#: ../src/file.c:1501
+#, c-format
+msgid "The following track has been updated"
+msgstr "Следующая дорожка была обновлена"
+
+#. gint id,
+#. gboolean modal,
+#: ../src/file.c:1507
+msgid "Successful Track Update"
+msgstr "Успешное обновление дорожки"
+
+#: ../src/file.c:1566
+#, c-format
+msgid "No mserv information could be retrieved for the following track"
+"No mserv information could be retrieved for the following %d tracks"
+msgstr "Сведения mserv не могли быть получены для следующей дорожки"
+"Сведения mserv не могли быть получены для следующих %d дорожек"
+
+#. gint id,
+#. gboolean modal,
+#: ../src/file.c:1572
+msgid "mserv data retrieval problem"
+msgstr "Ошибка загрузки данных mserv"
+
+#: ../src/file.c:1661
+msgid "no local filename available, file on the iPod will be used instead"
+msgstr "локальное имя файла недоступно, будет использовано имя файла на iPod"
+
+#: ../src/file.c:1667
+msgid "no local filename available and copy on iPod cannot be found"
+msgstr "локальное имя файла недоступно, и не найдена копия на iPod"
+
+#: ../src/file.c:1671 ../src/file.c:1689
+msgid "no local filename available"
+msgstr "локальное имя файла недоступно"
+
+#: ../src/file.c:1679
+msgid "local file could not be found, file on the iPod will be used instead"
+msgstr "локальный файл не найден, будет использован файл на iPod"
+
+#: ../src/file.c:1685
+msgid "local file as well as copy on the iPod cannot be found"
+msgstr "локальный файл и копия на iPod не найдены"
+
+#. update not successful -- log this track for later display
+#: ../src/file.c:1788
+msgid "update failed (format not supported?)"
+msgstr "ошибка при обновлении (формат не поддерживается?)"
+
+#: ../src/file.c:1873 ../src/misc_playlist.c:916
+#, c-format
+msgid "Processing '%s'..."
+msgstr "Идёт обработка \"%s\"..."
+
+#: ../src/file.c:1879
+#, c-format
+msgid "Skipping '%s' because it matches exclude masks.\n"
+msgstr "Пропущено \"%s\", поскольку оно соответствует маскам исключения.\n"
+
+#: ../src/file.c:1999 ../src/misc_track.c:1773 ../src/misc_track.c:1878
+#, c-format
+msgid ""
+"Podcast already present: '%s'\n"
+"\n"
+msgstr "Подкаст уже присутствует: \"%s\"\n"
+"\n"
+
+#: ../src/file.c:2064
+#, c-format
+msgid ""
+"Writing to video files not yet supported (%s).\n"
+"\n"
+msgstr "Запись в видеофайлы ещё не поддерживается (%s).\n"
+"\n"
+
+#: ../src/file.c:2116 ../src/file.c:2130
+#, c-format
+msgid "Couldn't change tags of file: %s\n"
+msgstr "Не удалось изменить метки файла: %s\n"
+
+#: ../src/file.c:2232
+#, c-format
+msgid "Could not open '%s' for reading and writing.\n"
+msgstr "Не удалось открыть \"%s\" для чтения и записи.\n"
+
+#: ../src/file.c:2239
+#, c-format
+msgid "Could not obtain lock on '%s'.\n"
+msgstr "Не удалось получить блокировку для \"%s\".\n"
+
+#. error!
+#: ../src/file.c:2256 ../src/file.c:2265 ../src/file.c:2276 ../src/file.c:2286
+#, c-format
+msgid "Malformed line in '%s': %s\n"
+msgstr "Некорректная строка в \"%s\": %s\n"
+
+#. gint id,
+#. gboolean modal,
+#: ../src/file.c:2315
+msgid "Remove offline playcounts?"
+msgstr "Удалить счётчики воспроизведения в автономном режиме?"
+
+#. title
+#: ../src/file.c:2316
+msgid ""
+"Some tracks played offline could not be found in the iTunesDB. Press 'OK' to "
+"remove them from the offline playcount file, 'Cancel' to keep them."
+msgstr "Некоторые дорожки, воспроизведённые в автономном режиме, не были найдены в iTunesDB."
+"Нажмите \"OK\", чтобы удалить их из файла счётчика воспроизведений в автономном режиме."
+"Нажмите \"Cancel\", чтобы сохранить их."
+
+#: ../src/file.c:2333
+#, c-format
+msgid "Error writing to '%s'.\n"
+msgstr "Ошибка записи в \"%s\".\n"
+
+#: ../src/file.c:2390 ../src/tools.c:270
+#, c-format
+msgid ""
+"Normalization failed: file type not supported (%s).\n"
+"\n"
+msgstr "Нормализация завершена неуспешно: тип файла не поддерживается (%s).\n"
+"\n"
+
+#: ../src/file.c:2406 ../src/tools.c:287
+#, c-format
+msgid ""
+"Normalization failed: file not available (%s).\n"
+"\n"
+msgstr "Нормализация завершена неуспешно: файл недоступен (%s).\n"
+"\n"
+
+#: ../src/file_convert.c:316
+msgid "Summary status of conversion processes"
+msgstr "Сводное состояние процессов преобразования"
+
+#: ../src/file_convert.c:564
+msgid "active"
+msgstr "активно"
+
+#: ../src/file_convert.c:569
+msgid "inactive"
+msgstr "неактивно"
+
+#: ../src/file_convert.c:580
+#, c-format
+msgid "Active threads: %d. Scheduled tracks: %d."
+msgstr "Активных потоков: %d. Спланированных дорожек: %d."
+
+#: ../src/file_convert.c:1071
+#, c-format
+msgid "Original filename not available for '%s.'\n"
+msgstr "Оригинальное имя файла недоступно для \"%s\".\n"
+
+#: ../src/file_convert.c:1086
+#, c-format
+msgid "Filename '%s' is no longer valid for '%s'.\n"
+msgstr "Имя файла \"%s\" больше не допустимо для \"%s\".\n"
+
+#: ../src/file_convert.c:1137
+msgid "Ogg Vorbis"
+msgstr "Ogg Vorbis"
+
+#: ../src/file_convert.c:1143
+msgid "FLAC"
+msgstr "FLAC"
+
+#: ../src/file_convert.c:1198
+#, c-format
+msgid ""
+"Files of type '%s' are not supported by the iPod. Please go to the "
+"Preferences to set up and turn on a suitable conversion script for '%s'.\n"
+"\n"
+msgstr "Файлы типа \"%s\" не поддерживаются iPod. Пожалуйста, откройте диалог"
+"\"Параметры\", чтобы установить и включить подходящий сценарий"
+"преобразования для \"%s\".\n"
+"\n"
+
+#: ../src/file_convert.c:1284
+msgid "No information available"
+msgstr "Сведения недоступны"
+
+#: ../src/file_convert.c:1323
+#, c-format
+msgid "Could not create '%s'. Filetype conversion will not work.\n"
+msgstr "Не удалось создать \"%s\". Преобразование типа файлов не будет работать.\n"
+
+#: ../src/file_convert.c:1641 ../src/file_convert.c:3049
+#, c-format
+msgid ""
+"Transfer of '%s' failed. %s\n"
+"\n"
+msgstr "Передача \"%s\" завершена неуспешно. %s\n"
+"\n"
+
+#: ../src/file_convert.c:2047 ../src/file_convert.c:2325
+#, c-format
+msgid ""
+"Conversion of '%s' failed: '%s'.\n"
+"\n"
+msgstr "Преобразование \"%s\" завершено неуспешно. %s\n"
+"\n"
+
+#: ../src/file_convert.c:2062
+#, c-format
+msgid ""
+"Conversion of '%s' failed: '%s %s' returned exit status %d.\n"
+"\n"
+msgstr "Преобразование \"%s\" завершено неуспешно: \"%s %s\" вернул статус завершения %d.\n"
+"\n"
+
+#: ../src/file_convert.c:2091
+#, c-format
+msgid ""
+"Conversion of '%s' failed: '\"%s\" %s' did not return filename extension as "
+"expected.\n"
+"\n"
+msgstr "Преобразование \"%s\" завершено неуспешно: \"%s %s\" не вернул расширение"
+"файла, как ожидалось.\n"
+"\n"
+
+#: ../src/file_convert.c:2167
+#, c-format
+msgid ""
+"Conversion of '%s' failed: Could not access original file '%s' (%s).\n"
+"\n"
+msgstr "Преобразование \"%s\" завершено неуспешно: Нет доступа к оригинальному файлу \"%s\" (%s).\n"
+"\n"
+
+#: ../src/file_convert.c:2222
+#, c-format
+msgid ""
+"Conversion of '%s' failed: Could not create directory '%s'.\n"
+"\n"
+msgstr "Преобразование \"%s\" завершено неуспешно: Не удалось создать папку \"%s\".\n"
+"\n"
+
+#: ../src/file_convert.c:2356
+#, c-format
+msgid ""
+"Conversion of '%s' failed: '%s' returned exit status %d.\n"
+"\n"
+msgstr "Преобразование \"%s\" завершено неуспешно: \"%s\" вернул статус завершения %d.\n"
+"\n"
+
+#: ../src/file_convert.c:2395
+#, c-format
+msgid ""
+"Conversion of '%s' failed: could not stat the converted file '%s'.\n"
+"\n"
+msgstr "Преобразование \"%s\" завершено неуспешно: не удалось получить информацию о преобразованном файле \"%s\".\n"
+"\n"
+
+#: ../src/file_export.c:182
+#, c-format
+msgid "Skipping existing file with same length: '%s'\n"
+msgstr "Пропущен существующий файл с той же длиной: \"%s\"\n"
+
+#: ../src/file_export.c:190
+#, c-format
+msgid "Overwriting existing file: '%s'\n"
+msgstr "Перезаписан существующий файл: \"%s\"\n"
+
+#: ../src/file_export.c:207
+#, c-format
+msgid "Error copying '%s' to '%s': Permission Error (%s)\n"
+msgstr "Ошибка при копировании \"%s\" в \"%s\": Ошибка прав доступа (%s)\n"
+
+#: ../src/file_export.c:209
+#, c-format
+msgid "Error copying '%s' to '%s' (%s)\n"
+msgstr "Ошибка при копировании \"%s\" в \"%s\" (%s)\n"
+
+#: ../src/file_export.c:217
+#, c-format
+msgid "Unable to open '%s' for reading\n"
+msgstr "Не удалось открыть \"%s\" для чтения\n"
+
+#: ../src/file_export.c:327
+#, c-format
+msgid "Could find file for '%s' on the iPod\n"
+msgstr "Найден файл для \"%s\" на iPod\n"
+
+#. create the dialog window
+#: ../src/file_export.c:395 ../src/tools.c:360
+msgid "Information"
+msgstr "Сведения"
+
+#: ../src/file_export.c:406 ../src/tools.c:372
+msgid "Press button to abort."
+msgstr "Нажмите кнопку для отмены."
+
+#: ../src/file_export.c:419
+msgid "copying..."
+msgstr "копирование..."
+
+#: ../src/file_export.c:476
+#, c-format
+msgid "Failed to write '%s-%s'\n"
+msgstr "Не удалось записать \"%s-%s\"\n"
+
+#: ../src/file_export.c:489
+#, c-format
+msgid "Copied %d of %d track."
+msgstr "Скопировано %d из дорожки %d."
+
+#: ../src/file_export.c:505 ../src/tools.c:518
+#, c-format
+msgid "%d%% (%d:%02d:%02d left)"
+msgstr "%d%% (%d:%02d:%02d осталось)"
+
+#: ../src/file_export.c:514
+msgid "Some tracks were not copied."
+msgstr "Некоторые дорожки не были скопированы."
+
+#: ../src/file_export.c:579
+msgid "Export from iPod database not possible in offline mode."
+msgstr "Экспорт из базы данных iPod невозможен в автономном режиме."
+
+#: ../src/file_export.c:587
+msgid "Select Export Destination Directory"
+msgstr "Выберите целевую директорию для экспорта"
+
+#: ../src/file_export.c:736
+msgid "Drag from iPod database not possible in offline mode."
+msgstr "Перетаскивание из базы данных iPod невозможно в автономном режиме."
+
+#: ../src/file_export.c:770
+msgid "The following tracks have to be copied to your harddisk"
+msgstr "Следующие дорожки должны быть скопированы на ваш жёсткий диск"
+
+#: ../src/file_export.c:815
+msgid ""
+"Some tracks were not copied to your harddisk. Only the copied tracks will be "
+"included in the current drag and drop operation.\n"
+"\n"
+msgstr "Некоторые дорожки не были скопированы на ваш жёсткий диск. Только скопированные"
+"дорожки могут быть включены в текущую операцию перетаскивания.\n"
+"\n"
+
+#: ../src/file_export.c:1010
+#, c-format
+msgid ""
+"No valid filename for: %s\n"
+"\n"
+msgstr "Нет допустимого имени файла для: %s\n"
+"\n"
+
+#: ../src/file_export.c:1026
+#, c-format
+msgid "Created playlist with one track."
+msgstr "Создан список воспроизведения с одной дорожкой."
+
+#: ../src/file_export.c:1031
+#, c-format
+msgid ""
+"Could not open '%s' for writing (%s).\n"
+"\n"
+msgstr "Не удалось открыть \"%s\" для записи (%s).\n"
+"\n"
+
+#: ../src/file_itunesdb.c:129
+#, c-format
+msgid "Matching SHA1 checksum for file %d/%d"
+msgstr "Проверяется контрольная сумма SHA1 для файла %d/%d"
+
+#: ../src/file_itunesdb.c:236
+msgid "Could not open \"iTunesDB.ext\" for reading extended info.\n"
+msgstr "Не удалось открыть \"iTunesDB.ext\" для чтения расширенных сведений.\n"
+
+#: ../src/file_itunesdb.c:243
+msgid "Could not create hash value from itunesdb\n"
+msgstr "Не удалось создать значение хэша из iTunesDB\n"
+
+#: ../src/file_itunesdb.c:259
+#, c-format
+msgid "Error while reading extended info: %s\n"
+msgstr "Ошибка при чтении расширенных сведений: %s\n"
+
+#: ../src/file_itunesdb.c:276
+#, c-format
+msgid ""
+"iTunesDB '%s' does not match checksum in extended information file '%s'\n"
+"gtkpod will try to match the information using SHA1 checksums. This may take "
+"a long time.\n"
+"\n"
+msgstr "iTunesDB \"%s\" не соответствует контрольной сумме в файле расширенных сведений \"%s\"\n"
+"gtkpod попытается проверить сведения, используя контрольные суммы SHA1. Это может"
+"занять длительное время.\n"
+"\n"
+
+#: ../src/file_itunesdb.c:288
+#, c-format
+msgid ""
+"%s:\n"
+"Expected \"itunesdb_hash=\" but got:\"%s\"\n"
+msgstr "%s:\n"
+"Ожидалось \"itunesdb_hash=\", но получено: \"%s\"\n"
+
+#: ../src/file_itunesdb.c:348
+#, c-format
+msgid ""
+"%s:\n"
+"Format error: %s\n"
+msgstr "%s:\n"
+"Ошибка форматирования: %s\n"
+
+#: ../src/file_itunesdb.c:393
+msgid ""
+"No SHA1 checksums on individual tracks are available.\n"
+"\n"
+"To avoid this situation in the future either switch on duplicate detection "
+"(will provide SHA1 checksums) or avoid using the iPod with programs other "
+"than gtkpod.\n"
+"\n"
+msgstr "Контрольные суммы SHA1 для отдельных дорожек недоступны.\n"
+"\n"
+"Чтобы избежать этой ситуации в будущем, либо включите обнаружение дубликатов"
+"(которое сделает доступными контрольные суммы SHA1), либо избегайте использования"
+"iPod с другими программами, кроме gtkpod.\n"
+"\n"
+
+#: ../src/file_itunesdb.c:457
+msgid ""
+"Extended info will not be used. If you have non-transferred tracks,\n"
+"these will be lost.\n"
+msgstr "Расширенные сведения не будут использованы. Если у вас имеются\n"
+"непереданные дорожки, они будут потеряны.\n"
+
+#: ../src/file_itunesdb.c:465
+msgid "Offline iPod database successfully imported"
+msgstr "База данных iPod автономного режима импортирована успешно"
+
+#: ../src/file_itunesdb.c:468
+msgid "Local database successfully imported"
+msgstr "Локальная база данных импортирована успешно"
+
+#: ../src/file_itunesdb.c:476
+#, c-format
+msgid ""
+"Offline iPod database import failed: '%s'\n"
+"\n"
+msgstr "Ошибка при импорте базы данных iPod автономного режима: \"%s\"\n"
+"\n"
+
+#: ../src/file_itunesdb.c:480
+#, c-format
+msgid ""
+"Local database import failed: '%s'\n"
+"\n"
+msgstr "Ошибка при импорте локальной базы данных iPod: \"%s\"\n"
+"\n"
+
+#: ../src/file_itunesdb.c:487
+msgid ""
+"Offline iPod database import failed: \n"
+"\n"
+msgstr "Ошибка при импорте базы данных iPod автономного режима: \n"
+"\n"
+
+#: ../src/file_itunesdb.c:490
+msgid ""
+"Local database import failed: \n"
+"\n"
+msgstr "Ошибка при импорте локальной базы данных iPod: \n"
+"\n"
+
+#: ../src/file_itunesdb.c:497
+#, c-format
+msgid ""
+"'%s' does not exist. Import aborted.\n"
+"\n"
+msgstr "\"%s\" не существует. Импорт прерван.\n"
+"\n"
+
+#: ../src/file_itunesdb.c:520
+msgid "Extended info will not be used.\n"
+msgstr "Расширенные сведения не будут использованы.\n"
+
+#: ../src/file_itunesdb.c:527
+msgid "iPod Database Successfully Imported"
+msgstr "База данных iPod успешно импортирована"
+
+#: ../src/file_itunesdb.c:534
+#, c-format
+msgid ""
+"iPod Database Import Failed: '%s'\n"
+"\n"
+msgstr "Ошибка импорта базы данных iPod: \"%s\"\n"
+"\n"
+
+#: ../src/file_itunesdb.c:540
+msgid ""
+"iPod Database Import Failed.\n"
+"\n"
+msgstr "Ошибка импорта базы данных iPod.\n"
+"\n"
+
+#: ../src/file_itunesdb.c:549
+#, c-format
+msgid ""
+"'%s' (or similar) does not exist. Import aborted.\n"
+"\n"
+msgstr "\"%s\" (или похожий) не существует. Импорт прерван.\n"
+"\n"
+
+#: ../src/file_itunesdb.c:865
+#, c-format
+msgid ""
+"Could not find iPod directory structure at '%s'.\n"
+"If you are sure that the iPod is properly mounted at '%s', gtkpod can create "
+"the directory structure for you.\n"
+"\n"
+"Do you want to create the directory structure now?\n"
+msgstr "Не удалось найти структуру папок iPod в \"%s\".\n"
+"Если вы уверены, что iPod правильно примонтирован в \"%s\", gtkpod может создать"
+"структуру папок для вас."
+"\n"
+"Желаете ли вы создать структуру папок сейчас?\n"
+
+#: ../src/file_itunesdb.c:1180
+#, c-format
+msgid "Could not open \"%s\" for writing extended info.\n"
+msgstr "Не удалось открыть \"%s\" для записи расширенных сведений.\n"
+
+#: ../src/file_itunesdb.c:1195
+msgid "Aborted writing of extended info.\n"
+msgstr "Запись расширенных сведений прервана.\n"
+
+#: ../src/file_itunesdb.c:1397
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: ../src/file_itunesdb.c:1411
+#, c-format
+msgid "%d%% (%d/%d  %d:%02d:%02d left)"
+msgstr "%d%% (%d/%d  %d:%02d:%02d осталось)"
+
+#: ../src/file_itunesdb.c:1463
+msgid "Status: Deleting File"
+msgstr "Состояние: Удаление файла"
+
+#: ../src/file_itunesdb.c:1524
+#, c-format
+msgid ""
+"Could not remove the following file: '%s'\n"
+"\n"
+msgstr "Не удалось удалить следующий файл: \"%s\"\n"
+"\n"
+
+#: ../src/file_itunesdb.c:1632
+msgid ""
+"The following track could not be converted successfully:\n"
+"\n"
+"The following tracks could not be converted successfully:\n"
+"\n"
+msgstr "Не удалось преобразовать следующую дорожку:\n"
+"\n"
+"Не удалось преобразовать следующие дорожки:\n"
+"\n"
+
+#: ../src/file_itunesdb.c:1642
+msgid ""
+"The following track could not be transferred successfully:\n"
+"\n"
+"The following tracks could not be transferred successfully:\n"
+"\n"
+msgstr "Не удалось передать следующую дорожку:\n"
+"\n"
+"Не удалось передать следующие дорожки:\n"
+"\n"
+
+#. ID
+#. modal,
+#. gint id,
+#. gboolean modal,
+#: ../src/file_itunesdb.c:1651 ../src/misc_confirm.c:70
+msgid "Warning"
+msgstr "Внимание"
+
+#. title
+#: ../src/file_itunesdb.c:1652
+msgid ""
+"The iPod could not be ejected. Please fix the problems mentioned below and "
+"then eject the iPod again. Pressing 'OK' will re-schedule the failed tracks "
+"for conversion and transfer."
+msgstr "iPod не может быть извлечён. Пожалуйста, исправьте ошибки, упомянутые"
+"ниже, и извлеките iPod снова. При нажатии \"OK\" gtkpod вновь попытается"
+"преобразовать и передать дорожки, для которых операция завершилась неудачей."
+
+#: ../src/file_itunesdb.c:1715
+#, c-format
+msgid "Status: Copying track"
+msgstr "Состояние: Копирование дорожки"
+
+#: ../src/file_itunesdb.c:1721
+#, c-format
+msgid "Status: Waiting for conversion to complete"
+msgstr "Состояние: Ожидание завершения преобразования"
+
+#: ../src/file_itunesdb.c:1725
+#, c-format
+msgid "Status: Finished transfer"
+msgstr "Состояние: Передача завершена"
+
+#: ../src/file_itunesdb.c:1770
+#, c-format
+msgid ""
+"One track could not be transferred because your iPod is full. Either delete "
+"some tracks or otherwise create space on the iPod before ejecting the iPod "
+"again."
+"%d tracks could not be transferred because your iPod is full. Either delete "
+"some tracks or otherwise create space on the iPod before ejecting the iPod "
+"again."
+msgstr "Одна дорожка не могла быть передана, поскольку iPod заполнен. Либо удалите"
+"некоторые дорожки, либо освободите место на iPod иным образом перед"
+"повторным извлечением."
+"%d дорожек не могли быть переданы, поскольку iPod заполнен. Либо удалите"
+"некоторые дорожки, либо освободите место на iPod иным образом перед"
+"повторным извлечением."
+
+#: ../src/file_itunesdb.c:1852
+#, c-format
+msgid ""
+"You did not import the existing iTunesDB ('%s'). This is most likely "
+"incorrect and will result in the loss of the existing database.\n"
+"\n"
+"Press 'OK' if you want to proceed anyhow or 'Cancel' to skip storing. If you "
+"cancel, you can import the existing database before calling this function "
+"again.\n"
+msgstr "Вы не импортировали существующую iTunesDB (\"%s\"). Как правило, это"
+"является ошибкой и приведёт к потере существующей базы данных.\n"
+"\n"
+"Нажмите \"OK\", чтобы продолжить, несмотря на это, или \"Отмена\", чтобы"
+"пропустить сохранение. Если вы нажмёте \"Отмена\", вы сможете"
+"импортировать существующую базу данных перед повторным вызовом"
+"этой функции.\n"
+
+#: ../src/file_itunesdb.c:1887
+msgid ""
+"iPod directory structure must be present before synching to the iPod can be "
+"performed.\n"
+msgstr "Структура папок iPod должна присутствовать, прежде чем может быть"
+"осуществлена синхронизация с iPod.\n"
+
+#: ../src/file_itunesdb.c:1896
+msgid "Some tracks could not be deleted from the iPod. Export aborted!"
+msgstr "Некоторые дорожки не могут быть удалены с iPod. Экспорт прерван."
+
+#: ../src/file_itunesdb.c:1914
+#, c-format
+msgid "Now writing database '%s'. Please wait..."
+msgstr "Записывается база данных \"%s\". Пожалуйста, подождите..."
+
+#: ../src/file_itunesdb.c:1963
+#, c-format
+msgid "Extended information file not deleted: '%s'"
+msgstr "Файл расширенных сведений не удалён: \"%s\""
+
+#: ../src/file_itunesdb.c:2070
+#, c-format
+msgid "%s: Database saved"
+msgstr "%s: База данных сохранена"
+
+#: ../src/file_itunesdb.c:2074
+#, c-format
+msgid "%s: Changes saved"
+msgstr "%s: Изменения сохранены"
+
+#: ../src/fileselection.c:129
+msgid "Successfully added files"
+msgstr "Файлы успешно добавлены"
+
+#: ../src/fileselection.c:131
+msgid "Some files were not added successfully"
+msgstr "Произошла ошибка при добавлении некоторых файлов"
+
+#: ../src/fileselection.c:164 ../src/fileselection.c:305
+#: ../src/fileselection.c:792
+msgid "Please select a playlist or repository before adding tracks."
+msgstr "Пожалуйста, выберите список воспроизведения или репозиторий перед добавлением дорожек."
+
+#: ../src/fileselection.c:175 ../src/fileselection.c:314
+#: ../src/fileselection.c:803
+msgid "Please load the iPod before adding tracks."
+msgstr "Пожалуйста, загрузите iPod перед добавлением дорожек."
+
+#: ../src/fileselection.c:185
+#, c-format
+msgid "Add files to '%s'"
+msgstr "Добавить файлы к \"%s\""
+
+#: ../src/fileselection.c:189
+#, c-format
+msgid "Add files to '%s/%s'"
+msgstr "Добавить файлы к \"%s/%s\""
+
+#. Create window title
+#: ../src/fileselection.c:322
+#, c-format
+msgid "Add playlist files to '%s'"
+msgstr "Добавить файлы списка воспроизведения к \"%s\""
+
+#. Create the file chooser, and handle the response
+#: ../src/fileselection.c:378
+msgid "Set Cover"
+msgstr "Задать обложку"
+
+#: ../src/fileselection.c:816
+#, c-format
+msgid "Add directories to '%s'"
+msgstr "Добавить папки к \"%s\""
+
+#: ../src/fileselection.c:820
+#, c-format
+msgid "Add directories to '%s/%s'"
+msgstr "Добавить файлы к \"%s/%s\""
+
+#: ../src/fileselection.c:1097
+msgid "Ok"
+msgstr "OK"
+
+#: ../src/fileselection.c:1106
+msgid "Cancel"
+msgstr "Отмена"
+
+#: ../src/flacfile.c:62
+#, c-format
+msgid "'%s' does not appear to be an FLAC audio file.\n"
+msgstr "\"%s\" не поход на аудиофайл FLAC.\n"
+
+#: ../src/flacfile.c:78
+#, c-format
+msgid "Error retrieving tags for '%s'.\n"
+msgstr "Ошибка при получении меток для \"%s\".\n"
+
+#: ../src/flacfile.c:165
+#, c-format
+msgid ""
+"Import of '%s' failed: FLAC not supported without the FLAC library. You must "
+"compile the gtkpod source together with the FLAC library.\n"
+msgstr "Ошибка при импорте \"%s\": FLAC не поддерживается без библиотеки FLAC. Вы должны"
+"скомпилировать исходный код gtkpod с поддержкой библиотеки FLAC.\n"
+
+#: ../src/flacfile.c:171
+#, c-format
+msgid ""
+"FLAC metadata update for '%s' failed: FLAC not supported without the FLAC "
+"library. You must compile the gtkpod source together with the FLAC library.\n"
+msgstr "Ошибка при обновлении метаданных FLAC для \"%s\": FLAC не поддерживается без библиотеки FLAC. Вы должны"
+"скомпилировать исходный код gtkpod с поддержкой библиотеки FLAC.\n"
+
+#: ../src/getopt.c:681
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: опция \"%s\" имеет несколько значений\n"
+
+#: ../src/getopt.c:706
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: опция \"--%s\" не допускает аргумент\n"
+
+#: ../src/getopt.c:711
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: опция \"%c%s\" не допускает аргумент\n"
+
+#: ../src/getopt.c:729 ../src/getopt.c:902
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: опция \"--%s\" требует аргумент\n"
+
+#. --option
+#: ../src/getopt.c:758
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: неопознанная опция \"--%s\"\n"
+
+#. +option or -option
+#: ../src/getopt.c:762
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: неопознанная опция \"%c%s\"\n"
+
+#. 1003.2 specifies the format of this message.
+#: ../src/getopt.c:788
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: недопустимая опция -- %c\n"
+
+#: ../src/getopt.c:791
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: недопустимая опция -- %c\n"
+
+#. 1003.2 specifies the format of this message.
+#: ../src/getopt.c:821 ../src/getopt.c:951
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: опция требует аргумент -- %c\n"
+
+#: ../src/getopt.c:868
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: опция \"-W %s\" имеет несколько значений\n"
+
+#: ../src/getopt.c:886
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: опция \"-W %s\" не допускает аргумент\n"
+
+#: ../src/info.c:383
+msgid "n/c"
+msgstr "n/c"
+
+#: ../src/info.c:388 ../src/info.c:838
+msgid "offline"
+msgstr "автономный"
+
+#: ../src/info.c:486
+#, c-format
+msgid " P:%d T:%d/%d"
+msgstr " P:%d T:%d/%d"
+
+#: ../src/info.c:780
+msgid "B"
+msgstr "Б"
+
+#: ../src/info.c:780
+msgid "kB"
+msgstr "КБ"
+
+#: ../src/info.c:780
+msgid "TB"
+msgstr "ТБ"
+
+#: ../src/info.c:823
+#, c-format
+msgid " %s Free"
+msgstr "%s свободно"
+
+#: ../src/info.c:828
+#, c-format
+msgid " %s Pending"
+msgstr "%s выполняется"
+
+#: ../src/info.c:833
+msgid " disconnected"
+msgstr " отключено"
+
+#: ../src/info.c:884
+msgid "No database or playlist selected"
+msgstr "Не выбрана база данных или список воспроизведения"
+
+#: ../src/info.c:889
+msgid "No tracks selected"
+msgstr "Дорожки не выбраны"
+
+#: ../src/info.c:894
+msgid "No playlist selected"
+msgstr "Список воспроизведения не выбран"
+
+#: ../src/info.c:899
+msgid "No iPod or iPod playlist selected"
+msgstr "Не выбран iPod или список воспроизведения iPod"
+
+#. Strings used several times
+#: ../src/ipod_init.c:48
+msgid "Select or enter your model"
+msgstr "Выберите или введите свою модель"
+
+#: ../src/ipod_init.c:79 ../src/repository.c:546 ../src/repository.c:2369
+msgid "Select mountpoint"
+msgstr "Выберите точку монтирования"
+
+#: ../src/ipod_init.c:359
+#, c-format
+msgid "Error initialising iPod: %s\n"
+msgstr "Ошибка при инициализации iPod: %s\n"
+
+#: ../src/ipod_init.c:366
+msgid "Error initialising iPod, unknown error\n"
+msgstr "Ошибка при инициализации iPod, неизвестная ошибка\n"
+
+#: ../src/ipod_init.c:422
+#, c-format
+msgid "<b>Please select your iPod model at </b><i>%s</i>"
+msgstr "<b>Пожалуйста, выберите модель iPod в </b><i>%s</i>"
+
+#: ../src/ipod_init.c:463
+msgid ""
+"Could not determine the model you selected -- this could be a bug or "
+"incompatibilty in the GTK+ or glade library.\n"
+"\n"
+msgstr "Не удалось определить выбранную вами модель iPod -- возможно,"
+"это ошибка в библиотеке GTK+ или glade.\n"
+"\n"
+
+#: ../src/misc.c:70
+msgid ""
+"© 2002 - 2007\n"
+"Jorg Schuler (jcsjcs at users dot sourceforge dot net)\n"
+"Corey Donohoe (atmos at atmos dot org)\n"
+msgstr ""
+"© 2002 - 2007\n"
+"Jorg Schuler (jcsjcs at users dot sourceforge dot net)\n"
+"Corey Donohoe (atmos at atmos dot org)\n"
+
+#: ../src/misc.c:74
+msgid ""
+"Patches were supplied by the following people (list may be incomplete -- "
+"please contact me)\n"
+msgstr ""
+"Patches were supplied by the following people (list may be incomplete -- "
+"please contact me)\n"
+
+#: ../src/misc.c:75
+msgid "Ramesh Dharan: Multi-Edit (edit tags of several tracks in one run)"
+msgstr "Ramesh Dharan: Multi-Edit (edit tags of several tracks in one run)"
+
+#: ../src/misc.c:76
+msgid "Hiroshi Kawashima: Japanese charset autodetecion feature"
+msgstr "Hiroshi Kawashima: Japanese charset autodetecion feature"
+
+#: ../src/misc.c:77
+msgid "Adrian Ulrich: porting of playlist code from mktunes.pl to itunesdb.c"
+msgstr "Adrian Ulrich: porting of playlist code from mktunes.pl to itunesdb.c"
+
+#: ../src/misc.c:78
+msgid ""
+"Walter Bell: correct handling of DND URIs with escaped characters and/or cr/"
+"newlines at the end"
+msgstr ""
+"Walter Bell: correct handling of DND URIs with escaped characters and/or cr/"
+"newlines at the end"
+
+#: ../src/misc.c:79
+msgid "Sam Clegg: user defined filenames when exporting tracks from the iPod"
+msgstr "Sam Clegg: user defined filenames when exporting tracks from the iPod"
+
+#: ../src/misc.c:80
+msgid "Chris Cutler: automatic creation of various playlist types"
+msgstr "Chris Cutler: automatic creation of various playlist types"
+
+#: ../src/misc.c:81
+msgid ""
+"Graeme Wilford: reading and writing of the 'Composer' ID3 tags, progress "
+"dialogue during sync"
+msgstr ""
+"Graeme Wilford: reading and writing of the 'Composer' ID3 tags, progress "
+"dialogue during sync"
+
+#: ../src/misc.c:82
+msgid ""
+"Edward Matteucci: debugging, special playlist creation, most of the volume "
+"normalizing code"
+msgstr ""
+"Edward Matteucci: debugging, special playlist creation, most of the volume "
+"normalizing code"
+
+#: ../src/misc.c:83
+msgid "Jens Lautenbach: some optical improvements"
+msgstr "Jens Lautenbach: some optical improvements"
+
+#: ../src/misc.c:84
+msgid "Alex Tribble: iPod eject patch"
+msgstr "Alex Tribble: iPod eject patch"
+
+#: ../src/misc.c:85
+msgid "Yaroslav Halchenko: Orphaned and dangling tracks handling"
+msgstr "Yaroslav Halchenko: Orphaned and dangling tracks handling"
+
+#: ../src/misc.c:86
+msgid ""
+"Andrew Huntwork: Filename case sensitivity fix and various other bugfixes"
+msgstr ""
+"Andrew Huntwork: Filename case sensitivity fix and various other bugfixes"
+
+#: ../src/misc.c:87
+msgid ""
+"Ero Carrera: Filename validation and quick sync when copying tracks from the "
+"iPod"
+msgstr ""
+"Ero Carrera: Filename validation and quick sync when copying tracks from the "
+"iPod"
+
+#: ../src/misc.c:88
+msgid "Jens Taprogge: Support for LAME's replay gain tag to normalize volume"
+msgstr "Jens Taprogge: Support for LAME's replay gain tag to normalize volume"
+
+#: ../src/misc.c:89
+msgid "Armando Atienza: Support with external playcounts"
+msgstr "Armando Atienza: Support with external playcounts"
+
+#: ../src/misc.c:90
+msgid "D.L. Sharp: Support for m4b files (bookmarkable AAC files)"
+msgstr "D.L. Sharp: Support for m4b files (bookmarkable AAC files)"
+
+#: ../src/misc.c:91
+msgid "Jim Hall: Decent INSTALL file"
+msgstr "Jim Hall: Decent INSTALL file"
+
+#: ../src/misc.c:92
+msgid ""
+"Juergen Helmers, Markus Gaugusch: Conversion scripts to sync calendar/"
+"contacts to the iPod"
+msgstr ""
+"Juergen Helmers, Markus Gaugusch: Conversion scripts to sync calendar/"
+"contacts to the iPod"
+
+#. J"urgen!
+#: ../src/misc.c:93
+msgid "Flavio Stanchina: bugfixes"
+msgstr "Flavio Stanchina: bugfixes"
+
+#: ../src/misc.c:94
+msgid ""
+"Chris Micacchi: when sorting ignore 'the' and similar at the beginning of "
+"the title"
+msgstr ""
+"Chris Micacchi: when sorting ignore 'the' and similar at the beginning of "
+"the title"
+
+#: ../src/misc.c:95
+msgid "Steve Jay: use statvfs() instead of df (better portability, faster)"
+msgstr "Steve Jay: use statvfs() instead of df (better portability, faster)"
+
+#: ../src/misc.c:97
+msgid ""
+"Christoph Kunz: address compatibility issues when writing id3v2.4 type mp3 "
+"tags"
+msgstr ""
+"Christoph Kunz: address compatibility issues when writing id3v2.4 type mp3 "
+"tags"
+
+#: ../src/misc.c:99
+msgid ""
+"James Liggett:\n"
+"replacement of old GTK file selection dialogs with new GTK filechooser "
+"dialogs\n"
+"refactored user preferences system."
+msgstr ""
+"James Liggett:\n"
+"replacement of old GTK file selection dialogs with new GTK filechooser "
+"dialogs\n"
+"refactored user preferences system."
+
+#: ../src/misc.c:103
+msgid "Daniel Kercher: sync scripts for abook and webcalendar"
+msgstr "Daniel Kercher: sync scripts for abook and webcalendar"
+
+#: ../src/misc.c:105
+msgid "Clinton Gormley: sync scripts for thunderbird"
+msgstr "Clinton Gormley: sync scripts for thunderbird"
+
+#: ../src/misc.c:107
+msgid "Sebastien Beridot: sync script for ldif addressbook format"
+msgstr "Sebastien Beridot: sync script for ldif addressbook format"
+
+#: ../src/misc.c:109
+msgid "Sebastian Scherer: sync script for kNotes"
+msgstr "Sebastian Scherer: sync script for kNotes"
+
+#: ../src/misc.c:111
+msgid "Nick Piper: sync script for Palm, type-ahead search"
+msgstr "Nick Piper: sync script for Palm, type-ahead search"
+
+#: ../src/misc.c:113
+msgid "Uwe Hermann: help with support for iPod Video"
+msgstr "Uwe Hermann: help with support for iPod Video"
+
+#: ../src/misc.c:115
+msgid ""
+"Iain Benson: support for compilation tag in mp3 files and separate display "
+"of compilations in the sort tab."
+msgstr ""
+"Iain Benson: support for compilation tag in mp3 files and separate display "
+"of compilations in the sort tab."
+
+#: ../src/misc.c:116
+msgid ""
+"Nicolas Chariot: icons of buttons\n"
+"\n"
+msgstr ""
+"Nicolas Chariot: icons of buttons\n"
+"\n"
+
+#: ../src/misc.c:118
+msgid "This program borrows code from the following projects:"
+msgstr "This program borrows code from the following projects:"
+
+#: ../src/misc.c:119
+msgid ""
+"gnutools: (mktunes.pl, ported to C) reading and writing of iTunesDB  (http://"
+"www.gnu.org/software/gnupod/)"
+msgstr ""
+"gnutools: (mktunes.pl, ported to C) reading and writing of iTunesDB  (http://"
+"www.gnu.org/software/gnupod/)"
+
+#: ../src/misc.c:120
+msgid ""
+"iPod.cpp, iPod.h by Samuel Wood (sam dot wood at gmail dot com): some code "
+"for smart playlists is based on his C++-classes."
+msgstr ""
+"iPod.cpp, iPod.h by Samuel Wood (sam dot wood at gmail dot com): some code "
+"for smart playlists is based on his C++-classes."
+
+#: ../src/misc.c:121
+msgid "mp3info: mp3 playlength detection (http://ibiblio.org/mp3info/)"
+msgstr "mp3info: mp3 playlength detection (http://ibiblio.org/mp3info/)"
+
+#: ../src/misc.c:122
+msgid "xmms: dirbrowser, mp3 playlength detection (http://www.xmms.org)"
+msgstr "xmms: dirbrowser, mp3 playlength detection (http://www.xmms.org)"
+
+#: ../src/misc.c:124
+msgid "The GUI was created with the help of glade-2 (http://glade.gnome.org/)."
+msgstr "The GUI was created with the help of glade-2 (http://glade.gnome.org/)."
+
+#: ../src/misc.c:128
+msgid "French: David Le Brun (david at dyn-ns dot net)"
+msgstr "French: David Le Brun (david at dyn-ns dot net)"
+
+#: ../src/misc.c:129
+msgid "German: Jorg Schuler (jcsjcs at users dot sourceforge dot net)"
+msgstr "German: Jorg Schuler (jcsjcs at users dot sourceforge dot net)"
+
+#: ../src/misc.c:130
+msgid "Hebrew: Assaf Gillat (gillata at gmail dot com)"
+msgstr "Hebrew: Assaf Gillat (gillata at gmail dot com)"
+
+#: ../src/misc.c:131
+msgid ""
+"Italian: Edward Matteucci (edward_matteucc at users dot sourceforge dot net)"
+msgstr ""
+"Italian: Edward Matteucci (edward_matteucc at users dot sourceforge dot net)"
+
+#: ../src/misc.c:132
+msgid "Japanese: Ayako Sano"
+msgstr "Japanese: Ayako Sano"
+
+#: ../src/misc.c:133
+msgid "Japanese: Kentaro Fukuchi (fukuchi at users dot sourceforge dot net)"
+msgstr "Japanese: Kentaro Fukuchi (fukuchi at users dot sourceforge dot net)"
+
+#: ../src/misc.c:134
+msgid "Swedish: Stefan Asserhall (stefan asserhall at comhem dot se)"
+msgstr "Swedish: Stefan Asserhall (stefan asserhall at comhem dot se)"
+
+#: ../src/misc.c:139
+msgid ""
+"This program is free software; you can redistribute it and/or\n"
+"modify it under the terms of the GNU General Public License as\n"
+"published by the Free Software Foundation; either version 2 of the\n"
+"License, or (at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful, but\n"
+"WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See\n"
+"the GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public\n"
+"License along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA\n"
+"02111-1307, USA."
+msgstr ""
+"This program is free software; you can redistribute it and/or\n"
+"modify it under the terms of the GNU General Public License as\n"
+"published by the Free Software Foundation; either version 2 of the\n"
+"License, or (at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful, but\n"
+"WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See\n"
+"the GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public\n"
+"License along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA\n"
+"02111-1307, USA."
+
+#: ../src/misc.c:154
+msgid ""
+"© 2002-2007\n"
+"Jorg Schuler <jcsjcs at users.sourceforge.net>\n"
+"Corey Donohoe <atmos at atmos.org>"
+msgstr ""
+"© 2002-2007\n"
+"Jorg Schuler <jcsjcs at users.sourceforge.net>\n"
+"Corey Donohoe <atmos at atmos.org>"
+
+#: ../src/misc.c:162
+msgid "Cross-platform multilingual interface to Apple's iPod™"
+msgstr "Кроссплатформенный многоязыковой интерфейс для Apple iPod™"
+
+#: ../src/misc.c:929
+#, c-format
+msgid "Could not process '%s' (no filename available)"
+msgstr "Не удалось обработать \"%s\" (имя файла недоступно)"
+
+#: ../src/misc.c:1083
+#, c-format
+msgid "Unknown token '%%%c' in template '%s'"
+msgstr "Неизвестная лексема '%%%c' в шаблоне '%s'"
+
+#: ../src/misc.c:1166
+#, c-format
+msgid "Template ('%s') does not match file type '%s'\n"
+msgstr "Шаблон (\"%s\") не соответствует типу файла \"%s\"\n"
+
+#: ../src/misc.c:1252
+#, c-format
+msgid "Error creating %s: %s\n"
+msgstr "Ошибка при создании %s: %s\n"
+
+#: ../src/misc.c:1686
+#, c-format
+msgid ""
+"Writing preferences file '%s' failed (%s).\n"
+"\n"
+msgstr "Не удалось записать файл настроек \"%s\" (%s).\n"
+"\n"
+
+#: ../src/misc.c:1688
+msgid "unspecified error"
+msgstr "неспецифицированная ошибка"
+
+#: ../src/misc.c:1696
+#, c-format
+msgid ""
+"Writing preferences to the iPod (%s) failed: could not get path to Control "
+"Directory.\n"
+"\n"
+msgstr "Не удалось записать настройки на iPod (%s): невозможно получить путь к папке Control.\n"
+"\n"
+
+#. title
+#: ../src/misc_confirm.c:71
+msgid "The following has occurred:"
+msgstr "Произошло следующее:"
+
+#: ../src/misc_confirm.c:122
+msgid ""
+"Are you sure you want to delete the following track completely from your "
+"iPod? The number of playlists this track is a member of is indicated in "
+"parentheses."
+"Are you sure you want to delete the following tracks completely from your "
+"iPod? The number of playlists the tracks are member of is indicated in "
+"parentheses."
+msgstr "Вы уверены, что хотите полностью удалить следующую дорожку с iPod?"
+"Число списков воспроизведения, в которые входит эта дорожка, указано"
+"в скобках."
+"Вы уверены, что хотите полностью удалить следующие дорожки с iPod?"
+"Число списков воспроизведения, в которые входят эти дорожки, указано"
+"в скобках."
+
+#: ../src/misc_confirm.c:126
+msgid "Delete Track Completely from iPod?"
+msgstr "Удалить дорожку с iPod полностью?"
+
+#: ../src/misc_confirm.c:137 ../src/misc_confirm.c:178
+#, c-format
+msgid ""
+"Are you sure you want to remove the following track from the playlist \"%s\"?"
+"Are you sure you want to remove the following tracks from the playlist \"%s"
+"\"?"
+msgstr "Вы уверены, что хотите удалить следующую дорожку из списка воспроизведения \"%s\"?"
+"Вы уверены, что хотите удалить следующие дорожки из списка воспроизведения \"%s\"?"
+
+#: ../src/misc_confirm.c:141 ../src/misc_confirm.c:182
+msgid "Remove Track From Playlist?"
+msgstr "Удалить дорожку из списка воспроизведения?"
+
+#: ../src/misc_confirm.c:163
+msgid ""
+"Are you sure you want to delete the following track completely from your "
+"harddisk? The number of playlists this track is a member of is indicated in "
+"parentheses."
+"Are you sure you want to delete the following tracks completely from your "
+"harddisk? The number of playlists the tracks are member of is indicated in "
+"parentheses."
+msgstr "Вы уверены, что хотите полностью удалить следующую дорожку с жёсткого диска?"
+"Число списков воспроизведения, в которые входит эта дорожка, указано"
+"в скобках."
+"Вы уверены, что хотите полностью удалить следующие дорожки с жёсткого диска?"
+"Число списков воспроизведения, в которые входят эти дорожки, указано"
+"в скобках."
+
+#: ../src/misc_confirm.c:167
+msgid "Delete Track from Harddisk?"
+msgstr "Удалить дорожку с жёсткого диска?"
+
+#: ../src/misc_confirm.c:192
+msgid ""
+"Are you sure you want to remove the following track completely from your "
+"local database? The number of playlists this track is a member of is "
+"indicated in parentheses."
+"Are you sure you want to remove the following tracks completely from your "
+"local database? The number of playlists the tracks are member of is "
+"indicated in parentheses."
+msgstr "Вы уверены, что хотите удалить следующую дорожку из локальной базы данных?"
+"Число списков воспроизведения, в которые входит эта дорожка, указано"
+"в скобках."
+"Вы уверены, что хотите удалить следующие дорожки из локальной базы данных?"
+"Число списков воспроизведения, в которые входят эти дорожки, указано"
+"в скобках."
+
+#: ../src/misc_confirm.c:196
+msgid "Remove Track from Local Database?"
+msgstr "Удалить дорожку из локальной базы данных?"
+
+#: ../src/misc_confirm.c:261
+#, c-format
+msgid "Deleted one track completely from iPod"
+msgstr "Одна дорожка полностью удалена с iPod"
+
+#: ../src/misc_confirm.c:267 ../src/misc_confirm.c:291
+#, c-format
+msgid "Deleted %d track from playlist '%s'"
+msgstr "Дорожка %d удалена из списка воспроизведения \"%s\""
+
+#: ../src/misc_confirm.c:285
+#, c-format
+msgid "Deleted one track from harddisk"
+msgstr "Одна дорожка удалена с жёсткого диска"
+
+#: ../src/misc_confirm.c:297
+#, c-format
+msgid "Deleted track from local database"
+msgstr "Дорожка удалена из локальной базы данных"
+
+#: ../src/misc_confirm.c:442
+msgid "Cannot remove entry 'All'"
+msgstr "Невозможно удалить запись \"Все\""
+
+#: ../src/misc_confirm.c:536
+#, c-format
+msgid "Removed all %d tracks from the iPod"
+msgstr "Удалено %d дорожек с iPod"
+
+#: ../src/misc_confirm.c:541
+#, c-format
+msgid "Removed all podcasts from the iPod"
+msgstr "Все подкасты удалены с iPod"
+
+#: ../src/misc_confirm.c:550 ../src/misc_confirm.c:624
+#, c-format
+msgid "Deleted playlist '%s' including %d member track"
+msgstr "Удалён список воспроизведения \"%s\", включая %d дорожек"
+
+#. first use playlist name
+#: ../src/misc_confirm.c:566 ../src/misc_confirm.c:640
+#, c-format
+msgid "Deleted playlist '%s'"
+msgstr "Удалён список воспроизведения \"%s\""
+
+#: ../src/misc_confirm.c:600
+#, c-format
+msgid "Deleted playlist '%s' including %d member track on harddisk"
+msgstr "Удалён список воспроизведения \"%s\", включая %d дорожек на жёстком диске"
+
+#: ../src/misc_confirm.c:617
+#, c-format
+msgid "Removed all %d tracks from the database"
+msgstr "Удалено %d дорожек из базы данных"
+
+#: ../src/misc_confirm.c:695
+#, c-format
+msgid "Are you sure you want to remove all tracks from your iPod?"
+msgstr "Вы уверены, что хотите удалить все дорожки с iPod?"
+
+#: ../src/misc_confirm.c:700
+#, c-format
+msgid "Are you sure you want to remove all podcasts from your iPod?"
+msgstr "Вы уверены, что хотите удалить все подкасты с iPod?"
+
+#: ../src/misc_confirm.c:708
+#, c-format
+msgid ""
+"Are you sure you want to delete playlist '%s' and the following track "
+"completely from your ipod? The number of playlists this track is a member of "
+"is indicated in parentheses."
+"Are you sure you want to delete playlist '%s' and the following tracks "
+"completely from your ipod? The number of playlists the tracks are member of "
+"is indicated in parentheses."
+msgstr "Вы уверены, что хотите удалить список воспроизведения \"%s\" и следующую дорожку с iPod?"
+"Число списков воспроизведения, в которые входит эта дорожка, указано"
+"в скобках."
+"Вы уверены, что хотите удалить список воспроизведения \"%s\" и следующие дорожки с iPod?"
+"Число списков воспроизведения, в которые входят эти дорожки, указано"
+"в скобках."
+
+#: ../src/misc_confirm.c:719 ../src/misc_confirm.c:774
+#, c-format
+msgid "Are you sure you want to delete the playlist '%s'?"
+msgstr "Вы уверены, что хотите удалить список воспроизведения \"%s\"?"
+
+#: ../src/misc_confirm.c:745
+#, c-format
+msgid ""
+"Are you sure you want to delete playlist '%s' and remove the following track "
+"from your harddisk? The number of playlists this track is a member of is "
+"indicated in parentheses."
+"Are you sure you want to delete playlist '%s' and remove the following "
+"tracks from your harddisk? The number of playlists the tracks are member of "
+"is indicated in parentheses."
+msgstr "Вы уверены, что хотите удалить список воспроизведения \"%s\" и следующую дорожку с жёсткого диска?"
+"Число списков воспроизведения, в которые входит эта дорожка, указано"
+"в скобках."
+"Вы уверены, что хотите удалить список воспроизведения \"%s\" и следующие дорожки с жёсткого диска?"
+"Число списков воспроизведения, в которые входят эти дорожки, указано"
+"в скобках."
+
+#: ../src/misc_confirm.c:753
+#, c-format
+msgid "Are you sure you want to remove all tracks from the database?"
+msgstr "Вы уверены, что хотите удалить все дорожки из базы данных?"
+
+#: ../src/misc_confirm.c:762
+#, c-format
+msgid ""
+"Are you sure you want to delete playlist '%s' and remove the following track "
+"from the database? The number of playlists this track is a member of is "
+"indicated in parentheses."
+"Are you sure you want to delete playlist '%s' and remove the following "
+"tracks from the database? The number of playlists the tracks are member of "
+"is indicated in parentheses."
+msgstr "Вы уверены, что хотите удалить список воспроизведения \"%s\" и следующую дорожку из базы данных?"
+"Число списков воспроизведения, в которые входит эта дорожка, указано"
+"в скобках."
+"Вы уверены, что хотите удалить список воспроизведения \"%s\" и следующие дорожки из базы данных?"
+"Число списков воспроизведения, в которые входят эти дорожки, указано"
+"в скобках."
+
+#: ../src/misc_confirm.c:841
+msgid ""
+"Data has been changed and not been saved.\n"
+"OK to exit gtkpod?"
+msgstr "Данные изменены и не были сохранены.\n"
+"Вы уверены, что хотите выйти из gtkpod?"
+
+#: ../src/misc_conversion.c:66
+msgid "File type"
+msgstr "Тип файла"
+
+#: ../src/misc_conversion.c:67
+msgid "PC File"
+msgstr "Файл на ПК"
+
+#: ../src/misc_conversion.c:68
+msgid "iPod File"
+msgstr "Файл на iPod"
+
+#: ../src/misc_conversion.c:69
+msgid "iPod ID"
+msgstr "iPod ID"
+
+#. 10
+#: ../src/misc_conversion.c:70
+msgid "Track Nr (#)"
+msgstr "Номер дорожки"
+
+#: ../src/misc_conversion.c:71
+msgid "Transferred"
+msgstr "Передано"
+
+#: ../src/misc_conversion.c:72
+msgid "File Size"
+msgstr "Размер файла"
+
+#: ../src/misc_conversion.c:73
+msgid "Play Time"
+msgstr "Длительность"
+
+#. 20
+#: ../src/misc_conversion.c:80
+msgid "Date played"
+msgstr "Дата воспроизведения"
+
+#: ../src/misc_conversion.c:82
+msgid "Volume"
+msgstr "Том"
+
+#: ../src/misc_conversion.c:83
+msgid "Soundcheck"
+msgstr "Soundcheck"
+
+#. 25
+#: ../src/misc_conversion.c:85
+msgid "CD Nr"
+msgstr "Номер CD"
+
+#: ../src/misc_conversion.c:88
+msgid "Category"
+msgstr "Категория"
+
+#: ../src/misc_conversion.c:89
+msgid "Description"
+msgstr "Описание"
+
+#. 30
+#: ../src/misc_conversion.c:90
+msgid "Podcast URL"
+msgstr "URL подкаста"
+
+#: ../src/misc_conversion.c:91
+msgid "Podcast RSS"
+msgstr "RSS подкаста"
+
+#: ../src/misc_conversion.c:92
+msgid "Subtitle"
+msgstr "Субтитры"
+
+#: ../src/misc_conversion.c:93
+msgid "Date released"
+msgstr "Дата выпуска"
+
+#: ../src/misc_conversion.c:94
+msgid "Checked"
+msgstr "Отмечено"
+
+#. 35
+#: ../src/misc_conversion.c:95
+msgid "Start time"
+msgstr "Время начала"
+
+#: ../src/misc_conversion.c:96
+msgid "Stop time"
+msgstr "Время окончания"
+
+#: ../src/misc_conversion.c:97
+msgid "Remember Playback Position"
+msgstr "Запомнить позицию воспроизведения"
+
+#: ../src/misc_conversion.c:98
+msgid "Skip when Shuffling"
+msgstr "Пропускать при перемешивании"
+
+#: ../src/misc_conversion.c:99
+msgid "Artwork Path"
+msgstr "Путь к изображению"
+
+#. 40
+#: ../src/misc_conversion.c:100
+msgid "Media Type"
+msgstr "Тип содержимого"
+
+#: ../src/misc_conversion.c:102
+msgid "TV Episode"
+msgstr "Серия телесериала"
+
+#: ../src/misc_conversion.c:103
+msgid "TV Network"
+msgstr "Телеканал"
+
+#: ../src/misc_conversion.c:104
+msgid "Season Nr"
+msgstr "Номер сезона"
+
+#. 45
+#: ../src/misc_conversion.c:105
+msgid "Episode Nr"
+msgstr "Номер серии"
+
+#: ../src/misc_conversion.c:106
+msgid "Album Artist"
+msgstr "Художник обложки"
+
+#: ../src/misc_conversion.c:107
+msgid "Sort Artist"
+msgstr "Сортировка по исполнителям"
+
+#: ../src/misc_conversion.c:108
+msgid "Sort Title"
+msgstr "Сортировка по названиям"
+
+#: ../src/misc_conversion.c:109
+msgid "Sort Album"
+msgstr "Сортировка по альбомам"
+
+#. 50
+#: ../src/misc_conversion.c:110
+msgid "Sort Album Artist"
+msgstr "Сортировка по альбомам и исполнителям"
+
+#: ../src/misc_conversion.c:111
+msgid "Sort Composer"
+msgstr "Сортировка по композиторам"
+
+#: ../src/misc_conversion.c:112
+msgid "Sort TV Show"
+msgstr "Сортировка по телесериалам"
+
+#: ../src/misc_conversion.c:113
+msgid "Gapless Track Flag"
+msgstr "Флаг безразрывной дорожки"
+
+#: ../src/misc_conversion.c:126
+msgid "Name of file on PC, if available"
+msgstr "Имя файла на ПК, если доступно"
+
+#: ../src/misc_conversion.c:127
+msgid "Name of file on the iPod"
+msgstr "Имя файла на iPod"
+
+#. 10
+#: ../src/misc_conversion.c:129
+msgid "Track Nr. and total number of tracks on CD"
+msgstr "Номер дорожки и общее число дорожек на CD"
+
+#: ../src/misc_conversion.c:130
+msgid "Whether the file has already been transferred to the iPod or not"
+msgstr "Был ли файл уже передан на iPod или нет"
+
+#: ../src/misc_conversion.c:136
+msgid "Beats per minute"
+msgstr "Ударов в минуту"
+
+#: ../src/misc_conversion.c:137
+msgid "Number of times the track has been played"
+msgstr "Сколько раз дорожка была воспроизведена"
+
+#: ../src/misc_conversion.c:138
+msgid "Star rating from 0 to 5"
+msgstr "Оценка в звёздах, от 0 до 5"
+
+#: ../src/misc_conversion.c:139
+msgid "Date and time track has been added"
+msgstr "Дата и время добавления дорожки"
+
+#. 20
+#: ../src/misc_conversion.c:140
+msgid "Date and time track has last been played"
+msgstr "Дата и время последнего воспроизведения дорожки"
+
+#: ../src/misc_conversion.c:141
+msgid "Date and time track has last been modified"
+msgstr "Дата и время последнего изменения дорожки"
+
+#: ../src/misc_conversion.c:142
+msgid "Manual volume adjust"
+msgstr "Ручная подстройка громкости"
+
+#: ../src/misc_conversion.c:143
+msgid ""
+"Volume adjust in dB (replay gain) -- you need to activate 'soundcheck' on "
+"the iPod"
+msgstr "Подстройка громкости в dB (\"replay gain\"): вы должны включить опцию"
+"\"soundcheck\" на iPod"
+
+#. 25
+#: ../src/misc_conversion.c:146
+msgid "CD Nr. and total number of CDS in set"
+msgstr "Номер CD и общее число CD в наборе"
+
+#: ../src/misc_conversion.c:149
+msgid ""
+"The category (e.g. 'Technology' or 'Music') where the podcast was located."
+msgstr "Категория (например, \"Технология\" или \"Музыка\", где находился подкаст."
+
+#: ../src/misc_conversion.c:150
+msgid "Accessible by selecting the center button on the iPod."
+msgstr "Доступно нажатием средней кнопки на iPod."
+
+#: ../src/misc_conversion.c:154
+msgid "Release date (for podcasts displayed next to the title on the iPod)"
+msgstr "Дата выпуска (для подкастов располагается рядом с названием на iPod)"
+
+#. 50
+#: ../src/misc_conversion.c:168 ../src/misc_conversion.c:169
+#: ../src/misc_conversion.c:170 ../src/misc_conversion.c:171
+#: ../src/misc_conversion.c:172 ../src/misc_conversion.c:173
+msgid "Used for sorting on the iPod"
+msgstr "Используется для сортировки на iPod"
+
+#: ../src/misc_conversion.c:735
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the file scheme"
+msgstr "URI \"%s\" не является абсолютным URI схемы file"
+
+#: ../src/misc_conversion.c:745
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "Локальный URL типа file \"%s\" не может включать \"#\""
+
+#: ../src/misc_conversion.c:762
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "URI \"%s\" некорректен"
+
+#: ../src/misc_conversion.c:774
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Имя хоста в URI \"%s\" некорректно"
+
+#: ../src/misc_conversion.c:790
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "URI %s содержит неверные escape-последовательности"
+
+#: ../src/misc_playlist.c:67 ../src/misc_playlist.c:94
+#: ../src/misc_playlist.c:429
+msgid "Please enter a name for the new playlist"
+msgstr "Пожалуйста, введите имя нового списка воспроизведения"
+
+#: ../src/misc_playlist.c:154
+msgid "AR:"
+msgstr "ИС:"
+
+#: ../src/misc_playlist.c:157
+msgid "AL:"
+msgstr "АЛ:"
+
+#: ../src/misc_playlist.c:160
+msgid "GE:"
+msgstr "ЖА:"
+
+#: ../src/misc_playlist.c:163
+msgid "CO:"
+msgstr "ОБ:"
+
+#: ../src/misc_playlist.c:166
+msgid "YE:"
+msgstr "ГО:"
+
+#: ../src/misc_playlist.c:194
+msgid "Unknown"
+msgstr "Неизвестно"
+
+#: ../src/misc_playlist.c:272
+#, c-format
+msgid "Random (%d)"
+msgstr "Случайное (%d)"
+
+#: ../src/misc_playlist.c:297
+msgid ""
+"Auto Store of track view disabled.\n"
+"\n"
+msgstr "Автосохранение представления дорожки отключено.\n"
+"\n"
+
+#: ../src/misc_playlist.c:356
+msgid "Not Listed"
+msgstr "Не в списке"
+
+#: ../src/misc_playlist.c:406
+#, c-format
+msgid "Created playlist '%s' with %d track."
+msgstr "Создан список воспроизведения \"%s\" с дорожкой %d."
+
+#. n==0
+#: ../src/misc_playlist.c:417
+msgid "No tracks available, playlist not created"
+msgstr "Нет доступных дорожек, список воспроизведения не создан"
+
+#: ../src/misc_playlist.c:543
+#, c-format
+msgid "Most Listened (%d)"
+msgstr "Наиболее часто прослушиваемые (%d)"
+
+#: ../src/misc_playlist.c:584
+#, c-format
+msgid "Never Listened"
+msgstr "Никогда не прослушанные"
+
+#: ../src/misc_playlist.c:624
+#, c-format
+msgid "Best Rated (%d)"
+msgstr "Наибольший рейтинг (%d)"
+
+#: ../src/misc_playlist.c:666
+msgid "Unrated tracks"
+msgstr "Дорожки без рейтинга"
+
+#: ../src/misc_playlist.c:671
+#, c-format
+msgid "Rated %d"
+msgstr "Рейтинг %d"
+
+#: ../src/misc_playlist.c:714
+#, c-format
+msgid "Recent (%d)"
+msgstr "Недавние (%d)"
+
+#: ../src/misc_playlist.c:753
+msgid "Last Time"
+msgstr "Последнее время"
+
+#: ../src/misc_playlist.c:844
+msgid "Removal of dangling tracks with no files on PC was canceled."
+msgstr "Удаление повисших дорожек без файлов на ПК отменено."
+
+#: ../src/misc_playlist.c:854
+msgid "Handling of dangling tracks with files on PC was canceled."
+msgstr "Обработка повисших дорожек без файлов на ПК отменена."
+
+#: ../src/misc_playlist.c:882
+msgid "Dangling tracks with no files on PC were removed."
+msgstr "Повисшие дорожки без файлов на ПК были удалены."
+
+#: ../src/misc_playlist.c:943
+msgid "Dangling tracks with files on PC were handled."
+msgstr "Повисшие дорожки без файлов на ПК были обработаны."
+
+#: ../src/misc_playlist.c:976
+msgid "Track"
+msgstr "Дорожка"
+
+#: ../src/misc_playlist.c:1019
+msgid ""
+"You did not import the existing iTunesDB. This is most likely incorrect and "
+"will result in the loss of the existing database.\n"
+"\n"
+"Press 'OK' if you want to proceed anyhow or 'Cancel' to abort. If you "
+"cancel, you can import the existing database before calling this function "
+"again.\n"
+msgstr "Вы не импортировали существующую iTunesDB (\"%s\"). Как правило, это"
+"является ошибкой и приведёт к потере существующей базы данных.\n"
+"\n"
+"Нажмите \"OK\", чтобы продолжить, несмотря на это, или \"Отмена\", чтобы"
+"пропустить сохранение. Если вы нажмёте \"Отмена\", вы сможете"
+"импортировать существующую базу данных перед повторным вызовом"
+"этой функции.\n"
+
+#: ../src/misc_playlist.c:1033
+msgid "Creating a tree of known files"
+msgstr "Создание дерева известных файлов"
+
+#: ../src/misc_playlist.c:1077
+msgid "Checking iPOD files against known files in DB"
+msgstr "Сопоставление файлов на iPod с известными файлами в БД"
+
+#: ../src/misc_playlist.c:1120
+msgid "Orphaned"
+msgstr "Сирота"
+
+#: ../src/misc_playlist.c:1147
+#, c-format
+msgid ""
+"The following orphaned file had already been added to the iPod again. It "
+"will be removed with the next sync:\n"
+"%s\n"
+"\n"
+msgstr "Следующий осиротевший файл уже был добавлен на iPod вновь. Он"
+"будет удалён при следующей синхронизации:\n"
+"%s\n"
+"\n"
+
+#: ../src/misc_playlist.c:1175
+#, c-format
+msgid "Found %d orphaned and %d dangling files. Processing..."
+msgstr "Найдено %d осиротевших и %d повисших файлов. Идёт обработка..."
+
+#: ../src/misc_playlist.c:1199
+#, c-format
+msgid ""
+"The following dangling track has a file on PC.\n"
+"Press OK to have them transfered from the file on next Sync, CANCEL to leave "
+"it as is."
+"The following %d dangling tracks have files on PC.\n"
+"Press OK to have them transfered from the files on next Sync, CANCEL to "
+"leave them as is."
+msgstr "Следующая повисшая дорожка имеет файл на ПК.\n"
+"Нажмите \"OK\", чтобы передать её из файла при следующей синхронизации,"
+"или \"Отмена\", чтобы оставить её как есть."
+"Следующие %d повисших дорожек имеют файлы на ПК.\n"
+"Нажмите \"OK\", чтобы передать их из файлов при следующей синхронизации,"
+"или \"Отмена\", чтобы оставить их как есть."
+
+#: ../src/misc_playlist.c:1204
+#, c-format
+msgid ""
+"The following dangling track doesn't have file on PC. \n"
+"Press OK to remove it, CANCEL to leave it as is."
+"The following %d dangling tracks do not have files on PC. \n"
+"Press OK to remove them, CANCEL to leave them. as is"
+msgstr "Следующая повисшая дорожка не имеет файла на ПК.\n"
+"Нажмите \"OK\", чтобы удалить её, или \"Отмена\", чтобы оставить её без изменений."
+"Следующие %d повисших дорожек не имеют файла на ПК.\n"
+"Нажмите \"OK\", чтобы удалитьихё, или \"Отмена\", чтобы оставить их без изменений."
+
+#. we want unique window for each
+#. gboolean modal,
+#: ../src/misc_playlist.c:1211
+msgid "Dangling Tracks"
+msgstr "Повисшие дорожки"
+
+#: ../src/misc_playlist.c:1234
+#, c-format
+msgid "Found %d orphaned and %d dangling files. Done."
+msgstr "Найдено %d осиротевших и %d повисших файлов. Завершено."
+
+#. update for count == 1, 21, 41 ... and for count == n
+#: ../src/misc_track.c:89
+#, c-format
+msgid "Hashed %d of %d track."
+msgstr "Хэшировано %d из %d дорожек."
+
+#: ../src/misc_track.c:198
+#, c-format
+msgid "The following duplicate track has been removed."
+msgstr "Следующая дорожка-дубликат была удалена."
+
+#: ../src/misc_track.c:205
+#, c-format
+msgid ""
+"The following duplicate track has not been added to the master play list."
+"The following %d duplicate tracks have not been added to the master play "
+"list."
+msgstr "Следующая дорожка-дубликат не была добавлена в главный список воспроизведения."
+"Следующие %d дорожек-дубликатов не были добавлены в главный список воспроизведения."
+
+#. gint id,
+#. gboolean modal,
+#: ../src/misc_track.c:212
+msgid "Duplicate detection"
+msgstr "Обнаружение дубликатов"
+
+#: ../src/misc_track.c:1339
+msgid "Local Database"
+msgstr "Локальная база данных"
+
+#. artwork is set
+#: ../src/misc_track.c:1350
+msgid "Embedded or filename was lost"
+msgstr "Внедрено или имя файла было потеряно"
+
+#: ../src/misc_track.c:1354
+msgid "Artwork not set"
+msgstr "Изображение не задано"
+
+#: ../src/misc_track.c:1816
+#, c-format
+msgid "Could not find source file for '%s'. Track not copied."
+msgstr "Не удалось найти исходный файл для \"%s\". Дорожка не скопирована."
+
+#: ../src/misc_track.c:2052
+#, c-format
+msgid "drag and drop: ignored '%s'\n"
+msgstr "перетаскивание: проигнорировано \"%s\"\n"
+
+#: ../src/mp3file.c:1336
+#, c-format
+msgid "Error setting ID3 field: %s\n"
+msgstr "Ошибка при установке поля ID3: %s\n"
+
+#: ../src/mp3file.c:1360 ../src/mp3file.c:1453 ../src/mp3file.c:1608
+#: ../src/mp3file.c:2733
+#, c-format
+msgid "ERROR while opening file: '%s' (%s).\n"
+msgstr "ОШИБКА при открытии файла: \"%s\" (%s).\n"
+
+#: ../src/mp3file.c:1688
+#, c-format
+msgid "ERROR while writing tag to file: '%s' (%s).\n"
+msgstr "ОШИБКА при записи метки в файл: \"%s\" (%s).\n"
+
+#. Tracks with zero play length are ignored by iPod...
+#: ../src/mp3file.c:2770
+#, c-format
+msgid "File \"%s\" has zero play length. Ignoring.\n"
+msgstr "Файл \"%s\" имеет нулевую длительность. Проигнорировано.\n"
+
+#: ../src/mp4file.c:243 ../src/mp4file.c:404
+#, c-format
+msgid "'%s' does not appear to be a mp4 audio or video file.\n"
+msgstr "\"%s\" не похож на видео- или аудиофайл MP4.\n"
+
+#: ../src/mp4file.c:253 ../src/mp4file.c:414
+#, c-format
+msgid "Could not open '%s' for reading, or file is not an mp4 file.\n"
+msgstr "Не удалось открыть \"%s\" для чтения или файл не является MP4-файлом.\n"
+
+#: ../src/mp4file.c:529
+#, c-format
+msgid "'%s' does not appear to be a mp4 audio file.\n"
+msgstr "\"%s\" не похож на аудиофайл MP4.\n"
+
+#: ../src/mp4file.c:540
+#, c-format
+msgid "Could not open '%s' for writing, or file is not an mp4 file.\n"
+msgstr "Не удалось открыть \"%s\" для записи или файл не является MP4-файлом.\n"
+
+#: ../src/mp4file.c:553
+#, c-format
+msgid ""
+"Import of '%s' failed: m4a/m4p/m4b not supported without the mp4v2 library. "
+"You must compile the gtkpod source together with the mp4v2 library.\n"
+msgstr "Импорт \"%s\" завершился неуспешно: M4A/M4P/M4B не поддерживается без библиотеки mp4v2."
+"Вы должны откомпилировать исходный код gtkpod с поддержкой библиотеки mp4v2.\n"
+
+#: ../src/mp4file.c:559
+#, c-format
+msgid ""
+"m4a/m4p/m4b metadata update for '%s' failed: m4a/m4p/m4b not supported "
+"without the mp4v2 library. You must compile the gtkpod source together with "
+"the mp4v2 library.\n"
+msgstr "Обновление метаданных M4A/M4P/M4B для \"%s\" завершилось неуспешно: M4A/M4P/M4B"
+"не поддерживается без библиотеки mp4v2. Вы должны откомпилировать исходный код"
+"gtkpod с поддержкой библиотеки mp4v2.\n"
+
+#: ../src/mp4file.c:565
+#, c-format
+msgid ""
+"m4a/m4p/m4b soundcheck update for '%s' failed: m4a/m4p/m4b not supported "
+"without the mp4v2 library. You must compile the gtkpod source together with "
+"the mp4v2 library.\n"
+msgstr "Обновление soundcheck M4A/M4P/M4B для \"%s\" завершилось неуспешно: M4A/M4P/M4B"
+"не поддерживается без библиотеки mp4v2. Вы должны откомпилировать исходный код"
+"gtkpod с поддержкой библиотеки mp4v2.\n"
+
+#: ../src/oggfile.c:62 ../src/wavfile.c:107
+#, c-format
+msgid "Could not open '%s' for reading.\n"
+msgstr "Не удалось открыть \"%s\" для чтения.\n"
+
+#: ../src/oggfile.c:73
+#, c-format
+msgid "'%s' does not appear to be an ogg audio file.\n"
+msgstr "\"%s\" не похож на аудиофайл Ogg.\n"
+
+#: ../src/oggfile.c:154
+#, c-format
+msgid ""
+"Import of '%s' failed: ogg not supported without the ogg library. You must "
+"compile the gtkpod source together with the ogg library.\n"
+msgstr "Импорт \"%s\" завершился неуспешно: Ogg не поддерживается без библиотеки Ogg."
+"Вы должны откомпилировать исходный код gtkpod с поддержкой библиотеки Ogg.\n"
+
+#: ../src/oggfile.c:160
+#, c-format
+msgid ""
+"ogg metadata update for '%s' failed: ogg not supported without the ogg "
+"library. You must compile the gtkpod source together with the ogg library.\n"
+msgstr "Обновление метаданных для \"%s\" завершилось неуспешно: Ogg не поддерживается без библиотеки Ogg."
+"Вы должны откомпилировать исходный код gtkpod с поддержкой библиотеки Ogg.\n"
+
+#: ../src/prefs.c:357
+#, c-format
+msgid "gtkpod version %s usage:\n"
+msgstr "использование версии gtkpod %s:\n"
+
+#: ../src/prefs.c:358
+msgid "  -h, --help:   display this message\n"
+msgstr "  -h, --help:   отобразить это сообщение\n"
+
+#: ../src/prefs.c:359
+msgid "  -p <file>:    increment playcount for file by one\n"
+msgstr "  -p <file>:    увеличить число воспроизведений файла на 1\n"
+
+#: ../src/prefs.c:360
+msgid "  --hash <file>:print gtkpod hash for file\n"
+msgstr "  --hash <file>:вывести хэш gtkpod для файла\n"
+
+#: ../src/prefs.c:361
+msgid "  -m path:      define the mountpoint of your iPod\n"
+msgstr "  -m path:      задать точку монтирования iPod\n"
+
+#: ../src/prefs.c:362
+msgid "  --mountpoint: same as '-m'.\n"
+msgstr "  --mountpoint: то же, что '-m'.\n"
+
+#: ../src/prefs.c:363
+msgid "  -a:           import database automatically after start.\n"
+msgstr "  -a:           импортировать базу данных автоматически при запуске.\n"
+
+#: ../src/prefs.c:364
+msgid "  --auto:       same as '-a'.\n"
+msgstr "  --auto:       то же, что '-a'.\n"
+
+#: ../src/prefs.c:561
+#, c-format
+msgid "Couldn't create ~/.gtkpod\n"
+msgstr "Не удалось создать ~/.gtkpod\n"
+
+#: ../src/prefs_window.c:133
+msgid "Please select command for 'Play Now'"
+msgstr "Пожалуйста, выберите команду для функции \"Воспроизвести сейчас\""
+
+#: ../src/prefs_window.c:134
+msgid "Please select command for 'Enqueue'"
+msgstr "Пожалуйста, выберите команду для функции \"Поставить в очередь\""
+
+#: ../src/prefs_window.c:135
+msgid "Please select the mp3gain executable"
+msgstr "Пожалуйста, выберите исполняемый файл mp3gain"
+
+#: ../src/prefs_window.c:136
+msgid "Please select the aacgain executable"
+msgstr "Пожалуйста, выберите исполняемый файл aacgain"
+
+#: ../src/prefs_window.c:137
+msgid "Select the mserv music root directory"
+msgstr "Выберите корневую папку музыки mserv"
+
+#: ../src/prefs_window.c:138
+msgid "Select the mserv trackinfo root directory"
+msgstr "Выберите корневую папку mserv trackinfo"
+
+#: ../src/prefs_window.c:139
+msgid "Select the ogg/vorbis converter command"
+msgstr "Выберите команду преобразования Ogg/Vorbis"
+
+#: ../src/prefs_window.c:140
+msgid "Select the flac converter command"
+msgstr "Выберите команду преобразования FLAC"
+
+#: ../src/prefs_window.c:141
+msgid "Select the m4a converter command."
+msgstr "Выберите команду преобразования M4A"
+
+#: ../src/prefs_window.c:142
+msgid "Select the mp3 converter command."
+msgstr "Выберите команду преобразования MP3"
+
+#: ../src/prefs_window.c:143
+msgid "Select the wav converter command."
+msgstr "Выберите команду преобразования WAV"
+
+#: ../src/prefs_window.c:201 ../src/repository.c:662
+#, c-format
+msgid ""
+"<i>Have a look at the scripts provided in '%s'. If you write a new script or "
+"improve an existing one, please send it to jcsjcs at users.sourceforge.net "
+"for inclusion into the next release.</i>"
+msgstr "<i>Посмотрите на сценарии, поставляемые в \"%s\". Если вы написали новый"
+"сценарий или улучшили существующий, пожалуйста, отправьте его на jcsjcs at users.sourceforge.net "
+"для включения в следующую версию.</i>"
+
+#: ../src/prefs_window.c:1205 ../src/prefs_window.c:1223
+msgid "Preferences not updated"
+msgstr "Настройки не обновлены"
+
+#: ../src/prefs_window.c:1232
+msgid "Preferences applied"
+msgstr "Настройки применены"
+
+#: ../src/repository.c:573 ../src/repository.c:2395
+msgid "Set backup file"
+msgstr "Задайте файл резервной копии"
+
+#: ../src/repository.c:612
+msgid "Select directory for synchronization"
+msgstr "Выберите папку для синхронизации"
+
+#: ../src/repository.c:638
+msgid "Please select command to sync contacts"
+msgstr "Пожалуйста, выберите команду для синхронизации контактов"
+
+#: ../src/repository.c:644
+msgid "Please select command to sync calendar"
+msgstr "Пожалуйста, выберите команду для синхронизации календаря"
+
+#: ../src/repository.c:650
+msgid "Please select command to sync notes"
+msgstr "Пожалуйста, выберите команду для синхронизации заметок"
+
+#: ../src/repository.c:729
+msgid "Smart playlist updated."
+msgstr "Умный список воспроизведения обновлён."
+
+#: ../src/repository.c:1190
+msgid "Podcasts Repository"
+msgstr "Репозиторий подкастов"
+
+#: ../src/repository.c:1194
+msgid "Local Repository"
+msgstr "Локальный репозиторий"
+
+#: ../src/repository.c:1348
+msgid "Master Playlist"
+msgstr "Главный список воспроизведения"
+
+#: ../src/repository.c:1352
+msgid "Podcasts Playlist"
+msgstr "Список воспроизведения подкастов"
+
+#: ../src/repository.c:1360
+msgid "Regular Playlist"
+msgstr "Обычный список воспроизведения"
+
+#: ../src/repository.c:2423
+msgid "Set local repository file"
+msgstr "Задайте файл локального репозитория"
+
+#: ../src/repository.c:2522
+msgid "New Repository"
+msgstr "Новый репозиторий"
+
+#: ../src/sha1.c:186
+msgid "Hashed file is 0 bytes long\n"
+msgstr "Хэшированный файл имеет длину 0 байт\n"
+
+#: ../src/sha1.c:239
+#, c-format
+msgid "Could not open '%s' to calculate SHA1 checksum: %s\n"
+msgstr "Не удалось открыть \"%s\" для вычисления контрольной суммы SHA1: %s\n"
+
+#: ../src/syncdir.c:237
+#, c-format
+msgid "Sync summary for %s/%s\n"
+msgstr "Сводная информация о синхронизации для %s/%s\n"
+
+#: ../src/syncdir.c:246
+msgid "The following track has been added or updated:\n"
+msgstr "Следующая дорожка была добавлена или обновлена:\n"
+
+#: ../src/syncdir.c:255
+msgid "The following track has been completely removed from the iPod:\n"
+"The following tracks have been completely removed from the iPod:\n"
+msgstr "Следующая дорожка была полностью удалена с iPod:\n"
+"Следующие дорожки была полностью удалены с iPod:\n"
+
+#: ../src/syncdir.c:264
+msgid "The following track has been removed from the repository:\n"
+msgstr "Следующая дорожка была удалена из репозитория:\n"
+
+#: ../src/syncdir.c:271
+msgid "The following track has been removed from the playlist:\n"
+msgstr "Следующая дорожка была удалена из списка воспроизведения:\n"
+
+#: ../src/syncdir.c:277
+msgid "Nothing was changed.\n"
+msgstr "Никаких изменений не произошло.\n"
+
+#: ../src/syncdir.c:282
+msgid "Sync summary"
+msgstr "Сводная информация о синхронизации"
+
+#: ../src/tools.c:118
+#, c-format
+msgid ""
+"Could not find '%s'.\n"
+"Please specifiy the exact path in the Tools section of the preference dialog "
+"or install the program if it is not installed on your system.\n"
+"\n"
+msgstr "Не удалось найти \"%s\".\n"
+"Пожалуйста, задайте полный путь в разделе \"Инструменты\" диалога настроек"
+"или установите программу, если она не установлена на вашей системе.\n"
+"\n"
+
+#: ../src/tools.c:203
+#, c-format
+msgid ""
+"Execution of '%s' failed.\n"
+"\n"
+msgstr "Ошибка при исполнении \"%s\".\n"
+"\n"
+
+#: ../src/tools.c:248
+#, c-format
+msgid ""
+"Did not normalize '%s'. Set mp3gain path in the Tools section of the "
+"preferences.\n"
+msgstr "\"%s\" не был нормализован. Задайте путь к mp3gain в разделе \"Инструменты\""
+"диалога настроек.\n"
+
+#: ../src/tools.c:258
+#, c-format
+msgid ""
+"Did not normalize '%s'. Set aacgain path in the Tools section of the "
+"preferences.\n"
+msgstr "\"%s\" не был нормализован. Задайте путь к aacgain в разделе \"Инструменты\""
+"диалога настроек.\n"
+
+#: ../src/tools.c:385
+msgid "Normalizing..."
+msgstr "Нормализация..."
+
+#: ../src/tools.c:435
+#, c-format
+msgid "%s - %s"
+msgstr "%s - %s"
+
+#: ../src/tools.c:461
+msgid "Aborting..."
+msgstr "Прерывание..."
+
+#: ../src/tools.c:465
+msgid "Will abort after current mp3gain process ends."
+msgstr "Операция будет прервана, когда завершится текущий процесс mp3gain."
+
+#: ../src/tools.c:491
+#, c-format
+msgid ""
+"'%s-%s' (%s) could not be normalized.\n"
+"\n"
+msgstr ""
+"'%s-%s' (%s) не может быть нормализован.\n"
+"\n"
+
+#: ../src/tools.c:530
+#, c-format
+msgid "Normalized %d of %d tracks."
+msgstr "Нормализовано %d из %d дорожек."
+
+#: ../src/tools.c:633
+msgid ""
+"Please specify the command to be called on the 'Tools' section of the "
+"preferences dialog.\n"
+msgstr "Пожалуйста, задайте команду для вызова в разделе \"Инструменты\""
+"диалога настроек.\n"
+
+#: ../src/tools.c:645
+#, c-format
+msgid ""
+"Could not find the command '%s'.\n"
+"\n"
+"Please verify the setting in the 'Tools' section of the preferences dialog.\n"
+"\n"
+msgstr "Не удалось найти команду \"%s\".\n"
+"Пожалуйста, проверьте настройку в разделе \"Инструменты\""
+"диалога настроек.\n"
+
+#: ../src/tools.c:687
+#, c-format
+msgid ""
+"'%s' returned the following output:\n"
+"%s\n"
+msgstr "\"%s\" вернул следующий вывод:\n"
+"%s\n"
+
+#: ../src/tools.c:754
+#, c-format
+msgid "No command set for '%s'"
+msgstr "Команда для \"%s\" не задана"
+
+#: ../src/tools.c:774
+#, c-format
+msgid "Could not find command '%s' specified for '%s'"
+msgstr "Не удалось найти команду \"%s\", заданную для \"%s\""
+
+#: ../src/wavfile.c:181
+#, c-format
+msgid "%s does not appear to be a supported wav file.\n"
+msgstr "%s не похож на поддерживаемый wav-файл.\n"
+

Added: trunk/po/sv.po
===================================================================
--- trunk/po/sv.po	                        (rev 0)
+++ trunk/po/sv.po	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,5678 @@
+# Translation of gtkpod to Swedish.
+# This file is distributed under the same license as gtkpod.
+# Copyright (C) Stefan Asserhäll <stefan.asserhall at comhem.se>, 2004, 2005, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: sv\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-12-13 18:36-0500\n"
+"PO-Revision-Date: 2007-12-14 21:11+0100\n"
+"Last-Translator: Stefan Asserhäll <stefan.asserhall at comhem.se>\n"
+"Language-Team: Svenska <sv at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms:  nplurals=2; plural=(n != 1);\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: ../data/gtkpod.desktop.in.h:1
+msgid "GtkPod"
+msgstr "Gtkpod"
+
+#: ../data/gtkpod.desktop.in.h:2
+msgid "Manage music and video on an Apple iPod"
+msgstr "Hantera musik och video på en Apple iPod"
+
+#: ../data/gtkpod.desktop.in.h:3
+msgid "iPod Manager"
+msgstr "Hantering av iPod"
+
+#: ../data/gtkpod.glade.h:1
+msgid " "
+msgstr " "
+
+#: ../data/gtkpod.glade.h:2
+msgid "    "
+msgstr "    "
+
+#: ../data/gtkpod.glade.h:3
+msgid "     "
+msgstr "     "
+
+#: ../data/gtkpod.glade.h:4
+msgid "      "
+msgstr "      "
+
+#: ../data/gtkpod.glade.h:5
+msgid "   Sort by:"
+msgstr "   Sortera enligt:"
+
+#: ../data/gtkpod.glade.h:6
+msgid " <= cts <= "
+msgstr " <= antal <= "
+
+#: ../data/gtkpod.glade.h:7
+msgid " Logic: "
+msgstr " Logiskt: "
+
+#: ../data/gtkpod.glade.h:9
+#, no-c-format
+msgid "%A"
+msgstr "%A"
+
+#: ../data/gtkpod.glade.h:10
+msgid ""
+"'DD/MM/YYYY HH:MM < d < DD/MM/YYYY HH:MM' or similar. Press 'enter' when "
+"finished."
+msgstr ""
+"'ÅÅÅÅ-MM-DD TT:MM < d < ÅÅÅÅ-MM-DD TT:MM' eller liknande. Tryck på "
+"returtangenten när du är klar."
+
+#: ../data/gtkpod.glade.h:11
+msgid "'aacgain' executable:"
+msgstr "Körbart program 'aacgain':"
+
+#: ../data/gtkpod.glade.h:12
+msgid "'mp3gain' executable:"
+msgstr "Körbart program 'mp3gain':"
+
+#: ../data/gtkpod.glade.h:13
+msgid "(Checked)"
+msgstr "(Kontrollerad)"
+
+#: ../data/gtkpod.glade.h:14
+msgid "...as icons"
+msgstr "...som ikoner"
+
+#: ../data/gtkpod.glade.h:15
+msgid "...as text"
+msgstr "...som text"
+
+#: ../data/gtkpod.glade.h:16
+msgid "...both as icons and text"
+msgstr "...både som ikoner och text"
+
+#: ../data/gtkpod.glade.h:17
+msgid "...entry 'All' in sort tab..."
+msgstr "...raden 'Alla' i sorteringsflikar"
+
+#: ../data/gtkpod.glade.h:18
+msgid "...master playlist"
+msgstr "...huvudspellista"
+
+#: ../data/gtkpod.glade.h:20
+#, no-c-format
+msgid "../%A.jpg"
+msgstr "../%A.jpg"
+
+#: ../data/gtkpod.glade.h:21
+msgid "0"
+msgstr "0"
+
+#: ../data/gtkpod.glade.h:22
+msgid "1"
+msgstr "1"
+
+#: ../data/gtkpod.glade.h:23
+msgid "2"
+msgstr "2"
+
+#: ../data/gtkpod.glade.h:24
+msgid "3"
+msgstr "3"
+
+#: ../data/gtkpod.glade.h:25
+msgid "4"
+msgstr "4"
+
+#: ../data/gtkpod.glade.h:26
+msgid "5"
+msgstr "5"
+
+#: ../data/gtkpod.glade.h:27
+msgid ":"
+msgstr ":"
+
+#: ../data/gtkpod.glade.h:28
+msgid "<"
+msgstr "<"
+
+#: ../data/gtkpod.glade.h:29
+msgid "<b>Account Information</b>"
+msgstr "<b>Kontoinformation</b>"
+
+#: ../data/gtkpod.glade.h:30
+msgid "<b>Adding/Updating/Syncing</b>"
+msgstr "<b>Tillägg, uppdatering, synkronisering</b>"
+
+#: ../data/gtkpod.glade.h:31
+msgid "<b>Audioscrobbler</b>"
+msgstr "<b>Audioscrobbler</b>"
+
+#: ../data/gtkpod.glade.h:32
+msgid "<b>Auto-Generated Playlists</b>"
+msgstr "<b>Automatiskt skapade spellistor</b>"
+
+#: ../data/gtkpod.glade.h:33
+msgid "<b>Automatically select...</b>"
+msgstr "<b>Välj automatiskt...</b>"
+
+#: ../data/gtkpod.glade.h:34
+msgid "<b>Calendar/Contacts/Notes</b>"
+msgstr "<b>Kalender, kontakter och anteckningar</b>"
+
+#: ../data/gtkpod.glade.h:35
+msgid "<b>Coverart</b>"
+msgstr "<b>Omslag</b>"
+
+#: ../data/gtkpod.glade.h:36
+msgid "<b>Delete Confirmation</b>"
+msgstr "<b>Bekräfta borttagning</b>"
+
+#: ../data/gtkpod.glade.h:37
+msgid "<b>Examples</b>"
+msgstr "<b>Exempel</b>"
+
+#: ../data/gtkpod.glade.h:38
+msgid "<b>Ignore Frequent Words</b>"
+msgstr "<b>Ignorera vanliga ord</b>"
+
+#: ../data/gtkpod.glade.h:39
+msgid "<b>Misc</b>"
+msgstr "<b>Diverse</b>"
+
+#: ../data/gtkpod.glade.h:40
+msgid "<b>Mountpoint and individual repository/playlist options</b>"
+msgstr "<b>Alternativ för monteringspunkt, enskilda arkiv och spellistor</b>"
+
+#: ../data/gtkpod.glade.h:41
+msgid "<b>On-the-fly Conversion</b>"
+msgstr "<b>Konvertering i farten</b>"
+
+#: ../data/gtkpod.glade.h:42
+msgid "<b>Play</b>"
+msgstr "<b>Spela</b>"
+
+#: ../data/gtkpod.glade.h:43
+msgid "<b>Playlists</b>"
+msgstr "<b>Spellistor</b>"
+
+#: ../data/gtkpod.glade.h:44
+msgid "<b>Please select mountpoint and your iPod model</b>"
+msgstr "<b>Välj monteringsplats och iPod-modell</b>"
+
+#: ../data/gtkpod.glade.h:45
+msgid "<b>Repositories</b>"
+msgstr "<b>Arkiv</b>"
+
+#: ../data/gtkpod.glade.h:46
+msgid "<b>Sort Order</b>"
+msgstr "<b>Sorteringsordning</b>"
+
+#: ../data/gtkpod.glade.h:47
+msgid "<b>Sort Tabs</b>"
+msgstr "<b>Sorteringsflikar</b>"
+
+#: ../data/gtkpod.glade.h:48
+msgid "<b>Sync</b>"
+msgstr "<b>Synkronisera</b>"
+
+#: ../data/gtkpod.glade.h:49
+msgid "<b>Synchronization</b>"
+msgstr "<b>Synkronisering</b>"
+
+#: ../data/gtkpod.glade.h:50
+msgid "<b>Tag Reading</b>"
+msgstr "<b>Taggläsning</b>"
+
+#: ../data/gtkpod.glade.h:51
+msgid "<b>Toolbar</b>"
+msgstr "<b>Verktygsrad</b>"
+
+#: ../data/gtkpod.glade.h:52
+msgid "<b>Tooltips</b>"
+msgstr "<b>Verktygstips</b>"
+
+#: ../data/gtkpod.glade.h:53
+msgid "<b>Track Attributes</b>"
+msgstr "<b>Spåregenskaper</b>"
+
+#: ../data/gtkpod.glade.h:54
+msgid "<b>Track Editing</b>"
+msgstr "<b>Spårredigering</b>"
+
+#: ../data/gtkpod.glade.h:55
+msgid "<b>Volume Normalization</b>"
+msgstr "<b>Normalisering av volym</b>"
+
+#: ../data/gtkpod.glade.h:56
+msgid "<b>mserv</b>"
+msgstr "<b>mServ</b>"
+
+#: ../data/gtkpod.glade.h:57
+msgid ">"
+msgstr ">"
+
+#: ../data/gtkpod.glade.h:58
+msgid "About gtkpod"
+msgstr "Om gtkpod"
+
+#: ../data/gtkpod.glade.h:59
+msgid "Add Directories Recursively"
+msgstr "Lägg till kataloger rekursivt"
+
+#: ../data/gtkpod.glade.h:60
+msgid "Add Files"
+msgstr "Lägg till filer"
+
+#: ../data/gtkpod.glade.h:61
+msgid "Add Files or Directories"
+msgstr "Lägg till filer eller kataloger"
+
+#: ../data/gtkpod.glade.h:62
+msgid "Add Fol_der"
+msgstr "Lägg till _katalog"
+
+#: ../data/gtkpod.glade.h:63
+msgid "Add Folder"
+msgstr "Lägg till katalog"
+
+#: ../data/gtkpod.glade.h:64
+msgid "Add Image_s"
+msgstr "Lägg till _bilder"
+
+#: ../data/gtkpod.glade.h:65
+msgid "Add Images from a Directory"
+msgstr "Lägg till bilder från en katalog"
+
+#: ../data/gtkpod.glade.h:66
+msgid "Add Playlist"
+msgstr "Lägg till spellista"
+
+#: ../data/gtkpod.glade.h:67
+msgid "Add _Files"
+msgstr "Lägg till _filer"
+
+#: ../data/gtkpod.glade.h:68
+msgid "Add _Playlist"
+msgstr "Lägg till s_pellista"
+
+#: ../data/gtkpod.glade.h:69
+msgid "Add coverart from file using the following template"
+msgstr "Lägg till omslag från fil med följande mall"
+
+#: ../data/gtkpod.glade.h:70
+msgid "Add directories recursively"
+msgstr "Lägg till kataloger rekursivt"
+
+#: ../data/gtkpod.glade.h:71
+msgid "Add new repository/iPod"
+msgstr "Lägg till nytt arkiv eller iPod"
+
+#: ../data/gtkpod.glade.h:72
+msgid "Add playlist from file"
+msgstr "Lägg till spellista från fil"
+
+#: ../data/gtkpod.glade.h:73 ../src/display_sorttabs.c:3247
+#: ../src/display_tracks.c:2103
+msgid "Added"
+msgstr "Tillagd"
+
+#: ../data/gtkpod.glade.h:74
+msgid "Advanced Sorting Options"
+msgstr "Avancerade sorteringsalternativ"
+
+#. 0
+#: ../data/gtkpod.glade.h:75 ../src/display_sorttabs.c:2982
+#: ../src/display_spl.c:84 ../src/misc_conversion.c:60
+msgid "Album"
+msgstr "Album"
+
+#: ../data/gtkpod.glade.h:76
+msgid "Album Art"
+msgstr "Albumomslag"
+
+#: ../data/gtkpod.glade.h:77
+msgid "All (AND)"
+msgstr "Alla (och)"
+
+#: ../data/gtkpod.glade.h:78
+msgid "All Tracks Never Listened To"
+msgstr "Alla spår som aldrig lyssnats på"
+
+#: ../data/gtkpod.glade.h:79
+msgid "All Tracks Played Since Last Time"
+msgstr "Alla spår som spelats sedan sist"
+
+#: ../data/gtkpod.glade.h:80
+msgid "All Tracks not Listed in any Playlist"
+msgstr "Alla spår som inte finns i någon spellista"
+
+#: ../data/gtkpod.glade.h:81
+msgid "Also include tracks never played in \"Best Rated\" playlist"
+msgstr "Inkludera också spår som aldrig spelats i spellistan \"med bäst betyg\""
+
+#: ../data/gtkpod.glade.h:82
+msgid "Always write ID3v2.4 tags (only applies to MP3)"
+msgstr "Skriv alltid ID3v2.4-taggar (gäller bara MP3)"
+
+#: ../data/gtkpod.glade.h:83
+msgid "Any (OR)"
+msgstr "Någon (eller)"
+
+#: ../data/gtkpod.glade.h:84 ../src/display_sorttabs.c:2979
+#: ../src/display_spl.c:85 ../src/misc_conversion.c:61
+msgid "Artist"
+msgstr "Artist"
+
+#: ../data/gtkpod.glade.h:85
+msgid "Artwork Preview"
+msgstr "Förhandsgranskning av omslagsbilder"
+
+#: ../data/gtkpod.glade.h:86
+msgid ""
+"As a last resort set the following tags to the\n"
+"filename if they are (still) empty:"
+msgstr ""
+"Om följande taggar (fortfarande) är tomma,\n"
+"lagra filnamnet i dem som en sista utväg:"
+
+#: ../data/gtkpod.glade.h:88
+msgid "Ascending"
+msgstr "Stigande"
+
+#: ../data/gtkpod.glade.h:89
+msgid "Auto Store"
+msgstr "Lagra automatiskt"
+
+#: ../data/gtkpod.glade.h:90
+msgid ""
+"Automatically start displaying tracks that match the criteria entered above. "
+"If not selected, you must press 'Display' to start displaying."
+msgstr ""
+"Börja automatiskt visa spår som motsvarar villkoren som skrivs in ovan. Om "
+"inte markerad, måste du klicka på 'Visa' för att börja visningen."
+
+#: ../data/gtkpod.glade.h:91
+msgid "Available:"
+msgstr "Tillgängliga:"
+
+#: ../data/gtkpod.glade.h:92
+msgid "Before removing playlists or tracks from a playlist"
+msgstr "Innan spellistor eller spår tas bort från en spellista"
+
+#: ../data/gtkpod.glade.h:93
+msgid "Before removing tracks from the harddisk"
+msgstr "Innan spår tas bort från hårddisken"
+
+#: ../data/gtkpod.glade.h:94
+msgid "Before removing tracks from the iPod"
+msgstr "Innan spår tas bort från iPod"
+
+#: ../data/gtkpod.glade.h:95
+msgid "Before removing tracks from the local database"
+msgstr "Innan spår tas bort från den lokala databasen"
+
+#: ../data/gtkpod.glade.h:96
+msgid "Best Rated Tracks"
+msgstr "Spår med bäst betyg"
+
+#: ../data/gtkpod.glade.h:97
+msgid "Browse"
+msgstr "Bläddra"
+
+#: ../data/gtkpod.glade.h:98
+msgid "Cache directory:"
+msgstr "Cachekatalog:"
+
+#: ../data/gtkpod.glade.h:99
+msgid "Calendar"
+msgstr "Kalender"
+
+#: ../data/gtkpod.glade.h:100
+msgid "Calendar sync command:"
+msgstr "Synkroniseringskommando för kalender:"
+
+#: ../data/gtkpod.glade.h:101
+msgid "Call automatically when synchronizing iTunesDB"
+msgstr "Anropa automatiskt vid synkronisering av iTunes databas"
+
+#: ../data/gtkpod.glade.h:102
+msgid "Category: "
+msgstr "Kategori: "
+
+#: ../data/gtkpod.glade.h:103
+msgid ""
+"Change all tracks\n"
+"simultaneously"
+msgstr ""
+"Ändra alla spår\n"
+"samtidigt"
+
+#: ../data/gtkpod.glade.h:105
+msgid ""
+"Check before removing photos from a photo album whether\n"
+"they should be deleted from the Photo Database."
+msgstr ""
+"Kontrollera om foton ska tas bort från fotodatabasen\n"
+"innan de tas bort från ett fotoalbum"
+
+#: ../data/gtkpod.glade.h:107
+msgid "Check for existing files when copying from iPod."
+msgstr "Titta efter befintliga filer vid kopiering från iPod."
+
+#: ../data/gtkpod.glade.h:108
+msgid "Command for 'Enqueue':"
+msgstr "Kommando för 'Köa':"
+
+#: ../data/gtkpod.glade.h:109
+msgid "Command for 'Play now':"
+msgstr "Kommando för 'Spela nu':"
+
+#. 5
+#: ../data/gtkpod.glade.h:110 ../src/display_spl.c:97
+#: ../src/misc_conversion.c:65
+msgid "Composer"
+msgstr "Kompositör"
+
+#: ../data/gtkpod.glade.h:111
+msgid "Confirm before removing tracks from the iPod or repository"
+msgstr "Bekräfta innan spår tas bort från iPod eller arkiv"
+
+#: ../data/gtkpod.glade.h:112
+msgid ""
+"Confirm before removing tracks from the iPod or repository\n"
+"when syncing playlists"
+msgstr ""
+"Bekräfta innan spår tas bort från iPod eller arkiv\n"
+"vid synkronisering av spellistor"
+
+#: ../data/gtkpod.glade.h:114
+msgid "Confirm lists of directories"
+msgstr "Bekräfta lista med kataloger"
+
+#: ../data/gtkpod.glade.h:115
+msgid "Contacts sync command:"
+msgstr "Synkroniseringskommando för kontakter:"
+
+#: ../data/gtkpod.glade.h:116
+msgid "Containing Displayed Tracks"
+msgstr "Som innehåller visade spår"
+
+#: ../data/gtkpod.glade.h:117
+msgid "Containing Selected Tracks"
+msgstr "Som innehåller markerade spår"
+
+#: ../data/gtkpod.glade.h:118
+msgid "Conversion Progress Display"
+msgstr "Visning av konverteringsförlopp"
+
+#: ../data/gtkpod.glade.h:119
+msgid "Cover"
+msgstr "Omslag"
+
+#: ../data/gtkpod.glade.h:120
+msgid "Create New Playlist"
+msgstr "Skapa ny spellista"
+
+#: ../data/gtkpod.glade.h:121
+msgid "Create Repository"
+msgstr "Skapa arkiv"
+
+#: ../data/gtkpod.glade.h:122
+msgid "Create _Playlist File"
+msgstr "Skapa sp_ellistefil"
+
+#: ../data/gtkpod.glade.h:123
+msgid "Credits"
+msgstr "Tack till"
+
+#: ../data/gtkpod.glade.h:124
+msgid "Currently only rating is supported."
+msgstr "För närvarande stöds bara ett betyg"
+
+#: ../data/gtkpod.glade.h:125
+msgid "Delete repository"
+msgstr "Ta bort arkiv"
+
+#: ../data/gtkpod.glade.h:126
+msgid ""
+"Delete tracks that are no longer present from the\n"
+"iPod or repository"
+msgstr ""
+"Ta bort spår som inte längre finns\n"
+"från iPod eller arkiv"
+
+#: ../data/gtkpod.glade.h:128
+msgid "Deleted tracks"
+msgstr "Borttagna spår"
+
+#: ../data/gtkpod.glade.h:129
+msgid "Descending"
+msgstr "Fallande"
+
+#: ../data/gtkpod.glade.h:130
+msgid "Details"
+msgstr "Detaljinformation"
+
+#: ../data/gtkpod.glade.h:132
+#, no-c-format
+msgid ""
+"Determines how the string for the info field should be constructed, e.g '%a/%"
+"A/%T - %t.mp3' or '%o'.  You can separate several templates by semicolons -- "
+"gtkpod will determine which one to use by the filename extension given. "
+"Artist: %a, album: %A, composer: %c, title: %t, genre: %G, track nr: %T, CD "
+"nr: %C, year: %Y, original filename (requires extended information file): %"
+"o, the character '%': %%."
+msgstr ""
+"Avgör hur strängen för informationsfältet ska skapas, t.ex. '%a/%A/%T - %t."
+"mp3' eller '%o'. Du kan skilja flera mönster åt med semikolon. Vilket som "
+"används avgörs av gtkpod genom filnamnsändelsen som anges. Artist: %a, "
+"album: %A, kompositör: %c, titel: %t, genre: %G, spårnummer: %T, cd-nummer: %"
+"C, år: %Y, ursprungligt filnamn (kräver fil med utökad information): %o, "
+"tecknet '%': %%."
+
+#: ../data/gtkpod.glade.h:134
+#, no-c-format
+msgid ""
+"Determines the filename of tracks you copy from the iPod, e.g '%a/%A/%T - %t."
+"mp3' or '%o'.  You can separate several patterns by semicolons -- gtkpod "
+"will determine which one to use by the filename extension given. Artist: %a, "
+"album: %A, composer: %c, title: %t, genre: %G, track nr: %T, CD nr: %C, "
+"year: %Y, original filename (requires extended information file): %o, "
+"current playlist: %p, the character '%': %%."
+msgstr ""
+"Avgör filnamn för spåren du kopierar från iPod, t.ex. '%a/%A/%T - %t.mp3' "
+"eller '%o'. Du kan skilja flera mönster åt med semikolon. Vilket som används "
+"avgörs av gtkpod genom filnamnsändelsen som anges. Artist: %a, album: %A, "
+"kompositör: %c, titel: %t, genre: %G, spårnummer: %T, cd-nummer: %C, år: %Y, "
+"ursprungligt filnamn (kräver fil med utökad information): %o, nuvarande "
+"spellista: %p, tecknet '%': %%."
+
+#: ../data/gtkpod.glade.h:136
+#, no-c-format
+msgid ""
+"Determines the name of the file with the cover art. You can separate several "
+"patterns by semicolons which will be tried in order. Artist: %a, album: %A, "
+"composer: %c, title: %t, genre: %G, track nr: %T, CD nr: %C, year: %Y, "
+"original filename (requires extended information file): %o, original "
+"filename without file extension: %O, current playlist: %p, the character "
+"'%': %%."
+msgstr ""
+"Avgör namn på filen med omslagsbilden. Du kan skilja flera mönster åt med "
+"semikolon, som används i tur och ordning. Artist: %a, album: %A, kompositör: "
+"%c, titel: %t, genre: %G, spårnummer: %T, cd-nummer: %C, år: %Y, "
+"ursprungligt filnamn (kräver fil med utökad information): %o, ursprungligt "
+"filnamn utan filändelse: %O, nuvarande spellista: %p, tecknet '%': %%."
+
+#: ../data/gtkpod.glade.h:137
+msgid ""
+"Directories to sync with are determined from the filenames of the tracks in "
+"the playlist."
+msgstr "Kataloger att synkronisera avgörs från filnamnen hos spåren i spellistan."
+
+#: ../data/gtkpod.glade.h:138
+msgid "Display a list of tracks that could actually be updated."
+msgstr "Visa en lista med spår som skulle kunna uppdateras."
+
+#: ../data/gtkpod.glade.h:139
+msgid "Display a list of tracks that could not be updated."
+msgstr "Visa en lista med spår som inte kunde uppdateras."
+
+#: ../data/gtkpod.glade.h:140
+msgid "Display conversion log"
+msgstr "Visa konverteringslogg"
+
+#: ../data/gtkpod.glade.h:141
+msgid "Display info about detected duplicates"
+msgstr "Visa information om detekterade duplikat"
+
+#: ../data/gtkpod.glade.h:142
+msgid "Display info about non-updated tracks"
+msgstr "Visa information om spår som inte uppdaterats"
+
+#: ../data/gtkpod.glade.h:143
+msgid "Display info about updated tracks"
+msgstr "Visa information om uppdaterade spår"
+
+#: ../data/gtkpod.glade.h:144
+msgid "Display messages and warnings at startup"
+msgstr "Visa meddelanden och varningar vid start"
+
+#: ../data/gtkpod.glade.h:145
+msgid "Display the list of duplicates that have been detected after adding files."
+msgstr "Visa listan med upptäckta duplikat efter filer har lagts till."
+
+#: ../data/gtkpod.glade.h:146
+msgid "Display toolbar..."
+msgstr "Visa verktygsrad..."
+
+#: ../data/gtkpod.glade.h:147
+msgid "Display tooltips in main window"
+msgstr "Visa verktygstips i huvudfönstret"
+
+#: ../data/gtkpod.glade.h:148
+msgid "Display tooltips in prefs window"
+msgstr "Visa verktygstips i inställningsfönstret"
+
+#: ../data/gtkpod.glade.h:149
+msgid "Display tracks that match the criteria entered above."
+msgstr "Visa spår som uppfyller ovan inskrivna villkor."
+
+#: ../data/gtkpod.glade.h:150
+msgid ""
+"Displayed\n"
+"Tracks"
+msgstr ""
+"Visade\n"
+"spår"
+
+#: ../data/gtkpod.glade.h:152
+msgid "Displayed:"
+msgstr "Visade:"
+
+#: ../data/gtkpod.glade.h:153
+msgid "Don't allow file duplication"
+msgstr "Tillåt inte duplicerade filer"
+
+#: ../data/gtkpod.glade.h:154
+msgid "Don't automatically sync on startup"
+msgstr "Synkronisera inte automatiskt vid start"
+
+#: ../data/gtkpod.glade.h:155
+msgid "Duplicate Recognition is based on a (modified) sha1 hash over the file."
+msgstr "Igenkänning av duplikat är baserat på filens (modifierade) SHA1-checksumma."
+
+#: ../data/gtkpod.glade.h:156
+msgid "Edit Repository/iPod Options"
+msgstr "Redigera arkiv- och iPodalternativ"
+
+#: ../data/gtkpod.glade.h:157 ../src/context_menus.c:662
+msgid "Edit Smart Playlist"
+msgstr "Redigera smart spellista"
+
+#: ../data/gtkpod.glade.h:158 ../src/context_menus.c:749
+msgid "Edit Track Details"
+msgstr "Redigera detaljinformation om spår"
+
+#: ../data/gtkpod.glade.h:159
+msgid "Edit _Preferences"
+msgstr "Redigera in_ställningar"
+
+#: ../data/gtkpod.glade.h:160
+msgid "Effective free space"
+msgstr "Verkligt ledigt utrymme"
+
+#: ../data/gtkpod.glade.h:161
+msgid "Empty Playlist"
+msgstr "Tom spellista"
+
+#: ../data/gtkpod.glade.h:162
+msgid "Exclude file mask(s)"
+msgstr "Filmask(er) att utesluta"
+
+#: ../data/gtkpod.glade.h:163
+msgid "Export can be continued at a later time if canceled."
+msgstr "Exporten kan fortsättas vid ett senare tillfälle om den avbryts."
+
+#: ../data/gtkpod.glade.h:164
+msgid "File size"
+msgstr "Filstorlek"
+
+#: ../data/gtkpod.glade.h:165
+msgid "File size (deleted)"
+msgstr "Filstorlek (borttagna)"
+
+#: ../data/gtkpod.glade.h:166
+msgid "File size (non-transferred)"
+msgstr "Filstorlek (inte överförda)"
+
+#: ../data/gtkpod.glade.h:167
+msgid "Filename Format: "
+msgstr "Filnamnsformat: "
+
+#: ../data/gtkpod.glade.h:168
+msgid ""
+"Find orphan files (files with no track info in DB) and dangling tracks "
+"(tracks with no corresponding files on iPod)"
+msgstr ""
+"Hitta övergivna filer (filer utan någon spårinformation i databasen) och "
+"saknade spår (spår utan motsvarande filer på iPod)"
+
+#: ../data/gtkpod.glade.h:169
+msgid "First try <i>folder.jpg</i>, then <i>&lt;artist&gt;.jpg</i>"
+msgstr "Försök först med <i>katalog.jpg</i>, därefter med <i>&lt;artist&gt;.jpg</i>"
+
+#: ../data/gtkpod.glade.h:170
+msgid "Flac with :"
+msgstr "FLAC med: "
+
+#: ../data/gtkpod.glade.h:172
+#, no-c-format
+msgid ""
+"For example, 'xmms %s' will clear xmms' current playlist, add the selected "
+"tracks and start playing."
+msgstr ""
+"Till exempel rensas XMM:s nuvarande spellista, de markerade spåren läggs "
+"till och uppspelning startar med 'xmms %s'."
+
+#: ../data/gtkpod.glade.h:174
+#, no-c-format
+msgid ""
+"For example, 'xmms -e %s' will append (enqueue) the selected tracks to xmms' "
+"current playlist."
+msgstr ""
+"Till exempel läggs de markerade spåren till sist i XMM:s nuvarande spellista "
+"(köas) med 'xmms -e %s'."
+
+#: ../data/gtkpod.glade.h:175 ../src/display_sorttabs.c:2985
+#: ../src/display_spl.c:89 ../src/misc_conversion.c:63
+msgid "Genre"
+msgstr "Genre"
+
+#: ../data/gtkpod.glade.h:176
+msgid "Group artists on compilation CDs"
+msgstr "Gruppera artister på samlingsskivor"
+
+#: ../data/gtkpod.glade.h:177
+msgid ""
+"Highly recommended for faster import when taking advantage of the "
+"duplication recognition. Also, having the PC filenames allows writing "
+"changed ID3 tags to disk, and even to reconstruct your iPod's contents in "
+"case of file system corruption (change the \"transferred=\" entries in your "
+"backuped database)."
+msgstr ""
+"Rekommenderas starkt för snabbare import när funktionen för att känna igen "
+"duplikat utnyttjas. Dessutom blir det möjligt att skriva ändrade ID3-taggar "
+"till disk när PC-filnamnen behålls, eller till och med att återskapa "
+"innehållet i iPod om filsystemet blir skadat (ändra raderna \"transferred=\" "
+"i den säkerhetskopierade databasen)."
+
+#: ../data/gtkpod.glade.h:178 ../src/context_menus.c:685
+#: ../src/context_menus.c:703 ../src/context_menus.c:820
+msgid "I'm sure"
+msgstr "Jag är säker"
+
+#: ../data/gtkpod.glade.h:179
+msgid ""
+"If available, the local copy of the track is referenced in the playlist. "
+"Otherwise the file on the iPod is used."
+msgstr ""
+"Om tillgänglig, hänvisar spellistan till den lokala kopian av spåret. Annars "
+"används filen på iPod."
+
+#: ../data/gtkpod.glade.h:180
+msgid "If both options are selected, embedded APIC data takes precedence."
+msgstr "Om båda alternativ är markerade, ges förtur åt inbäddad APIC-data."
+
+#: ../data/gtkpod.glade.h:181
+msgid ""
+"If checked, sorting will be case sensitive. Please note that case sensitive "
+"sorting will not work well with most charsets."
+msgstr ""
+"Om markerat är sorteringen skiftlägeskänslig. Observera att "
+"skiftlägeskänslig sortering inte fungerar bra med de flesta teckenkodningar."
+
+#: ../data/gtkpod.glade.h:182
+msgid ""
+"If the filename (full path) of an existing track matches that of a track to "
+"be added, this option allows you to update the information about the "
+"existing track rather than just skipping the track altogether. No update "
+"will take place if the file hasn't changed and you have selected the 'Don't "
+"allow file duplication' option above."
+msgstr ""
+"Om filnamnet (fullständiga sökvägen) för ett befintligt spår motsvarar ett "
+"spår som ska läggas till, låter det här alternativet dig uppdatera "
+"informationen om det befintliga spåret istället för att bara hoppa över "
+"spåret helt. Ingen uppdatering sker om filen inte har ändrats och du har "
+"valt alternativet 'Tillåt inte duplicerade filer' ovan."
+
+#: ../data/gtkpod.glade.h:183
+msgid "If you check this, gtkpod will descend into subdirectories recursively."
+msgstr "Om du markerar det här, går gtkpod ner i underkataloger rekursivt."
+
+#: ../data/gtkpod.glade.h:184
+msgid ""
+"If you check this, information (cover art and meta information) changed for "
+"this track will be copied to all other selected tracks as well. Use with "
+"care."
+msgstr ""
+"Om du markerar detta, kopieras information (omslagsbild och metainformation) "
+"som ändrats för spåret också till alla andra markerade spår. Använd med "
+"försiktighet."
+
+#: ../data/gtkpod.glade.h:185
+msgid ""
+"If you don't select the master playlist automatically, the initial database "
+"import is much faster because the display dosn't have to be updated."
+msgstr ""
+"Om du inte väljer huvudspellistan automatiskt, går den ursprungliga importen "
+"av databasen mycket snabbare eftersom skärmen inte behöver uppdateras."
+
+#: ../data/gtkpod.glade.h:186
+msgid ""
+"If you select several tracks in the track list and edit a tag of the first "
+"track, the tags in the other tracks are updated as well."
+msgstr ""
+"Om du markerar flera spår i spårlistan och redigerar taggen för det första "
+"spåret, uppdateras också taggarna för övriga spår."
+
+#: ../data/gtkpod.glade.h:187
+msgid "Ignore these words when at the beginning of the following fields:"
+msgstr "Ignorera dessa ord i början av följande fält:"
+
+#: ../data/gtkpod.glade.h:188
+msgid ""
+"In order to save the displayed track order to the iPod choose 'Save "
+"Displayed Track Order' from the 'Edit' menu or select 'Auto Store' below."
+msgstr ""
+"För att lagra visad spårordning i iPod måste du välja 'Spara visad "
+"spårordning' i menyn 'Redigera' eller välja 'Lagra automatiskt' nedan."
+
+#: ../data/gtkpod.glade.h:189
+msgid "Initialize iPod"
+msgstr "Initiera iPod"
+
+#: ../data/gtkpod.glade.h:190
+msgid ""
+"Insert before\n"
+"Insert after"
+msgstr ""
+"Infoga innan\n"
+"Infoga efter"
+
+#: ../data/gtkpod.glade.h:192
+msgid "Keeps all compilation CDs grouped together in the artists sort tab."
+msgstr ""
+"Behåller alla samlingsskivor grupperade tillsammans i sorteringsfliken för "
+"artister"
+
+#: ../data/gtkpod.glade.h:193
+msgid "Live _updating"
+msgstr "_Uppdatering under tiden"
+
+#: ../data/gtkpod.glade.h:194
+msgid "Load iPod(s)"
+msgstr "Ladda iPod"
+
+#: ../data/gtkpod.glade.h:195
+msgid "Lower Margin"
+msgstr "Under gräns"
+
+#: ../data/gtkpod.glade.h:196
+msgid "M4A with :"
+msgstr "M4A med: "
+
+#: ../data/gtkpod.glade.h:197
+msgid "MP3 with :"
+msgstr "MP3 med: "
+
+#: ../data/gtkpod.glade.h:198
+msgid "Match al_l of the following"
+msgstr "Matcha a_lla följande"
+
+#: ../data/gtkpod.glade.h:199
+msgid "Match an_y of the following"
+msgstr "Matcha _någon av följande"
+
+#: ../data/gtkpod.glade.h:200
+msgid "Match only _checked tracks"
+msgstr "Matcha bara _kryssmarkerade spår"
+
+#: ../data/gtkpod.glade.h:201
+msgid "Maximum number of background threads:"
+msgstr "Maximalt antal bakgrundstrådar:"
+
+#: ../data/gtkpod.glade.h:202
+msgid "Maximum size of cache directory (in GB):"
+msgstr "Maximal storlek för cachekatalogen (i Gibyte):"
+
+#: ../data/gtkpod.glade.h:203
+msgid "Model:"
+msgstr "Modell:"
+
+#: ../data/gtkpod.glade.h:204 ../src/display_tracks.c:2100
+msgid "Modified"
+msgstr "Ändrad"
+
+#: ../data/gtkpod.glade.h:205
+msgid "Most Recently Played Tracks"
+msgstr "Spår som nyligen spelats"
+
+#: ../data/gtkpod.glade.h:206
+msgid "Move selected attributes to the displayed list"
+msgstr "Flytta markerade egenskaper till den visade listan"
+
+#: ../data/gtkpod.glade.h:207
+msgid "Music Root:"
+msgstr "Musikrot:"
+
+#: ../data/gtkpod.glade.h:208
+msgid ""
+"Music files can have images embedded in the APIC tag. Currently this is only "
+"supported for MP3 files."
+msgstr ""
+"Musikfiler kan ha inbäddade bilder i APIC-taggen. För närvarande stöds det "
+"bara för MP3-filer."
+
+#: ../data/gtkpod.glade.h:209
+msgid "Never show this dialogue again"
+msgstr "Visa aldrig den här dialogrutan igen"
+
+#: ../data/gtkpod.glade.h:210 ../src/display_spl.c:1719
+#: ../src/misc_playlist.c:66 ../src/misc_playlist.c:68
+#: ../src/misc_playlist.c:93 ../src/misc_playlist.c:95
+#: ../src/misc_playlist.c:428 ../src/misc_playlist.c:430
+msgid "New Playlist"
+msgstr "Ny spellista"
+
+#: ../data/gtkpod.glade.h:211
+msgid "No lower margin"
+msgstr "Ingen undre gräns"
+
+#: ../data/gtkpod.glade.h:212
+msgid "No upper margin"
+msgstr "Ingen övre gräns"
+
+#: ../data/gtkpod.glade.h:213
+msgid "Non-transferred tracks"
+msgstr "Spår som inte överförts"
+
+#: ../data/gtkpod.glade.h:214
+msgid "None"
+msgstr "Ingen"
+
+#: ../data/gtkpod.glade.h:215
+msgid ""
+"Normally the charset specified when first importing the track will be used "
+"for the filename. If you set this option you can set a different charset "
+"with the charset selector (Preferences/'Adding/Updating/Syncing'). Note: the "
+"charset info is stored in the extended information file (see "
+"Preferences/'Writing of the iTunesDB'). Tracks imported before V0.51 will "
+"have no charset stored. Instead the charset specified will be used."
+msgstr ""
+"Normalt används teckenkodningen som anges när spåret först importeras för "
+"filnamnet. Om du markerar det här alternativet kan du ange en annan "
+"teckenkodning i teckensnittsväljaren (Inställningar/'Tillägg, uppdatering, "
+"synkronisering'). Observera: kodningsinformationen lagras i filen med utökad "
+"information (se Inställningar/'Skrivning av iTunes databas'). Spår som "
+"importerats innan version 0.51 har ingen teckenkodning lagrad. Istället "
+"används då teckensnittet som anges."
+
+#: ../data/gtkpod.glade.h:216
+msgid ""
+"Normally the charset specified when first importing the track will be used "
+"to update the track information. If you have chosen a wrong charset when "
+"first importing a track and want to correct it using the 'Update Track' "
+"function, you must check this option. Note: the charset info is stored in "
+"the extended information file (see 'Writing of iTunesDB' below) and tracks "
+"imported before V0.51 will have no charset stored. Instead the charset "
+"specified above will be used then."
+msgstr ""
+"Normalt används teckenkodning som först anges när spåret importeras för att "
+"uppdatera spårinformation. Om du valde fel teckenkodning när spåret först "
+"importerades, och vill rätta det med funktionen 'Uppdatera spår', måste du "
+"markera alternativet. Observera: kodningsinformationen lagras i filen med "
+"utökad information (se 'Skrivning av iTunes databas' nedan) och spår som "
+"importerats innan version 0.51 har ingen teckenkodning lagrad. Istället "
+"används då teckensnittet som anges ovan."
+
+#: ../data/gtkpod.glade.h:217
+msgid ""
+"Normally the charset specified when first importing the track will be used "
+"to write the tags. If you have chosen a wrong charset when first importing a "
+"track, you should select this option along with the correct charset.  Note: "
+"uses the extended information file to store the charset information (see "
+"'Writing of the iTunesDB' on the 'Input/Output' page) and tracks imported "
+"before V0.51 will have no charset stored -- the charset specified on the "
+"'Input/Output' page will be used."
+msgstr ""
+"Normalt används teckenkodning som först anges när spåret importeras för att "
+"skriva taggarna. Om du valde fel teckenkodning när spåret först "
+"importerades, ska du markera det här alternativet tillsammans med den "
+"riktiga teckenkodningen. Observera: använder filen med utökad information "
+"för att lagra kodningsinformation (se 'Skrivning av iTunes databas' på sidan "
+"'In- och utmatning') och spår som importerats innan version 0.51 har ingen "
+"teckenkodning lagrad. Istället används då teckensnittet som anges på sidan "
+"'In- och utmatning'."
+
+#: ../data/gtkpod.glade.h:218
+msgid ""
+"Normally, if a track is no longer present in the sync directory, it will be "
+"removed from the playlist, but not from the iPod or local repository.\n"
+"If this option is checked, tracks will be completely removed from the iPod "
+"or local repository, unless the track is a member of other playlists as "
+"well.\n"
+"NOTE: if you sync with the master playlist, you must check this option if "
+"you want tracks to be removed, because removing from the master playlist "
+"means removing from the iPod."
+msgstr ""
+"Om ett spår inte längre finns i synkroniseringskatalogen, tas det normalt "
+"bort från spellistan, men inte från iPod eller det lokala arkivet.\n"
+"Om alternativet markeras, tas spår fullständigt bort från iPod eller det "
+"lokala arkivet, om inte spåret också ingår i andra spellistor.\n"
+"Observera: Om du synkroniserar med huvudspellistan måste du markera "
+"alternativet om du vill att spår ska tas bort, eftersom att ta bort från "
+"huvudspellistan innebär att ta bort från iPod."
+
+#: ../data/gtkpod.glade.h:221
+msgid "Notes sync command:"
+msgstr "Synkroniseringskommando för anteckningar:"
+
+#: ../data/gtkpod.glade.h:222
+msgid "Number of playlists"
+msgstr "Antal spellistor"
+
+#: ../data/gtkpod.glade.h:223
+msgid "Number of tracks"
+msgstr "Antal spår"
+
+#: ../data/gtkpod.glade.h:224
+msgid "Number of tracks in generated playlists:"
+msgstr "Antal spår i skapade spellistor:"
+
+#: ../data/gtkpod.glade.h:225
+msgid ""
+"Number of tracks in the generated playlists 'Most Often Listened', 'Best "
+"Rated' and 'Most Recently Played'. Choose '0' for 'no limit'."
+msgstr ""
+"Antal spår i de skapade spellistorna 'oftast lyssnats på', 'med bäst betyg' "
+"och 'nyligen spelats'. Ange '0' för 'ingen begränsning'."
+
+#: ../data/gtkpod.glade.h:226
+msgid "Ogg with :"
+msgstr "Ogg med: "
+
+#: ../data/gtkpod.glade.h:227
+msgid "On startup automatically sync with playlist directories"
+msgstr "Synkronisera automatiskt med spellistekataloger vid start"
+
+#: ../data/gtkpod.glade.h:228
+msgid "On startup automatically sync with the following directory"
+msgstr "Synkronisera automatiskt med följande katalog vid start"
+
+#: ../data/gtkpod.glade.h:229
+msgid "On startup automatically update (Live Playlist)"
+msgstr "Uppdatera automatiskt vid start (levande spellista)"
+
+#: ../data/gtkpod.glade.h:230
+msgid "One for each Album"
+msgstr "En för varje album"
+
+#: ../data/gtkpod.glade.h:231
+msgid "One for each Artist"
+msgstr "En för varje artist"
+
+#: ../data/gtkpod.glade.h:232
+msgid "One for each Composer"
+msgstr "En för varje kompositör"
+
+#: ../data/gtkpod.glade.h:233
+msgid "One for each Genre"
+msgstr "En för varje genre"
+
+#: ../data/gtkpod.glade.h:234
+msgid "One for each Rating"
+msgstr "En för varje betyg"
+
+#: ../data/gtkpod.glade.h:235
+msgid "One for each Year"
+msgstr "En för varje år"
+
+#: ../data/gtkpod.glade.h:236
+msgid "Overwrite tags that are already set"
+msgstr "Skriv över taggar som redan är angivna"
+
+#: ../data/gtkpod.glade.h:237
+msgid "Password:"
+msgstr "Lösenord:"
+
+#: ../data/gtkpod.glade.h:238
+msgid "Path:"
+msgstr "Sökväg:"
+
+#: ../data/gtkpod.glade.h:239
+msgid "Photo Window"
+msgstr "Fotofönster"
+
+#: ../data/gtkpod.glade.h:240 ../src/display_spl.c:94
+msgid "Play time"
+msgstr "Speltid"
+
+#: ../data/gtkpod.glade.h:241 ../src/display_spl.c:98
+#: ../src/misc_conversion.c:77
+msgid "Playcount"
+msgstr "Spelningsantal"
+
+#: ../data/gtkpod.glade.h:242 ../src/display_tracks.c:2097
+msgid "Played"
+msgstr "Spelad"
+
+#: ../data/gtkpod.glade.h:243
+msgid "Playlist name:"
+msgstr "Spellistans namn:"
+
+#: ../data/gtkpod.glade.h:244
+msgid "Playlist type:"
+msgstr "Typ av spellista:"
+
+#: ../data/gtkpod.glade.h:245 ../src/display_playlists.c:2258
+msgid "Playlists"
+msgstr "Spellistor"
+
+#: ../data/gtkpod.glade.h:246
+msgid "Please refer to the notice below."
+msgstr "Se anmärkningen nedan."
+
+#: ../data/gtkpod.glade.h:247
+msgid "Please specify a time interval"
+msgstr "Ange ett tidsintervall"
+
+#: ../data/gtkpod.glade.h:248
+msgid "Preferences"
+msgstr "Inställningar"
+
+#: ../data/gtkpod.glade.h:249
+msgid "Progress Information"
+msgstr "Förloppsinformation"
+
+#: ../data/gtkpod.glade.h:250
+msgid "R_ename Album"
+msgstr "B_yt namn på album"
+
+#: ../data/gtkpod.glade.h:251
+msgid "Random Playlist from Displayed Tracks"
+msgstr "Slumpmässig spellista från visade spår"
+
+#: ../data/gtkpod.glade.h:252
+msgid "Randomize Current Playlist"
+msgstr "Gör nuvarande spellista slumpmässig"
+
+#: ../data/gtkpod.glade.h:253 ../src/display_spl.c:101
+#: ../src/misc_conversion.c:78
+msgid "Rating"
+msgstr "Betyg"
+
+#: ../data/gtkpod.glade.h:254
+msgid "Read coverart from embedded APIC data"
+msgstr "Läs omslagsbild från inbäddad APIC-data"
+
+#: ../data/gtkpod.glade.h:255
+msgid "Read tags from file contents (e.g. ID3 tags in MP3 files)"
+msgstr "Läs spår från filinnehåll (t.ex. ID3-taggar i MP3-filer)"
+
+#: ../data/gtkpod.glade.h:256
+msgid "Remove selected attributes from the displayed list"
+msgstr "Ta bort markerade egenskaper från den visade listan"
+
+#: ../data/gtkpod.glade.h:257
+msgid "Repository Options"
+msgstr "Arkivalternativ"
+
+#: ../data/gtkpod.glade.h:258
+msgid "Repository name:"
+msgstr "Arkivnamn:"
+
+#: ../data/gtkpod.glade.h:259
+msgid "Repository type:"
+msgstr "Arkivtyp:"
+
+#: ../data/gtkpod.glade.h:260
+msgid "Root directory of mserv database (trackinfo root)."
+msgstr "Rotkatalog för mserv databasen (rot för spårinformation)."
+
+#: ../data/gtkpod.glade.h:261
+msgid "Rules"
+msgstr "Regler"
+
+#: ../data/gtkpod.glade.h:262 ../src/context_menus.c:804
+msgid "Save Changes"
+msgstr "Spara ändringar"
+
+#: ../data/gtkpod.glade.h:263
+msgid "Scrobble Tracks?"
+msgstr "Skicka spår till Audioscrobble?"
+
+#: ../data/gtkpod.glade.h:264
+msgid "Select '-1' for no upper limit."
+msgstr "Välj '-1' för ingen övre gräns."
+
+#: ../data/gtkpod.glade.h:265
+msgid "Select '0' for no lower limit."
+msgstr "Välj '0' för ingen undre gräns."
+
+#: ../data/gtkpod.glade.h:266
+msgid ""
+"Selected\n"
+"Playlist"
+msgstr ""
+"Markerad\n"
+"spellista"
+
+#: ../data/gtkpod.glade.h:268
+msgid ""
+"Selected\n"
+"Tracks"
+msgstr ""
+"Markerade\n"
+"spår"
+
+#: ../data/gtkpod.glade.h:270
+msgid "Selected Filter Tab Entry from Database"
+msgstr "Markerade filterflikar från databas"
+
+#: ../data/gtkpod.glade.h:271
+msgid "Selected Filter Tab Entry from Hard Disk"
+msgstr "Markerade filterflikar från hårddisk"
+
+#: ../data/gtkpod.glade.h:272
+msgid "Selected Filter Tab Entry from Playlist"
+msgstr "Markerade filterflikar från spellista"
+
+#: ../data/gtkpod.glade.h:273
+msgid "Selected Filter Tab Entry from iPod"
+msgstr "Markerade filterflikar från iPod"
+
+#: ../data/gtkpod.glade.h:274
+msgid "Selected Playlist Including Tracks from Database"
+msgstr "Markerade spellista inklusive spår från databas"
+
+#: ../data/gtkpod.glade.h:275
+msgid "Selected Playlist Including Tracks from Hard Disk"
+msgstr "Markerade spellista inklusive spår från hårddisk"
+
+#: ../data/gtkpod.glade.h:276
+msgid "Selected Playlist Including Tracks from iPod"
+msgstr "Markerade spellista inklusive spår från iPod"
+
+#: ../data/gtkpod.glade.h:277
+msgid "Selected Tab _Entry"
+msgstr "Markerad _flikrad"
+
+#: ../data/gtkpod.glade.h:278
+msgid "Selected Tracks from Database"
+msgstr "Markerade spår från databas"
+
+#: ../data/gtkpod.glade.h:279
+msgid "Selected Tracks from Hard Disk"
+msgstr "Markerade spår från hårddisk"
+
+#: ../data/gtkpod.glade.h:280
+msgid "Selected Tracks from Playlist"
+msgstr "Markerade spår från spellista"
+
+#: ../data/gtkpod.glade.h:281
+msgid "Selected Tracks from iPod"
+msgstr "Markerade spår från iPod"
+
+#: ../data/gtkpod.glade.h:282
+msgid "Selected _Playlist"
+msgstr "Markerad _spellista"
+
+#: ../data/gtkpod.glade.h:283
+msgid "Selected _Tracks"
+msgstr "Markerade s_pår"
+
+#: ../data/gtkpod.glade.h:284
+msgid "Selected playlist"
+msgstr "Markerade spellista"
+
+#: ../data/gtkpod.glade.h:285
+msgid "Semicolon separated list of file exclusion masks, e.g. '*.mp3'"
+msgstr "Lista med filmasker att utesluta åtskilda med semikolon, t.ex. '*.mp3'"
+
+#: ../data/gtkpod.glade.h:286
+msgid "Set Cover Art from _File"
+msgstr "Ange omslagsbild från _fil"
+
+#: ../data/gtkpod.glade.h:287
+msgid "Set mountpoint or edit repository options"
+msgstr "Ange monteringspunkt eller redigera arkivalternativ"
+
+#: ../data/gtkpod.glade.h:288
+msgid "Set options for Calendar/Contacts/Notes"
+msgstr "Ange alternativ för kalender, kontakter och anteckningar"
+
+#: ../data/gtkpod.glade.h:289
+msgid ""
+"Set this to 'aacgain -q -k' to use the 'Normalize volume' functionality in "
+"the Tools Menu. If this is set, missing normalization data for .m4a and .m4b "
+"files will be calculated and written to your music file using this command."
+msgstr ""
+"Ställ in det här till 'aacgain -q -k' för att använda funktionen "
+"'Normalisera volym' i menyn Verktyg. Om det är inställt, beräknas saknad "
+"normaliseringsdata för .m4a- och .m4b-filer och skrivs i musikfilerna med "
+"detta kommando."
+
+#: ../data/gtkpod.glade.h:290
+msgid ""
+"Set this to 'mp3gain -q -k' to use the 'Normalize volume' functionality in "
+"the Tools Menu. If this is set, missing normalization data for mp3 files "
+"will be calculated and written to your mp3 file using this command."
+msgstr ""
+"Ställ in det här till 'mp3gain -q -k' för att använda funktionen "
+"'Normalisera volym' i menyn Verktyg. Om det är inställt, beräknas saknad "
+"normaliseringsdata för mp3-filer och skrivs i musikfilerna med detta "
+"kommando."
+
+#: ../data/gtkpod.glade.h:291
+msgid "Set this to your last.fm password"
+msgstr "Ställ in detta till ditt lösenord på last.fm"
+
+#: ../data/gtkpod.glade.h:292
+msgid "Set this to your last.fm username"
+msgstr "Ställ in detta till ditt användarnamn på last.fm"
+
+#: ../data/gtkpod.glade.h:293
+msgid ""
+"Set to 0 to effectively disable caching (a maximum of one track will be "
+"cached at a time)."
+msgstr ""
+"Ställ in till 0 för att inaktivera lagring i cache helt och hållet (maximalt "
+"ett spår lagras i cachen åt gången)."
+
+#: ../data/gtkpod.glade.h:294
+msgid ""
+"Set to 0 to use as many background threads as CPUs are available on your "
+"system."
+msgstr ""
+"Ställ in till 0 för att använda lika många bakgrundstrådar som det finns "
+"tillgängiga processorer på systemet."
+
+#: ../data/gtkpod.glade.h:295
+msgid "Show information about problems when accessing mserv"
+msgstr "Visa information om problem vid användning av mserv"
+
+#: ../data/gtkpod.glade.h:296
+msgid "Show summary of sync result"
+msgstr "Visa sammanfattning av synkroniseringsresultat"
+
+#: ../data/gtkpod.glade.h:297 ../src/misc_playlist.c:96
+#: ../src/repository.c:1356
+msgid "Smart Playlist"
+msgstr "Smart spellista"
+
+#: ../data/gtkpod.glade.h:298
+msgid "Sort tracks according to: "
+msgstr "Sortera spår enligt: "
+
+#: ../data/gtkpod.glade.h:299
+msgid "Sorting Options"
+msgstr "Sorteringsalternativ"
+
+#: ../data/gtkpod.glade.h:300
+msgid "Sorting case sensitive"
+msgstr "Skiftlägeskänslig sortering"
+
+#: ../data/gtkpod.glade.h:301
+msgid "Sorttab: "
+msgstr "Sorteringsflik: "
+
+#: ../data/gtkpod.glade.h:302
+msgid "Sorttabs"
+msgstr "Sorteringsflikar"
+
+#: ../data/gtkpod.glade.h:303
+msgid "Source:"
+msgstr "Källa:"
+
+#: ../data/gtkpod.glade.h:305
+#, no-c-format
+msgid ""
+"Specify exact path including command line options. '%i' will be replaced "
+"with the mount point of the iPod."
+msgstr ""
+"Ange fullständig sökväg inklusive kommandoradsväljare. '%i' ersätts med "
+"monteringspunkten för iPod."
+
+#: ../data/gtkpod.glade.h:306
+msgid "Specify interval"
+msgstr "Ange intervall"
+
+#: ../data/gtkpod.glade.h:307
+msgid "Start display automatically"
+msgstr "Börja visa automatiskt"
+
+#: ../data/gtkpod.glade.h:308
+msgid "Synchronise Contacts, Calendar and Notes"
+msgstr "Synkronisera kontakter, kalender och anteckningar"
+
+#: ../data/gtkpod.glade.h:309
+msgid "Synchronize All"
+msgstr "Synkronisera allt"
+
+#: ../data/gtkpod.glade.h:310
+msgid "Synchronize Calendar"
+msgstr "Synkronisera kalender"
+
+#: ../data/gtkpod.glade.h:311
+msgid "Synchronize Contacts"
+msgstr "Synkronisera kontakter"
+
+#: ../data/gtkpod.glade.h:312
+msgid "Synchronize Notes"
+msgstr "Synkronisera anteckningar"
+
+#: ../data/gtkpod.glade.h:313
+msgid "Template for info field: "
+msgstr "Mall för informationsfält:"
+
+#: ../data/gtkpod.glade.h:314
+msgid ""
+"The local copy of the track is referenced in the playlist. If the track is "
+"not available locally, an error message is displayed."
+msgstr ""
+"Spellistan hänvisar till den lokala kopian av spåret. Om spåret inte är "
+"tillgängligt lokalt, visas ett felmeddelande."
+
+#: ../data/gtkpod.glade.h:315
+msgid ""
+"The output of the background conversion scripts is copied below. Each page "
+"of the notebook corresponds to one background thread."
+msgstr ""
+"Utmatningen från konverteringsskripten som kört i bakgrunden har kopierats "
+"nedan. Varje sida i anteckningsboken motsvarar en bakgrundstråd."
+
+#: ../data/gtkpod.glade.h:316
+msgid ""
+"The tags are written to the files on your harddrive and on the iPod (if "
+"available)."
+msgstr "Taggarna skrivs till filer på din hårddisk och på iPod (om tillgänglig)."
+
+#: ../data/gtkpod.glade.h:317
+msgid "The track on the iPod is referenced in the playlist file."
+msgstr "Spellistan hänvisar till spåret på iPod."
+
+#: ../data/gtkpod.glade.h:318
+msgid "This is the same option as in 'Edit/Delete Confirmation'"
+msgstr "Det här är samma alternativ som i 'Redigera/Bekräfta "
+
+#: ../data/gtkpod.glade.h:319
+msgid ""
+"This is the way to go, but maybe not all programs support it yet. ID3v2.4 "
+"uses unicode to store the tags, so you won't have to worry about charsets "
+"any more. gtkpod will use UTF8 encoding as this will not increase the size "
+"of pure ASCII tags. ID3v2.2/4 tags will also be written if they are already "
+"present in the file to write to."
+msgstr ""
+"Det här är rätt metod, men kanske stöder inte alla program det ännu. ID3v2.4 "
+"använder Unicode för att lagra taggar, så du behöver inte längre bekymra dig "
+"om teckenkodning. Kodningen UTF8 används av gtkpod, om den inte ökar "
+"storleken av rena ASCII-taggar. ID3v2.2/4-taggar skrivs också om de redan "
+"finns i filen som skrivs."
+
+#: ../data/gtkpod.glade.h:320
+msgid "This option will be re-activated when you upgrade gtkpod."
+msgstr "Det här alternativet aktiveras igen när du uppdaterar gtkpod."
+
+#: ../data/gtkpod.glade.h:321
+msgid "Time:"
+msgstr "Tid:"
+
+#: ../data/gtkpod.glade.h:322 ../src/display_sorttabs.c:2991
+#: ../src/display_spl.c:83 ../src/misc_conversion.c:62
+msgid "Title"
+msgstr "Titel"
+
+#: ../data/gtkpod.glade.h:323
+msgid ""
+"Total\n"
+"(iPod)"
+msgstr ""
+"Totalt\n"
+"(iPod)"
+
+#: ../data/gtkpod.glade.h:325
+msgid ""
+"Total\n"
+"(local)"
+msgstr ""
+"Totalt\n"
+"(lokalt)"
+
+#: ../data/gtkpod.glade.h:327
+msgid "Tracks"
+msgstr "Spår"
+
+#: ../data/gtkpod.glade.h:328
+msgid "Tracks Most Often Listened To"
+msgstr "Spår som oftast lyssnats på"
+
+#: ../data/gtkpod.glade.h:329
+msgid ""
+"Tracks can be transferred in the background as soon as they are added to an "
+"iPod repository. Otherwise they will be transferred when ejecting the "
+"contents of the iPod completely unchanged until then."
+msgstr ""
+"Spår kan överföras i bakgrunden så fort de har lagts till i ett iPod-arkiv. "
+"Annars överförs de vid utmatning, och innehållet på iPod är fullständigt "
+"oförändrat innnan dess."
+
+#: ../data/gtkpod.glade.h:330
+msgid "Tracks in Selected Tab _Entry"
+msgstr "Spår i markerad _flikrad"
+
+#: ../data/gtkpod.glade.h:331
+msgid "Tracks in Selected _Playlist"
+msgstr "Spår i markerad _spellista"
+
+#: ../data/gtkpod.glade.h:332
+msgid "Transfer tracks to the iPod in the background"
+msgstr "Överför spår till iPod i bakgrunden"
+
+#: ../data/gtkpod.glade.h:333
+msgid "Translators"
+msgstr "Översättare"
+
+#: ../data/gtkpod.glade.h:334
+msgid ""
+"Try to load contents of all connected iPods. For each iPod a separate "
+"repository must be set up."
+msgstr ""
+"Försök ladda innehållet från alla anslutna iPod-enheter. Ett separat arkiv "
+"måste ställas in för varje iPod."
+
+#: ../data/gtkpod.glade.h:335
+msgid "Undo _Track"
+msgstr "Å_ngra spår"
+
+#: ../data/gtkpod.glade.h:336
+msgid "Update _mserv Data from File"
+msgstr "Uppdatera _mserv data från fil"
+
+#: ../data/gtkpod.glade.h:337
+msgid "Update/Sync all playlists now"
+msgstr "Uppdatera och synkronisera alla spellistor nu"
+
+#: ../data/gtkpod.glade.h:338
+msgid "Update/Sync playlist now"
+msgstr "Uppdatera och synkronisera spellista nu"
+
+#: ../data/gtkpod.glade.h:339
+msgid "Upper margin"
+msgstr "Övre gräns"
+
+#: ../data/gtkpod.glade.h:340
+msgid "Use 'Multi-Edit' also for title field"
+msgstr "Använd också 'Redigera flera' för titelfältet"
+
+#: ../data/gtkpod.glade.h:341
+msgid "Use 'Multi-Edit' for tracks selections"
+msgstr "Använd 'Redigera flera' för markerade spår"
+
+#: ../data/gtkpod.glade.h:342
+msgid "Use <i>&lt;Album&gt;.jpg</i> in the parent directory"
+msgstr "Använd <i>&lt;Album&gt;.jpg</i> i överliggande katalog"
+
+#: ../data/gtkpod.glade.h:343
+msgid "Use <i>&lt;Album&gt;.jpg</i>, <i>&lt;Album&gt;.png</i>..."
+msgstr "Använd <i>&lt;Album&gt;.jpg</i>, <i>&lt;Album&gt;.png</i>..."
+
+#: ../data/gtkpod.glade.h:344
+msgid "Use <i>folder.jpg</i> as cover art."
+msgstr "Använd <i>katalog.jpg</i> som omslagsbild."
+
+#: ../data/gtkpod.glade.h:345
+msgid "Use <i>folder.jpg</i>, <i>folder.png</i>..."
+msgstr "Använd <i>katalog.jpg</i>, <i>katalog.png</i>..."
+
+#: ../data/gtkpod.glade.h:346
+msgid "Use mserv database to fill additional information"
+msgstr "Använd mserv databas för att fylla i ytterligare information"
+
+#: ../data/gtkpod.glade.h:347
+msgid ""
+"Use selected charset (Preferences/'Adding/Updating/ Syncing')\n"
+"for this filename."
+msgstr ""
+"Använd vald teckenkodning för detta filnamn\n"
+"(Inställningar/'Tillägg, uppdatering, synkronisering')."
+
+#: ../data/gtkpod.glade.h:349
+msgid ""
+"Use selected encoding (on the 'General' page)\n"
+"when writing tags"
+msgstr ""
+"Använd vald teckenkodning (från sidan 'Allmänt')\n"
+"vid skrivning av taggar"
+
+#: ../data/gtkpod.glade.h:351
+msgid "Use selected encoding also when updating or syncing tracks"
+msgstr "Använd också vald kodning vid uppdatering eller synkronisering av spår"
+
+#: ../data/gtkpod.glade.h:352
+msgid "Use this template to parse filename for tag information:"
+msgstr "Använd mallen för att tolka filnamnet som tagginformation:"
+
+#: ../data/gtkpod.glade.h:353
+msgid "Username to be used for mserv database lookup."
+msgstr "Användarnamn att använda vid uppslagning i mserv databasen."
+
+#: ../data/gtkpod.glade.h:354
+msgid "Username:"
+msgstr "Användarnamn:"
+
+#: ../data/gtkpod.glade.h:355
+msgid ""
+"Usually you don't want to set the title of several tracks to the same text. "
+"This option might avoid unwanted results (especially since there is no "
+"'undo' yet)."
+msgstr ""
+"Oftast vill du inte ange titeln för flera spår till samma text. Det här "
+"alternativet kan undvika oönskade resultat (särskilt eftersom funktionen "
+"'Ångra' inte finns ännu)."
+
+#: ../data/gtkpod.glade.h:356
+msgid "View Full Size"
+msgstr "Visa med full storlek"
+
+#: ../data/gtkpod.glade.h:357
+msgid "WAV with :"
+msgstr "Wav med: "
+
+#: ../data/gtkpod.glade.h:358
+msgid ""
+"When adding dirs/files, update information of\n"
+"existing tracks with identical filenames"
+msgstr ""
+"När kataloger och filer läggs till, uppdatera information\n"
+"om befintliga spår med identiska filnamn"
+
+#: ../data/gtkpod.glade.h:360
+msgid ""
+"When copying from iPod no check is performed on whether the destination file "
+"exists. Enabling this option will make gtkpod check whether the length of "
+"the destination file is the same as the file in the iPod. If so the file is "
+"skipped, allowing a quick sync of the iPod's contents."
+msgstr ""
+"Vid kopiering från iPod görs ingen kontroll om målfilen finns. Markeras det "
+"här alternativet kontrollerar gtkpod om målfilens längd är samma som filen "
+"från iPod. Om det är fallet hoppas filen över, vilket gör det möjligt att "
+"snabbt synkronisera innehållet i iPod."
+
+#: ../data/gtkpod.glade.h:361
+msgid "When syncing playlists"
+msgstr "Vid synkronisering av spellistor"
+
+#: ../data/gtkpod.glade.h:362
+msgid ""
+"Will show a list of tracks removed and a list of tracks newly added or "
+"updated."
+msgstr ""
+"Visar en lista med borttagna spår och en lista med spår som är nytillagda "
+"eller uppdaterade."
+
+#: ../data/gtkpod.glade.h:363
+msgid "Write ID3 tags to disk when modified in gtkpod"
+msgstr "Skriv ID3-taggar till disk när de ändrats i gtkpod"
+
+#: ../data/gtkpod.glade.h:364
+msgid "Write all changes made to the disk and the iPod(s)."
+msgstr "Skriv alla ändringar gjorda på disk och iPod."
+
+#: ../data/gtkpod.glade.h:365
+msgid ""
+"Write extended information (PC filenames, SHA1 hashes,\n"
+"encoding...). Recommended."
+msgstr ""
+"Skriv utökad information (PC-filnamn, SHA1-checksummor,\n"
+"teckenkodning). Rekommenderas."
+
+#: ../data/gtkpod.glade.h:367
+msgid ""
+"You can also use the table headers, but this allows you to sort according to "
+"a column that is not displayed."
+msgstr ""
+"Du kan också använda tabellhuvuden, men här kan du sortera enligt en kolumn "
+"som inte visas."
+
+#: ../data/gtkpod.glade.h:368
+msgid "_About gtkpod"
+msgstr "_Om gtkpod"
+
+#: ../data/gtkpod.glade.h:369
+msgid "_Add Album"
+msgstr "_Lägg till album"
+
+#: ../data/gtkpod.glade.h:370
+msgid "_Add Image"
+msgstr "_Lägg till bild"
+
+#: ../data/gtkpod.glade.h:371
+msgid "_Album"
+msgstr "_Album"
+
+#: ../data/gtkpod.glade.h:372
+msgid "_All Tracks"
+msgstr "_Alla spår"
+
+#: ../data/gtkpod.glade.h:373
+msgid "_Arrange Sort Tabs"
+msgstr "_Ordna sorteringsflikar"
+
+#: ../data/gtkpod.glade.h:374
+msgid "_Check iPod's Files"
+msgstr "K_ontrollera iPod-filer"
+
+#: ../data/gtkpod.glade.h:375
+msgid "_Conversion Log"
+msgstr "_Konverteringslogg"
+
+#: ../data/gtkpod.glade.h:376
+msgid "_Create Playlists"
+msgstr "S_kapa spellistor"
+
+#: ../data/gtkpod.glade.h:377
+msgid "_Create iPod's Directories"
+msgstr "Skapa iPod-ka_taloger"
+
+#: ../data/gtkpod.glade.h:378
+msgid "_Delete"
+msgstr "_Ta bort"
+
+#: ../data/gtkpod.glade.h:379
+msgid "_Display"
+msgstr "_Visa"
+
+#: ../data/gtkpod.glade.h:380
+msgid "_Displayed Tracks"
+msgstr "_Visade spår"
+
+#: ../data/gtkpod.glade.h:381
+msgid "_Edit"
+msgstr "_Redigera"
+
+#: ../data/gtkpod.glade.h:382
+msgid "_Encoding (ID3, files):"
+msgstr "_Teckenkodning (ID3, filer):"
+
+#: ../data/gtkpod.glade.h:383
+msgid "_Enqueue"
+msgstr "_Köa"
+
+#: ../data/gtkpod.glade.h:384
+msgid "_Export Tracks from Database"
+msgstr "E_xportera spår från databasen"
+
+#: ../data/gtkpod.glade.h:385
+msgid "_File"
+msgstr "_Arkiv"
+
+#: ../data/gtkpod.glade.h:386
+msgid "_General"
+msgstr "_Allmänt"
+
+#: ../data/gtkpod.glade.h:387
+msgid "_Help"
+msgstr "_Hjälp"
+
+#: ../data/gtkpod.glade.h:388
+msgid "_Ignore rules"
+msgstr "_Ignorera regler"
+
+#: ../data/gtkpod.glade.h:389
+msgid "_Image"
+msgstr "B_ild"
+
+#: ../data/gtkpod.glade.h:390
+msgid "_Info Window"
+msgstr "_Informationsfönster"
+
+#: ../data/gtkpod.glade.h:391
+msgid "_Last.FM"
+msgstr "_Last.FM"
+
+#: ../data/gtkpod.glade.h:392
+msgid "_Less Sort Tabs"
+msgstr "Färre _sorteringsflikar"
+
+#: ../data/gtkpod.glade.h:393
+msgid "_Limit to"
+msgstr "_Begränsa till"
+
+#: ../data/gtkpod.glade.h:394
+msgid "_Load iPod(s)"
+msgstr "_Ladda iPod"
+
+#: ../data/gtkpod.glade.h:395
+msgid "_Local"
+msgstr "_Lokal"
+
+#: ../data/gtkpod.glade.h:396
+msgid "_M3U"
+msgstr "_M3U"
+
+#: ../data/gtkpod.glade.h:397
+msgid "_Misc."
+msgstr "_Diverse"
+
+#: ../data/gtkpod.glade.h:398
+msgid "_More Sort Tabs"
+msgstr "_Fler sorteringsflikar"
+
+#: ../data/gtkpod.glade.h:399
+msgid "_Newly Added Tracks"
+msgstr "_Nytillagda spår"
+
+#: ../data/gtkpod.glade.h:400
+msgid "_Normalize Volume"
+msgstr "_Normalisera volym"
+
+#: ../data/gtkpod.glade.h:401
+msgid "_Number of sort tabs:"
+msgstr "A_ntal sorteringsflikar:"
+
+#: ../data/gtkpod.glade.h:402
+msgid "_PLS"
+msgstr "_PLS"
+
+#: ../data/gtkpod.glade.h:403
+msgid "_Play Now"
+msgstr "S_pela nu"
+
+#: ../data/gtkpod.glade.h:404
+msgid "_Podcasts"
+msgstr "_Podradiosändningar"
+
+#: ../data/gtkpod.glade.h:405
+msgid "_Prefer Local"
+msgstr "_Föredra lokal"
+
+#: ../data/gtkpod.glade.h:406
+msgid "_Remove Album"
+msgstr "Ta bort _album"
+
+#: ../data/gtkpod.glade.h:407
+msgid "_Remove Cover Art"
+msgstr "_Ta bort omslagsbild"
+
+#: ../data/gtkpod.glade.h:408
+msgid "_Remove Images"
+msgstr "_Ta bort bilder"
+
+#: ../data/gtkpod.glade.h:409
+msgid "_Save Changes"
+msgstr "_Spara ändringar"
+
+#: ../data/gtkpod.glade.h:410
+msgid "_Save Displayed Track Order"
+msgstr "Spara _visad spårordning"
+
+#: ../data/gtkpod.glade.h:411
+msgid "_Sorting"
+msgstr "S_ortera"
+
+#: ../data/gtkpod.glade.h:412
+msgid "_Synchronize Playlist with Dir(s)"
+msgstr "S_ynkronisera spellista med katalog(er)"
+
+#: ../data/gtkpod.glade.h:413
+msgid "_Toolbar"
+msgstr "_Verktygsrad"
+
+#: ../data/gtkpod.glade.h:414
+msgid "_Tools"
+msgstr "Verk_tyg"
+
+#: ../data/gtkpod.glade.h:415
+msgid "_Tooltips"
+msgstr "Verktygs_tips"
+
+#: ../data/gtkpod.glade.h:416
+msgid "_Track Info"
+msgstr "_Spårinformation"
+
+#: ../data/gtkpod.glade.h:417
+msgid "_Undo All"
+msgstr "Å_ngra alla"
+
+#: ../data/gtkpod.glade.h:418
+msgid "_Update Tracks from File"
+msgstr "_Uppdatera spår från fil"
+
+#: ../data/gtkpod.glade.h:419
+msgid "_Video"
+msgstr "_Video"
+
+#: ../data/gtkpod.glade.h:420
+msgid "_View"
+msgstr "_Visa"
+
+#: ../data/gtkpod.glade.h:421
+msgid "_iPod"
+msgstr "_iPod"
+
+#: ../data/gtkpod.glade.h:423
+#, no-c-format
+msgid ""
+"artist: %a, album: %A, composer: %c, title: %t, genre: %G, track nr: %T, CD "
+"nr: %C, year: %Y, skip data: %*, the character '%': %%. You can separate "
+"several templates by a ';'. The first one matching the filename will be "
+"used. Example: '%a - %A/%T %t.mp3;%t.wav'."
+msgstr ""
+"artist: %a, album: %A, kompositör: %c, titel: %t, genre: %G, spårnummer: %T, "
+"cd-nummer: %C, år: %Y, hoppa över data: %*, tecknet '%': %%. Du kan skilja "
+"flera mallar åt med ';'. Den första som stämmer med filnamnet används. "
+"Exempel: '%a - %A/%T %t.mp3;%t.wav'."
+
+#: ../data/gtkpod.glade.h:424
+msgid "folder"
+msgstr "katalog"
+
+#: ../data/gtkpod.glade.h:425
+msgid "folder.jpg"
+msgstr "katalog.jpg"
+
+#: ../data/gtkpod.glade.h:427
+#, no-c-format
+msgid "folder.jpg;%a.jpg"
+msgstr "katalog.jpg;%a.jpg"
+
+#: ../data/gtkpod.glade.h:428
+msgid "gtkpod"
+msgstr "gtkpod"
+
+#: ../data/gtkpod.glade.h:429
+msgid "gtkpod Info"
+msgstr "Information om gtkpod"
+
+#: ../data/gtkpod.glade.h:430
+msgid ""
+"gtkpod expects the ID3 tags and the filenames to be in the encoding "
+"specified here. You can change it for consecutive 'Add Files' and 'Add Dirs' "
+"operation. 'System Charset' is the charset used by your current locale."
+msgstr ""
+"ID3-taggar och filnamn förväntas ha kodningen som anges här. Du kan ändra "
+"den för varje enskild användning av 'Lägg till filer' eller 'Lägg till "
+"kataloger'. 'Systemets kodning' är den kodning som används i din aktuella "
+"landsinställning."
+
+#: ../data/gtkpod.glade.h:431
+msgid "gtkpod options"
+msgstr "Inställningar för gtkpod"
+
+#. These are the items for the 'Repository type' combo in the 'Create Repository' dialog. Keep the three items in order!
+#: ../data/gtkpod.glade.h:433
+msgid ""
+"iPod\n"
+"Local Repository (Standard)\n"
+"Local Repository (Podcasts)\n"
+msgstr ""
+"iPod\n"
+"Lokalt arkiv (standard)\n"
+"Lokalt arkiv (podradiosändningar)\n"
+
+#: ../data/gtkpod.glade.h:437
+msgid "iPod mountpoint:"
+msgstr "iPod monteringspunkt:"
+
+#: ../data/gtkpod.glade.h:438
+msgid "iTunesDB backup:"
+msgstr "Säkerhetskopia av iTunes databas:"
+
+#: ../data/gtkpod.glade.h:439
+msgid "mserv Root:"
+msgstr "Rot för mserv:"
+
+#: ../data/gtkpod.glade.h:440
+msgid "mserv database lookup will be done for music in this directory."
+msgstr "Uppslagning av musik för mserv databasen görs i den här katalogen."
+
+#: ../data/gtkpod.glade.h:441 ../src/details.c:1347
+msgid "n/a"
+msgstr "ej tillgänglig"
+
+#: ../data/gtkpod.glade.h:442
+msgid "special_sorttab -- Don't translate!"
+msgstr "special_sorttab -- Don't translate!"
+
+#: ../src/autodetection.c:310
+msgid "Could not initialize GnomeVFS\n"
+msgstr "Kunde inte initiera Gnome VFS\n"
+
+#: ../src/autodetection.c:397
+#, c-format
+msgid ""
+"Newly mounted iPod at '%s' could not be loaded into gtkpod.\n"
+"\n"
+msgstr ""
+"Nymonterad iPod på '%s' kunde inte laddas i gtkpod.\n"
+"\n"
+
+#: ../src/autodetection.c:403
+#, c-format
+msgid ""
+"Newly mounted iPod at '%s' appears to be already loaded!\n"
+"\n"
+msgstr ""
+"Nymonterad iPod på '%s' verkar redan vara laddad.\n"
+"\n"
+
+#: ../src/autodetection.c:416
+msgid "New iPod"
+msgstr "Ny iPod"
+
+#: ../src/charset.c:53
+msgid "Arabic (IBM-864)"
+msgstr "Arabisk (IBM-864)"
+
+#: ../src/charset.c:54
+msgid "Arabic (ISO-8859-6)"
+msgstr "Arabisk (ISO-8859-6)"
+
+#: ../src/charset.c:55
+msgid "Arabic (Windows-1256)"
+msgstr "Arabisk (Windows-1256)"
+
+#: ../src/charset.c:56
+msgid "Baltic (ISO-8859-13)"
+msgstr "Baltisk (ISO-8859-13)"
+
+#: ../src/charset.c:57
+msgid "Baltic (ISO-8859-4)"
+msgstr "Baltisk (ISO-8859-4)"
+
+#: ../src/charset.c:58
+msgid "Baltic (Windows-1257)"
+msgstr "Baltisk (Windows-1257)"
+
+#: ../src/charset.c:59
+msgid "Celtic (ISO-8859-14)"
+msgstr "Keltisk (ISO-8859-14)"
+
+#: ../src/charset.c:60
+msgid "Central European (IBM-852)"
+msgstr "Centraleuropeisk (IBM-852)"
+
+#: ../src/charset.c:61
+msgid "Central European (ISO-8859-2)"
+msgstr "Centraleuropeisk (ISO-8859-2)"
+
+#: ../src/charset.c:62
+msgid "Central European (Windows-1250)"
+msgstr "Centraleuropeisk (Windows-1250)"
+
+#: ../src/charset.c:63
+msgid "Chinese Simplified (GB18030)"
+msgstr "Förenklad kinesisk (GB18030)"
+
+#: ../src/charset.c:64
+msgid "Chinese Simplified (GB2312)"
+msgstr "Förenklad kinesisk (GB2312)"
+
+#: ../src/charset.c:65
+msgid "Chinese Traditional (Big5)"
+msgstr "Traditionell kinesisk (Big5)"
+
+#: ../src/charset.c:66
+msgid "Chinese Traditional (Big5-HKSCS)"
+msgstr "Traditionell kinesisk (Big5-HKSCS)"
+
+#: ../src/charset.c:67
+msgid "Cyrillic (IBM-855)"
+msgstr "Kyrillisk (IBM-855)"
+
+#: ../src/charset.c:68
+msgid "Cyrillic (ISO-8859-5)"
+msgstr "Kyrillisk (ISO-8859-5)"
+
+#: ../src/charset.c:69
+msgid "Cyrillic (ISO-IR-111)"
+msgstr "Kyrillisk (ISO-IR-111)"
+
+#: ../src/charset.c:70
+msgid "Cyrillic (KOI8-R)"
+msgstr "Kyrillisk (KOI8-R)"
+
+#: ../src/charset.c:71
+msgid "Cyrillic (Windows-1251)"
+msgstr "Kyrillisk (Windows-1251)"
+
+#: ../src/charset.c:72
+msgid "Cyrillic/Russian (CP-866)"
+msgstr "Kyrillisk/Rysk (CP-866)"
+
+#: ../src/charset.c:73
+msgid "Cyrillic/Ukrainian (KOI8-U)"
+msgstr "Kyrillisk/Ukrainsk (KOI8-U)"
+
+#: ../src/charset.c:74
+msgid "English (US-ASCII)"
+msgstr "Engelsk (US-ASCII)"
+
+#: ../src/charset.c:75
+msgid "Greek (ISO-8859-7)"
+msgstr "Grekisk (ISO-8859-7)"
+
+#: ../src/charset.c:76
+msgid "Greek (Windows-1253)"
+msgstr "Grekisk (Windows-1253)"
+
+#: ../src/charset.c:77
+msgid "Hebrew (IBM-862)"
+msgstr "Hebreisk (IBM-862)"
+
+#: ../src/charset.c:78
+msgid "Hebrew (Windows-1255)"
+msgstr "Hebreisk (Windows-1255)"
+
+#: ../src/charset.c:79
+msgid "Japanese (automatic detection)"
+msgstr "Japansk (automatisk detektering)"
+
+#: ../src/charset.c:80
+msgid "Japanese (EUC-JP)"
+msgstr "Japansk (EUC-JP)"
+
+#: ../src/charset.c:81
+msgid "Japanese (ISO-2022-JP)"
+msgstr "Japansk (ISO-2022-JP)"
+
+#: ../src/charset.c:82
+msgid "Japanese (Shift_JIS)"
+msgstr "Japansk (Shift_JIS)"
+
+#: ../src/charset.c:83
+msgid "Korean (EUC-KR)"
+msgstr "Koreansk (EUC-KR)"
+
+#: ../src/charset.c:84
+msgid "Nordic (ISO-8859-10)"
+msgstr "Nordisk (ISO-8859-10)"
+
+#: ../src/charset.c:85
+msgid "South European (ISO-8859-3)"
+msgstr "Sydeuropeisk (ISO-8859-3)"
+
+#: ../src/charset.c:86
+msgid "Thai (TIS-620)"
+msgstr "Thailändsk (TIS-620)"
+
+#: ../src/charset.c:87
+msgid "Turkish (IBM-857)"
+msgstr "Turkisk (IBM-857)"
+
+#: ../src/charset.c:88
+msgid "Turkish (ISO-8859-9)"
+msgstr "Turkisk (ISO-8859-9)"
+
+#: ../src/charset.c:89
+msgid "Turkish (Windows-1254)"
+msgstr "Turkisk (Windows-1254)"
+
+#: ../src/charset.c:90
+msgid "Unicode (UTF-7)"
+msgstr "Unicode (UTF-7)"
+
+#: ../src/charset.c:91
+msgid "Unicode (UTF-8)"
+msgstr "Unicode (UTF-8)"
+
+#: ../src/charset.c:92
+msgid "Unicode (UTF-16BE)"
+msgstr "Unicode (UTF-16BE)"
+
+#: ../src/charset.c:93
+msgid "Unicode (UTF-16LE)"
+msgstr "Unicode (UTF-16LE)"
+
+#: ../src/charset.c:94
+msgid "Unicode (UTF-32BE)"
+msgstr "Unicode (UTF-32BE)"
+
+#: ../src/charset.c:95
+msgid "Unicode (UTF-32LE)"
+msgstr "Unicode (UTF-32LE)"
+
+#: ../src/charset.c:96
+msgid "Vietnamese (VISCII)"
+msgstr "Vietnamesisk (VISCII)"
+
+#: ../src/charset.c:97
+msgid "Vietnamese (Windows-1258)"
+msgstr "Vietnamesisk (Windows-1258)"
+
+#: ../src/charset.c:98
+msgid "Visual Hebrew (ISO-8859-8)"
+msgstr "Visuell Hebreisk (ISO-8859-8)"
+
+#: ../src/charset.c:99
+msgid "Western (IBM-850)"
+msgstr "Västlig (IBM-850)"
+
+#: ../src/charset.c:100
+msgid "Western (ISO-8859-1)"
+msgstr "Västlig (ISO-8859-1)"
+
+#: ../src/charset.c:101
+msgid "Western (ISO-8859-15)"
+msgstr "Västlig (ISO-8859-15)"
+
+#: ../src/charset.c:102
+msgid "Western (Windows-1252)"
+msgstr "Västlig (Windows-1252)"
+
+#. sanity!
+#. check for "System Charset" and return NULL
+#: ../src/charset.c:160 ../src/charset.c:170 ../src/charset.c:223
+msgid "System Charset"
+msgstr "Systemets kodning"
+
+#. we are not the first instance of gtkpod -- the socket is
+#. already being used, so we pass
+#: ../src/clientserver.c:214
+msgid "Another instance of gtkpod was detected. Playcount server not started.\n"
+msgstr "En annan instans av gtkpod detekterades. Spelningsservern startades inte.\n"
+
+#: ../src/confirmation.c:377
+msgid "Confirmation Dialogue"
+msgstr "Bekräftelsedialogruta"
+
+#: ../src/context_menus.c:362
+#, c-format
+msgid "Copied \"%s\" playlist to %s"
+msgstr "Kopierade spellistan \"%s\" till %s"
+
+#: ../src/context_menus.c:401
+#, c-format
+msgid "Copied %d track to '%s'"
+msgid_plural "Copied %d tracks to '%s'"
+msgstr[0] "Kopierade %d spår till '%s'"
+msgstr[1] "Kopierade %d spår till '%s'"
+
+#: ../src/context_menus.c:429
+#, c-format
+msgid "Copied '%s' playlist to '%s' in '%s'"
+msgstr "Kopierade spellistan '%s'till '%s' i '%s'"
+
+#: ../src/context_menus.c:462
+#, c-format
+msgid "Copied %d track to '%s' in '%s'"
+msgid_plural "Copied %d tracks to %s in '%s'"
+msgstr[0] "Kopierade %d spår till '%s' i '%s'"
+msgstr[1] "Kopierade %d spår till '%s' i '%s'"
+
+#: ../src/context_menus.c:622 ../src/tools.c:854
+msgid "Play Now"
+msgstr "Spela nu"
+
+#: ../src/context_menus.c:628 ../src/tools.c:867
+msgid "Enqueue"
+msgstr "Köa"
+
+#: ../src/context_menus.c:634
+msgid "Copy Tracks to Filesystem"
+msgstr "Kopiera spår till filsystem"
+
+#: ../src/context_menus.c:641 ../src/file_export.c:1085
+msgid "Create Playlist File"
+msgstr "Skapa spellistefil"
+
+#: ../src/context_menus.c:648
+msgid "Create new Playlist"
+msgstr "Skapa ny spellista"
+
+#: ../src/context_menus.c:655
+msgid "Update Tracks from File"
+msgstr "Uppdatera spår från fil"
+
+#: ../src/context_menus.c:669
+msgid "Sync Playlist with Dir(s)"
+msgstr "Synkronisera spellista med katalog(er)"
+
+#: ../src/context_menus.c:679
+msgid "Remove All Tracks from iPod"
+msgstr "Ta bort alla spår från iPod"
+
+#: ../src/context_menus.c:697
+msgid "Remove All Podcasts from iPod"
+msgstr "Ta bort alla podradiosändningar från iPod"
+
+#: ../src/context_menus.c:712
+msgid "Delete Including Tracks"
+msgstr "Ta bort inklusive spår"
+
+#: ../src/context_menus.c:720
+msgid "Delete But Keep Tracks"
+msgstr "Ta bort men behåll spår"
+
+#: ../src/context_menus.c:728
+msgid "Edit iPod Properties"
+msgstr "Redigera iPod-egenskaper"
+
+#: ../src/context_menus.c:735
+msgid "Edit Repository Properties"
+msgstr "Redigera arkivegenskaper"
+
+#: ../src/context_menus.c:742
+msgid "Edit Playlist Properties"
+msgstr "Redigera spellisteegenskaper"
+
+#: ../src/context_menus.c:770
+msgid "View Full Size Artwork"
+msgstr "Visa omslagsbilder med full storlek"
+
+#: ../src/context_menus.c:777
+msgid "Select Cover From File"
+msgstr "Välj omslag från fil"
+
+#: ../src/context_menus.c:790
+msgid "Load iPod"
+msgstr "Ladda iPod"
+
+#: ../src/context_menus.c:797
+msgid "Eject iPod"
+msgstr "Mata ut iPod"
+
+#: ../src/context_menus.c:814
+msgid "Remove All Tracks from Database"
+msgstr "Ta bort alla spår från databasen"
+
+#: ../src/context_menus.c:829
+msgid "Delete Including Tracks (Harddisk)"
+msgstr "Ta bort inklusive spår (hårddisk)"
+
+#: ../src/context_menus.c:837
+msgid "Delete Including Tracks (Database)"
+msgstr "Ta bort inklusive spår (databas)"
+
+#: ../src/context_menus.c:845
+msgid "Delete From iPod"
+msgstr "Ta bort från iPod"
+
+#: ../src/context_menus.c:853
+msgid "Delete From Playlist"
+msgstr "Ta bort från spellista"
+
+#: ../src/context_menus.c:861
+msgid "Delete From Harddisk"
+msgstr "Ta bort från hårddisk"
+
+#: ../src/context_menus.c:869
+msgid "Delete From Database"
+msgstr "Ta bort från databas"
+
+#: ../src/context_menus.c:877
+msgid "Alphabetize"
+msgstr "Sortera alfabetiskt"
+
+#: ../src/context_menus.c:895
+msgid "Remove Album"
+msgstr "Ta bort album"
+
+#: ../src/context_menus.c:905
+msgid "Remove Photo"
+msgstr "Ta bort foto"
+
+#: ../src/context_menus.c:922
+msgid "Rename Album"
+msgstr "Byt namn på album"
+
+#: ../src/context_menus.c:981 ../src/context_menus.c:1030
+msgid "Copy selected playlist to..."
+msgstr "Kopiera markerad spellista till..."
+
+#: ../src/context_menus.c:1083
+msgid "Copy selected track(s) to..."
+msgstr "Kopiera markerade spår till..."
+
+#: ../src/date_parser.l:269
+#, c-format
+msgid "Date format error: unrecognized character: '%s'\n"
+msgstr "Fel i datumformat: tecknet känns inte igen: '%s'\n"
+
+#: ../src/details.c:82
+msgid "Audio/Video"
+msgstr "Ljud och video"
+
+#: ../src/details.c:83
+msgid "Audio"
+msgstr "Ljud"
+
+#: ../src/details.c:84
+msgid "Video"
+msgstr "Video"
+
+#: ../src/details.c:85
+msgid "Podcast"
+msgstr "Podradiosändning"
+
+#: ../src/details.c:86
+msgid "Video Podcast"
+msgstr "Podvideosändning"
+
+#: ../src/details.c:87
+msgid "Audiobook"
+msgstr "Ljudbok"
+
+#: ../src/details.c:88 ../src/display_spl.c:209 ../src/display_spl.c:218
+msgid "Music Video"
+msgstr "Musikvideo"
+
+#: ../src/details.c:89 ../src/display_spl.c:107 ../src/display_spl.c:210
+#: ../src/display_spl.c:219 ../src/misc_conversion.c:101
+msgid "TV Show"
+msgstr "Tv-program"
+
+#: ../src/details.c:90
+msgid "TV Show & Music Video"
+msgstr "Tv-program och musikvideo"
+
+#: ../src/details.c:836
+#, c-format
+msgid "%s (image data corrupted or unreadable)"
+msgstr "%s (bilddata förstörd eller oläsbar)"
+
+#: ../src/details.c:973
+#, c-format
+msgid "Please report unknown mediatype %x\n"
+msgstr "Rapportera gärna okänd mediatyp %x\n"
+
+#: ../src/details.c:1418
+msgid "<b>n/a</b>"
+msgstr "<b>ej tillgänglig</b>"
+
+#: ../src/details.c:1906
+#, c-format
+msgid "Error occurred dropping an image onto the details window: %s\n"
+msgstr "Fel uppstod när en bild släpptes på fönstret med detaljinformation: %s\n"
+
+#: ../src/details.c:1952 ../src/display_coverart.c:2128
+msgid "Successfully set new coverart for selected tracks"
+msgstr "Nya omslagsbilder för markerade spår tillagda med lyckat resultat"
+
+#: ../src/display.c:490
+#, c-format
+msgid "<b>Image Dimensions: %s</b>"
+msgstr "<b>Bilddimensioner: %s</b>"
+
+#: ../src/display.c:744
+msgid "Edit selected entry of which sort tab?"
+msgstr "Redigera markerad rad för vilken sorts flik?"
+
+#. no entry selected
+#: ../src/display.c:751 ../src/misc_confirm.c:435 ../src/misc_track.c:2138
+msgid "No entry selected."
+msgstr "Ingen rad markerad."
+
+#: ../src/display.c:910 ../src/display.c:1230 ../src/display.c:1286
+#: ../src/display.c:1340 ../src/display.c:1395 ../src/display.c:1656
+#, c-format
+msgid "No entry selected in Sort Tab %d"
+msgstr "Ingen rad markerad i sorteringsflik %d"
+
+#: ../src/display.c:949
+msgid "Remove entry of which sort tab from database?"
+msgstr "Ta bort rad för vilken sorts flik från databasen?"
+
+#: ../src/display.c:957
+msgid "Remove tracks in selected entry of which filter tab from the iPod?"
+msgstr "Ta bort spår i markerad rad för vilken sorts filterflik från iPod?"
+
+#: ../src/display.c:979
+msgid "Remove tracks in selected entry of which filter tab from the harddisk?"
+msgstr "Ta bort spår i markerad rad för vilken sorts filterflik från hårddisken?"
+
+#: ../src/display.c:1009
+msgid "Remove tracks in selected entry of which filter tab from playlist?"
+msgstr "Ta bort spår i markerad rad för vilken sorts filterflik från spellistan?"
+
+#: ../src/display.c:1036 ../src/display.c:1074
+#, c-format
+msgid ""
+"iPod at '%s' is not loaded.\n"
+"Please load it first."
+msgstr ""
+"iPod på '%s' har inte laddats.\n"
+"Ladda den först."
+
+#: ../src/display.c:1111 ../src/display.c:1138
+msgid "Update selected entry of which sort tab?"
+msgstr "Uppdatera markerad rad för vilken sorts flik?"
+
+#: ../src/display.c:1224
+msgid "Export selected entry of which sort tab?"
+msgstr "Exportera markerad rad för vilken sorts flik?"
+
+#: ../src/display.c:1280
+msgid "Create playlist file from selected entry of which sort tab?"
+msgstr "Skapa spellistefil från markerad rad för vilken sorts flik?"
+
+#: ../src/display.c:1334
+msgid "Play tracks in selected entry of which sort tab?"
+msgstr "Spela spår i markerad rad för vilken sorts flik?"
+
+#: ../src/display.c:1389
+msgid "Enqueue tracks in selected entry of which sort tab?"
+msgstr "Köa spår i markerad rad för vilken sorts flik?"
+
+#: ../src/display.c:1646
+msgid "Normalize tracks in selected entry of which sort tab?"
+msgstr "Normalisera spår i markerad rad för vilken sorts flik?"
+
+#: ../src/display_coverart.c:1713
+msgid "Failed to remove the album from the album hash store."
+msgstr "Misslyckades ta bort albumet från den checksummerade albumlagringen."
+
+#: ../src/display_coverart.c:2098
+#, c-format
+msgid "Error occurred dropping an image onto the coverart display: %s\n"
+msgstr "Fel uppstod när en bild släpptes på visningen av omslag: %s\n"
+
+#: ../src/display_itdb.c:376
+#, c-format
+msgid "Failed to set cover art: '%s'\n"
+msgstr "Misslyckades ange omslagsbild: '%s'\n"
+
+#: ../src/display_itdb.c:858 ../src/display_itdb.c:991
+msgid "Local"
+msgstr "Lokal"
+
+#. add podcast playlist
+#: ../src/display_itdb.c:866 ../src/display_itdb.c:989
+#: ../src/display_itdb.c:1025
+msgid "Podcasts"
+msgstr "Podradiosändningar"
+
+#: ../src/display_itdb.c:875 ../src/display_itdb.c:993
+#: ../src/repository.c:1186
+msgid "iPod"
+msgstr "iPod"
+
+#: ../src/display_itdb.c:1084
+#, c-format
+msgid "Increased playcount for '%s'"
+msgstr "ökade spelningsantal för '%s'"
+
+#: ../src/display_photo.c:163
+#, c-format
+msgid "Error reading iPod photo database (%s).\n"
+msgstr "Fel vid läsning av iPod fotodatabas (%s).\n"
+
+#: ../src/display_photo.c:168
+msgid "Error reading iPod photo database.\n"
+msgstr "Fel vid läsning av iPod fotodatabas.\n"
+
+#: ../src/display_photo.c:238
+msgid "Could not access the iPod's photo database."
+msgstr "Kunde inte komma åt iPod fotodatabas."
+
+#: ../src/display_photo.c:441
+msgid "Photo Albums"
+msgstr "Fotoalbum"
+
+#: ../src/display_photo.c:451 ../src/display_photo.c:1685
+msgid "<Unnamed>"
+msgstr "<Namnlös>"
+
+#: ../src/display_photo.c:939
+msgid "The Photo Library album cannot be removed"
+msgstr "Fotobibliotekets album kan inte tas bort"
+
+#: ../src/display_photo.c:961
+msgid "Do you want to remove the album's photos too?"
+msgstr "Är du säker på att du också vill ta bort albumets foton?"
+
+#: ../src/display_photo.c:967
+msgid "Yes. Do Not Display Again"
+msgstr "Ja. Visa inte igen"
+
+#: ../src/display_photo.c:1038
+msgid ""
+"This will remove the photo selection from the selected album.\n"
+" Do you want to delete them from the database as well?"
+msgstr ""
+"Detta tar bort markerade foton från det valda albumet.\n"
+"Vill du också ta bort dem från databasen?"
+
+#: ../src/display_photo.c:1053
+msgid ""
+"This will delete the photo selection from the Photo Library and all albums. "
+"Are you sure?"
+msgstr ""
+"Detta tar bort markerade foton från fotobiblioteket och alla album.\n"
+"Är du säker?"
+
+#: ../src/display_photo.c:1128
+msgid "New Photo Album Name"
+msgstr "Nytt namn på fotoalbum"
+
+#: ../src/display_photo.c:1129
+msgid "Please enter a new name for the photo album"
+msgstr "Skriv in ett nytt namn på fotoalbumet"
+
+#: ../src/display_photo.c:1141 ../src/display_photo.c:1223
+msgid "An album with that name already exists."
+msgstr "Ett album med samma namn finns redan."
+
+#: ../src/display_photo.c:1210
+msgid "New Photo Album"
+msgstr "Nytt fotoalbum"
+
+#: ../src/display_photo.c:1211
+msgid "Please enter a name for the new photo album"
+msgstr "Skriv in ett namn på det nya fotoalbumet"
+
+#: ../src/display_photo.c:1232
+msgid "The new album failed to be created."
+msgstr "Det nya albumet kunde inte skapas."
+
+#: ../src/display_photo.c:1256
+msgid "Add Image to iPod"
+msgstr "Lägg till bild på iPod"
+
+#. Open a dialog directory chooser window
+#: ../src/display_photo.c:1311
+msgid "Add a Directory of Images to the iPod. Select the Directory."
+msgstr "Lägg till en katalog med bilder på iPod. Markera katalogen."
+
+#: ../src/display_photo.c:1699
+#, c-format
+msgid "<No members>\n"
+msgstr "<Inga medlemmar>\n"
+
+#. give a notice on the statusbar -- otherwise the user
+#. * will never know why the drag is not possible
+#: ../src/display_playlists.c:516 ../src/display_playlists.c:558
+msgid "Error: drag from iPod not possible in offline mode."
+msgstr "Fel: att dra från iPod är inte möjligt i nerkopplat läge."
+
+#: ../src/display_playlists.c:585 ../src/display_tracks.c:286
+#, c-format
+msgid "Copied one track"
+msgid_plural "Copied %d tracks"
+msgstr[0] "Kopierade ett spår"
+msgstr[1] "Kopierade %d spår"
+
+#: ../src/display_playlists.c:865 ../src/display_playlists.c:877
+msgid "Can't reorder sorted treeview."
+msgstr "Kan inte ordna om sorterad trädvy."
+
+#: ../src/display_playlists.c:954
+#, c-format
+msgid ""
+"This DND type (%d) is not (yet) supported. If you feel implementing this "
+"would be useful, please contact the author.\n"
+"\n"
+msgstr ""
+"Den här typen av drag och släpp (%d) stöds inte (ännu). Om du anser att den "
+"vore användbart att implementera, kontakta gärna upphovsmannen.\n"
+"\n"
+
+#. no existing photo playlist found so add one
+#. * either itdb had no children or none of them
+#. * were of the photo type.
+#.
+#: ../src/display_playlists.c:1569
+msgid "Photos"
+msgstr "Foton"
+
+#: ../src/display_sorttabs.c:473
+msgid "'Played' condition ignored because of error."
+msgstr "Tillståndet 'Spelad' ignoreras på grund av fel."
+
+#: ../src/display_sorttabs.c:476
+msgid "'Modified' condition ignored because of error."
+msgstr "Tillståndet 'Ändrad' ignoreras på grund av fel."
+
+#: ../src/display_sorttabs.c:479
+msgid "'Added' condition ignored because of error."
+msgstr "Tillståndet 'Tillagd' ignoreras på grund av fel."
+
+#: ../src/display_sorttabs.c:1562 ../src/misc_conversion.c:59
+msgid "All"
+msgstr "Alla"
+
+#: ../src/display_sorttabs.c:1588
+msgid "Compilations"
+msgstr "Samlingar"
+
+#: ../src/display_sorttabs.c:2988
+msgid "Comp."
+msgstr "Komp."
+
+#: ../src/display_sorttabs.c:2994 ../src/display_spl.c:88
+#: ../src/display_tracks.c:2109 ../src/misc_conversion.c:84
+msgid "Year"
+msgstr "År"
+
+#: ../src/display_sorttabs.c:2997
+msgid "Special"
+msgstr "Special"
+
+#: ../src/display_sorttabs.c:3245
+msgid "Last Played"
+msgstr "Senast spelad"
+
+#: ../src/display_sorttabs.c:3246
+msgid "Last Modified"
+msgstr "Senast ändrad"
+
+#: ../src/display_spl.c:64
+msgid "days"
+msgstr "dagar"
+
+#: ../src/display_spl.c:65
+msgid "weeks"
+msgstr "veckor"
+
+#: ../src/display_spl.c:66
+msgid "months"
+msgstr "månader"
+
+#: ../src/display_spl.c:73
+msgid "kbps"
+msgstr "kbps"
+
+#: ../src/display_spl.c:74
+msgid "Hz"
+msgstr "Hz"
+
+#: ../src/display_spl.c:75 ../src/display_spl.c:179 ../src/info.c:780
+msgid "MB"
+msgstr "Mibyte"
+
+#: ../src/display_spl.c:76
+msgid "secs"
+msgstr "sekunder"
+
+#: ../src/display_spl.c:86 ../src/misc_conversion.c:74
+msgid "Bitrate"
+msgstr "Bithastighet"
+
+#. 15
+#: ../src/display_spl.c:87 ../src/misc_conversion.c:75
+msgid "Samplerate"
+msgstr "Samplingsfrekvens"
+
+#: ../src/display_spl.c:90
+msgid "Kind"
+msgstr "Sort"
+
+#: ../src/display_spl.c:91 ../src/misc_conversion.c:81
+msgid "Date modified"
+msgstr "Ändringsdatum"
+
+#: ../src/display_spl.c:92
+msgid "Track number"
+msgstr "Spårnummer"
+
+#: ../src/display_spl.c:93
+msgid "Size"
+msgstr "Storlek"
+
+#: ../src/display_spl.c:95 ../src/misc_conversion.c:64
+msgid "Comment"
+msgstr "Kommentar"
+
+#: ../src/display_spl.c:96 ../src/misc_conversion.c:79
+msgid "Date added"
+msgstr "Tillagd datum"
+
+#: ../src/display_spl.c:99
+msgid "Last played"
+msgstr "Senast spelad"
+
+#: ../src/display_spl.c:100
+msgid "Disc number"
+msgstr "Skivnummer"
+
+#: ../src/display_spl.c:102 ../src/misc_conversion.c:87
+msgid "Compilation"
+msgstr "Samling"
+
+#: ../src/display_spl.c:103 ../src/misc_conversion.c:76
+msgid "BPM"
+msgstr "Taktslag per minut"
+
+#: ../src/display_spl.c:104 ../src/misc_conversion.c:86
+msgid "Grouping"
+msgstr "Gruppering"
+
+#: ../src/display_spl.c:105
+msgid "Playlist"
+msgstr "Spellista"
+
+#: ../src/display_spl.c:106
+msgid "Video Kind"
+msgstr "Videotyp"
+
+#: ../src/display_spl.c:108
+msgid "Season number"
+msgstr "Säsongsnummer"
+
+#: ../src/display_spl.c:109
+msgid "Skip count"
+msgstr "Antal överhoppade"
+
+#: ../src/display_spl.c:110
+msgid "Last skipped"
+msgstr "Senast överhoppad"
+
+#: ../src/display_spl.c:111
+msgid "Album artist"
+msgstr "Albumartist"
+
+#: ../src/display_spl.c:117
+msgid "contains"
+msgstr "innehåller"
+
+#: ../src/display_spl.c:118
+msgid "does not contain"
+msgstr "innehåller inte"
+
+#: ../src/display_spl.c:119 ../src/display_spl.c:128 ../src/display_spl.c:138
+#: ../src/display_spl.c:157 ../src/display_spl.c:164
+msgid "is"
+msgstr "är"
+
+#: ../src/display_spl.c:120 ../src/display_spl.c:129 ../src/display_spl.c:139
+#: ../src/display_spl.c:158 ../src/display_spl.c:165
+msgid "is not"
+msgstr "är inte"
+
+#: ../src/display_spl.c:121
+msgid "starts with"
+msgstr "börjar med"
+
+#: ../src/display_spl.c:122
+msgid "ends with"
+msgstr "slutar med"
+
+#: ../src/display_spl.c:130
+msgid "is greater than"
+msgstr "är större än"
+
+#: ../src/display_spl.c:131
+msgid "is less than"
+msgstr "är mindre än"
+
+#: ../src/display_spl.c:132 ../src/display_spl.c:144
+msgid "is in the range"
+msgstr "är i intervallet"
+
+#: ../src/display_spl.c:140
+msgid "is after"
+msgstr "är efter"
+
+#: ../src/display_spl.c:141
+msgid "is before"
+msgstr "är före"
+
+#: ../src/display_spl.c:142
+msgid "in the last"
+msgstr "i sista"
+
+#: ../src/display_spl.c:143
+msgid "not in the last"
+msgstr "inte i sista"
+
+#: ../src/display_spl.c:150
+msgid "is set"
+msgstr "är satt"
+
+#: ../src/display_spl.c:151
+msgid "is not set"
+msgstr "är inte satt"
+
+#: ../src/display_spl.c:171
+msgid "Not supported"
+msgstr "Stöds inte"
+
+#: ../src/display_spl.c:178
+msgid "minutes"
+msgstr "minuter"
+
+#: ../src/display_spl.c:180
+msgid "tracks"
+msgstr "spår"
+
+#: ../src/display_spl.c:181
+msgid "hours"
+msgstr "timmar"
+
+#: ../src/display_spl.c:182 ../src/info.c:780
+msgid "GB"
+msgstr "Gibyte"
+
+#: ../src/display_spl.c:189
+msgid "random order"
+msgstr "slumpmässig ordning"
+
+#: ../src/display_spl.c:190
+msgid "title"
+msgstr "titel"
+
+#: ../src/display_spl.c:191
+msgid "album"
+msgstr "album"
+
+#: ../src/display_spl.c:192
+msgid "artist"
+msgstr "artist"
+
+#: ../src/display_spl.c:193
+msgid "genre"
+msgstr "genre"
+
+#: ../src/display_spl.c:194
+msgid "most recently added"
+msgstr "senast tillagd"
+
+#: ../src/display_spl.c:195
+msgid "least recently added"
+msgstr "tidigast tillagd"
+
+#: ../src/display_spl.c:196
+msgid "most often played"
+msgstr "mest spelad"
+
+#: ../src/display_spl.c:197
+msgid "least often played"
+msgstr "minst spelad"
+
+#: ../src/display_spl.c:198
+msgid "most recently played"
+msgstr "senast spelad"
+
+#: ../src/display_spl.c:199
+msgid "least recently played"
+msgstr "tidigast spelad"
+
+#: ../src/display_spl.c:200
+msgid "highest rating"
+msgstr "högst betyg"
+
+#: ../src/display_spl.c:201
+msgid "lowest rating"
+msgstr "lägst betyg"
+
+#: ../src/display_spl.c:208 ../src/display_spl.c:217
+msgid "Movie"
+msgstr "Film"
+
+#: ../src/display_spl.c:1192 ../src/display_spl.c:1207
+msgid "to"
+msgstr "till"
+
+#: ../src/display_spl.c:1485
+msgid "-"
+msgstr "-"
+
+#: ../src/display_spl.c:1500
+msgid "+"
+msgstr "+"
+
+#: ../src/display_tracks.c:281
+#, c-format
+msgid "Moved one track"
+msgid_plural "Moved %d tracks"
+msgstr[0] "Flyttade ett spår"
+msgstr[1] "Flyttade %d spår"
+
+#: ../src/display_tracks.c:1810
+#, c-format
+msgid ""
+"Cannot unsort track view because of a bug in the GTK lib you are using (%d.%"
+"d.%d < 2.5.4). Once you sort the track view, you cannot go back to the "
+"unsorted state.\n"
+"\n"
+msgstr ""
+"Kan inte göra spårvyn osorterad, beroende på ett fel i GTK-biblioteket du "
+"använder (%d.%d.%d < 2.5.4). Så snart du sorterat spårvyn kan du inte gå "
+"tillbaka till det osorterade tillståndet.\n"
+"\n"
+
+#: ../src/display_tracks.c:2069
+msgid "Rtng"
+msgstr "Betyg"
+
+#: ../src/display_tracks.c:2072
+msgid "#"
+msgstr "#"
+
+#: ../src/display_tracks.c:2075
+msgid "CD"
+msgstr "Cd"
+
+#: ../src/display_tracks.c:2078
+msgid "ID"
+msgstr "Id"
+
+#: ../src/display_tracks.c:2081
+msgid "Trnsfrd"
+msgstr "Överfört"
+
+#: ../src/display_tracks.c:2085
+msgid "Cmpl"
+msgstr "Komp."
+
+#: ../src/display_tracks.c:2091
+msgid "Time"
+msgstr "Tid"
+
+#: ../src/display_tracks.c:2094
+msgid "Plycnt"
+msgstr "Speln."
+
+#: ../src/display_tracks.c:2106
+msgid "Released"
+msgstr "Utgiven"
+
+#: ../src/display_tracks.c:2112
+msgid "Vol."
+msgstr "Vol."
+
+#: ../src/display_tracks.c:2115
+msgid "Sndchk."
+msgstr "Ljudkontr."
+
+#: ../src/fetchcover.c:358
+msgid "Coverart file already exists"
+msgstr "Omslagsfilen finns redan"
+
+#: ../src/fetchcover.c:371
+#, c-format
+msgid ""
+"The picture file %s already exists.\n"
+"This may be associated with other music files in the directory.\n"
+"\n"
+"-  Clicking Yes will overwrite the existing file, possibly associating\n"
+"   other music files in the same directory with this coverart file.\n"
+"-  Clicking No will save the file with a unique file name.\n"
+"-  Clicking Cancel will abort the fetchcover operation."
+msgstr ""
+"Bildfilen %s finns redan.\n"
+"Den kan höra ihop med andra musikfiler i katalogen.\n"
+"\n"
+"-  Att klicka på Ja skriver över den befintliga filen, och kopplar kanske\n"
+"   ihop andra musikfiler i samma katalog med den här omslagsfilen.\n"
+"-  Att klicka på Nej sparar filen med ett unikt filnamn.\n"
+"-  Att klicka på Avbryt gör att omslagshämtningen avbryts."
+
+#: ../src/file.c:236
+#, c-format
+msgid ""
+"'%s' is a directory, not a playlist file.\n"
+"\n"
+msgstr ""
+"'%s' är en katalog, inte en spellistefil.\n"
+"\n"
+
+#: ../src/file.c:266
+#, c-format
+msgid ""
+"'%s' is a not a known playlist file.\n"
+"\n"
+msgstr ""
+"'%s' är inte en känd spellistefil.\n"
+"\n"
+
+#: ../src/file.c:283 ../src/file_export.c:217 ../src/oggfile.c:62
+#: ../src/wavfile.c:107
+#, c-format
+msgid "Could not open '%s' for reading.\n"
+msgstr "Kunde inte öppna '%s' för läsning.\n"
+
+#: ../src/file.c:369
+#, c-format
+msgid "Skipping '%s' because it is a directory.\n"
+msgstr "Hoppar över '%s' eftersom det är en katalog.\n"
+
+#: ../src/file.c:374
+#, c-format
+msgid "Skipping '%s' to avoid adding playlist file recursively\n"
+msgstr "Hoppar över '%s' för att undvika att spellistfiler läggs till rekursivt.\n"
+
+#: ../src/file.c:629
+#, c-format
+msgid "Unknown token '%s' in template '%s'\n"
+msgstr "Okänd beteckning '%s' i mallen '%s'\n"
+
+#: ../src/file.c:923
+#, c-format
+msgid "Local filename not valid (%s)"
+msgstr "Lokalt filnamn inte giltigt (%s)"
+
+#: ../src/file.c:982
+#, c-format
+msgid "No information found for user '%s' in '%s'"
+msgstr "Ingen information hittades för användaren '%s' i '%s'"
+
+#: ../src/file.c:991
+#, c-format
+msgid "mserv data file (%s) not available for track (%s)"
+msgstr "Datafilen från mserv (%s) är inte tillgänglig för spåret (%s)"
+
+#: ../src/file.c:999
+#, c-format
+msgid "Track (%s) not in mserv music root directory (%s)"
+msgstr "Spåret (%s) finns inte i mserv rotkatalog för musik (%s)"
+
+#: ../src/file.c:1123
+#, c-format
+msgid "The following track could not be processed (file does not exist): '%s'\n"
+msgstr "Följande spår kunde inte behandlas (filen finns inte): '%s'\n"
+
+#: ../src/file.c:1209
+#, c-format
+msgid "The following track could not be processed (filetype unknown): '%s'\n"
+msgstr "Följande spår kunde inte behandlas (filtypen okänd): '%s'\n"
+
+#: ../src/file.c:1307
+#, c-format
+msgid ""
+"The following track could not be processed (filetype is known but analysis "
+"failed): '%s'\n"
+msgstr ""
+"Följande spår kunde inte behandlas (filtypen känd, men analys misslyckades): "
+"'%s'\n"
+
+#: ../src/file.c:1337 ../src/file.c:1391
+msgid "Nothing to update"
+msgstr "Ingenting att uppdatera"
+
+#: ../src/file.c:1358
+#, c-format
+msgid "Updating %s"
+msgstr "Uppdaterar %s"
+
+#: ../src/file.c:1372
+msgid "Updated selected tracks with info from file."
+msgstr "Uppdaterar markerade spår med information från fil."
+
+#: ../src/file.c:1406
+#, c-format
+msgid "Retrieving mserv data %s"
+msgstr "Hämtar data från mserv %s"
+
+#: ../src/file.c:1411
+msgid "no filename available"
+msgstr "inget filnamn tillgängligt"
+
+#: ../src/file.c:1416
+msgid "Updated selected tracks with data from mserv."
+msgstr "Uppdaterar markerade spår med data från mserv."
+
+#: ../src/file.c:1437
+#, c-format
+msgid "The following track could not be updated"
+msgid_plural "The following %d tracks could not be updated"
+msgstr[0] "Följande spår kunde inte uppdateras"
+msgstr[1] "Följande %d spår kunde inte uppdateras"
+
+#. gint id,
+#. gboolean modal,
+#: ../src/file.c:1443
+msgid "Failed Track Update"
+msgstr "Uppdatering av spår misslyckades"
+
+#: ../src/file.c:1501
+#, c-format
+msgid "The following track has been updated"
+msgid_plural "The following %d tracks have been updated"
+msgstr[0] "Följande spår har uppdaterats"
+msgstr[1] "Följande %d spår har uppdaterats"
+
+#. gint id,
+#. gboolean modal,
+#: ../src/file.c:1507
+msgid "Successful Track Update"
+msgstr "Uppdatering av spår lyckades"
+
+#: ../src/file.c:1566
+#, c-format
+msgid "No mserv information could be retrieved for the following track"
+msgid_plural "No mserv information could be retrieved for the following %d tracks"
+msgstr[0] "Ingen information kunde hämtas från mserv för följande spår"
+msgstr[1] "Ingen information kunde hämtas från mserv för följande %d spår"
+
+#. gint id,
+#. gboolean modal,
+#: ../src/file.c:1572
+msgid "mserv data retrieval problem"
+msgstr "Problem att hämta data från mserv"
+
+#: ../src/file.c:1661
+msgid "no local filename available, file on the iPod will be used instead"
+msgstr "inget lokalt filnamn tillgängligt, filen på iPod används istället"
+
+#: ../src/file.c:1667
+msgid "no local filename available and copy on iPod cannot be found"
+msgstr "inget lokalt filnamn tillgängligt och kopian på iPod kan inte hittas"
+
+#: ../src/file.c:1671 ../src/file.c:1689
+msgid "no local filename available"
+msgstr "inget lokalt filnamn tillgängligt"
+
+#: ../src/file.c:1679
+msgid "local file could not be found, file on the iPod will be used instead"
+msgstr "den lokala filen kunde inte hittas, filen på iPod används istället"
+
+#: ../src/file.c:1685
+msgid "local file as well as copy on the iPod cannot be found"
+msgstr "den lokala filen samt kopian på iPod kan inte hittas"
+
+#. update not successful -- log this track for later display
+#: ../src/file.c:1788
+msgid "update failed (format not supported?)"
+msgstr "uppdatering misslyckades (formatet stöds kanske inte)"
+
+#: ../src/file.c:1873 ../src/misc_playlist.c:916
+#, c-format
+msgid "Processing '%s'..."
+msgstr "Behandlar '%s'..."
+
+#: ../src/file.c:1879
+#, c-format
+msgid "Skipping '%s' because it matches exclude masks.\n"
+msgstr "Hoppar över '%s' eftersom det motsvarar filmasker att utesluta.\n"
+
+#: ../src/file.c:1999 ../src/misc_track.c:1773 ../src/misc_track.c:1878
+#, c-format
+msgid ""
+"Podcast already present: '%s'\n"
+"\n"
+msgstr ""
+"Podradiosändning finns redan: '%s'\n"
+"\n"
+
+#: ../src/file.c:2064
+#, c-format
+msgid ""
+"Writing to video files not yet supported (%s).\n"
+"\n"
+msgstr ""
+"Att skriva till videofiler stöds inte än (%s).\n"
+"\n"
+
+#: ../src/file.c:2116 ../src/file.c:2130
+#, c-format
+msgid "Couldn't change tags of file: %s\n"
+msgstr "Kunde inte ändra taggar för filen: %s\n"
+
+#: ../src/file.c:2232
+#, c-format
+msgid "Could not open '%s' for reading and writing.\n"
+msgstr "Kunde inte öppna '%s' för läsning och skrivning.\n"
+
+#: ../src/file.c:2239
+#, c-format
+msgid "Could not obtain lock on '%s'.\n"
+msgstr "Kunde inte låsa '%s'.\n"
+
+#. error!
+#: ../src/file.c:2256 ../src/file.c:2265 ../src/file.c:2276 ../src/file.c:2286
+#, c-format
+msgid "Malformed line in '%s': %s\n"
+msgstr "Felaktig rad i '%s': %s\n"
+
+#. gint id,
+#. gboolean modal,
+#: ../src/file.c:2315
+msgid "Remove offline playcounts?"
+msgstr "Ta bort nerkopplade spelningsantal?"
+
+#. title
+#: ../src/file.c:2316
+msgid ""
+"Some tracks played offline could not be found in the iTunesDB. Press 'OK' to "
+"remove them from the offline playcount file, 'Cancel' to keep them."
+msgstr ""
+"Vissa spår som spelats i nerkopplat läge hittades inte i iTunes databas. "
+"Klicka på 'Ok' för att ta bort dem från filen med nerkopplade "
+"spelningsantal, eller 'Avbryt' för att behålla dem."
+
+#: ../src/file.c:2333
+#, c-format
+msgid "Error writing to '%s'.\n"
+msgstr "Fel vid skrivning till '%s'.\n"
+
+#: ../src/file.c:2390 ../src/tools.c:270
+#, c-format
+msgid ""
+"Normalization failed: file type not supported (%s).\n"
+"\n"
+msgstr ""
+"Normalisering misslyckades: Filtypen stöds inte (%s).\n"
+"\n"
+
+#: ../src/file.c:2406 ../src/tools.c:287
+#, c-format
+msgid ""
+"Normalization failed: file not available (%s).\n"
+"\n"
+msgstr ""
+"Normalisering misslyckades: Filen inte tillgänglig (%s).\n"
+"\n"
+
+#: ../src/file_convert.c:316
+msgid "Summary status of conversion processes"
+msgstr "Sammanfattning av konverteringsprocessens status"
+
+#: ../src/file_convert.c:564
+msgid "active"
+msgstr "aktiv"
+
+#: ../src/file_convert.c:569
+msgid "inactive"
+msgstr "inaktiv"
+
+#: ../src/file_convert.c:580
+#, c-format
+msgid "Active threads: %d. Scheduled tracks: %d."
+msgstr "Aktiva trådar: %d. Schemalagda spår: %d."
+
+#: ../src/file_convert.c:1071
+#, c-format
+msgid "Original filename not available for '%s.'\n"
+msgstr "Originalfilnamnet inte tillgängligt för '%s'.\n"
+
+#: ../src/file_convert.c:1086
+#, c-format
+msgid "Filename '%s' is no longer valid for '%s'.\n"
+msgstr "Filnamnet '%s' är inte längre giltigt för '%s'.\n"
+
+#: ../src/file_convert.c:1137
+msgid "Ogg Vorbis"
+msgstr "Ogg Vorbis"
+
+#: ../src/file_convert.c:1143
+msgid "FLAC"
+msgstr "FLAC"
+
+#: ../src/file_convert.c:1198
+#, c-format
+msgid ""
+"Files of type '%s' are not supported by the iPod. Please go to the "
+"Preferences to set up and turn on a suitable conversion script for '%s'.\n"
+"\n"
+msgstr ""
+"Filer med typen '%s' stöds inte av iPod. Gå till inställningarna för att "
+"ställa in och aktivera ett lämpligt konverteringsskript för '%s'.\n"
+"\n"
+
+#: ../src/file_convert.c:1284
+msgid "No information available"
+msgstr "Ingen information tillgänglig"
+
+#: ../src/file_convert.c:1323
+#, c-format
+msgid "Could not create '%s'. Filetype conversion will not work.\n"
+msgstr "Kunde inte skapa '%s'. Konvertering av filtyp kommer inte att fungera.\n"
+
+#: ../src/file_convert.c:1641 ../src/file_convert.c:3049
+#, c-format
+msgid ""
+"Transfer of '%s' failed. %s\n"
+"\n"
+msgstr ""
+"Överföring av '%s' misslyckades. %s\n"
+"\n"
+
+#: ../src/file_convert.c:2047 ../src/file_convert.c:2325
+#, c-format
+msgid ""
+"Conversion of '%s' failed: '%s'.\n"
+"\n"
+msgstr ""
+"Konvertering av '%s' misslyckades: '%s'.\n"
+"\n"
+
+#: ../src/file_convert.c:2062
+#, c-format
+msgid ""
+"Conversion of '%s' failed: '%s %s' returned exit status %d.\n"
+"\n"
+msgstr ""
+"Konvertering av '%s' misslyckades: '%s %s' returnerade status %d.\n"
+"\n"
+
+#: ../src/file_convert.c:2091
+#, c-format
+msgid ""
+"Conversion of '%s' failed: '\"%s\" %s' did not return filename extension as "
+"expected.\n"
+"\n"
+msgstr ""
+"Konvertering av '%s' misslyckades: '\"%s\" %s' returnerade inte "
+"filnamnsändelse som förväntat.\n"
+"\n"
+
+#: ../src/file_convert.c:2167
+#, c-format
+msgid ""
+"Conversion of '%s' failed: Could not access original file '%s' (%s).\n"
+"\n"
+msgstr ""
+"Körning av '%s' misslyckades: Kunde inte komma åt originalfil '%s' (%s).\n"
+"\n"
+
+#: ../src/file_convert.c:2222
+#, c-format
+msgid ""
+"Conversion of '%s' failed: Could not create directory '%s'.\n"
+"\n"
+msgstr ""
+"Konvertering av '%s'misslyckades: Kunde inte skapa katalogen '%s'.\n"
+"\n"
+
+#: ../src/file_convert.c:2356
+#, c-format
+msgid ""
+"Conversion of '%s' failed: '%s' returned exit status %d.\n"
+"\n"
+msgstr ""
+"Konvertering av '%s'misslyckades: '%s' returnerade status %d.\n"
+"\n"
+
+#: ../src/file_convert.c:2395
+#, c-format
+msgid ""
+"Conversion of '%s' failed: could not stat the converted file '%s'.\n"
+"\n"
+msgstr ""
+"Konvertering av '%s'misslyckades: kunde inte hämta information för den "
+"konverterade filen '%s'.\n"
+"\n"
+
+#: ../src/file_export.c:182
+#, c-format
+msgid "Skipping existing file with same length: '%s'\n"
+msgstr "Hoppar över befintlig fil med samma längd: '%s'\n"
+
+#: ../src/file_export.c:190
+#, c-format
+msgid "Overwriting existing file: '%s'\n"
+msgstr "Skriver över befintlig fil: '%s'\n"
+
+#: ../src/file_export.c:207
+#, c-format
+msgid "Error copying '%s' to '%s': Permission Error (%s)\n"
+msgstr "Fel vid kopiering av '%s' till '%s': Fel i rättigheter (%s)\n"
+
+#: ../src/file_export.c:209
+#, c-format
+msgid "Error copying '%s' to '%s' (%s)\n"
+msgstr "Fel vid kopiering av '%s' till '%s' (%s)\n"
+
+#: ../src/file_export.c:327
+#, c-format
+msgid "Could find file for '%s' on the iPod\n"
+msgstr "Kunde hitta fil för '%s' på iPod\n"
+
+#. create the dialog window
+#: ../src/file_export.c:395 ../src/tools.c:360
+msgid "Information"
+msgstr "Information"
+
+#: ../src/file_export.c:406 ../src/tools.c:372
+msgid "Press button to abort."
+msgstr "Tryck på knappen för att avbryta."
+
+#: ../src/file_export.c:419
+msgid "copying..."
+msgstr "kopierar..."
+
+#: ../src/file_export.c:476
+#, c-format
+msgid "Failed to write '%s-%s'\n"
+msgstr "Misslyckades skriva '%s-%s'\n"
+
+#: ../src/file_export.c:489
+#, c-format
+msgid "Copied %d of %d track."
+msgid_plural "Copied %d of %d tracks."
+msgstr[0] "Kopierade %d av %d spår."
+msgstr[1] "Kopierade %d av %d spår."
+
+#: ../src/file_export.c:505 ../src/tools.c:518
+#, c-format
+msgid "%d%% (%d:%02d:%02d left)"
+msgstr "%d%% (%d:%02d:%02d kvar)"
+
+#: ../src/file_export.c:514
+msgid "Some tracks were not copied."
+msgstr "Några spår kopierades inte."
+
+#: ../src/file_export.c:579
+msgid "Export from iPod database not possible in offline mode."
+msgstr "Export från iPod-databasen är inte möjlig i nerkopplat läge."
+
+#: ../src/file_export.c:587
+msgid "Select Export Destination Directory"
+msgstr "Välj målkatalog för export"
+
+#: ../src/file_export.c:736
+msgid "Drag from iPod database not possible in offline mode."
+msgstr "Att dra från iPod-databasen är inte möjlig i nerkopplat läge."
+
+#: ../src/file_export.c:770
+msgid "The following tracks have to be copied to your harddisk"
+msgstr "Följande spår måste kopieras till din hårddisk"
+
+#: ../src/file_export.c:815
+msgid ""
+"Some tracks were not copied to your harddisk. Only the copied tracks will be "
+"included in the current drag and drop operation.\n"
+"\n"
+msgstr ""
+"Vissa spår kopierades inte till din hårddisk. Bara de kopierade spåren "
+"kommer att ingå i den nuvarande drag och släpp åtgärden.\n"
+"\n"
+
+#: ../src/file_export.c:1010
+#, c-format
+msgid ""
+"No valid filename for: %s\n"
+"\n"
+msgstr ""
+"Inget giltigt filnamn för: %s\n"
+"\n"
+
+#: ../src/file_export.c:1026
+#, c-format
+msgid "Created playlist with one track."
+msgid_plural "Created playlist with %d tracks."
+msgstr[0] "Skapade spellista med ett spår."
+msgstr[1] "Skapade spellista med %d spår."
+
+#: ../src/file_export.c:1031
+#, c-format
+msgid ""
+"Could not open '%s' for writing (%s).\n"
+"\n"
+msgstr ""
+"Kunde inte öppna '%s' för skrivning (%s).\n"
+"\n"
+
+#: ../src/file_itunesdb.c:129
+#, c-format
+msgid "Matching SHA1 checksum for file %d/%d"
+msgstr "Matchande SHA1-checksumma för filen %d/%d"
+
+#: ../src/file_itunesdb.c:236
+#, c-format
+msgid "Could not open \"%s\" for reading extended info.\n"
+msgstr "Kunde inte öppna \"%s\" för att läsa utökad information.\n"
+
+#: ../src/file_itunesdb.c:243
+msgid "Could not create hash value from itunesdb\n"
+msgstr "Kunde inte skapa checksumma från itunesdb\n"
+
+#: ../src/file_itunesdb.c:259
+#, c-format
+msgid "Error while reading extended info: %s\n"
+msgstr "Fel vid läsning av utökad information: %s\n"
+
+#: ../src/file_itunesdb.c:276
+#, c-format
+msgid ""
+"iTunesDB '%s' does not match checksum in extended information file '%s'\n"
+"gtkpod will try to match the information using SHA1 checksums. This may take "
+"a long time.\n"
+"\n"
+msgstr ""
+"Checksumman för iTunes databas '%s' stämmer inte med den i filen '%s' med "
+"utökad information.\n"
+"Ett försök görs av gtkpod att passa ihop informationen med SHA1-checksummor. "
+"Det kan ta lång tid.\n"
+"\n"
+
+#: ../src/file_itunesdb.c:288
+#, c-format
+msgid ""
+"%s:\n"
+"Expected \"itunesdb_hash=\" but got:\"%s\"\n"
+msgstr ""
+"%s:\n"
+"Förväntande \"itunesdb_hash=\", men hittade \"%s\"\n"
+
+#: ../src/file_itunesdb.c:348
+#, c-format
+msgid ""
+"%s:\n"
+"Format error: %s\n"
+msgstr ""
+"%s:\n"
+"Formatfel: %s\n"
+
+#: ../src/file_itunesdb.c:393
+msgid ""
+"No SHA1 checksums on individual tracks are available.\n"
+"\n"
+"To avoid this situation in the future either switch on duplicate detection "
+"(will provide SHA1 checksums) or avoid using the iPod with programs other "
+"than gtkpod.\n"
+"\n"
+msgstr ""
+"Inga SHA1-checksummor är tillgängliga för enskilda spår.\n"
+"\n"
+"För att undvika situationen i framtiden, aktivera antingen detektering av "
+"duplikat (som tillhandahåller SHA1-checksummor) eller undvik att använda "
+"iPod med andra program än gtkpod.\n"
+"\n"
+
+#: ../src/file_itunesdb.c:457
+msgid ""
+"Extended info will not be used. If you have non-transferred tracks,\n"
+"these will be lost.\n"
+msgstr ""
+"Utökad information kommer inte att användas. Om\n"
+"du har spår som inte överförts, går de förlorade.\n"
+
+#: ../src/file_itunesdb.c:465
+msgid "Offline iPod database successfully imported"
+msgstr "Nerkopplad iPod-databas importerad med lyckat resultat"
+
+#: ../src/file_itunesdb.c:468
+msgid "Local database successfully imported"
+msgstr "Lokal databas importerad med lyckat resultat"
+
+#: ../src/file_itunesdb.c:476
+#, c-format
+msgid ""
+"Offline iPod database import failed: '%s'\n"
+"\n"
+msgstr ""
+"Import av nerkopplad iPod-databas misslyckades: '%s'\n"
+"\n"
+
+#: ../src/file_itunesdb.c:480
+#, c-format
+msgid ""
+"Local database import failed: '%s'\n"
+"\n"
+msgstr ""
+"Import av lokal databas misslyckades: '%s'\n"
+"\n"
+
+#: ../src/file_itunesdb.c:487
+msgid ""
+"Offline iPod database import failed: \n"
+"\n"
+msgstr ""
+"Import av nerkopplad iPod-databas misslyckades: \n"
+"\n"
+
+#: ../src/file_itunesdb.c:490
+msgid ""
+"Local database import failed: \n"
+"\n"
+msgstr ""
+"Import av lokal databas misslyckades: \n"
+"\n"
+
+#: ../src/file_itunesdb.c:497
+#, c-format
+msgid ""
+"'%s' does not exist. Import aborted.\n"
+"\n"
+msgstr ""
+"'%s' finns inte. Import avbruten.\n"
+"\n"
+
+#: ../src/file_itunesdb.c:520
+msgid "Extended info will not be used.\n"
+msgstr "Utökad information kommer inte att användas.\n"
+
+#: ../src/file_itunesdb.c:527
+msgid "iPod Database Successfully Imported"
+msgstr "iPod-databasen importerad med lyckat resultat"
+
+#: ../src/file_itunesdb.c:534
+#, c-format
+msgid ""
+"iPod Database Import Failed: '%s'\n"
+"\n"
+msgstr ""
+"Import av iPod-databasen misslyckades: '%s'\n"
+"\n"
+
+#: ../src/file_itunesdb.c:540
+msgid ""
+"iPod Database Import Failed.\n"
+"\n"
+msgstr ""
+"Import av iPod-databasen misslyckades.\n"
+"\n"
+
+#: ../src/file_itunesdb.c:549
+#, c-format
+msgid ""
+"'%s' (or similar) does not exist. Import aborted.\n"
+"\n"
+msgstr ""
+"'%s' (eller liknande) finns inte. Import avbruten.\n"
+"\n"
+
+#: ../src/file_itunesdb.c:865
+#, c-format
+msgid ""
+"Could not find iPod directory structure at '%s'.\n"
+"If you are sure that the iPod is properly mounted at '%s', gtkpod can create "
+"the directory structure for you.\n"
+"\n"
+"Do you want to create the directory structure now?\n"
+msgstr ""
+"Kunde inte hitta iPod-katalogstrykturen på '%s'.\n"
+"Om du är säker på att din iPod är riktigt monterad på %s', kan gtkpod skapa "
+"katalogstrukturen åt dig.\n"
+"\n"
+"Vill du skapa katalogstrukturen nu?\n"
+
+#: ../src/file_itunesdb.c:1180
+#, c-format
+msgid "Could not open \"%s\" for writing extended info.\n"
+msgstr "Kunde inte öppna \"%s\" för att skriva utökad information.\n"
+
+#: ../src/file_itunesdb.c:1195
+msgid "Aborted writing of extended info.\n"
+msgstr "Avbröt skrivning av utökad information.\n"
+
+#: ../src/file_itunesdb.c:1397
+#, c-format
+msgid "%d%%"
+msgstr "%d %%"
+
+#: ../src/file_itunesdb.c:1411
+#, c-format
+msgid "%d%% (%d/%d  %d:%02d:%02d left)"
+msgstr "%d %% (%d/%d  %d:%02d:%02d kvar)"
+
+#: ../src/file_itunesdb.c:1463
+msgid "Status: Deleting File"
+msgstr "Status: Tar bort fil"
+
+#: ../src/file_itunesdb.c:1524
+#, c-format
+msgid ""
+"Could not remove the following file: '%s'\n"
+"\n"
+msgstr ""
+"Kunde inte ta bort följande fil: '%s'\n"
+"\n"
+
+#: ../src/file_itunesdb.c:1632
+msgid ""
+"The following track could not be converted successfully:\n"
+"\n"
+msgid_plural ""
+"The following tracks could not be converted successfully:\n"
+"\n"
+msgstr[0] ""
+"Följande spår kunde inte konverteras med lyckat resultat:\n"
+"\n"
+msgstr[1] ""
+"Följande spår kunde inte konverteras med lyckat resultat:\n"
+"\n"
+
+#: ../src/file_itunesdb.c:1642
+msgid ""
+"The following track could not be transferred successfully:\n"
+"\n"
+msgid_plural ""
+"The following tracks could not be transferred successfully:\n"
+"\n"
+msgstr[0] ""
+"Följande spår kunde inte överföras med lyckat resultat:\n"
+"\n"
+msgstr[1] ""
+"Följande spår kunde inte överföras med lyckat resultat:\n"
+"\n"
+
+#. ID
+#. modal,
+#. gint id,
+#. gboolean modal,
+#: ../src/file_itunesdb.c:1651 ../src/misc_confirm.c:70
+msgid "Warning"
+msgstr "Varning"
+
+#. title
+#: ../src/file_itunesdb.c:1652
+msgid ""
+"The iPod could not be ejected. Please fix the problems mentioned below and "
+"then eject the iPod again. Pressing 'OK' will re-schedule the failed tracks "
+"for conversion and transfer."
+msgstr ""
+"Kunde inte mata ut iPod. Rätta problemen som nämns nedan och mata därefter "
+"ut iPod igen. Att klicka på 'Ok' gör att misslyckade spår schemaläggs för "
+"konvertering och överföring igen."
+
+#: ../src/file_itunesdb.c:1715
+#, c-format
+msgid "Status: Copying track"
+msgstr "Status: Kopierar spår"
+
+#: ../src/file_itunesdb.c:1721
+#, c-format
+msgid "Status: Waiting for conversion to complete"
+msgstr "Status: Väntar på att konvertering ska bli klar"
+
+#: ../src/file_itunesdb.c:1725
+#, c-format
+msgid "Status: Finished transfer"
+msgstr "Status: Överföring klar"
+
+#: ../src/file_itunesdb.c:1770
+#, c-format
+msgid ""
+"One track could not be transferred because your iPod is full. Either delete "
+"some tracks or otherwise create space on the iPod before ejecting the iPod "
+"again."
+msgid_plural ""
+"%d tracks could not be transferred because your iPod is full. Either delete "
+"some tracks or otherwise create space on the iPod before ejecting the iPod "
+"again."
+msgstr[0] ""
+"Ett spår kunde inte överföras eftersom iPod är full. Ta antingen bort några "
+"spår eller skapa utrymme på iPod på något annat sätt innan iPod matas ut "
+"igen."
+msgstr[1] ""
+"Ett spår kunde inte överföras eftersom iPod är full. Ta antingen bort några "
+"spår eller skapa utrymme på iPod på något annat sätt innan iPod matas ut "
+"igen."
+
+#: ../src/file_itunesdb.c:1852
+#, c-format
+msgid ""
+"You did not import the existing iTunesDB ('%s'). This is most likely "
+"incorrect and will result in the loss of the existing database.\n"
+"\n"
+"Press 'OK' if you want to proceed anyhow or 'Cancel' to skip storing. If you "
+"cancel, you can import the existing database before calling this function "
+"again.\n"
+msgstr ""
+"Du importerade inte befintlig iTunes databas ('%s'). Det är troligtvis "
+"felaktigt och orsakar förlust av den befintliga databasen.\n"
+"\n"
+"Klicka på 'Ok' om du vill fortsätta ändå eller 'Avbryt' för att avbryta "
+"lagringen. Om du avbryter, kan du importera befintlig databas innan du "
+"använder den här funktionen igen.\n"
+
+#: ../src/file_itunesdb.c:1887
+msgid ""
+"iPod directory structure must be present before synching to the iPod can be "
+"performed.\n"
+msgstr ""
+"Katalogstrukturen i iPod måste finnas innan synkronisering av iPod kan "
+"utföras.\n"
+
+#: ../src/file_itunesdb.c:1896
+msgid "Some tracks could not be deleted from the iPod. Export aborted!"
+msgstr "Vissa spår kunde inte tas bort från iPod. Export avbruten."
+
+#: ../src/file_itunesdb.c:1914
+#, c-format
+msgid "Now writing database '%s'. Please wait..."
+msgstr "Skriver nu databas '%s'. Vänta..."
+
+#: ../src/file_itunesdb.c:1963
+#, c-format
+msgid "Extended information file not deleted: '%s'"
+msgstr "Filen med utökad information inte borttagen: '%s'"
+
+#: ../src/file_itunesdb.c:2070
+#, c-format
+msgid "%s: Database saved"
+msgstr "%s: Databas sparad"
+
+#: ../src/file_itunesdb.c:2074
+#, c-format
+msgid "%s: Changes saved"
+msgstr "%s: Ändringar sparade"
+
+#: ../src/fileselection.c:129
+msgid "Successfully added files"
+msgstr "Filer tillagda med lyckat resultat"
+
+#: ../src/fileselection.c:131
+msgid "Some files were not added successfully"
+msgstr "Vissa filer kunde inte läggas till med lyckat resultat"
+
+#: ../src/fileselection.c:164 ../src/fileselection.c:305
+#: ../src/fileselection.c:792
+msgid "Please select a playlist or repository before adding tracks."
+msgstr "Välj en spellista eller arkiv innan spår läggs till."
+
+#: ../src/fileselection.c:175 ../src/fileselection.c:314
+#: ../src/fileselection.c:803
+msgid "Please load the iPod before adding tracks."
+msgstr "Ladda iPod innan spår läggs till."
+
+#: ../src/fileselection.c:185
+#, c-format
+msgid "Add files to '%s'"
+msgstr "Lägg till filer i '%s'"
+
+#: ../src/fileselection.c:189
+#, c-format
+msgid "Add files to '%s/%s'"
+msgstr "Lägg till filer i '%s/%s'"
+
+#. Create window title
+#: ../src/fileselection.c:322
+#, c-format
+msgid "Add playlist files to '%s'"
+msgstr "Lägg till spellistefiler i '%s'"
+
+#. Create the file chooser, and handle the response
+#: ../src/fileselection.c:378
+msgid "Set Cover"
+msgstr "Ange omslag"
+
+#: ../src/fileselection.c:816
+#, c-format
+msgid "Add directories to '%s'"
+msgstr "Lägg till kataloger i '%s'"
+
+#: ../src/fileselection.c:820
+#, c-format
+msgid "Add directories to '%s/%s'"
+msgstr "Lägg till kataloger i '%s/%s'"
+
+#: ../src/fileselection.c:1097
+msgid "Ok"
+msgstr "Ok"
+
+#: ../src/fileselection.c:1106
+msgid "Cancel"
+msgstr "Avbryt"
+
+#: ../src/flacfile.c:62
+#, c-format
+msgid "'%s' does not appear to be an FLAC audio file.\n"
+msgstr "'%s' verkar inte vara en FLAC-ljudfil.\n"
+
+#: ../src/flacfile.c:78
+#, c-format
+msgid "Error retrieving tags for '%s'.\n"
+msgstr "Fel vid hämtning av taggar för '%s'.\n"
+
+#: ../src/flacfile.c:165
+#, c-format
+msgid ""
+"Import of '%s' failed: FLAC not supported without the FLAC library. You must "
+"compile the gtkpod source together with the FLAC library.\n"
+msgstr ""
+"Import av '%s' misslyckades: FLAC stöds inte utan FLAC-biblioteket. Du måste "
+"kompilera källkoden för gtkpod tillsammans med FLAC-biblioteket.\n"
+
+#: ../src/flacfile.c:171
+#, c-format
+msgid ""
+"FLAC metadata update for '%s' failed: FLAC not supported without the FLAC "
+"library. You must compile the gtkpod source together with the FLAC library.\n"
+msgstr ""
+"Uppdatering av FLAC metadata för '%s' misslyckades: FLAC stöds inte utan "
+"FLAC-biblioteket. Du måste kompilera källkoden för gtkpod tillsammans med "
+"FLAC-biblioteket.\n"
+
+#: ../src/getopt.c:681
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: väljaren '%s' är tvetydig\n"
+
+#: ../src/getopt.c:706
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: väljaren `--%s' tillåter inte något argument\n"
+
+#: ../src/getopt.c:711
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: väljaren `%c%s' tillåter inte något argument\n"
+
+#: ../src/getopt.c:729 ../src/getopt.c:902
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: väljaren `%s' kräver ett argument\n"
+
+#. --option
+#: ../src/getopt.c:758
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: väljaren '--%s' känns inte igen\n"
+
+#. +option or -option
+#: ../src/getopt.c:762
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: väljaren '%c%s' känns inte igen\n"
+
+#. 1003.2 specifies the format of this message.
+#: ../src/getopt.c:788
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: felaktig väljare --%c\n"
+
+#: ../src/getopt.c:791
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: ogiltig väljare -- %c\n"
+
+#. 1003.2 specifies the format of this message.
+#: ../src/getopt.c:821 ../src/getopt.c:951
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: väljaren kräver ett argument --%c\n"
+
+#: ../src/getopt.c:868
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: väljaren `-W %s' är tvetydig\n"
+
+#: ../src/getopt.c:886
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: väljaren `-W %s' tillåter inte något argument\n"
+
+#: ../src/info.c:383
+msgid "n/c"
+msgstr "okänt"
+
+#: ../src/info.c:388 ../src/info.c:838
+msgid "offline"
+msgstr "nerkopplad"
+
+#: ../src/info.c:486
+#, c-format
+msgid " P:%d T:%d/%d"
+msgstr " L:%d S:%d/%d"
+
+#: ../src/info.c:780
+msgid "B"
+msgstr "byte"
+
+#: ../src/info.c:780
+msgid "kB"
+msgstr "Kibyte"
+
+#: ../src/info.c:780
+msgid "TB"
+msgstr "Tibyte"
+
+#: ../src/info.c:823
+#, c-format
+msgid " %s Free"
+msgstr " %s fritt"
+
+#: ../src/info.c:828
+#, c-format
+msgid " %s Pending"
+msgstr " %s återstår"
+
+#: ../src/info.c:833
+msgid " disconnected"
+msgstr " nerkopplad"
+
+#: ../src/info.c:884
+msgid "No database or playlist selected"
+msgstr "Ingen databas eller spellista markerad"
+
+#: ../src/info.c:889
+msgid "No tracks selected"
+msgstr "Inga spår markerade"
+
+#: ../src/info.c:894
+msgid "No playlist selected"
+msgstr "Ingen spellista markerad"
+
+#: ../src/info.c:899
+msgid "No iPod or iPod playlist selected"
+msgstr "Ingen iPod eller iPod-spellista markerad"
+
+#. Strings used several times
+#: ../src/ipod_init.c:48
+msgid "Select or enter your model"
+msgstr "Välj eller skriv in modell"
+
+#: ../src/ipod_init.c:79 ../src/repository.c:546 ../src/repository.c:2369
+msgid "Select mountpoint"
+msgstr "Markera monteringspunkt"
+
+#: ../src/ipod_init.c:359
+#, c-format
+msgid "Error initialising iPod: %s\n"
+msgstr "Fel vid initiering av iPod: %s\n"
+
+#: ../src/ipod_init.c:366
+msgid "Error initialising iPod, unknown error\n"
+msgstr "Fel vid initiering av iPod: okänt fel\n"
+
+#: ../src/ipod_init.c:422
+#, c-format
+msgid "<b>Please select your iPod model at </b><i>%s</i>"
+msgstr "<b>Välj iPod-modell på </b><i>%s</i>"
+
+#: ../src/ipod_init.c:463
+msgid ""
+"Could not determine the model you selected -- this could be a bug or "
+"incompatibilty in the GTK+ or glade library.\n"
+"\n"
+msgstr ""
+"Kunde inte avgöra vald modell: Detta kan vara ett fel eller en "
+"inkompatibilitet i biblioteken GTK+ eller glade.\n"
+
+#: ../src/misc.c:70
+msgid ""
+"© 2002 - 2007\n"
+"Jorg Schuler (jcsjcs at users dot sourceforge dot net)\n"
+"Corey Donohoe (atmos at atmos dot org)\n"
+msgstr ""
+"© 2002 - 2007\n"
+"Jorg Schuler (jcsjcs snabela users punkt sourceforge punkt net)\n"
+"Corey Donohoe (atmos snabela atmos punkt org)\n"
+
+#: ../src/misc.c:74
+msgid ""
+"Patches were supplied by the following people (list may be incomplete -- "
+"please contact me)\n"
+msgstr ""
+"Programfixar har tillhandahållits av följande personer (listan kan vara "
+"ofullständig: kontakta mig då gärna)\n"
+
+#: ../src/misc.c:75
+msgid "Ramesh Dharan: Multi-Edit (edit tags of several tracks in one run)"
+msgstr "Ramesh Dharan: Redigera flera (redigera taggar för flera spår på en gång)"
+
+#: ../src/misc.c:76
+msgid "Hiroshi Kawashima: Japanese charset autodetection feature"
+msgstr ""
+"Hiroshi Kawashima: Funktion för automatisk detektering av japansk "
+"teckenkodning"
+
+#: ../src/misc.c:77
+msgid "Adrian Ulrich: porting of playlist code from mktunes.pl to itunesdb.c"
+msgstr "Adrian Ulrich: överföring av spellistans kod från mktunes.pl till itunesdb.c"
+
+#: ../src/misc.c:78
+msgid ""
+"Walter Bell: correct handling of DND URIs with escaped characters and/or cr/"
+"newlines at the end"
+msgstr ""
+"Walter Bell: riktig hantering av drag och släpp information med "
+"specialtecken och/eller returtecken/nyrader i slutet"
+
+#: ../src/misc.c:79
+msgid "Sam Clegg: user defined filenames when exporting tracks from the iPod"
+msgstr "Sam Clegg: användardefinierade filnamn vid export av spår från iPod"
+
+#: ../src/misc.c:80
+msgid "Chris Cutler: automatic creation of various playlist types"
+msgstr "Chris Cutler: skapa olika sorters spellistor automatiskt"
+
+#: ../src/misc.c:81
+msgid ""
+"Graeme Wilford: reading and writing of the 'Composer' ID3 tags, progress "
+"dialogue during sync"
+msgstr ""
+"Graeme Wilford: läsning och skrivning av ID3-taggar för 'Kompositör', "
+"förloppsdialog under synkronisering"
+
+#: ../src/misc.c:82
+msgid ""
+"Edward Matteucci: debugging, special playlist creation, most of the volume "
+"normalizing code"
+msgstr ""
+"Edward Matteucci: felsökning, skapa speciella spellistor, den största delen "
+"av koden för volymnormalisering"
+
+#: ../src/misc.c:83
+msgid "Jens Lautenbach: some optical improvements"
+msgstr "Jens Lautenbach: några visuella förbättringar"
+
+#: ../src/misc.c:84
+msgid "Alex Tribble: iPod eject patch"
+msgstr "Alex Tribble: programfix för att mata ut iPod"
+
+#: ../src/misc.c:85
+msgid "Yaroslav Halchenko: Orphaned and dangling tracks handling"
+msgstr "Yaroslav Halchenko: hantering av övergivna filer och saknade spår"
+
+#: ../src/misc.c:86
+msgid "Andrew Huntwork: Filename case sensitivity fix and various other bugfixes"
+msgstr ""
+"Andrew Huntwork: rättning av skiftlägeskänsliga filnamn och diverse andra "
+"felrättningar"
+
+#: ../src/misc.c:87
+msgid ""
+"Ero Carrera: Filename validation and quick sync when copying tracks from the "
+"iPod"
+msgstr ""
+"Ero Carrera: validering av filnamn och snabbsynkronisering när spår kopieras "
+"från iPod"
+
+#: ../src/misc.c:88
+msgid "Jens Taprogge: Support for LAME's replay gain tag to normalize volume"
+msgstr ""
+"Jens Taprogge: stöd för spelningsnivåtagg från LAME vid normalisering av "
+"volym"
+
+#: ../src/misc.c:89
+msgid "Armando Atienza: Support with external playcounts"
+msgstr "Armando Atienza: stöd med externa spelningsantal"
+
+#: ../src/misc.c:90
+msgid "D.L. Sharp: Support for m4b files (bookmarkable AAC files)"
+msgstr "D.L. Sharp: stöd för m4b-filer (AAC-filer med bokmärken)"
+
+#: ../src/misc.c:91
+msgid "Jim Hall: Decent INSTALL file"
+msgstr "Jim Hall: hygglig INSTALL-fil"
+
+#: ../src/misc.c:92
+msgid ""
+"Juergen Helmers, Markus Gaugusch: Conversion scripts to sync calendar/"
+"contacts to the iPod"
+msgstr ""
+"Juergen Helmers, Markus Gaugusch: konverteringsskript för att synkronisera "
+"kalender och kontakter i iPod"
+
+#. J"urgen!
+#: ../src/misc.c:93
+msgid "Flavio Stanchina: bugfixes"
+msgstr "Flavio Stanchina: felrättningar"
+
+#: ../src/misc.c:94
+msgid ""
+"Chris Micacchi: when sorting ignore 'the' and similar at the beginning of "
+"the title"
+msgstr "Chris Micacchi: ignorera 'the' och liknande i titelns början vid sortering"
+
+#: ../src/misc.c:95
+msgid "Steve Jay: use statvfs() instead of df (better portability, faster)"
+msgstr "Steve Jay: använd statvfs() istället för df (bättre flyttbarhet, snabbare)"
+
+#: ../src/misc.c:97
+msgid ""
+"Christoph Kunz: address compatibility issues when writing id3v2.4 type mp3 "
+"tags"
+msgstr ""
+"Christoph Kunz: hantering av kompatibilitetsfrågor när MP3-taggar av typ "
+"id3v2.4 skrivs"
+
+#: ../src/misc.c:99
+msgid ""
+"James Liggett:\n"
+"replacement of old GTK file selection dialogs with new GTK filechooser "
+"dialogs\n"
+"refactored user preferences system."
+msgstr ""
+"James Ligget:\n"
+"ersättning av gamla GTK dialogrutor för filmarkering med nya GTK\n"
+"dialogrutor för filval, omgjort system för användarinställningar."
+
+#: ../src/misc.c:103
+msgid "Daniel Kercher: sync scripts for abook and webcalendar"
+msgstr "Daniel Kercher: synkroniseringsskript för abook och webbkalender"
+
+#: ../src/misc.c:105
+msgid "Clinton Gormley: sync scripts for thunderbird"
+msgstr "Clinton Gormley: synkroniseringsskript för thunderbird"
+
+#: ../src/misc.c:107
+msgid "Sebastien Beridot: sync script for ldif addressbook format"
+msgstr "Sebastien Beridot: synkroniseringsskript för LDIF-adressboksformat"
+
+#: ../src/misc.c:109
+msgid "Sebastian Scherer: sync script for kNotes"
+msgstr "Sebastian Scherer: synkroniseringsskript för Knotes"
+
+#: ../src/misc.c:111
+msgid "Nick Piper: sync script for Palm, type-ahead search"
+msgstr "Nick Piper: synkroniseringsskript för Palm, sökning under inskrivning"
+
+#: ../src/misc.c:113
+msgid "Uwe Hermann: help with support for iPod Video"
+msgstr "Uwe Hermann: hjälp med stöd för iPod-video"
+
+#: ../src/misc.c:115
+msgid ""
+"Iain Benson: support for compilation tag in mp3 files and separate display "
+"of compilations in the sort tab."
+msgstr ""
+"Iain Benson: stöd för samlingstaggen i mp3-filer och separat visning av "
+"samlingar i sorteringsfliken."
+
+#: ../src/misc.c:116
+msgid ""
+"Nicolas Chariot: icons of buttons\n"
+"\n"
+msgstr ""
+"Nicolas Chariot: ikoner för knappar\n"
+"\n"
+
+#: ../src/misc.c:118
+msgid "This program borrows code from the following projects:"
+msgstr "Detta program lånar kod från följande projekt:"
+
+#: ../src/misc.c:119
+msgid ""
+"gnutools: (mktunes.pl, ported to C) reading and writing of iTunesDB  (http://"
+"www.gnu.org/software/gnupod/)"
+msgstr ""
+"gnutools: (mktunes.pl, överförd till C) läsning och skrivning av iTunes "
+"databas (http://www.gnu.org/software/gnupod/)"
+
+#: ../src/misc.c:120
+msgid ""
+"iPod.cpp, iPod.h by Samuel Wood (sam dot wood at gmail dot com): some code "
+"for smart playlists is based on his C++-classes."
+msgstr ""
+"iPod.cpp, iPod.h av Samuel Wood (sam punkt wood snabela gmail punkt "
+"com): viss kod för smarta spellistor är baserad på hans C++ klasser."
+
+#: ../src/misc.c:121
+msgid "mp3info: mp3 playlength detection (http://ibiblio.org/mp3info/)"
+msgstr "mp3info: detektering av MP3-spelningslängd (http://ibiblio.org/mp3info/)"
+
+#: ../src/misc.c:122
+msgid "xmms: dirbrowser, mp3 playlength detection (http://www.xmms.org)"
+msgstr ""
+"xmms: katalogbläddring, detektering av MP3-spelningslängd "
+"(http://www.xmms.org)"
+
+#: ../src/misc.c:124
+msgid "The GUI was created with the help of glade-2 (http://glade.gnome.org/)."
+msgstr "Det grafiska gränssnittet skapades med hjälp av glade-2 (http://glade.gnome.org/)."
+
+#: ../src/misc.c:128
+msgid "French: David Le Brun (david at dyn-ns dot net)"
+msgstr "Franska: David Le Brun (david snabela dyn-ns punkt net)"
+
+#: ../src/misc.c:129
+msgid "French: Éric Lassauge (rpmfarm at free dot fr)"
+msgstr "Franska: Éric Lassauge (rpmfarm snabela free punkt fr)"
+
+#: ../src/misc.c:130
+msgid "German: Jorg Schuler (jcsjcs at users dot sourceforge dot net)"
+msgstr "Tyska: Jorg Schuler (jcsjcs snabela users punkt sourceforge punkt net)"
+
+#: ../src/misc.c:131
+msgid "German: Kai-Ove"
+msgstr "Tyska: Kai-Ove"
+
+#: ../src/misc.c:132
+msgid "Hebrew: Assaf Gillat (gillata at gmail dot com)"
+msgstr "Hebreiska: Assaf Gillat (gillata snabela gmail punkt com)"
+
+#: ../src/misc.c:133
+msgid "Italian: Edward Matteucci (edward_matteucc at users dot sourceforge dot net)"
+msgstr ""
+"Italienska: Edward Matteucci (edward_matteucc snabela users punkt "
+"sourceforge punkt net)"
+
+#: ../src/misc.c:134
+msgid "Italian: Daniele Forsi (dforsi at gmail dot com)"
+msgstr "Italienska: Daniele Forsi (dforsi snabela gmail punkt com)"
+
+#: ../src/misc.c:135
+msgid "Japanese: Ayako Sano"
+msgstr "Japanska: Ayako Sano"
+
+#: ../src/misc.c:136
+msgid "Japanese: Kentaro Fukuchi (fukuchi at users dot sourceforge dot net)"
+msgstr "Japanska: Kentaro Fukuchi (fukuchi snabela users punkt sourceforge punkt net)"
+
+#: ../src/misc.c:137
+msgid "Romanian: Alex Eftimie (alexeftimie at gmail dot com)"
+msgstr "Rumänska: Alex Eftimie (alexeftimie snabela gmail punkt com)"
+
+#: ../src/misc.c:138
+msgid "Spanish: Alejandro Lamas Daviña (alejandro.lamas at ific dot uv dot es)"
+msgstr "Spanska: Alejandro Lamas Daviña (alejandro.lamas snabela ific punkt uv punkt es)"
+
+#: ../src/misc.c:139
+msgid "Swedish: Stefan Asserhall (stefan.asserhall at comhem dot se)"
+msgstr "Svenska: Stefan Asserhäll (stefan asserhall snabela comhem punkt se)"
+
+#: ../src/misc.c:144
+msgid ""
+"This program is free software; you can redistribute it and/or\n"
+"modify it under the terms of the GNU General Public License as\n"
+"published by the Free Software Foundation; either version 2 of the\n"
+"License, or (at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful, but\n"
+"WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See\n"
+"the GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public\n"
+"License along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA\n"
+"02111-1307, USA."
+msgstr ""
+"Detta program är fri programvara. Du kan distribuera det\n"
+"och/eller ändra det under villkoren i GNU General Public License,\n"
+"publicerad av Free Software Foundation, antingen version 2 av\n"
+"licensen, eller (om du så önskar) någon senare version.\n"
+"\n"
+"Detta program distribueras i hopp om att det ska vara användbart,\n"
+"men UTAN NÅGON SOM HELST GARANTI, Även utan underförstådd\n"
+"garanti om SÄLJBARHET eller LÄMPLIGHET FÖR NÅGOT SPECIELLT\n"
+"ÄNDAMÅL. Se GNU General Public License för ytterligare information.\n"
+"\n"
+"Du ska ha fått en kopia av GNU General Public License tillsammans\n"
+"med detta program. Om inte, skriv till Free Software Foundation, Inc.,\n"
+"59 Temple Place, Suite 330, Boston, MA  02111-1307, USA."
+
+#: ../src/misc.c:159
+msgid ""
+"© 2002-2007\n"
+"Jorg Schuler <jcsjcs at users.sourceforge.net>\n"
+"Corey Donohoe <atmos at atmos.org>"
+msgstr ""
+"© 2002 - 2007\n"
+"Jorg Schuler <jcsjcs at users.sourceforge.net>\n"
+"Corey Donohoe <atmos at atmos.org>"
+
+#: ../src/misc.c:167
+msgid "Cross-platform multilingual interface to Apple's iPod™"
+msgstr "Plattformsoberoende flerspråkigt gränssnitt för Apples iPod™"
+
+#: ../src/misc.c:934
+#, c-format
+msgid "Could not process '%s' (no filename available)"
+msgstr "Kunde inte behandla '%s' (inget filnamn tillgängligt)"
+
+#: ../src/misc.c:1088
+#, c-format
+msgid "Unknown token '%%%c' in template '%s'"
+msgstr "Okänd beteckning '%%%c' i mallen '%s'"
+
+#: ../src/misc.c:1171
+#, c-format
+msgid "Template ('%s') does not match file type '%s'\n"
+msgstr "Mallen ('%s') passar inte ihop med filtypen '%s'\n"
+
+#: ../src/misc.c:1257
+#, c-format
+msgid "Error creating %s: %s\n"
+msgstr "Fel när %s skulle skapas: %s\n"
+
+#: ../src/misc.c:1691
+#, c-format
+msgid ""
+"Writing preferences file '%s' failed (%s).\n"
+"\n"
+msgstr ""
+"Skrivning av inställningsfilen '%s' misslyckades (%s).\n"
+"\n"
+
+#: ../src/misc.c:1693
+msgid "unspecified error"
+msgstr "ospecificerat fel"
+
+#: ../src/misc.c:1701
+#, c-format
+msgid ""
+"Writing preferences to the iPod (%s) failed: could not get path to Control "
+"Directory.\n"
+"\n"
+msgstr ""
+"Skrivning av inställningar till iPod (%s) misslyckades: kunde inte hämta "
+"sökväg till katalogen Control.\n"
+"\n"
+
+#. title
+#: ../src/misc_confirm.c:71
+msgid "The following has occurred:"
+msgstr "Följande har inträffat:"
+
+#: ../src/misc_confirm.c:122
+msgid ""
+"Are you sure you want to delete the following track completely from your "
+"iPod? The number of playlists this track is a member of is indicated in "
+"parentheses."
+msgid_plural ""
+"Are you sure you want to delete the following tracks completely from your "
+"iPod? The number of playlists the tracks are member of is indicated in "
+"parentheses."
+msgstr[0] ""
+"Är du säker på att du vill ta bort följande spår helt från iPod? Antal "
+"spellistor som spåret finns i anges inom parentes."
+msgstr[1] ""
+"Är du säker på att du vill ta bort följande spår helt från iPod? Antal "
+"spellistor som spåret finns i anges inom parentes."
+
+#: ../src/misc_confirm.c:126
+msgid "Delete Track Completely from iPod?"
+msgid_plural "Delete Tracks Completely from iPod?"
+msgstr[0] "Ta bort spår helt från iPod?"
+msgstr[1] "Ta bort spår helt från iPod?"
+
+#: ../src/misc_confirm.c:137 ../src/misc_confirm.c:178
+#, c-format
+msgid "Are you sure you want to remove the following track from the playlist \"%s\"?"
+msgid_plural ""
+"Are you sure you want to remove the following tracks from the playlist \"%s"
+"\"?"
+msgstr[0] "Är du säker på att du vill ta bort följande spår från spellistan \"%s\"?"
+msgstr[1] "Är du säker på att du vill ta bort följande spår från spellistan \"%s\"?"
+
+#: ../src/misc_confirm.c:141 ../src/misc_confirm.c:182
+msgid "Remove Track From Playlist?"
+msgid_plural "Remove Tracks From Playlist?"
+msgstr[0] "Ta bort spår från spellista?"
+msgstr[1] "Ta bort spår från spellista?"
+
+#: ../src/misc_confirm.c:163
+msgid ""
+"Are you sure you want to delete the following track completely from your "
+"harddisk? The number of playlists this track is a member of is indicated in "
+"parentheses."
+msgid_plural ""
+"Are you sure you want to delete the following tracks completely from your "
+"harddisk? The number of playlists the tracks are member of is indicated in "
+"parentheses."
+msgstr[0] ""
+"Är du säker på att du vill ta bort följande spår helt från hårddisken? Antal "
+"spellistor som spåret finns i anges inom parentes."
+msgstr[1] ""
+"Är du säker på att du vill ta bort följande spår helt från hårddisken? Antal "
+"spellistor som spåret finns i anges inom parentes."
+
+#: ../src/misc_confirm.c:167
+msgid "Delete Track from Harddisk?"
+msgid_plural "Delete Tracks from Harddisk?"
+msgstr[0] "Ta bort spår från hårddisk?"
+msgstr[1] "Ta bort spår från hårddisk?"
+
+#: ../src/misc_confirm.c:192
+msgid ""
+"Are you sure you want to remove the following track completely from your "
+"local database? The number of playlists this track is a member of is "
+"indicated in parentheses."
+msgid_plural ""
+"Are you sure you want to remove the following tracks completely from your "
+"local database? The number of playlists the tracks are member of is "
+"indicated in parentheses."
+msgstr[0] ""
+"Är du säker på att du vill ta bort följande spår helt från den lokala "
+"databasen? Antal spellistor som spåret finns i anges inom parentes."
+msgstr[1] ""
+"Är du säker på att du vill ta bort följande spår helt från den lokala "
+"databasen? Antal spellistor som spåret finns i anges inom parentes."
+
+#: ../src/misc_confirm.c:196
+msgid "Remove Track from Local Database?"
+msgid_plural "Remove Tracks from Local Database?"
+msgstr[0] "Ta bort spår från lokal databas?"
+msgstr[1] "Ta bort spår från lokal databas?"
+
+#: ../src/misc_confirm.c:261
+#, c-format
+msgid "Deleted one track completely from iPod"
+msgid_plural "Deleted %d tracks completely from iPod"
+msgstr[0] "Tog bort ett spår helt från iPod"
+msgstr[1] "Tog bort %d spår helt från iPod"
+
+#: ../src/misc_confirm.c:267 ../src/misc_confirm.c:291
+#, c-format
+msgid "Deleted %d track from playlist '%s'"
+msgid_plural "Deleted %d tracks from playlist '%s'"
+msgstr[0] "Tog bort %d spår från spellistan '%s'"
+msgstr[1] "Tog bort %d spår från spellistan '%s'"
+
+#: ../src/misc_confirm.c:285
+#, c-format
+msgid "Deleted one track from harddisk"
+msgid_plural "Deleted %d tracks from harddisk"
+msgstr[0] "Tog bort ett spår från hårddisken"
+msgstr[1] "Tog bort %d spår från hårddisken"
+
+#: ../src/misc_confirm.c:297
+#, c-format
+msgid "Deleted track from local database"
+msgid_plural "Deleted %d tracks from local database"
+msgstr[0] "Tog bort spår från den lokala databasen"
+msgstr[1] "Tog bort %d spår från den lokala databasen"
+
+#: ../src/misc_confirm.c:442
+msgid "Cannot remove entry 'All'"
+msgstr "Kan inte ta bort raden 'Alla'"
+
+#: ../src/misc_confirm.c:536
+#, c-format
+msgid "Removed all %d tracks from the iPod"
+msgstr "Tog bort alla %d spår från iPod"
+
+#: ../src/misc_confirm.c:541
+#, c-format
+msgid "Removed all podcasts from the iPod"
+msgstr "Tog bort alla podradiosändningar från iPod"
+
+#: ../src/misc_confirm.c:550 ../src/misc_confirm.c:624
+#, c-format
+msgid "Deleted playlist '%s' including %d member track"
+msgid_plural "Deleted playlist '%s' including %d member tracks"
+msgstr[0] "Tog bort spellistan '%s' inklusive %d ingående spår"
+msgstr[1] "Tog bort spellistan '%s' inklusive %d ingående spår"
+
+#. first use playlist name
+#: ../src/misc_confirm.c:566 ../src/misc_confirm.c:640
+#, c-format
+msgid "Deleted playlist '%s'"
+msgstr "Tog bort spellistan '%s'"
+
+#: ../src/misc_confirm.c:600
+#, c-format
+msgid "Deleted playlist '%s' including %d member track on harddisk"
+msgid_plural "Deleted playlist '%s' including %d member tracks on harddisk"
+msgstr[0] "Tog bort spellistan '%s' inklusive %d ingående spår från hårddisken"
+msgstr[1] "Tog bort spellistan '%s' inklusive %d ingående spår från hårddisken"
+
+#: ../src/misc_confirm.c:617
+#, c-format
+msgid "Removed all %d tracks from the database"
+msgstr "Tog bort alla %d spår från databasen"
+
+#: ../src/misc_confirm.c:695
+#, c-format
+msgid "Are you sure you want to remove all tracks from your iPod?"
+msgstr "Är du säker på att du vill ta bort alla spår från iPod?"
+
+#: ../src/misc_confirm.c:700
+#, c-format
+msgid "Are you sure you want to remove all podcasts from your iPod?"
+msgstr "Är du säker på att du vill ta bort alla podradiosändningar från iPod?"
+
+#: ../src/misc_confirm.c:708
+#, c-format
+msgid ""
+"Are you sure you want to delete playlist '%s' and the following track "
+"completely from your iPod? The number of playlists this track is a member of "
+"is indicated in parentheses."
+msgid_plural ""
+"Are you sure you want to delete playlist '%s' and the following tracks "
+"completely from your iPod? The number of playlists the tracks are member of "
+"is indicated in parentheses."
+msgstr[0] ""
+"Är du säker på att du vill ta bort spellistan '%s' och följande spår helt "
+"från iPod? Antal spellistor som spåret finns i anges inom parentes."
+msgstr[1] ""
+"Är du säker på att du vill ta bort spellistan '%s' och följande spår helt "
+"från iPod? Antal spellistor som spåret finns i anges inom parentes."
+
+#: ../src/misc_confirm.c:719 ../src/misc_confirm.c:774
+#, c-format
+msgid "Are you sure you want to delete the playlist '%s'?"
+msgstr "Är du säker på att du vill ta bort spellistan '%s'?"
+
+#: ../src/misc_confirm.c:745
+#, c-format
+msgid ""
+"Are you sure you want to delete playlist '%s' and remove the following track "
+"from your harddisk? The number of playlists this track is a member of is "
+"indicated in parentheses."
+msgid_plural ""
+"Are you sure you want to delete playlist '%s' and remove the following "
+"tracks from your harddisk? The number of playlists the tracks are member of "
+"is indicated in parentheses."
+msgstr[0] ""
+"Är du säker på att du vill ta bort spellistan '%s' och följande spår helt "
+"från hårddisken? Antal spellistor som spåret finns i anges inom parentes."
+msgstr[1] ""
+"Är du säker på att du vill ta bort spellistan '%s' och följande spår helt "
+"från hårddisken? Antal spellistor som spåren finns i anges inom parentes."
+
+#: ../src/misc_confirm.c:753
+#, c-format
+msgid "Are you sure you want to remove all tracks from the database?"
+msgstr "Är du säker på att du vill ta bort alla spår från databasen?"
+
+#: ../src/misc_confirm.c:762
+#, c-format
+msgid ""
+"Are you sure you want to delete playlist '%s' and remove the following track "
+"from the database? The number of playlists this track is a member of is "
+"indicated in parentheses."
+msgid_plural ""
+"Are you sure you want to delete playlist '%s' and remove the following "
+"tracks from the database? The number of playlists the tracks are member of "
+"is indicated in parentheses."
+msgstr[0] ""
+"Är du säker på att du vill ta bort spellistan '%s' och följande spår helt "
+"från databasen? Antal spellistor som spåret finns i anges inom parentes."
+msgstr[1] ""
+"Är du säker på att du vill ta bort spellistan '%s' och följande spår helt "
+"från databasen? Antal spellistor som spåren finns i anges inom parentes."
+
+#: ../src/misc_confirm.c:841
+msgid ""
+"Data has been changed and not been saved.\n"
+"OK to exit gtkpod?"
+msgstr ""
+"Data har ändrats och inte sparats.\n"
+"Ok att avsluta gtkpod?"
+
+#: ../src/misc_conversion.c:66
+msgid "File type"
+msgstr "Filtyp"
+
+#: ../src/misc_conversion.c:67
+msgid "PC File"
+msgstr "PC-fil"
+
+#: ../src/misc_conversion.c:68
+msgid "iPod File"
+msgstr "iPod-fil"
+
+#: ../src/misc_conversion.c:69
+msgid "iPod ID"
+msgstr "iPod-id"
+
+#. 10
+#: ../src/misc_conversion.c:70
+msgid "Track Nr (#)"
+msgstr "Spårnummer (#)"
+
+#: ../src/misc_conversion.c:71
+msgid "Transferred"
+msgstr "Överförd"
+
+#: ../src/misc_conversion.c:72
+msgid "File Size"
+msgstr "Filstorlek"
+
+#: ../src/misc_conversion.c:73
+msgid "Play Time"
+msgstr "Spelningstid"
+
+#. 20
+#: ../src/misc_conversion.c:80
+msgid "Date played"
+msgstr "Senast spelad"
+
+#: ../src/misc_conversion.c:82
+msgid "Volume"
+msgstr "Volym"
+
+#: ../src/misc_conversion.c:83
+msgid "Soundcheck"
+msgstr "Ljudkontroll"
+
+#. 25
+#: ../src/misc_conversion.c:85
+msgid "CD Nr"
+msgstr "Cd-nummer"
+
+#: ../src/misc_conversion.c:88
+msgid "Category"
+msgstr "Kategori"
+
+#: ../src/misc_conversion.c:89
+msgid "Description"
+msgstr "Beskrivning"
+
+#. 30
+#: ../src/misc_conversion.c:90
+msgid "Podcast URL"
+msgstr "Podradio webbadress"
+
+#: ../src/misc_conversion.c:91
+msgid "Podcast RSS"
+msgstr "Podradio RSS"
+
+#: ../src/misc_conversion.c:92
+msgid "Subtitle"
+msgstr "Underrubrik"
+
+#: ../src/misc_conversion.c:93
+msgid "Date released"
+msgstr "Utgivningsdatum"
+
+#: ../src/misc_conversion.c:94
+msgid "Checked"
+msgstr "Kontrollerad"
+
+#. 35
+#: ../src/misc_conversion.c:95
+msgid "Start time"
+msgstr "Starttid"
+
+#: ../src/misc_conversion.c:96
+msgid "Stop time"
+msgstr "Sluttid"
+
+#: ../src/misc_conversion.c:97
+msgid "Remember Playback Position"
+msgstr "Kom ihåg uppspelningsposition"
+
+#: ../src/misc_conversion.c:98
+msgid "Skip when Shuffling"
+msgstr "Hoppa över vid blandning"
+
+#: ../src/misc_conversion.c:99
+msgid "Artwork Path"
+msgstr "Sökväg till omslagsbilder"
+
+#. 40
+#: ../src/misc_conversion.c:100
+msgid "Media Type"
+msgstr "Mediatyp"
+
+#: ../src/misc_conversion.c:102
+msgid "TV Episode"
+msgstr "Tv-episod"
+
+#: ../src/misc_conversion.c:103
+msgid "TV Network"
+msgstr "Tv-kanal"
+
+#: ../src/misc_conversion.c:104
+msgid "Season Nr"
+msgstr "Säsongsnummer"
+
+#. 45
+#: ../src/misc_conversion.c:105
+msgid "Episode Nr"
+msgstr "Episodnummer"
+
+#: ../src/misc_conversion.c:106
+msgid "Album Artist"
+msgstr "Albumartist"
+
+#: ../src/misc_conversion.c:107
+msgid "Sort Artist"
+msgstr "Sorterade artister"
+
+#: ../src/misc_conversion.c:108
+msgid "Sort Title"
+msgstr "Sorterade titlar"
+
+#: ../src/misc_conversion.c:109
+msgid "Sort Album"
+msgstr "Sorterade album"
+
+#. 50
+#: ../src/misc_conversion.c:110
+msgid "Sort Album Artist"
+msgstr "Sorterade albumartister"
+
+#: ../src/misc_conversion.c:111
+msgid "Sort Composer"
+msgstr "Sorterade kompositörer"
+
+#: ../src/misc_conversion.c:112
+msgid "Sort TV Show"
+msgstr "Sorterade tv-program"
+
+#: ../src/misc_conversion.c:113
+msgid "Gapless Track Flag"
+msgstr "Flagga för spår utan mellanrum"
+
+#: ../src/misc_conversion.c:126
+msgid "Name of file on PC, if available"
+msgstr "Filens namn på PC:n, om tillgängligt"
+
+#: ../src/misc_conversion.c:127
+msgid "Name of file on the iPod"
+msgstr "Filens namn på iPod"
+
+#. 10
+#: ../src/misc_conversion.c:129
+msgid "Track Nr. and total number of tracks on CD"
+msgstr "Spårnummer och totalt antal spår på cd:n"
+
+#: ../src/misc_conversion.c:130
+msgid "Whether the file has already been transferred to the iPod or not"
+msgstr "Om filen redan har överförts till iPod eller inte"
+
+#: ../src/misc_conversion.c:136
+msgid "Beats per minute"
+msgstr "Taktslag per minut"
+
+#: ../src/misc_conversion.c:137
+msgid "Number of times the track has been played"
+msgstr "Antal gånger spåret har spelats"
+
+#: ../src/misc_conversion.c:138
+msgid "Star rating from 0 to 5"
+msgstr "Betyg med stjärnor från 0 till 5"
+
+#: ../src/misc_conversion.c:139
+msgid "Date and time track has been added"
+msgstr "Datum och tid då spåret lades till"
+
+#. 20
+#: ../src/misc_conversion.c:140
+msgid "Date and time track has last been played"
+msgstr "Datum och tid då spåret senast spelades"
+
+#: ../src/misc_conversion.c:141
+msgid "Date and time track has last been modified"
+msgstr "Datum och tid då spåret senast ändrades"
+
+#: ../src/misc_conversion.c:142
+msgid "Manual volume adjust"
+msgstr "Manuell volymjustering"
+
+#: ../src/misc_conversion.c:143
+msgid ""
+"Volume adjust in dB (replay gain) -- you need to activate 'soundcheck' on "
+"the iPod"
+msgstr "Volymjustering i dB (spelningsnivå): Du måste aktivera 'ljudkontroll' på iPod"
+
+#. 25
+#: ../src/misc_conversion.c:146
+msgid "CD Nr. and total number of CDS in set"
+msgstr "Cd-nummer och totalt antal cd i albumet"
+
+#: ../src/misc_conversion.c:149
+msgid "The category (e.g. 'Technology' or 'Music') where the podcast was located."
+msgstr "Kategorin (t.ex. 'Teknik' eller 'Musik') där podradiosändningen fanns."
+
+#: ../src/misc_conversion.c:150
+msgid "Accessible by selecting the center button on the iPod."
+msgstr "Kan kommas åt genom att trycka på iPod-mittenknappen."
+
+#: ../src/misc_conversion.c:154
+msgid "Release date (for podcasts displayed next to the title on the iPod)"
+msgstr "Utgivningsdatum (för podradiosändningar visas det intill titeln på iPod)"
+
+#. 50
+#: ../src/misc_conversion.c:168 ../src/misc_conversion.c:169
+#: ../src/misc_conversion.c:170 ../src/misc_conversion.c:171
+#: ../src/misc_conversion.c:172 ../src/misc_conversion.c:173
+msgid "Used for sorting on the iPod"
+msgstr "Används för sortering på iPod"
+
+#: ../src/misc_conversion.c:735
+#, c-format
+msgid "The URI '%s' is not an absolute URI using the file scheme"
+msgstr "Webbadressen '%s' är inte en absolut webbadress med filschema"
+
+#: ../src/misc_conversion.c:745
+#, c-format
+msgid "The local file URI '%s' may not include a '#'"
+msgstr "Webbadressen '%s' för lokal fil kan inte innehålla '#'"
+
+#: ../src/misc_conversion.c:762
+#, c-format
+msgid "The URI '%s' is invalid"
+msgstr "Webbadressen '%s' är ogiltig"
+
+#: ../src/misc_conversion.c:774
+#, c-format
+msgid "The hostname of the URI '%s' is invalid"
+msgstr "Värddator för webbadressen '%s' är ogiltig"
+
+#: ../src/misc_conversion.c:790
+#, c-format
+msgid "The URI '%s' contains invalidly escaped characters"
+msgstr "Webbadressen '%s' innehåller felaktiga specialtecken"
+
+#: ../src/misc_playlist.c:67 ../src/misc_playlist.c:94
+#: ../src/misc_playlist.c:429
+msgid "Please enter a name for the new playlist"
+msgstr "Skriv in ett namn på den nya spellistan"
+
+#: ../src/misc_playlist.c:154
+msgid "AR:"
+msgstr "AR:"
+
+#: ../src/misc_playlist.c:157
+msgid "AL:"
+msgstr "AL:"
+
+#: ../src/misc_playlist.c:160
+msgid "GE:"
+msgstr "GE:"
+
+#: ../src/misc_playlist.c:163
+msgid "CO:"
+msgstr "KO:"
+
+#: ../src/misc_playlist.c:166
+msgid "YE:"
+msgstr "ÅR:"
+
+#: ../src/misc_playlist.c:194
+msgid "Unknown"
+msgstr "Okänd"
+
+#: ../src/misc_playlist.c:272
+#, c-format
+msgid "Random (%d)"
+msgstr "Slumpmässig (%d)"
+
+#: ../src/misc_playlist.c:297
+msgid ""
+"Auto Store of track view disabled.\n"
+"\n"
+msgstr ""
+"Automatisk lagring av spårvy inaktiverad.\n"
+"\n"
+
+#: ../src/misc_playlist.c:356
+msgid "Not Listed"
+msgstr "Inte listad"
+
+#: ../src/misc_playlist.c:406
+#, c-format
+msgid "Created playlist '%s' with %d track."
+msgid_plural "Created playlist '%s' with %d tracks."
+msgstr[0] "Skapade spellistan '%s' med %d spår."
+msgstr[1] "Skapade spellistan '%s' med %d spår."
+
+#. n==0
+#: ../src/misc_playlist.c:417
+msgid "No tracks available, playlist not created"
+msgstr "Inga spår tillgängliga, spellistan skapades inte"
+
+#: ../src/misc_playlist.c:543
+#, c-format
+msgid "Most Listened (%d)"
+msgstr "Oftast lyssnade på (%d)"
+
+#: ../src/misc_playlist.c:584
+#, c-format
+msgid "Never Listened"
+msgstr "Aldrig lyssnade på"
+
+#: ../src/misc_playlist.c:624
+#, c-format
+msgid "Best Rated (%d)"
+msgstr "Med bäst betyg (%d)"
+
+#: ../src/misc_playlist.c:666
+msgid "Unrated tracks"
+msgstr "Spår utan betyg"
+
+#: ../src/misc_playlist.c:671
+#, c-format
+msgid "Rated %d"
+msgstr "Betyg %d"
+
+#: ../src/misc_playlist.c:714
+#, c-format
+msgid "Recent (%d)"
+msgstr "Senaste (%d)"
+
+#: ../src/misc_playlist.c:753
+msgid "Last Time"
+msgstr "Sista gången"
+
+#: ../src/misc_playlist.c:844
+msgid "Removal of dangling tracks with no files on PC was canceled."
+msgstr "Borttagning av spår med saknade filer utan filer på PC:n avbröts."
+
+#: ../src/misc_playlist.c:854
+msgid "Handling of dangling tracks with files on PC was canceled."
+msgstr "Hantering av spår med saknade filer som har filer på PC:n avbröts."
+
+#: ../src/misc_playlist.c:882
+msgid "Dangling tracks with no files on PC were removed."
+msgstr "Spår med saknade filer utan filer på PC:n har tagits bort."
+
+#: ../src/misc_playlist.c:943
+msgid "Dangling tracks with files on PC were handled."
+msgstr "Spår med saknade filer som har filer på PC:n har hanterats."
+
+#: ../src/misc_playlist.c:976
+msgid "Track"
+msgstr "Spår"
+
+#: ../src/misc_playlist.c:1019
+msgid ""
+"You did not import the existing iTunesDB. This is most likely incorrect and "
+"will result in the loss of the existing database.\n"
+"\n"
+"Press 'OK' if you want to proceed anyhow or 'Cancel' to abort. If you "
+"cancel, you can import the existing database before calling this function "
+"again.\n"
+msgstr ""
+"Du importerade inte befintlig iTunes databas. Det är troligtvis felaktigt "
+"och orsakar förlust av den befintliga databasen.\n"
+"\n"
+"Klicka på 'Ok' om du vill fortsätta ändå eller 'Avbryt' för att avbryta. Om "
+"du avbryter, kan du importera befintlig databas innan du använder den här "
+"funktionen igen.\n"
+
+#: ../src/misc_playlist.c:1033
+msgid "Creating a tree of known files"
+msgstr "Skapar träd med kända filer"
+
+#: ../src/misc_playlist.c:1077
+msgid "Checking iPOD files against known files in DB"
+msgstr "Kontrollerar iPod-filer med kända filer i databasen"
+
+#: ../src/misc_playlist.c:1120
+msgid "Orphaned"
+msgstr "Övergivna"
+
+#: ../src/misc_playlist.c:1147
+#, c-format
+msgid ""
+"The following orphaned file had already been added to the iPod again. It "
+"will be removed with the next sync:\n"
+"%s\n"
+"\n"
+msgstr ""
+"Följande övergivna fil har redan lagts till i iPod igen. Den tas bort vid "
+"nästa synkronisering:\n"
+"%s\n"
+"\n"
+
+#: ../src/misc_playlist.c:1175
+#, c-format
+msgid "Found %d orphaned and %d dangling files. Processing..."
+msgstr "Hittade %d övergivna filer och %d spår med saknade filer. Behandlar..."
+
+#: ../src/misc_playlist.c:1199
+#, c-format
+msgid ""
+"The following dangling track has a file on PC.\n"
+"Press OK to have them transfered from the file on next Sync, CANCEL to leave "
+"it as is."
+msgid_plural ""
+"The following %d dangling tracks have files on PC.\n"
+"Press OK to have them transfered from the files on next Sync, CANCEL to "
+"leave them as is."
+msgstr[0] ""
+"Följande spår med saknad fil har en fil på PC:n.\n"
+"Klicka på Ok för att överföra filen vid nästa synkronisering. Avbryt för att "
+"lämna det som det är."
+msgstr[1] ""
+"Följande %d spår med saknade filer har filer på PC:n.\n"
+"Klicka på Ok för att överföra filerna vid nästa synkronisering. Avbryt för "
+"att lämna dem som de är."
+
+#: ../src/misc_playlist.c:1204
+#, c-format
+msgid ""
+"The following dangling track doesn't have file on PC. \n"
+"Press OK to remove it, CANCEL to leave it as is."
+msgid_plural ""
+"The following %d dangling tracks do not have files on PC. \n"
+"Press OK to remove them, CANCEL to leave them. as is"
+msgstr[0] ""
+"Följande spår med saknad fil har ingen fil på PC:n.\n"
+"Klicka på Ok för att ta bort det, eller Avbryt för att lämna det som det är."
+msgstr[1] ""
+"Följande %d spår med saknade filer har inga filer på PC:n.\n"
+"Klicka på Ok för att ta bort dem, eller Avbryt för att lämna dem som de är."
+
+#. we want unique window for each
+#. gboolean modal,
+#: ../src/misc_playlist.c:1211
+msgid "Dangling Tracks"
+msgstr "Spår med saknade filer"
+
+#: ../src/misc_playlist.c:1234
+#, c-format
+msgid "Found %d orphaned and %d dangling files. Done."
+msgstr "Hittade %d övergivna filer och %d spår med saknade filer. Klar."
+
+#. update for count == 1, 21, 41 ... and for count == n
+#: ../src/misc_track.c:89
+#, c-format
+msgid "Hashed %d of %d track."
+msgid_plural "Hashed %d of %d tracks."
+msgstr[0] "Beräknade checksumma för %d av %d spår."
+msgstr[1] "Beräknade checksumma för %d av %d spår."
+
+#: ../src/misc_track.c:198
+#, c-format
+msgid "The following duplicate track has been removed."
+msgid_plural "The following %d duplicate tracks have been removed."
+msgstr[0] "Följande duplicerade spår har tagits bort."
+msgstr[1] "Följande %d duplicerade spår har tagits bort."
+
+#: ../src/misc_track.c:205
+#, c-format
+msgid "The following duplicate track has not been added to the master play list."
+msgid_plural ""
+"The following %d duplicate tracks have not been added to the master play "
+"list."
+msgstr[0] "Följande duplicerade spår har lagts till i huvudspellistan."
+msgstr[1] "Följande %d duplicerade spår har lagts till i huvudspellistan."
+
+#. gint id,
+#. gboolean modal,
+#: ../src/misc_track.c:212
+msgid "Duplicate detection"
+msgstr "Detektering av duplikat"
+
+#: ../src/misc_track.c:1339
+msgid "Local Database"
+msgstr "Lokal databas"
+
+#. artwork is set
+#: ../src/misc_track.c:1350
+msgid "Embedded or filename was lost"
+msgstr "Inbäddad eller förlorat filnamn"
+
+#: ../src/misc_track.c:1354
+msgid "Artwork not set"
+msgstr "Omslagsbild inte angiven"
+
+#: ../src/misc_track.c:1816
+#, c-format
+msgid "Could not find source file for '%s'. Track not copied."
+msgstr "Kunde hitta källfilen för '%s'. Spåret kopierades inte."
+
+#: ../src/misc_track.c:2052
+#, c-format
+msgid "drag and drop: ignored '%s'\n"
+msgstr "drag och släpp: ignorerade '%s'\n"
+
+#: ../src/mp3file.c:1336
+#, c-format
+msgid "Error setting ID3 field: %s\n"
+msgstr "Fel när ID3-fält skulle ändras: %s\n"
+
+#: ../src/mp3file.c:1360 ../src/mp3file.c:1453 ../src/mp3file.c:1608
+#: ../src/mp3file.c:2733
+#, c-format
+msgid "ERROR while opening file: '%s' (%s).\n"
+msgstr "FEL när filen skulle öppnas: '%s' (%s).\n"
+
+#: ../src/mp3file.c:1688
+#, c-format
+msgid "ERROR while writing tag to file: '%s' (%s).\n"
+msgstr "FEL när tagg skulle skrivas till filen: '%s' (%s).\n"
+
+#. Tracks with zero play length are ignored by iPod...
+#: ../src/mp3file.c:2770
+#, c-format
+msgid "File \"%s\" has zero play length. Ignoring.\n"
+msgstr "Filen \"%s\" har spelningslängden noll. Ignoreras.\n"
+
+#: ../src/mp4file.c:243 ../src/mp4file.c:404
+#, c-format
+msgid "'%s' does not appear to be a mp4 audio or video file.\n"
+msgstr "'%s' verkar inte vara en mp4 ljud- eller videofil.\n"
+
+#: ../src/mp4file.c:253 ../src/mp4file.c:414
+#, c-format
+msgid "Could not open '%s' for reading, or file is not an mp4 file.\n"
+msgstr "Kunde inte öppna '%s' för läsning, eller är filen inte en mp4-fil.\n"
+
+#: ../src/mp4file.c:529
+#, c-format
+msgid "'%s' does not appear to be a mp4 audio file.\n"
+msgstr "'%s' verkar inte vara en mp4-ljudfil.\n"
+
+#: ../src/mp4file.c:540
+#, c-format
+msgid "Could not open '%s' for writing, or file is not an mp4 file.\n"
+msgstr "Kunde inte öppna '%s' för skrivning, eller är filen inte en mp4-fil.\n"
+
+#: ../src/mp4file.c:553
+#, c-format
+msgid ""
+"Import of '%s' failed: m4a/m4p/m4b not supported without the mp4v2 library. "
+"You must compile the gtkpod source together with the mp4v2 library.\n"
+msgstr ""
+"Import av '%s' misslyckades: m4a/m4p/m4b stöds inte utan biblioteket mp4v2. "
+"Du måste kompilera källkoden för gtkpod tillsammans med biblioteket mp4v2.\n"
+
+#: ../src/mp4file.c:559
+#, c-format
+msgid ""
+"m4a/m4p/m4b metadata update for '%s' failed: m4a/m4p/m4b not supported "
+"without the mp4v2 library. You must compile the gtkpod source together with "
+"the mp4v2 library.\n"
+msgstr ""
+"Uppdatering av m4a/m4p/m4b metadata för '%s' misslyckades: m4a/m4p/m4b stöds "
+"inte utan biblioteket mp4v2. Du måste kompilera källkoden för gtkpod "
+"tillsammans med biblioteket mp4v2.\n"
+
+#: ../src/mp4file.c:565
+#, c-format
+msgid ""
+"m4a/m4p/m4b soundcheck update for '%s' failed: m4a/m4p/m4b not supported "
+"without the mp4v2 library. You must compile the gtkpod source together with "
+"the mp4v2 library.\n"
+msgstr ""
+"Uppdatering av m4a/m4p/m4b metadata för '%s' misslyckades: m4a/m4p/m4b stöds "
+"inte utan biblioteket mp4v2. Du måste kompilera källkoden för gtkpod "
+"tillsammans med biblioteket mp4v2.\n"
+
+#: ../src/oggfile.c:73
+#, c-format
+msgid "'%s' does not appear to be an ogg audio file.\n"
+msgstr "'%s' verkar inte vara en ogg ljudfil.\n"
+
+#: ../src/oggfile.c:154
+#, c-format
+msgid ""
+"Import of '%s' failed: ogg not supported without the ogg library. You must "
+"compile the gtkpod source together with the ogg library.\n"
+msgstr ""
+"Import av '%s' misslyckades: ogg stöds inte utan biblioteket ogg. Du måste "
+"kompilera källkoden för gtkpod tillsammans med biblioteket ogg.\n"
+
+#: ../src/oggfile.c:160
+#, c-format
+msgid ""
+"ogg metadata update for '%s' failed: ogg not supported without the ogg "
+"library. You must compile the gtkpod source together with the ogg library.\n"
+msgstr ""
+"Uppdatering av ogg metadata för '%s' misslyckades: ogg stöds inte utan "
+"biblioteket ogg. Du måste kompilera källkoden för gtkpod tillsammans med "
+"biblioteket ogg.\n"
+
+#: ../src/prefs.c:357
+#, c-format
+msgid "gtkpod version %s usage:\n"
+msgstr "Användning av gtkpod version %s:\n"
+
+#: ../src/prefs.c:358
+msgid "  -h, --help:   display this message\n"
+msgstr "  -h, --help:   visa det här meddelandet\n"
+
+#: ../src/prefs.c:359
+msgid "  -p <file>:    increment playcount for file by one\n"
+msgstr "  -p <filnamn>: öka spelningsantalet för filen med ett\n"
+
+#: ../src/prefs.c:360
+msgid "  --hash <file>:print gtkpod hash for file\n"
+msgstr "  --hash <fil>: skriv ut gtkpod checksumma för filen\n"
+
+#: ../src/prefs.c:361
+msgid "  -m path:      define the mountpoint of your iPod\n"
+msgstr "  -m sökväg:  definiera monteringspunkt för iPod\n"
+
+#: ../src/prefs.c:362
+msgid "  --mountpoint: same as '-m'.\n"
+msgstr "  --mountpoint: samma som '-m'.\n"
+
+#: ../src/prefs.c:363
+msgid "  -a:           import database automatically after start.\n"
+msgstr "  -a:           importera databas automatiskt efter start.\n"
+
+#: ../src/prefs.c:364
+msgid "  --auto:       same as '-a'.\n"
+msgstr "  --auto:       samma som '-a'.\n"
+
+#: ../src/prefs.c:561
+#, c-format
+msgid "Couldn't create ~/.gtkpod\n"
+msgstr "Kunde inte skapa ~/.gtkpod\n"
+
+#: ../src/prefs_window.c:133
+msgid "Please select command for 'Play Now'"
+msgstr "Välj kommando för 'Spela nu'"
+
+#: ../src/prefs_window.c:134
+msgid "Please select command for 'Enqueue'"
+msgstr "Välj kommando för 'Köa'"
+
+#: ../src/prefs_window.c:135
+msgid "Please select the mp3gain executable"
+msgstr "Välj körbart program mp3gain"
+
+#: ../src/prefs_window.c:136
+msgid "Please select the aacgain executable"
+msgstr "Välj körbart program accgain"
+
+#: ../src/prefs_window.c:137
+msgid "Select the mserv music root directory"
+msgstr "Välj mserv rotkatalog för musik"
+
+#: ../src/prefs_window.c:138
+msgid "Select the mserv trackinfo root directory"
+msgstr "Välj mserv rotkatalog för spårinformation"
+
+#: ../src/prefs_window.c:139
+msgid "Select the ogg/vorbis converter command"
+msgstr "Välj kommando för konvertering av ogg/vorbis."
+
+#: ../src/prefs_window.c:140
+msgid "Select the flac converter command"
+msgstr "Välj kommando för konvertering av FLAC."
+
+#: ../src/prefs_window.c:141
+msgid "Select the m4a converter command."
+msgstr "Välj kommando för konvertering av m4a."
+
+#: ../src/prefs_window.c:142
+msgid "Select the mp3 converter command."
+msgstr "Välj kommando för konvertering av mp3."
+
+#: ../src/prefs_window.c:143
+msgid "Select the wav converter command."
+msgstr "Välj kommando för konvertering av wav."
+
+#: ../src/prefs_window.c:201 ../src/repository.c:662
+#, c-format
+msgid ""
+"<i>Have a look at the scripts provided in '%s'. If you write a new script or "
+"improve an existing one, please send it to jcsjcs at users.sourceforge.net "
+"for inclusion into the next release.</i>"
+msgstr ""
+"<i>Ta en titt på skripten som tillhandahålls i '%s'. Om du skriver ett nytt "
+"skript, skicka det gärna till \"jcsjcs snabela users.sourceforge.net\" för "
+"att lägga till det i nästa utgåva.</i>"
+
+#: ../src/prefs_window.c:1205 ../src/prefs_window.c:1223
+msgid "Preferences not updated"
+msgstr "Inställningarna har inte uppdaterats"
+
+#: ../src/prefs_window.c:1232
+msgid "Preferences applied"
+msgstr "Inställningar ändrade"
+
+#: ../src/repository.c:573 ../src/repository.c:2395
+msgid "Set backup file"
+msgstr "Ange fil för säkerhetskopia"
+
+#: ../src/repository.c:612
+msgid "Select directory for synchronization"
+msgstr "Markera katalog för synkronisering"
+
+#: ../src/repository.c:638
+msgid "Please select command to sync contacts"
+msgstr "Välj kommando för att synkronisera kontakter"
+
+#: ../src/repository.c:644
+msgid "Please select command to sync calendar"
+msgstr "Välj kommando för att synkronisera kalender"
+
+#: ../src/repository.c:650
+msgid "Please select command to sync notes"
+msgstr "Välj kommando för att synkronisera anteckningar"
+
+#: ../src/repository.c:729
+msgid "Smart playlist updated."
+msgstr "Smart spellista uppdaterad."
+
+#: ../src/repository.c:1190
+msgid "Podcasts Repository"
+msgstr "Podsändningsarkiv"
+
+#: ../src/repository.c:1194
+msgid "Local Repository"
+msgstr "Lokalt arkiv"
+
+#: ../src/repository.c:1348
+msgid "Master Playlist"
+msgstr "Huvudspellista"
+
+#: ../src/repository.c:1352
+msgid "Podcasts Playlist"
+msgstr "Podsändningsspellista"
+
+#: ../src/repository.c:1360
+msgid "Regular Playlist"
+msgstr "Vanlig spellista"
+
+#: ../src/repository.c:2423
+msgid "Set local repository file"
+msgstr "Ange lokal arkivfil"
+
+#: ../src/repository.c:2522
+msgid "New Repository"
+msgstr "Nytt arkiv"
+
+#: ../src/sha1.c:186
+msgid "Hashed file is 0 bytes long\n"
+msgstr "Filen med checksumma har storleken 0 byte\n"
+
+#: ../src/sha1.c:239
+#, c-format
+msgid "Could not open '%s' to calculate SHA1 checksum: %s\n"
+msgstr "Kunde inte öppna '%s' för att beräkna SHA1-checksumma: %s\n"
+
+#: ../src/syncdir.c:237
+#, c-format
+msgid "Sync summary for %s/%s\n"
+msgstr "Sammanfattning av synkronisering för %s/%s\n"
+
+#: ../src/syncdir.c:246
+msgid "The following track has been added or updated:\n"
+msgid_plural "The following tracks have been added or updated:\n"
+msgstr[0] "Följande spår har lagts till eller uppdaterats:\n"
+msgstr[1] "Följande spår har lagts till eller uppdaterats:\n"
+
+#: ../src/syncdir.c:255
+msgid "The following track has been completely removed from the iPod:\n"
+msgid_plural "The following tracks have been completely removed from the iPod:\n"
+msgstr[0] "Följande spår har fullständigt tagits bort från iPod:\n"
+msgstr[1] "Följande spår har fullständigt tagits bort från iPod:\n"
+
+#: ../src/syncdir.c:264
+msgid "The following track has been removed from the repository:\n"
+msgid_plural "The following tracks have been removed from the repository:\n"
+msgstr[0] "Följande spår har tagits bort från arkivet:\n"
+msgstr[1] "Följande spår har tagits bort från arkivet:\n"
+
+#: ../src/syncdir.c:271
+msgid "The following track has been removed from the playlist:\n"
+msgid_plural "The following tracks have been removed from the playlist:\n"
+msgstr[0] "Följande spår har tagits bort från spellistan:\n"
+msgstr[1] "Följande spår har tagits bort från spellistan:\n"
+
+#: ../src/syncdir.c:277
+msgid "Nothing was changed.\n"
+msgstr "Ingenting har ändrats.\n"
+
+#: ../src/syncdir.c:282
+msgid "Sync summary"
+msgstr "Sammanfattning av synkronisering"
+
+#: ../src/tools.c:118
+#, c-format
+msgid ""
+"Could not find '%s'.\n"
+"Please specifiy the exact path in the Tools section of the preference dialog "
+"or install the program if it is not installed on your system.\n"
+"\n"
+msgstr ""
+"Kunde inte hitta '%s'.\n"
+"\n"
+"Ange exakt sökväg under 'Verktyg' i inställningsdialogrutan eller installera "
+"programmet om det inte är installerat på systemet.\n"
+"\n"
+
+#: ../src/tools.c:203
+#, c-format
+msgid ""
+"Execution of '%s' failed.\n"
+"\n"
+msgstr ""
+"Körning av '%s' misslyckades.\n"
+"\n"
+
+#: ../src/tools.c:248
+#, c-format
+msgid ""
+"Did not normalize '%s'. Set mp3gain path in the Tools section of the "
+"preferences.\n"
+msgstr ""
+"Normaliserade inte '%s'. Ställ in sökväg till mp3gain under Verktyg i "
+"inställningsdialogrutan.\n"
+
+#: ../src/tools.c:258
+#, c-format
+msgid ""
+"Did not normalize '%s'. Set aacgain path in the Tools section of the "
+"preferences.\n"
+msgstr ""
+"Normaliserade inte '%s'. Ställ in sökväg till accgain under Verktyg i "
+"inställningsdialogrutan.\n"
+
+#: ../src/tools.c:385
+msgid "Normalizing..."
+msgstr "Normaliserar..."
+
+#: ../src/tools.c:435
+#, c-format
+msgid "%s - %s"
+msgstr "%s - %s"
+
+#: ../src/tools.c:461
+msgid "Aborting..."
+msgstr "Avbryter..."
+
+#: ../src/tools.c:465
+msgid "Will abort after current mp3gain process ends."
+msgstr "Avbryter efter aktuell mp3gain process slutar."
+
+#: ../src/tools.c:491
+#, c-format
+msgid ""
+"'%s-%s' (%s) could not be normalized.\n"
+"\n"
+msgstr ""
+"'%s-%s' (%s) kunde inte normaliseras.\n"
+"\n"
+
+#: ../src/tools.c:530
+#, c-format
+msgid "Normalized %d of %d tracks."
+msgid_plural "Normalized %d of %d tracks."
+msgstr[0] "Normaliserade %d av %d spår."
+msgstr[1] "Normaliserade %d av %d spår."
+
+#: ../src/tools.c:633
+msgid ""
+"Please specify the command to be called on the 'Tools' section of the "
+"preferences dialog.\n"
+msgstr "Ange kommandot som ska anropas under 'Verktyg' i inställningsdialogrutan.\n"
+
+#: ../src/tools.c:645
+#, c-format
+msgid ""
+"Could not find the command '%s'.\n"
+"\n"
+"Please verify the setting in the 'Tools' section of the preferences dialog.\n"
+"\n"
+msgstr ""
+"Kunde inte hitta kommandot '%s'.\n"
+"\n"
+"Kontrollera inställningarna under 'Verktyg' i inställningsdialogrutan.\n"
+"\n"
+
+#: ../src/tools.c:687
+#, c-format
+msgid ""
+"'%s' returned the following output:\n"
+"%s\n"
+msgstr ""
+"'%s' returnerade följande utmatning.\n"
+"%s\n"
+
+#: ../src/tools.c:754
+#, c-format
+msgid "No command set for '%s'"
+msgstr "Inget kommando angivet för '%s'"
+
+#: ../src/tools.c:774
+#, c-format
+msgid "Could not find command '%s' specified for '%s'"
+msgstr "Kunde inte hitta kommandot '%s' som angavs för '%s'"
+
+#: ../src/wavfile.c:181
+#, c-format
+msgid "%s does not appear to be a supported wav file.\n"
+msgstr "%s verkar inte vara en wav-fil som stöds.\n"
+

Added: trunk/scripts/Makefile.am
===================================================================
--- trunk/scripts/Makefile.am	                        (rev 0)
+++ trunk/scripts/Makefile.am	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,28 @@
+## Process this file with automake to produce Makefile.in
+
+# where to install the scripts
+scriptdir = $(pkgdatadir)/scripts
+
+# these scripts will be installed
+script_SCRIPTS = \
+	convert-2m4a.sh \
+	convert-2mp3.sh \
+	gtkpod-convert-common.sh \
+	ldif2vcf.sh \
+	mab2vcard \
+	sync-abook.sh \
+	sync-evocalendar.sh \
+	sync-evolution.sh \
+	sync-kaddressbook.sh \
+	sync-knotes.sh \
+	sync-korganizer.sh \
+	sync-ldif.sh \
+	sync-notes.sh \
+	sync-palm-jppy.py \
+	sync-thunderbird-nano.sh \
+	sync-thunderbird.sh \
+	sync-tomboy.sh \
+	sync-webcalendar.sh
+
+# these scripts will of course also go in the distribution tarball.
+EXTRA_DIST=$(script_SCRIPTS)

Added: trunk/scripts/Makefile.in
===================================================================
--- trunk/scripts/Makefile.in	                        (rev 0)
+++ trunk/scripts/Makefile.in	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,422 @@
+# Makefile.in generated by automake 1.10 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = scripts
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(scriptdir)"
+scriptSCRIPT_INSTALL = $(INSTALL_SCRIPT)
+SCRIPTS = $(script_SCRIPTS)
+SOURCES =
+DIST_SOURCES =
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALL_LINGUAS = @ALL_LINGUAS@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CURL_CFLAGS = @CURL_CFLAGS@
+CURL_LIBS = @CURL_LIBS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GMODULE_CFLAGS = @GMODULE_CFLAGS@
+GMODULE_LIBS = @GMODULE_LIBS@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GNOME_VFS_CFLAGS = @GNOME_VFS_CFLAGS@
+GNOME_VFS_LIBS = @GNOME_VFS_LIBS@
+GREP = @GREP@
+GTHREAD_CFLAGS = @GTHREAD_CFLAGS@
+GTHREAD_LIBS = @GTHREAD_LIBS@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
+HAL_CFLAGS = @HAL_CFLAGS@
+HAL_LIBS = @HAL_LIBS@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
+INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
+INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
+INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
+INTLTOOL_PERL = @INTLTOOL_PERL@
+INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
+INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
+INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
+INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
+INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
+INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
+INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
+INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
+INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
+INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
+INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
+INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
+LDFLAGS = @LDFLAGS@
+LEX = @LEX@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
+LIBGLADE_CFLAGS = @LIBGLADE_CFLAGS@
+LIBGLADE_LIBS = @LIBGLADE_LIBS@
+LIBGNOMECANVAS_CFLAGS = @LIBGNOMECANVAS_CFLAGS@
+LIBGNOMECANVAS_LIBS = @LIBGNOMECANVAS_LIBS@
+LIBGPOD_CFLAGS = @LIBGPOD_CFLAGS@
+LIBGPOD_LIBS = @LIBGPOD_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MOUNT = @MOUNT@
+MSGFMT = @MSGFMT@
+MSGFMT_OPTS = @MSGFMT_OPTS@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+POFILES = @POFILES@
+POSUB = @POSUB@
+PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
+PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+UMOUNT = @UMOUNT@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+
+# where to install the scripts
+scriptdir = $(pkgdatadir)/scripts
+
+# these scripts will be installed
+script_SCRIPTS = \
+	convert-2m4a.sh \
+	convert-2mp3.sh \
+	gtkpod-convert-common.sh \
+	ldif2vcf.sh \
+	mab2vcard \
+	sync-abook.sh \
+	sync-evocalendar.sh \
+	sync-evolution.sh \
+	sync-kaddressbook.sh \
+	sync-knotes.sh \
+	sync-korganizer.sh \
+	sync-ldif.sh \
+	sync-notes.sh \
+	sync-palm-jppy.py \
+	sync-thunderbird-nano.sh \
+	sync-thunderbird.sh \
+	sync-tomboy.sh \
+	sync-webcalendar.sh
+
+
+# these scripts will of course also go in the distribution tarball.
+EXTRA_DIST = $(script_SCRIPTS)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  scripts/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  scripts/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-scriptSCRIPTS: $(script_SCRIPTS)
+	@$(NORMAL_INSTALL)
+	test -z "$(scriptdir)" || $(MKDIR_P) "$(DESTDIR)$(scriptdir)"
+	@list='$(script_SCRIPTS)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  if test -f $$d$$p; then \
+	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
+	    echo " $(scriptSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(scriptdir)/$$f'"; \
+	    $(scriptSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(scriptdir)/$$f"; \
+	  else :; fi; \
+	done
+
+uninstall-scriptSCRIPTS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(script_SCRIPTS)'; for p in $$list; do \
+	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
+	  echo " rm -f '$(DESTDIR)$(scriptdir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(scriptdir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(SCRIPTS)
+installdirs:
+	for dir in "$(DESTDIR)$(scriptdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-scriptSCRIPTS
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-scriptSCRIPTS
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+	distclean-generic distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-scriptSCRIPTS install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am uninstall uninstall-am uninstall-scriptSCRIPTS
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:

Added: trunk/scripts/convert-2m4a.sh
===================================================================
--- trunk/scripts/convert-2m4a.sh	                        (rev 0)
+++ trunk/scripts/convert-2m4a.sh	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,44 @@
+#!/bin/sh
+# Script that converts a file into an m4a file
+#
+# USAGE:
+#
+# convert-2m4a.sh [options] inputfile
+#
+# For a list of allowed options please consult gtkpod-convert-common.sh
+#
+# STDOUT's last line is the converted filename.
+# Return Codes:
+#   0 ok
+#   1 input file not found
+#   2 output file cannot be created
+#   3 cannot get info
+#   4 cannot exec decoding
+#   5 cannot exec encoding
+#   6 conversion failed
+#   7 unknown option
+#
+
+# Constants
+extension="m4a"
+ENCODER_OPTS="-q 150 -c 22000"
+# use the following for better quality (25% increase in file size) or simply
+# specify your options with "-q ..."
+#ENCODER_OPTS="-q 256 -c 44100"
+ENCODER="faac"
+
+. ${0%/*}/gtkpod-convert-common.sh
+
+if [ $filetype = "wav" ]; then
+    "$encoder" -o "$outfile" $ENCODER_OPTS -w --artist "$artist" --title "$title" --year "$year" --album "$album" --track "$track" --genre "$genre" --comment "$comment" "$infile"
+else
+    "$decoder" $options "$infile" | "$encoder" -o "$outfile" $ENCODER_OPTS -w --artist "$artist" --title "$title" --year "$year" --album "$album" --track "$track" --genre "$genre" --comment "$comment" -
+fi
+# Check result
+if [ "x$?" != "x0" ]; then
+    exit 6
+fi
+
+# Seems to be ok: display filename for gtkpod
+echo $outfile
+exit 0


Property changes on: trunk/scripts/convert-2m4a.sh
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/scripts/convert-2mp3.sh
===================================================================
--- trunk/scripts/convert-2mp3.sh	                        (rev 0)
+++ trunk/scripts/convert-2mp3.sh	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,59 @@
+#!/bin/sh
+# Script that converts a file into an mp3 file
+#
+# USAGE:
+#
+# convert-2mp3.sh [options] inputfile
+#
+# For a list of allowed options please consult gtkpod-convert-common.sh
+#
+# STDOUT's last line is the converted filename.
+# Return Codes:
+#   0 ok
+#   1 input file not found
+#   2 output file cannot be created
+#   3 cannot get info
+#   4 cannot exec decoding
+#   5 cannot exec encoding
+#   6 conversion failed
+#   7 unknown option
+#
+
+# Constants
+extension="mp3"
+ENCODER_OPTS="--preset standard"
+ENCODER="lame"
+
+. ${0%/*}/gtkpod-convert-common.sh
+
+# Check if the genre is one which lame supports
+if [ -n "$genre" ] && `"$encoder" --genre-list | grep -qi "\b$genre\b"`; then
+    usegenre=$genre
+else
+    usegenre=""
+    # check for id3v2
+    id3v2=`which id3v2`
+    if [ -n "$id3v2" ]; then
+        useid3v2=1
+    fi
+fi
+
+if [ $filetype = "wav" ]; then
+    "$encoder" $ENCODER_OPTS --add-id3v2 --tt "$title" --ta "$artist" --tl "$album" --ty "$year" --tc "$comment" --tn "$track" --tg "$usegenre" "$infile" "$outfile"
+else
+    "$decoder" $options "$infile" | "$encoder" $ENCODER_OPTS --add-id3v2 --tt "$title" --ta "$artist" --tl "$album" --ty "$year" --tc "$comment" --tn "$track" --tg "$usegenre" - "$outfile"
+fi
+# Check result
+if [ "x$?" != "x0" ]; then
+    exit 6
+fi
+
+# Try to set the genre with id3v2 if needed.  This may fail as older versions of
+# id3v2 did not support genre strings in place of numeric genre id's
+if [ -n "$useid3v2" ]; then
+    $id3v2 -g "$genre" "$mp3file" || :
+fi
+
+# Seems to be ok: display filename for gtkpod
+echo $outfile
+exit 0


Property changes on: trunk/scripts/convert-2mp3.sh
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/scripts/gtkpod-convert-common.sh
===================================================================
--- trunk/scripts/gtkpod-convert-common.sh	                        (rev 0)
+++ trunk/scripts/gtkpod-convert-common.sh	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,106 @@
+#!/bin/sh
+# Script that converts a file into an mp3 or an m4a file
+#
+# USAGE:
+#
+# Called by convert-2mp3.sh and convert-2m4a.sh.
+#
+# The following command line arguments are being used
+#
+#       -x      Print converted filename extension and exit
+#       -f      Set converted filename
+# 	-a	Artist tag
+#	-A 	Album tag
+#	-T	Track tag
+#	-t	Title tag
+#	-g	Genre tag
+#	-y	Year tag
+#	-c	Comment tag
+#	-q	Quality (overwrites standard encoder options)
+#               For mp3 files this could be "--vbr-new -V<number>".
+#
+# Return Codes:
+#   0 ok
+#   1 input file not found
+#   2 output file cannot be created
+#   3 cannot get info
+#   4 cannot exec decoding
+#   5 cannot exec encoding
+#   6 conversion failed
+#   7 unknown option
+
+# Get parameters
+while getopts q:a:A:T:t:g:c:y:f:x opt ; do
+	case "$opt" in
+	        x)      echo "$extension"; exit 0 ;;
+	        f)      outfile="$OPTARG" ;;
+		a)	artist="$OPTARG" ;;
+		A)	album="$OPTARG" ;;
+		T)	track="$OPTARG" ;;
+		t)	title="$OPTARG" ;;
+		g)	genre="$OPTARG" ;;
+		y)	year="$OPTARG" ;;
+		c)	comment="$OPTARG" ;;
+		q)	ENCODER_OPTS="$OPTARG" ;;
+	        ?)      exit 7 ;;
+	esac
+done
+shift $(($OPTIND - 1))
+
+infile="$1"
+infile_extension=${infile##*.}
+
+# Convert the source parameters to lowercase.
+filetype=`echo ${infile_extension}| tr [:upper:] [:lower:]`
+if [ $filetype != flac ] && [ $filetype != ogg ] && [ $filetype != wav ] && [ $filetype != m4a ]; then
+    exit 4
+fi
+
+if [ "$outfile" = "" ]; then
+    # Build output file
+    outfile=`basename "$infile"`
+    outfile=${outfile%.$infile_extension}
+    tmp=${TMPDIR-/tmp}
+    outfile="$tmp/$outfile.$extension"
+fi
+
+# Default values
+[ -z "$comment" ] && comment="Encoded for gtkpod with $ENCODER"
+
+# echo "Converting \"$infile\" into \"$outfile\""
+
+# Checking input file
+if [ "$infile" = "" ]; then
+    exit 1
+fi
+if [ ! -f "$infile" ]; then
+    exit 1
+fi
+
+# Checking output file
+touch "$outfile"
+if [ "x$?" != "x0" ]; then
+    exit 2
+fi
+
+# Check for the existence of encoder
+encoder=`which $ENCODER`
+if [ -z "$encoder" ]; then
+    exit 5
+fi
+
+# Determine decoder
+case $filetype in
+	flac)	decoder="flac" ; options="-d -c --"  ;;
+	ogg)	decoder="oggdec" ; options="--output - --" ;;
+	m4a)	decoder="faad" ; options="-o -" ;;
+	wav)	decoder="" ;;
+esac
+
+# Check for the existence of decoder
+if [ $decoder ]; then
+    decoder=`which "$decoder"`
+    if [ -z "$decoder" ]; then
+        exit 4
+    fi
+fi


Property changes on: trunk/scripts/gtkpod-convert-common.sh
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/scripts/ldif2vcf.sh
===================================================================
--- trunk/scripts/ldif2vcf.sh	                        (rev 0)
+++ trunk/scripts/ldif2vcf.sh	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,107 @@
+#! /usr/bin/awk -f
+
+function INIT_VAR() {
+	FIRSTNAME="FIRST_NAME"
+	FAMILYNAME="FAMILY_NAME"
+	NICKNAME=""
+	MAIL=""
+	SECONDMAIL=""
+	WORKPHONE=""
+	HOMEPHONE=""
+	CELLPHONE=""
+	ADDRESS=""
+	CITY=""
+	ZIPCODE=""
+	MISC=""
+	MISC1=""
+	MISC2=""
+	MISC3=""
+	MISC4=""
+	URLSITE=""
+
+	URL=""
+	DISPLAY=""}
+
+BEGIN {	INIT_VAR()}
+
+/^givenName:/,/^$/ { DISPLAY="OK" }
+
+/^givenName:/ { FIRSTNAME = substr($0, 12)}
+
+/^sn:/ { FAMILYNAME = substr($0, 5)}
+
+/^xmozillanickname:/ { NICKNAME = substr($0, 19)}
+
+/^mail:/ { MAIL = substr($0, 7)}
+
+/^mozillaSecondEmail:/ { SECONDMAIL = substr($0, 21)}
+
+/^homePhone:/ { HOMEPHONE = substr($0, 12)}
+
+/^mobile:/ { CELLPHONE = substr($0, 9)}
+
+/^telephoneNumber:/ { WORKPHONE = substr($0, 18) }
+
+/^homePostalAddress:/ { ADDRESS = substr($0, 20)}
+
+/^mozillaHomeLocalityName:/ { CITY = substr($0, 26)}
+
+/^mozillaHomePostalCode:/ { ZIPCODE = substr($0, 24)}
+
+/^homeurl:/ { URLSITE = substr($0, 10)}
+
+/^custom1:/ { MISC1 = substr($0, 10)}
+
+/^custom2:/ { MISC2 = substr($0, 10)}
+
+/^custom3:/ { MISC3 = substr($0, 10)}
+
+/^custom4:/ { MISC4 = substr($0, 10)}
+
+/^$/ && DISPLAY == "OK" {
+	# making up the Vcard
+	print "begin:vcard"
+	print "version:3.0"
+	print "n:" FAMILYNAME ";" FIRSTNAME ";;;"
+	print "fn:" FIRSTNAME " " FAMILYNAME
+	if ( NICKNAME ) {
+		print "nickname:" NICKNAME }
+
+	if ( MAIL || URLSITE || SECONDMAIL ) {
+		MAIL?URL="mailto:" MAIL:URL
+		if ( SECONDMAIL ) {
+			URL?URL=URL "\\n(mailto:" SECONDMAIL ")":URL=URL "(mailto:" SECONDMAIL ")" }
+		if ( URLSITE ) {
+			URL?URL=URL "\\n(url:" URLSITE ")":URL=URL "(url:" URLSITE ")" }
+
+		print "url;type=work:" URL }
+
+	if ( HOMEPHONE ) {
+		print "tel;type=home:" HOMEPHONE }
+
+	if ( WORKPHONE ) {
+		print "tel;type=work:" WORKPHONE }
+
+	if ( CELLPHONE ) {
+		print "tel;type=cell:" CELLPHONE }
+
+	if ( ADDRESS && ZIPCODE && CITY ) {
+		print "adr;type=home:;;" ADDRESS ";" ZIPCODE ";" CITY ";;;"
+		print "label;type=home:" ADDRESS "\\n" ZIPCODE " " CITY }
+
+	if ( MISC1 || MISC2 || MISC3 || MISC4 ) {
+		MISC1?MISC=MISC1:MISC
+		if ( MISC2 ) {
+			MISC?MISC=MISC "\\n" MISC2:MISC=MISC MISC2 }
+		if ( MISC3 ) {
+			MISC?MISC=MISC "\\n" MISC3:MISC=MISC MISC3 }
+		if ( MISC4 ) {
+			MISC?MISC=MISC "\\n" MISC4:MISC=MISC MISC4 }
+		
+		print "note:" MISC }
+
+	print "end:vcard"
+
+	INIT_VAR() }
+
+END {exit 0}


Property changes on: trunk/scripts/ldif2vcf.sh
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/scripts/mab2vcard
===================================================================
--- trunk/scripts/mab2vcard	                        (rev 0)
+++ trunk/scripts/mab2vcard	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,579 @@
+#!/usr/bin/perl
+# Copyright © 2004 Jamie Zawinski <jwz at jwz.org>
+#
+# Permission to use, copy, modify, distribute, and sell this software
+# and its documentation for any purpose is hereby granted without fee,
+# provided that the above copyright notice appear in all copies and
+# that both that copyright notice and this permission notice appear in
+# supporting documentation.  No representations are made about the
+# suitability of this software for any purpose.  It is provided "as
+# is" without express or implied warranty.
+#
+# Created:  3-Mar-2004 by Jamie Zawinski, Anonymous, and Jacob Post.
+#
+##########################################################################
+#
+# This program, originally by Jamie Zawinski for parsing mork files to
+# extract URLs from the history, has been repurposed by Clinton
+# Gormley to extract vCards from the Thunderbird default personal
+# addressbook (abook.mab), in a suitable format for importing into
+# Evolution or for storing on the iPod.
+#
+# It looks for abook.mab in the directories specified below in
+# ABOOK_PATHS.  If there are more paths that should be added by
+# default, please let me know.
+#
+# BUG : At the moment, there is no way of removing deleted addresses.
+# Thunderbird continues to store them in the address book, and I can't
+# see any way to find the deleted flag.  There is a key called
+# ns:addrbk:db:table:kind:deleted, but deleted records don't seem to
+# have this set.  So if you figure this one out, please let me know...
+#
+# If you would also like to include the Collected addresses, you can
+# specify the history.mab file on the command line.
+# 
+# I have done nothing with encoding in this program - on my system it
+# just works. If it doesn't for you, please send me the details.
+#
+# vCards should have a maximum line length of 75 chars. I have set the
+# line length lower in case there are characters which (when you
+# recode) take up more than one byte, so you have a degree of
+# flexibility with this. You may well run into problems if you are
+# using many non ASCII characters.
+#
+# The changes I have made to Jamie Zawinski's script enjoy the same
+# copyright as his original script (see above).
+#
+# The part of this script that parses the addressbook worked well for
+# me, but Jamie says that it is unreliable, and has given up trying to
+# improve it.  But until the Mozilla vcard project gets underway
+# (http://vcard.mozdev.org/) and uses Mozilla's own mork libraries,
+# you probably won't find anything better.
+# Mileage may vary... :)
+# 
+# Hope this helps!
+#
+# Clinton Gormley (perl at traveljury.com)
+#
+##########################################################################
+#
+# Just added support for parsing mobile phones (cell phones) entries in
+# address books from Thunderbird.
+# My work was so lame hacking this file that I couldn't help myself
+# being in the credits too. :-P
+# Of course, my lines of program are GPL licensed too.
+#
+# Sebastian Cruz (crux at lugmen.org.ar)
+#
+##########################################################################
+#
+# Contributed to the gtkpod project by Clinton Gormley
+# (perl at traveljury.com). This code can be used either under the
+# license mentioned above or under the terms of the GNU General Pulic
+# 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.
+#
+##########################################################################
+#
+# And Now, The Ugly Truth Laid Bare:
+#
+#   In Netscape Navigator 1.0 through 4.0, the history.db file was
+#   just a Berkeley DBM file.  You could trivially bind to it from
+#   Perl, and pull out the URLs and last-access time.  In Mozilla,
+#   this has been replaced with a "Mork" database for which no tools
+#   exist.
+#
+#   Let me make it clear that McCusker is a complete barking lunatic.
+#   This is just about the stupidest file format I've ever seen.
+#
+#       http://www.mozilla.org/mailnews/arch/mork/primer.txt
+#       http://jwz.livejournal.com/312657.html
+#       http://www.jwz.org/doc/mailsum.html
+#       http://bugzilla.mozilla.org/show_bug.cgi?id=241438
+#
+#   In brief, let's count its sins:
+#
+#     - Two different numerical namespaces that overlap.
+#
+#     - It can't decide what kind of character-quoting syntax to use:
+#       Backslash?  Hex encoding with dollar-sign?
+#
+#     - C++ line comments are allowed sometimes, but sometimes // is just
+#       a pair of characters in a URL.
+#
+#     - It goes to all this serious compression effort (two different 
+#       string-interning hash tables) and then writes out Unicode strings
+#       without using UTF-8: writes out the unpacked wchar_t characters!
+#
+#     - Worse, it hex-encodes each wchar_t with a 3-byte encoding,
+#       meaning the file size will be 3x or 6x (depending on whether
+#       whchar_t is 2 bytes or 4 bytes.)
+#
+#     - It masquerades as a "textual" file format when in fact it's
+#       just another binary-blob file, except that it represents all its
+#       magic numbers in ASCII.  It's not human-readable, it's not
+#       hand-editable, so the only benefit there is to the fact that it
+#       uses short lines and doesn't use binary characters is that it
+#       makes the file bigger. Oh wait, my mistake, that isn't actually
+#       a benefit at all.
+#
+# Pure comedy.
+#
+##########################################################################
+
+
+
+require 5;
+#use diagnostics;
+use strict;
+use constant ABOOK_PATHS => qw (~/.thunderbird/);
+
+#use Data::Dumper;
+my $progname = $0; $progname =~ s at .*/@@g;
+my $version = q{ $Revision: 695 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
+
+my (%key_table, %val_table, %row_hash);
+my ($total, $skipped) = (0, 0);
+
+##########################################################################
+# Returns a list of hashes, the contents of the mork file.
+##########################################################################
+
+sub mork_parse_file {
+  my $file = shift;
+  local $/ = undef;
+  local *IN;
+
+
+  ##########################################################################
+  # Define the messy regexen up here
+  ##########################################################################
+
+  my $top_level_comment = qr@//.*\n@;
+
+  my $key_table_re = qr/  < \s* <             # "< <"
+                         \( a=c \) >          # "(a=c)>"
+                         (?> ([^>]*) ) > \s*  # Grab anything that's not ">"
+                     /sx;
+
+  my $value_table_re = qr/ < ( .*?\) )> \s* /sx;
+
+  my $table_re = qr/ \{ -?        # "{" or "{-"
+                    [\da-f]+ :    # hex, ":"
+                    (?> .*?\{ )   # Eat up to a {...
+                   ((?> .*?\} )   # and then the closing }...
+                    (?> .*?\} ))  # Finally, grab the table section
+                 \s* /six;
+
+  my $row_re = qr/ ( (?> \[ [^]]* \]  # "["..."]"
+                         \s*)+ )      # Perhaps repeated many times
+                 /sx;
+
+  my $section_begin_re = qr/ \@\$\$\{    # "@$${"
+                             ([\dA-F]+)  # hex
+                             \{\@ \s*    # "{@"
+                           /six;
+
+  my $section_end_re = undef;
+  my $section = "top level";
+
+  ##########################################################################
+  # Read in the file.
+  ##########################################################################
+  open (IN, "<$file") || error ("$file: $!");
+
+  my $body = <IN>;
+  close IN;
+
+  $body =~ s/\r\n/\n/gs;    # Windows Mozilla uses \r\n
+  $body =~ s/\r/\n/gs;      # Presumably Mac Mozilla is similarly dumb
+
+  $body =~ s/\\\\/\$5C/gs;  # Sometimes backslash is quoted with a
+                            #  backslash; convert to hex.
+  $body =~ s/\\\)/\$29/gs;  # close-paren is quoted with a backslash;
+                            #  convert to hex.
+  $body =~ s/\\\n//gs;      # backslash at end of line is continuation.
+
+  ##########################################################################
+  # Figure out what we're looking at, and parse it.
+  ##########################################################################
+
+
+  pos($body) = 0;
+  my $length = length($body);
+
+  while( pos($body) < $length ) {
+
+    # Key table
+
+    if ( $body =~ m/\G$key_table_re/gc ) {
+      mork_parse_key_table($file, $section, $1);
+
+    # Values
+    } elsif ( $body =~ m/\G$value_table_re/gco ) {
+      mork_parse_value_table($file, $section, $1);
+
+    # Table
+    } elsif ( $body =~ m/\G$table_re/gco ) {
+      mork_parse_table($file, $section,  $1);
+
+    # Rows (-> table)
+    } elsif ( $body =~ m/\G$row_re/gco ) {
+      mork_parse_table($file, $section, $1);
+
+    # Section begin
+    } elsif ( $body =~ m/\G$section_begin_re/gco ) {
+      $section = $1;
+      $section_end_re = qr/\@\$\$\}$section\}\@\s*/s;
+
+    # Section end
+    } elsif ( $section_end_re && $body =~ m/\G$section_end_re/gc ) {
+      $section_end_re = undef;
+      $section = "top level";
+
+    # Comment
+    } elsif ( $body =~ m/\G$top_level_comment/gco ) {
+      #no-op
+
+    } else {
+#      $body =~ m/\G (.{0,300}) /gcsx; print "<$1>\n";
+      error("$file: $section: Cannot parse");
+    }
+  }
+
+  if($section_end_re) {
+    error("$file: Unterminated section $section");
+  }
+
+
+#  print STDERR "$progname: $file: sorting...\n" if ($verbose);
+
+  my @entries = values(%row_hash);
+  
+#  print STDERR "$progname: $file: done!  ($total total, $skipped skipped)\n"
+#    if ($verbose);
+# print Dumper(\%key_table,\%val_table,\%row_hash);
+  (%key_table, %val_table, %row_hash, $total, $skipped) = ();
+
+  return \@entries;
+}
+
+
+##########################################################################
+# parse a row and column table
+##########################################################################
+
+sub mork_parse_table {
+  my($file, $section, $table_part) = (@_);
+
+#  print STDERR "\n" if ($verbose > 3);
+
+  # Assumption: no relevant spaces in values in this section
+  $table_part =~ s/\s+//g;
+
+#  print $table_part; #exit(0);
+
+  #Grab each complete [...] block
+  while( $table_part =~ m/\G  [^[]*   \[  # find a "["
+                            ( [^]]+ ) \]  # capture up to "]"
+                        /gcx ) {
+    $_ = $1;
+
+    my %hash;
+    my ($id, @cells) = split (m/[()]+/s);
+    next unless scalar(@cells);
+    # Trim junk
+    $id =~ s/^-//;
+    $id =~ s/:.*//;
+
+    if($row_hash{$id}) {
+      %hash = ( %{$row_hash{$id}} );
+    } else {
+      %hash = ( 'ID'            => $id);
+    }
+
+    foreach (@cells) {
+      next unless $_;
+
+      my ($keyi, $which, $vali) =
+        m/^\^ ([-\dA-F]+)
+              ([\^=])
+              (.*)     
+          $/xi;
+
+      error ("$file: unparsable cell: $_\n") unless defined ($vali);
+
+      # If the key isn't in the key table, ignore it
+      #
+      my $key = $key_table{$keyi};
+      next unless defined($key);
+
+      my $val  = ($which eq '='
+                  ? $vali
+                  : $val_table{$vali});
+#print "$key : $val : $which : $vali : $val_table{$vali}\n";
+
+      $hash{$key} = $val;
+#print "$id: $key -> $val\n";
+    }
+
+
+
+    $total++;
+    $row_hash{$id} = \%hash;
+  }
+}
+
+
+##########################################################################
+# parse a values table
+##########################################################################
+
+sub mork_parse_value_table {
+  my($file, $section, $val_part) = (@_);
+
+  return unless $val_part;
+
+  my @pairs = split (m/\(([^\)]+)\)/, $val_part);
+  $val_part = undef;
+
+#  print STDERR "\n" if ($verbose > 3);
+
+  foreach (@pairs) {
+    next unless (m/[^\s]/s);
+    my ($key, $val) = m/([\dA-F]*)[\t\n ]*=[\t\n ]*(.*)/i;
+    if (! defined ($val)) {
+      print STDERR "$progname: $file: $section: unparsable val: $_\n";
+      next;
+    }
+
+    # Assume that URLs and LastVisited are never hexilated; so
+    # don't bother unhexilating if we won't be using Name, etc.
+    if($val =~ m/\$/) {
+      # Approximate wchar_t -> ASCII and remove NULs
+      $val =~ s/\$00//g;  # faster if we remove these first
+      $val =~ s/\$([\dA-F]{2})/chr(hex($1))/ge;
+    }
+
+    $val_table{$key} = $val;
+#    print STDERR "$progname: $file: $section: val $key = \"$val\"\n"
+#      if ($verbose > 3);
+  }
+}
+
+
+##########################################################################
+# parse a key table
+##########################################################################
+
+sub mork_parse_key_table {
+  my ($file, $section, $key_table) = (@_);
+
+#  print STDERR "\n" if ($verbose > 3);
+  $key_table =~ s@\s+//.*$@@gm;
+
+  my @pairs = split (m/\(([^\)]+)\)/s, $key_table);
+  $key_table = undef;
+
+  foreach (@pairs) {
+    next unless (m/[^\s]/s);
+    my ($key, $val) = m/([\dA-F]+)\s*=\s*(.*)/i;
+    error ("$file: $section: unparsable key: $_") unless defined ($val);
+
+    # If we're only emitting URLs and dates, don't even bother
+    # saving the other fields that we aren't interested in.
+    #
+    $key_table{$key} = $val;
+#    print STDERR "$progname: $file: $section: key $key = \"$val\"\n"
+#      if ($verbose > 3);
+  }
+}
+
+
+##########################################################################
+# Output the vcards
+##########################################################################
+sub output_vcards {
+	# Encoding?
+	# Fold lines
+	my $results = shift;
+	my %map = (
+		FN			=> [' ',qw(FirstName LastName)],
+		N			=> [';',qw(LastName FirstName null null null)],
+		'ADR;TYPE=WORK'		=> [';',qw(null WorkAddress WorkAddress2 WorkCity WorkState WorkCountry WorkZipCode)],
+		'ADR;TYPE=HOME'		=> [';',qw(null HomeAddress HomeAddress2 HomeCity HomeState HomeCountry HomeZipCode)],
+	   	'TEL;TYPE=HOME;TYPE=VOICE'
+	   			 	=> [' ',qw(HomePhone)],
+	   	'TEL;TYPE=FAX'	 	=> [' ',qw(FaxNumber)],
+	   	'TEL;TYPE=WORK;TYPE=VOICE'
+	   			 	=> [' ',qw(WorkPhone)],
+		'TEL;TYPE=CELL;TYPE=VOICE'
+	   				=> [' ',qw(CellularNumber)],
+	   	'TEL;TYPE=PAGER;TYPE=VOICE'
+	   				=> [' ',qw(PagerNumber)],
+	   	'EMAIL;TYPE=INTERNET;X-EVOLUTION-UI-SLOT=1'
+	   				=> [' ',qw(PrimaryEmail)],
+	   	'EMAIL;TYPE=INTERNET;X-EVOLUTION-UI-SLOT=2'
+	   				=> [' ',qw(SecondEmail)],
+	   	'NICKNAME'		=> [',',qw(NickName)],
+	   	'NOTE'			=> [' ',qw(Notes)],
+	   	'ORG'			=> [';',qw(Company Department)],
+	   	'TITLE'			=> [' ',qw(JobTitle)],
+	   	'URL'			=> [' '],
+	   	'X-AIM'			=> [' ',qw(_AimScreenName)],
+
+	);
+	foreach my $vcard (@$results) {
+		print "BEGIN:VCARD\n";
+		foreach my $key (keys %map) {
+			my @fields = @{$map{$key}};
+			my $data;
+			if ($key eq 'URL') {
+				$data = $vcard->{WebPage1}||$vcard->{WebPage2}||'';
+			} elsif ($key eq 'X-MOZILLA-HTML') {
+				$data = $vcard->{PreferMailFormat}==2 ? 'TRUE' : 'FALSE';
+			} else {
+				$data = join($fields[0],map {$vcard->{$_}||''} @fields[1..$#fields]);
+			}
+			next unless $key=~/^F?N$/ || $data=~/[^${fields[0]}]/;
+			$data="$key:$data";
+			$data=~s/(.{1,65})/$1\r\n /g;   ## Kept lines short so that there is some room for recoded characters
+			chop $data;
+			print $data;
+		}
+		print "END:VCARD\n";
+	}
+}
+
+
+
+##########################################################################
+# Escape results in preparation for vcards
+##########################################################################
+sub escape_results {
+	my $old_results = shift;
+	my @results = ();
+	foreach my $old_card (@$old_results) {
+		my %vcard = map {$_=>''} qw (
+			FirstName LastName WorkAddress WorkAddress2 WorkCity WorkState WorkCountry WorkZipCode
+			HomeAddress HomeAddress2 HomeCity HomeState HomeCountry HomeZipCode 
+			HomePhone FaxNumber WorkPhone CellularNumber PagerNumber PrimaryEmail SecondEmail
+			NickName Notes Company Department JobTitle URL _AimScreenName
+			PreferMailFormat WebPage1 WebPage2
+		);
+
+		foreach my $key (keys %vcard) {
+			my $val = $old_card->{$key};
+			next unless $val;
+			$val=~s/([,;\\])/\\$1/g;
+			$val=~s/\n/\\n/g;
+			$vcard{$key} = $val;
+		}
+		$vcard{null} = '';
+		push @results,\%vcard;
+	}
+	return \@results;
+}
+
+
+
+##########################################################################
+# Find default address book
+##########################################################################
+sub locate_default_abook {
+	my @files;
+	foreach my $path (ABOOK_PATHS) {
+		my $dir = glob($path);
+	use Data::Dumper; print Dumper($dir);	
+		next unless $dir;
+		error ("$path is not a directory. Please correct ABOOK_PATHS in the script '$progname'")
+			unless -d $dir;
+		$dir=~s/\/*\s*$//;
+print Dumper($dir);
+		push @files,(glob $dir.'/abook.mab');
+		push @files,(glob $dir.'/*/abook.mab');
+		push @files,(glob $dir.'/*/*/abook.mab');
+	}
+	return $files[0] if @files==1;
+	if (@files) {
+		my $errstr = "More than one address book found - please specify the correct one on the command line:\n";
+		foreach my $file (@files) {
+			$errstr.="  $file\n";
+		}
+		error($errstr);
+	}
+	my $errstr = "Couldn't find the default address book in : \n";
+	foreach my $path (ABOOK_PATHS) {
+		$errstr.="  $path\n";
+	}
+	$errstr.="Please specify the file to use on the command line";
+	error($errstr);
+}
+
+##########################################################################
+# Throw errors
+##########################################################################
+
+sub error {
+  ($_) = @_;
+  print STDERR '*'x60;
+  print STDERR "\n$progname: $_\n";
+  print STDERR '*'x60;
+  usage();
+  exit 1;
+}
+
+
+##########################################################################
+# Usage
+##########################################################################
+
+sub usage {
+	print STDERR <<USAGE
+
+	Usage : $progname [filename]
+	  
+	If you don't specify a filename, $progname tried to find the personal
+	address book 'abook.mab' in your home folder. Alternatively, you can 
+	specify the filename that $progname should parse.
+
+	vCards are printed to STDOUT, so can be redirected in the usual way:
+
+	  $progname > vcards_file_name
+	  $progname | recode UTF8..ISO-8859-15 > vcards_file_name
+
+USAGE
+
+}
+
+
+##########################################################################
+# Main
+##########################################################################
+
+  exit(usage()) if $ARGV[0]=~/^-/;
+  
+  # get file name
+  my $file = $ARGV[0] || locate_default_abook; 	
+
+  error("Couldn't read file '$file' - please check the correct path and correct") 
+	unless -s $file && -r _;
+
+  print STDERR "Using file : $file\n";      
+
+  # read mork file
+  my $results = mork_parse_file ($file);
+
+  # Escape results
+  $results = escape_results($results);
+
+  # output as vcards
+  output_vcards ($results);  
+
+exit 0;
+


Property changes on: trunk/scripts/mab2vcard
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/scripts/sync-abook.sh
===================================================================
--- trunk/scripts/sync-abook.sh	                        (rev 0)
+++ trunk/scripts/sync-abook.sh	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,74 @@
+#!/bin/sh
+# (c) 2005 Daniel Kercher 
+# Script to sync the ipod with abook
+
+# Usage:
+# 
+# sync-abook.sh [-i <ipod mountpoint>] [-d <abook database>]
+#           ... [-e <encoding ipod>] [-f <encoding abook>]
+#
+# with the following defaults: 
+
+IPOD_MOUNT='/mnt/ipod'				# mount point of ipod
+DATAFILE='~/.abook/addressbook'	                # the abook db
+ENCODING_FROM=UTF-8                             # encoding used by abook
+ENCODING=ISO-8859-15                            # encoding used by ipod
+
+# Unless called with "-e=none" this script requires "iconv" available
+# from http://www.gnu.org/software/libiconv/
+
+# About the encoding used by the iPod (by Jorg Schuler):
+#
+# For some reason the encoding used for the contact files and
+# calenader files depends on the language you have set your iPod
+# to. If you set your iPod to German, iso-8859-15 (or -1?) is
+# expected. If you set it to Japanese, SHIFT-JIS is expected. You need
+# to reboot the iPod to have the change take effect, however. (I'm
+# using firmware version 1.3.)
+#
+# If you know of more encodings, please let me know, so they can be
+# added here:
+#
+# iPod language      encoding expected
+# ----------------------------------------
+# German             ISO-8859-15
+# Japanese           SHIFT-JIS
+
+# Changelog
+# 2005/06/15 (Jorg Schuler <jcsjcs at users dot sourceforge dot net>):
+# Received original script from Daniel Kercher and added character
+# conversion and command line options.
+#
+# 2007/05/31 (Jorg Schuler <jcsjcs at users dot sourceforge dot net>):
+# Set a more reasonable default datafile.
+#
+
+# overwrite default settings with optional command line arguments
+while getopts i:d:e:f: option; do
+    case $option in
+        i) IPOD_MOUNT=$OPTARG;;
+        d) DATAFILE=$OPTARG;;
+        e) ENCODING=$OPTARG;;
+	f) ENCODING_FROM=$OPTARG;;
+        \?) echo "Usage: `basename $0` [-i <ipod mountpoint>] [-d <abook database>] [-e <encoding ipod>] [-f <encoding abook>]"
+	    exit 1;;
+    esac
+done
+
+# set the RECODE command
+if [ $ENCODING = "none" ] || [ $ENCODING = "NONE" ]; then
+    RECODE="cat"    # no conversion
+else
+    RECODE="iconv -f $ENCODING_FROM -t $ENCODING"
+fi
+
+
+# check if DATAFILE exists
+if [ ! -f $DATAFILE ]; then
+    echo "Error: $DATAFILE does not exist"
+    exit 1
+fi
+
+echo -n "Syncing abook to iPod... "
+abook --convert --infile $DATAFILE --outformat gcrd | sed '/^$/d' | $RECODE > ${IPOD_MOUNT}/Contacts/abook.vcf
+echo "done!"


Property changes on: trunk/scripts/sync-abook.sh
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/scripts/sync-evocalendar.sh
===================================================================
--- trunk/scripts/sync-evocalendar.sh	                        (rev 0)
+++ trunk/scripts/sync-evocalendar.sh	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,127 @@
+#!/bin/sh
+# (c) 2004 Markus Gaugusch <markus at gaugusch.at>
+# Script for syncing evolution calendar and task data with iPod
+
+# Usage:
+# 
+# sync-evocalendar.sh [-i <ipod mountpoint>] [-e <encoding>]
+#           ...       [-c <evolution calendar file>] [-t <evolution tasks file>]
+#           ...       [-f <ical filter script>]
+#
+# with the following defaults: 
+
+IPOD_MOUNT=/mnt/ipod                          # mountpoint of ipod
+
+#the path to a script that will be passed the ical information from STDIN and filter, if needed
+#FILTER_SCRIPT=
+
+#get all the local evolution calendars
+CALFILES=`find ~/.evolution/calendar/local/ -name "calendar.ics"`
+
+#get all the local evolution tasks
+TASKFILES=`find ~/.evolution/tasks/local/ -name "tasks.ics"`
+
+ENCODING=ISO-8859-15                          # encoding used by ipod
+
+# Unless called with "-e none" this script requires "iconv" available
+# from http://www.gnu.org/software/libiconv/
+
+# About the encoding used by the iPod (by Jorg Schuler):
+#
+# For some reason the encoding used for the contact files and
+# calenader files depends on the language you have set your iPod
+# to. If you set your iPod to German, iso-8859-15 (or -1?) is
+# expected. If you set it to Japanese, SHIFT-JIS is expected. You need
+# to reboot the iPod to have the change take effect, however. (I'm
+# using firmware version 1.3.)
+#
+# If you know of more encodings, please let me know, so they can be
+# added here:
+#
+# iPod language      encoding expected
+# ----------------------------------------
+# German             ISO-8859-15
+# Japanese           SHIFT-JIS
+
+
+# Changelog:
+#
+# 2006/03/08 (Michele C. Soccio <michele at soccio dot it>:
+# Changed to get all the local calendar and task files
+#
+# Changed to correct the calendar file(s) and task file(s) command line option
+# 
+# 2004/06/27 (Jorg Schuler <jcsjcs at users dot sourceforge dot net>):
+# Changed to accept ipod-mountpath and encoding as command line
+# option
+#
+# Split into two files -- one for contacts, one for calendar.
+#
+# Placed under GPL in agreement with Markus Gaugusch.
+#
+# Added note about encoding used by the iPod.
+#
+# 2004/07/02 (Jorg Schuler <jcsjcs at users dot sourceforge dot net>):
+# Added Usage-line, added check for vcard file, rearranged source
+#
+# 2004/07/03 (Jorg Schuler <jcsjcs at users dot sourceforge dot net>):
+# Made "iconv" optional (call with "-e none")
+#
+# Removed "dos2unix" as my iPod (firmware 1.3) happily accepted
+# DOS-type vcards as well. Instead changed the "grep" pattern to
+# catch \cr\lf as well.
+#
+# 2004/12/15 (Clinton Gormley <clint at traveljury dot com>):
+# adapted sync-korganiser to work with evolution.
+
+
+# overwrite default settings with optional command line arguments
+while getopts i:c:t:e: option; do
+    case $option in
+	i) IPOD_MOUNT=$OPTARG;;
+        c) CALFILES=$OPTARG;;
+        t) TASKFILES=$OPTARG;;
+        e) ENCODING=$OPTARG;;
+        f) FILTER=$OPTARG;;
+		\?) echo "Usage: `basename $0` [-i <ipod mountpoint>] [-c <evolution calendar file>] [-t <evolution tasks file>] [-f <filter script>] [-e <encoding>]"
+	    exit 1;;
+    esac
+done
+
+
+# set the RECODE command
+if [ $ENCODING = "none" ] || [ $ENCODING = "NONE" ]; then
+    RECODE="cat"    # no conversion
+else
+    RECODE="iconv -f UTF-8 -t $ENCODING"
+fi
+
+if [ $FILTER_SCRIPT ]; then
+	FILTER=$FILTER_SCRIPT
+else
+	FILTER="cat"
+fi
+
+# check if CALFILES exist
+for i in $CALFILES; do
+	if [ ! -f $CALFILE ]; then
+	    echo "Error: $i does not exist"
+	    exit 1
+	fi
+done
+
+# check if each TASKFILES exist
+for j in $TASKFILES; do
+	if [ ! -f $j ]; then
+	    echo "Error: $TASKFILE does not exist"
+	    exit 1
+	fi
+done
+
+echo $CALFILES
+echo $TASKFILES
+
+# remove all empty lines and recode if necessary
+echo -n "Syncing iPod ... [Calendar] "
+	cat $CALFILES $TASKFILES | grep -v '^[[:space:]]$\|^$' | $FILTER |  $RECODE > $IPOD_MOUNT/Calendars/evolution
+echo "done!"


Property changes on: trunk/scripts/sync-evocalendar.sh
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/scripts/sync-evolution.sh
===================================================================
--- trunk/scripts/sync-evolution.sh	                        (rev 0)
+++ trunk/scripts/sync-evolution.sh	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,102 @@
+#!/bin/sh
+# Script for syncing evolution addressbook data with iPod
+# (c) 2004 Clinton Gormley <clint at traveljury dot com>
+#
+
+# Usage:
+# 
+# sync-addressbooks.sh [-i <ipod mountpoint>] [-e <encoding>]
+#                      [-d <path to evolution-addressbook-export>]
+#
+# (specify '-d' if evolution-addressbook-export is not in your default
+# path)
+#
+# with the following defaults: 
+
+IPOD_MOUNT=/mnt/ipod         # mountpoint of ipod
+ENCODING=ISO-8859-15         # encoding used by ipod
+
+# try to find the path to evolution-addressbook-export
+for i in {/opt/gnome,/usr,/usr/local}/{bin,lib*}/{,evolution/*/}evolution-addressbook-export; do
+    if [ -x "$i" ]; then
+        EVOPATH=`dirname "$i"`
+        break
+    fi
+done
+
+# Unless called with "-e=none" this script requires "iconv" available
+# from http://www.gnu.org/software/libiconv/
+
+# About the encoding used by the iPod (by Jorg Schuler):
+#
+# For some reason the encoding used for the contact files and
+# calender files depends on the language you have set your iPod
+# to. If you set your iPod to German, iso-8859-15 (or -1?) is
+# expected. If you set it to Japanese, SHIFT-JIS is expected. You need
+# to reboot the iPod to have the change take effect, however. (I'm
+# using firmware version 1.3.)
+#
+# If you know of more encodings, please let me know, so they can be
+# added here:
+#
+# iPod language      encoding expected
+# ----------------------------------------
+# German             ISO-8859-15
+# Japanese           SHIFT-JIS
+
+
+# Changelog:
+#
+# 2004/12/07 (Clinton Gormley <clint at traveljury dot com>):
+# adapted sync-kaddressbook to work with evolution.
+#
+# 2004/12/15 (Jorg Schuler <jcsjcs at users dot sourceforge dot net>):
+# Split evolution support into a new file.
+#
+# 2007/04/02 (Jorg Schuler <jcsjcs at users dot sourceforge dot net>):
+# Allow syncing of contacts containing pictures. Thanks to Lars Friedrichs.
+
+
+# overwrite default settings with optional command line arguments
+while getopts i:d:e: option; do
+    case $option in
+        i) IPOD_MOUNT=$OPTARG;;
+        d) EVOPATH=$OPTARG;;
+        e) ENCODING=$OPTARG;;
+        
+        \?) echo "Usage: `basename $0 ` [-i <ipod mountpoint>] [-e <encoding>] [-d <path to evolution-addressbook-export>]"
+	    exit 1;;
+    esac
+done
+
+
+# set the RECODE command
+if [ $ENCODING = "none" ] || [ $ENCODING = "NONE" ]; then
+    RECODE="cat"    # no conversion
+else
+    RECODE="iconv -f UTF-8 -t $ENCODING"
+fi
+
+
+echo "Trying to export from evolution:"
+
+# adjust path to find evolution-addressbook-export
+PATH=$EVOPATH:$PATH
+
+# check if evolution-addressbook-export is in PATH
+evolution-addressbook-export --help  >/dev/null 2>&1
+
+if [ ! $? == 0 ]; then
+    echo "** Error: Couldn't find evolution-addressbook-export in your PATH:"
+    echo $PATH
+    echo ""
+    echo "Please specify \"-d <path to evolution-addressbook-export>\" when you call this script"
+    exit 1
+fi
+
+
+# remove all empty lines and recode if necessary
+echo -n "Syncing iPod ... [Contacts] "
+# Redirect STDERR to avoid the "FIXME : wait for completion unimplemented" warning
+evolution-addressbook-export 2>&1 | grep -v '^[[:space:]]$\|^$' | $RECODE | sed -e "s/PHOTO;ENCODING=b;TYPE=\"X-EVOLUTION-UNKNOWN\"/PHOTO;BASE64/g" > $IPOD_MOUNT/Contacts/evolution
+echo "done!"


Property changes on: trunk/scripts/sync-evolution.sh
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/scripts/sync-kaddressbook.sh
===================================================================
--- trunk/scripts/sync-kaddressbook.sh	                        (rev 0)
+++ trunk/scripts/sync-kaddressbook.sh	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,90 @@
+#!/bin/sh
+# (c) 2004 Markus Gaugusch <markus at gaugusch dot at>
+# Script for syncing kaddressbook data with iPod
+
+# Usage:
+# 
+# sync-kaddressbook.sh [-i <ipod mountpoint>] [-d <kaddressbook data file>]
+#           ...        [-e <encoding>]
+#
+# with the following defaults: 
+
+IPOD_MOUNT=/mnt/ipod                          # mountpoint of ipod
+DATAFILE=~/.kde/share/apps/kabc/std.vcf       # vcard file
+ENCODING=ISO-8859-15                          # encoding used by ipod
+
+# Unless called with "-e none" this script requires "iconv" available
+# from http://www.gnu.org/software/libiconv/
+
+# About the encoding used by the iPod (by Jorg Schuler):
+#
+# For some reason the encoding used for the contact files and
+# calenader files depends on the language you have set your iPod
+# to. If you set your iPod to German, iso-8859-15 (or -1?) is
+# expected. If you set it to Japanese, SHIFT-JIS is expected. You need
+# to reboot the iPod to have the change take effect, however. (I'm
+# using firmware version 1.3.)
+#
+# If you know of more encodings, please let me know, so they can be
+# added here:
+#
+# iPod language      encoding expected
+# ----------------------------------------
+# German             ISO-8859-15
+# Japanese           SHIFT-JIS
+
+
+# Changelog:
+#
+# 2004/06/27 (Jorg Schuler <jcsjcs at users dot sourceforge dot net>):
+# Changed to accept ipod-mountpath and encoding as command line
+# option
+#
+# Split into two files -- one for contacts, one for calendar.
+#
+# Placed under GPL in agreement with Markus Gaugusch.
+#
+# Added note about encoding used by the iPod.
+#
+# 2004/07/02 (Jorg Schuler <jcsjcs at users dot sourceforge dot net>):
+# Added Usage-line, added check for vcard file, rearranged source
+#
+# 2004/07/03 (Jorg Schuler <jcsjcs at users dot sourceforge dot net>):
+# Made "iconv" optional (call with "-e none")
+#
+# Removed "dos2unix" as my iPod (firmware 1.3) happily accepted
+# DOS-type vcards as well. Instead changed the "grep" pattern to
+# catch \cr\lf as well.
+
+
+# overwrite default settings with optional command line arguments
+while getopts i:d:e: option; do
+    case $option in
+        i) IPOD_MOUNT=$OPTARG;;
+        d) DATAFILE=$OPTARG;;
+        e) ENCODING=$OPTARG;;
+        \?) echo "Usage: `basename $0` [-i <ipod mountpoint>] [-d <kaddressbook data file>] [-e <encoding>]"
+	    exit 1;;
+    esac
+done
+
+
+# set the RECODE command
+if [ $ENCODING = "none" ] || [ $ENCODING = "NONE" ]; then
+    RECODE="cat"    # no conversion
+else
+    RECODE="iconv -f UTF-8 -t $ENCODING"
+fi
+
+
+# check if DATAFILE exists
+if [ ! -f $DATAFILE ]; then
+    echo "Error: $DATAFILE does not exist"
+    exit 1
+fi
+
+
+# remove all empty lines and recode if necessary
+echo -n "Syncing iPod ... [Contacts] "
+cat $DATAFILE | grep -v '^[[:space:]]$\|^$' | $RECODE > $IPOD_MOUNT/Contacts/`basename $DATAFILE`
+echo "done!"


Property changes on: trunk/scripts/sync-kaddressbook.sh
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/scripts/sync-knotes.sh
===================================================================
--- trunk/scripts/sync-knotes.sh	                        (rev 0)
+++ trunk/scripts/sync-knotes.sh	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,69 @@
+#!/bin/bash
+# (c) 2005 Sebastian Scherer <basti _at_ andrew.cmu.edu>
+# Script for syncing knotes with iPod.
+# Recode and options adapted from sync-notes.sh
+#
+# sync-notes.sh [-i <ipod mountpoint>] [-e <encoding>]
+#
+# defaults:
+IPOD_MOUNT=/media/iPod
+ENCODING=ISO-8859-15                          # encoding used by ipod
+
+#First start knotes if it is not started already:
+if dcop knotes 2>/dev/null 1>/dev/null
+then
+   :
+else
+    knotes 2>/dev/null 1>/dev/null
+fi
+
+
+#Set options if other parameters given.
+while getopts i:e: option; do
+    case $option in
+        i) IPOD_MOUNT=$OPTARG;;
+        e) ENCODING=$OPTARG;;
+        \?) echo "Usage: `basename $0` [-i <ipod mountpoint>] [-e <encoding>]"
+	    exit 1;;
+    esac
+done
+
+# set the RECODE command
+if [ $ENCODING = "none" ] || [ $ENCODING = "NONE" ]; then
+    RECODE="cat"    # no conversion
+else
+    which iconv >/dev/null 2>&1
+    if [ "$?" != "0" ]; then
+      echo "iconv utility not found. please install 'iconv'."
+      exit
+    fi
+    RECODE="iconv -f UTF-8 -t $ENCODING"
+fi
+
+# check if iPod mountpoint exists
+if [ ! -d $IPOD_MOUNT/Notes ]; then
+    echo "Error: Cannot find iPod at $IPOD_MOUNT"
+    exit 1
+fi
+
+echo -n "Syncing iPod ... [Notes] "
+#Remove old notes
+mkdir -p $IPOD_MOUNT/Notes
+rm -rf $IPOD_MOUNT/Notes/*
+
+#Add new notes
+INDICES=`dcop knotes KNotesIface notes| awk -F '->' '{print $1}'`
+TITLES=`dcop knotes KNotesIface notes | awk -F '->' '{print $2}'`
+COUNT=1
+for INDEX in $INDICES
+do
+  TITLE=`echo "$TITLES" | sed "$COUNT!d"`
+#  echo "$COUNT Index: $INDEX, Title: $TITLE"
+  TEXT=`dcop knotes KNotesIface text $INDEX`
+  #echo "Text: $TEXT"
+  TITLE=`echo "$TITLE" | sed 's/\W/./g'`
+  echo "$TEXT" | $RECODE > "$IPOD_MOUNT/Notes/${COUNT}-${TITLE}"
+  COUNT=`expr $COUNT + 1`
+done
+
+echo "done!"


Property changes on: trunk/scripts/sync-knotes.sh
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/scripts/sync-korganizer.sh
===================================================================
--- trunk/scripts/sync-korganizer.sh	                        (rev 0)
+++ trunk/scripts/sync-korganizer.sh	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,90 @@
+#!/bin/sh
+# (c) 2004 Markus Gaugusch <markus at gaugusch.at>
+# Script for syncing korganizer data with iPod
+
+# Usage:
+# 
+# sync-kaddressbook.sh [-i <ipod mountpoint>] [-d <korganizer data file>]
+#           ...        [-e <encoding>]
+#
+# with the following defaults: 
+
+IPOD_MOUNT=/mnt/ipod                          # mountpoint of ipod
+DATAFILE=~/.kde/share/apps/korganizer/std.ics # calendar data file
+ENCODING=ISO-8859-15                          # encoding used by ipod
+
+# Unless called with "-e none" this script requires "iconv" available
+# from http://www.gnu.org/software/libiconv/
+
+# About the encoding used by the iPod (by Jorg Schuler):
+#
+# For some reason the encoding used for the contact files and
+# calenader files depends on the language you have set your iPod
+# to. If you set your iPod to German, iso-8859-15 (or -1?) is
+# expected. If you set it to Japanese, SHIFT-JIS is expected. You need
+# to reboot the iPod to have the change take effect, however. (I'm
+# using firmware version 1.3.)
+#
+# If you know of more encodings, please let me know, so they can be
+# added here:
+#
+# iPod language      encoding expected
+# ----------------------------------------
+# German             ISO-8859-15
+# Japanese           SHIFT-JIS
+
+
+# Changelog:
+#
+# 2004/06/27 (Jorg Schuler <jcsjcs at users dot sourceforge dot net>):
+# Changed to accept ipod-mountpath and encoding as command line
+# option
+#
+# Split into two files -- one for contacts, one for calendar.
+#
+# Placed under GPL in agreement with Markus Gaugusch.
+#
+# Added note about encoding used by the iPod.
+#
+# 2004/07/02 (Jorg Schuler <jcsjcs at users dot sourceforge dot net>):
+# Added Usage-line, added check for vcard file, rearranged source
+#
+# 2004/07/03 (Jorg Schuler <jcsjcs at users dot sourceforge dot net>):
+# Made "iconv" optional (call with "-e none")
+#
+# Removed "dos2unix" as my iPod (firmware 1.3) happily accepted
+# DOS-type vcards as well. Instead changed the "grep" pattern to
+# catch \cr\lf as well.
+
+
+# overwrite default settings with optional command line arguments
+while getopts i:d:e: option; do
+    case $option in
+        i) IPOD_MOUNT=$OPTARG;;
+        d) DATAFILE=$OPTARG;;
+        e) ENCODING=$OPTARG;;
+        \?) echo "Usage: `basename $0` [-i <ipod mountpoint>] [-d <korganizer data file>] [-e <encoding>]"
+	    exit 1;;
+    esac
+done
+
+
+# set the RECODE command
+if [ $ENCODING = "none" ] || [ $ENCODING = "NONE" ]; then
+    RECODE="cat"    # no conversion
+else
+    RECODE="iconv -f UTF-8 -t $ENCODING"
+fi
+
+
+# check if DATAFILE exists
+if [ ! -f $DATAFILE ]; then
+    echo "Error: $DATAFILE does not exist"
+    exit 1
+fi
+
+
+# remove all empty lines and recode if necessary
+echo -n "Syncing iPod ... [Calendar] "
+cat $DATAFILE | grep -v '^[[:space:]]$\|^$' | $RECODE > $IPOD_MOUNT/Calendars/`basename $DATAFILE`
+echo "done!"


Property changes on: trunk/scripts/sync-korganizer.sh
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/scripts/sync-ldif.sh
===================================================================
--- trunk/scripts/sync-ldif.sh	                        (rev 0)
+++ trunk/scripts/sync-ldif.sh	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,158 @@
+#! /bin/sh
+
+# Placed under GPL; to know more, see:
+# 			http://www.gnu.org/licenses/licenses.html
+#
+# if you make any change, I would be happy to be kept advised by
+# sending an email at <sberidot at libertysurf dot fr>.
+#
+# Write "[sync-ldif.sh]" in the subject, otherwise the message is
+# bound to be considered as spam... :(
+#
+#
+# RESTRICTION : I haven't managed yet to read correctly data from
+# ldif files when accents are used, Thunderbird writes the names
+# differently...This is still Chinese for me!! :)
+
+export LDIFAMILYNAME=contactIPOD	# Filenames will look like $LDIFAMILYNAMEXX.vcf, X=[0-9]
+export IPOD_MOUNT=/mnt/ipod		# Mount point of the ipod
+declare LDIFILE=addressbook.ldif	# default filename 'addressbook.ldif'
+declare ENCODING=ISO-8859-15            # To try others encodings : 'iconv --list'
+declare DELETE="NO"			# To delete old .vcf files by default? 'NO'!!
+
+# Exiting function
+function EXITING {
+	export -n LDIFAMILYNAME
+	export -n IPOD_MOUNT
+}
+
+# Please HELP!!! :)
+function DISPLAY_HELP {
+	cat <<- EOF
+		Beware not to share the same familyname with old .vcf in the ipod directory;
+		no one precaution is taken, so files will be overwritten. :(
+		For the moment, I did not manage to make accents be displayed properly,
+		but still working on it. Enjoy!
+
+		Default options:
+		Current Ipod directory is      : $IPOD_MOUNT
+		Current Encoding               : $ENCODING
+		Current template for filenames : $LDIFAMILYNAME[1-9*].vcf
+		$(basename $0) doesn't delete old .vcf files by default, but overwrites.
+
+		Options:
+		Syntax : $(basename $0) -f addbook.ldif -m /media/ipod -n contactIPOD -d (-h)
+		[-f] addbook.ldif  : contains the .ldif Filename
+		[-m] /media/ipod   : contains the ipod Mounted directory
+		[-n] contactIPOD   : contains the .vcf family fileName
+		[-d]               : contains the option to Delete all old .vcf files
+		[-h]               : contains this Help
+	EOF
+}
+
+# $1 contains the directory to be tested
+# Is/Are .vcf file(s) present?
+function TST_VCF {
+	local j
+	for j in "${1%%/}/"* ; do
+		if [ "${j##*.}" = "vcf" ] ; then
+			return 0
+			break
+		fi
+	done
+	return 1
+}
+
+# $1 contains the util name
+# Is $1 already installed?
+function TST_UTIL {
+	which "$1" >/dev/null 2>&1
+	if [ "$?" != "0" ]; then
+		echo "[INSTALL] $1 utility not found, please install $1 package first!"
+		EXITING
+		exit 3
+	fi
+}
+
+# $1 contains the .vcf filename
+# extracts names from .vcf filename
+function EXTRACT_CONTACT_FROM_VCF {
+	local NAME="UNKNOWN"
+	if [ -e "$1" ] ; then
+		NAME=$(grep "fn:" "$1")
+		NAME=${NAME:3}
+	fi
+	echo "$NAME"
+}
+
+function DELETE_VCFILE_FROM_IPOD {
+	# if no .vcf file's found, exit!
+	if ! TST_VCF "$IPOD_MOUNT"/Contacts/ ; then
+		echo "[DELETING] no file detected"
+		return
+	fi
+	# begin to delete
+	local i
+	for i in "$IPOD_MOUNT"/Contacts/*.vcf ; do
+		echo "[DELETING] " $(EXTRACT_CONTACT_FROM_VCF "$i") "from ${i##*/}"
+		rm -f "$i"
+	done
+}
+
+# Is Ipod Directory valid?
+function IS_IPOD_DIR_VALID {
+	# Test of the $IPOD_MOUNT directory
+	if [ ! -d "$IPOD_MOUNT/Contacts/" ]; then
+		echo "$IPOD_MOUNT/Contacts invalid... Exiting."
+		EXITING
+		exit 2
+	fi
+}
+
+# Program's starting here!
+
+# Testing awk and iconv utils...
+TST_UTIL "awk"
+TST_UTIL "iconv"
+
+# picking up and processing parameters from prompt...
+while getopts ":f:m:n:dh:" option ; do
+	case $option in
+		f )	LDIFILE="$OPTARG";;
+		m )     IPOD_MOUNT="${OPTARG%%/}";;
+		n )	LDIFAMILYNAME="$OPTARG";;
+		d )	DELETE="OK";;
+		h | * )	DISPLAY_HELP; EXITING; exit 1;;
+	esac
+done
+
+# check, if not valid, exit!
+IS_IPOD_DIR_VALID
+
+# Is LDIFILE really a ldif file? just testing the extension, and if the file exists...
+if [ "${LDIFILE##*.}" == "ldif" ] || [ "${LDIFILE##*.}" == "LDIF" ] && [ -e "$LDIFILE" ] ; then
+	# The $IPOD_MOUNT/Contacts/ directory will be emptied if '-d' option!
+	if [ "$DELETE" == "OK" ]; then
+		echo "Old contacts being deleted from $IPOD_MOUNT. Work in progress..."
+		DELETE_VCFILE_FROM_IPOD
+		sleep 1
+	fi
+
+	echo "New contacts being synchronised from $LDIFILE. Work in progress..."
+	# Translation from LDIF into VCF, in order to cut standard output in vcf files...
+	# Converting into vcf stream | converting to ENCODING | detection of VCF card
+	#							and writing it into the Ipod
+	ldif2vcf.sh < "$LDIFILE" | iconv -f UTF-8 -t $ENCODING | awk 'BEGIN{RS="\n"; NAME=""; CARD=""; VCFILE=""; NCARD=1} /^fn:/ {NAME=substr($0,4)} /^$/{next} /^end:vcard/ {VCFILE = ENVIRON["IPOD_MOUNT"] "/Contacts/" ENVIRON["LDIFAMILYNAME"] (NCARD-1) ".vcf"; print "[WRITING] " NAME " in " ENVIRON["LDIFAMILYNAME"] (NCARD-1) ".vcf"; print CARD "end:vcard" > VCFILE; CARD=""; VCFILE=""; NCARD++; next} {CARD=CARD $0 RS} END{print (NCARD-1) " vcards added."}' # >/dev/null 2>&1
+
+	if [ "$?" != "0" ]; then
+		echo "[ERROR] An error occured, exiting, sorry for that... Please Report!"
+		EXITING
+		exit 1
+	fi
+	echo "complete!"
+else
+	DISPLAY_HELP
+fi
+
+EXITING
+exit 0


Property changes on: trunk/scripts/sync-ldif.sh
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/scripts/sync-notes.sh
===================================================================
--- trunk/scripts/sync-notes.sh	                        (rev 0)
+++ trunk/scripts/sync-notes.sh	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,145 @@
+#!/bin/sh
+# (c) 2004 Markus Gaugusch <markus at gaugusch.at>
+# Script for syncing notes with iPod
+
+# Usage:
+# 
+# sync-notes.sh [-i <ipod mountpoint>] [-d <path to folder containing notes (~/ipod_notes by default)>]
+#           ...        [-e <encoding>]
+#
+# with the following defaults: 
+
+IPOD_MOUNT=/media/ipod            # mountpoint of ipod
+NOTESPATH=~/Desktop/notes         # path to folder containing notes
+ENCODING=ISO-8859-15              # encoding used by ipod
+
+# Unless called with "-e=none" this script requires "iconv" available
+# from http://www.gnu.org/software/libiconv/
+
+# About the encoding used by the iPod (by Jorg Schuler):
+#
+# For some reason the encoding used for the contact files and
+# calenader files depends on the language you have set your iPod
+# to. If you set your iPod to German, iso-8859-15 (or -1?) is
+# expected. If you set it to Japanese, SHIFT-JIS is expected. You need
+# to reboot the iPod to have the change take effect, however. (I'm
+# using firmware version 1.3.)
+#
+# If you know of more encodings, please let me know, so they can be
+# added here:
+#
+# iPod language      encoding expected
+# ----------------------------------------
+# German             ISO-8859-15
+# Japanese           SHIFT-JIS
+
+
+# Changelog:
+#
+# 2004/06/27 (Jorg Schuler <jcsjcs at users dot sourceforge dot net>):
+# Changed to accept ipod-mountpath and encoding as command line
+# option
+#
+# Split into two files -- one for contacts, one for calendar.
+#
+# Placed under GPL in agreement with Markus Gaugusch.
+#
+# Added note about encoding used by the iPod.
+#
+# 2004/07/02 (Jorg Schuler <jcsjcs at users dot sourceforge dot net>):
+# Added Usage-line, added check for vcard file, rearranged source
+#
+# 2004/07/03 (Jorg Schuler <jcsjcs at users dot sourceforge dot net>):
+# Made "iconv" optional (call with "-e=none")
+#
+# Removed "dos2unix" as my iPod (firmware 1.3) happily accepted
+# DOS-type vcards as well. Instead changed the "grep" pattern to
+# catch \cr\lf as well.
+#
+# 2004/12/15 (Clinton Gormley <clint at traveljury dot com>):
+# adapted sync-korganiser to synchronise a folder containing notes
+#
+# 2005/04/02 (Thomas Perl <thp at perli dot net>):
+# * added features to remove gedit backup files (*~) from source 
+#   folder before syncing, better would be to modify the find 
+#   command to exclude such backup files instead of deleting them
+# * added support for directories inside of notes, syncing only 
+#   directories containing files
+# * added check to see if recode is installed
+# 
+# 2005/06/12 (Jorg Schuler <jcsjcs at users dot sourceforge dot net>):
+# * added patch by Alexey Dokuchaev to replace recode by iconv
+# * changed check for recode to check of iconv
+#
+# 2007/05/31 (Jorg Schuler <jcsjcs at users dot sourceforge dot net>):
+# Corrections By Oliver Sherouse <oliver.sherouse AT gmail DOT com>
+# (replaced some arithmetic expressions), fixed "-e=none", correctly
+# indicate "-d" in 'usage' instead of "-p")
+
+
+# overwrite default settings with optional command line arguments
+while getopts i:d:e: option; do
+    case $option in
+        i) IPOD_MOUNT=$OPTARG;;
+        d) NOTESPATH=$OPTARG;;
+        e) ENCODING=$OPTARG;;
+        \?) echo "Usage: `basename $0` [-i <ipod mountpoint>] [-p <path to folder containing notes (~/ipod_notes by default)>] [-e <encoding>]"
+	    exit 1;;
+    esac
+done
+
+
+# set the RECODE command
+if [ $ENCODING = "none" ] || [ $ENCODING = "NONE" ]; then
+    RECODE="cat"    # no conversion
+else
+    which iconv >/dev/null 2>&1
+    if [ "$?" != "0" ]; then
+      echo "iconv utility not found. please install 'iconv'."
+      exit
+    fi
+    RECODE="iconv -f UTF-8 -t $ENCODING"
+fi
+
+
+# check if NOTESPATH exists
+if [ ! -d $NOTESPATH ]; then
+    echo "Error: folder $NOTESPATH does not exist"
+    exit 1
+fi
+
+# check if iPod mountpoint exists
+if [ ! -d $IPOD_MOUNT/Notes ]; then
+    echo "Error: Cannot find iPod at $IPOD_MOUNT"
+    exit 1
+fi
+
+
+# remove existing files on iPod and transfer (recode if necessary) all current files to iPod
+# Seeing all notes should be under 4K, easier to delete and recopy rather than checking all files sizes
+
+echo -n "Syncing iPod ... [Notes] "
+rm -rf $IPOD_MOUNT/Notes/*
+rm -f $NOTESPATH/*~
+cd $NOTESPATH
+
+I=0
+
+find -type f |
+(
+  read FILE
+  while [ "$?" = "0" ]; do
+	I=`expr $I + 1`
+	mkdir -p "$IPOD_MOUNT/Notes/`dirname "$FILE"`/"
+	cat "$FILE" | $RECODE > "$IPOD_MOUNT/Notes/$FILE"
+	read FILE
+  done
+  echo  
+  case $I in 
+	0) echo "No notes found to copy";;
+	1) echo "1 note copied";;
+	*) echo "$I notes copied";;
+  esac
+)
+
+echo "done!"


Property changes on: trunk/scripts/sync-notes.sh
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/scripts/sync-palm-jppy.py
===================================================================
--- trunk/scripts/sync-palm-jppy.py	                        (rev 0)
+++ trunk/scripts/sync-palm-jppy.py	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,77 @@
+#!/usr/bin/python
+# Script for syncing Palm addressbook data with iPod via Jppy
+# (c) 2005 Nick Piper <nick at nickpiper dot co dot uk>
+#
+
+# Usage:
+# 
+# sync-jppy.py [-i <ipod mountpoint>] [-e <encoding>]
+#
+#
+# with the following defaults: 
+
+IPOD_MOUNT="/media/ipod"         # mountpoint of ipod
+ENCODING="ISO-8859-15"         # encoding used by ipod
+
+# Unless called with "-e=none" this script requires "recode" available
+# from ftp://ftp.iro.umontreal.ca/pub/recode/recode-3.6.tar.gz
+
+# About the encoding used by the iPod (by Jorg Schuler):
+#
+# For some reason the encoding used for the contact files and
+# calender files depends on the language you have set your iPod
+# to. If you set your iPod to German, iso-8859-15 (or -1?) is
+# expected. If you set it to Japanese, SHIFT-JIS is expected. You need
+# to reboot the iPod to have the change take effect, however. (I'm
+# using firmware version 1.3.)
+#
+# If you know of more encodings, please let me know, so they can be
+# added here:
+#
+# iPod language      encoding expected
+# ----------------------------------------
+# German             ISO-8859-15
+# Japanese           SHIFT-JIS
+
+
+from optparse import OptionParser
+import os
+import jppy
+import glob
+
+parser = OptionParser()
+parser.add_option("-i", "--ipod", dest="mountpoint",default=IPOD_MOUNT,
+                  help="use iPod mounted at DIR", metavar="DIR")
+parser.add_option("-e", "--encoding",
+                  dest="encoding", default=ENCODING,
+                  help="encode to ENCODING")
+parser.add_option("-q", "--quiet",
+                  action="store_false", dest="verbose", default=True,
+                  help="don't print status messages to stdout")
+
+(options, args) = parser.parse_args()
+
+if options.verbose:
+    print "Trying to export from Jppy:"
+
+dir = os.path.join(options.mountpoint,"Contacts")
+if not os.path.exists(dir):
+    parser.error("Are you sure the iPod is at %s?" % options.mountpoint)
+
+ab=jppy.addressBook()
+
+n=0
+for r in ab.records():
+    n=n+1
+    card=r.vcard().decode('palmos').encode(options.encoding)
+    open(os.path.join(dir,"jppy-%d.vcf" % n),"w").write(card)
+
+r=0
+dirnamelen=len(os.path.join(os.path.join(dir,"jppy-")))
+for fn in glob.glob(os.path.join(dir,"jppy-*.vcf")):
+    if int(fn[dirnamelen:-4]) > n:
+        r=r+1
+        os.unlink(fn)
+        
+if options.verbose:
+    print "Saved %d records, removed %d records." % (n,r)


Property changes on: trunk/scripts/sync-palm-jppy.py
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/scripts/sync-thunderbird-nano.sh
===================================================================
--- trunk/scripts/sync-thunderbird-nano.sh	                        (rev 0)
+++ trunk/scripts/sync-thunderbird-nano.sh	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,97 @@
+#!/bin/sh
+#
+# Script for syncing thunderbird addressbook data with iPod Nano
+#
+# It appears as if the old iPod Nano firmware only displayed the first
+# entry of a vcf file (the issue doesn't seem to exist with current
+# versions of the firmware). This script writes one vcf file per
+# address in your address book and could therefore also be useful
+# non-Nano users.
+#
+# (c) 2006 Paul Oremland <paul at oremland dot net>
+
+# Usage:
+# 
+# sync-thunderbird-nano.sh [-i <ipod mountpoint>] [-e <encoding>]
+#                      [-d <path to thunderbird address book>]
+#                      [-n <name of exported file>]
+#
+# specify '-d' if your thunderbird address book is not in
+# ~/.thunderbird/
+#
+# specify '-n' if you want to export more than one address book
+# (otherwise the second call to this script will overwrite the output
+# of the first call)
+
+# with the following defaults: 
+
+IPOD_MOUNT=/mnt/ipod         # mountpoint of ipod
+ENCODING=ISO-8859-15         # encoding used by ipod
+NAME=thunderbird             # default file export name
+FILE_FLAG=''		     # flag used to determine end of file
+let COUNT=0;		     # file counter
+
+# Unless called with "-e=none" this script requires "recode" available
+# from ftp://ftp.iro.umontreal.ca/pub/recode/recode-3.6.tar.gz
+
+# About the encoding used by the iPod (by Jorg Schuler):
+#
+# For some reason the encoding used for the contact files and
+# calender files depends on the language you have set your iPod
+# to. If you set your iPod to German, iso-8859-15 (or -1?) is
+# expected. If you set it to Japanese, SHIFT-JIS is expected. You need
+# to reboot the iPod to have the change take effect, however. (I'm
+# using firmware version 1.3.)
+#
+# If you know of more encodings, please let me know, so they can be
+# added here:
+#
+# iPod language      encoding expected
+# ----------------------------------------
+# German             ISO-8859-15
+# Japanese           SHIFT-JIS
+
+
+# Changelog:
+#
+# 2006/04/10 (Paul Oremland <paul at oremland dot net>):
+# break vcf file out into individual vcf files per contact
+
+
+# overwrite default settings with optional command line arguments
+while getopts i:d:e:n: option; do
+    case $option in
+        i) IPOD_MOUNT=$OPTARG;;
+        d) THUNPATH=$OPTARG;;
+        e) ENCODING=$OPTARG;;
+	n) NAME=$OPTARG;;
+        
+        \?) echo "Usage: `basename $0 ` [-i <ipod mountpoint>] [-e <encoding>] [-d <path to thunderbird address book>] [-n <name of exported file>]"
+	    exit 1;;
+    esac
+done
+
+
+echo "Exporting Contacts:"
+SYNC="$(dirname $0)/sync-thunderbird.sh -i ${IPOD_MOUNT} -e ${ENCODING} -d ${THUNPATH} -n ${NAME}"
+$SYNC
+
+echo "Breaking apart VCF file into individual contacts"
+for line in $(cat $IPOD_MOUNT/Contacts/${NAME}.vcf | sed "s/\ /[54321]/g")
+do
+	if [ "$FILE_FLAG" = 'END' ]; then
+		let COUNT=$COUNT+1;
+	fi
+
+	echo $line | sed "s/\[54321\]/\ /g" >> $IPOD_MOUNT/Contacts/${NAME}$COUNT.vcf
+
+	if [ "$line" = 'END:VCARD' ]; then
+		echo "Finished Writing ${NAME}$COUNT.vcf"
+		FILE_FLAG="END";
+	else
+		FILE_FLAG='';
+	fi
+done
+
+echo "Removing ${NAME}.vcf"
+rm $IPOD_MOUNT/Contacts/${NAME}.vcf


Property changes on: trunk/scripts/sync-thunderbird-nano.sh
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/scripts/sync-thunderbird.sh
===================================================================
--- trunk/scripts/sync-thunderbird.sh	                        (rev 0)
+++ trunk/scripts/sync-thunderbird.sh	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,87 @@
+#!/bin/sh
+# Script for syncing thunderbird addressbook data with iPod
+# (c) 2004 Clinton Gormley <clint at traveljury dot com>
+#
+
+# Usage:
+# 
+# sync-thunderbird.sh [-i <ipod mountpoint>] [-e <encoding>]
+#                      [-d <path to thunderbird address book>]
+#                      [-n <name of exported file>]
+#
+# specify '-d' if your thunderbird address book is not in
+# ~/.thunderbird/
+#
+# specify '-n' if you want to export more than one address book
+# (otherwise the second call to this script will overwrite the output
+# of the first call)
+
+# with the following defaults: 
+
+IPOD_MOUNT=/mnt/ipod         # mountpoint of ipod
+ENCODING=ISO-8859-15         # encoding used by ipod
+NAME=thunderbird             # default file export name
+
+# Unless called with "-e=none" this script requires "recode" available
+# from ftp://ftp.iro.umontreal.ca/pub/recode/recode-3.6.tar.gz
+
+# About the encoding used by the iPod (by Jorg Schuler):
+#
+# For some reason the encoding used for the contact files and
+# calender files depends on the language you have set your iPod
+# to. If you set your iPod to German, iso-8859-15 (or -1?) is
+# expected. If you set it to Japanese, SHIFT-JIS is expected. You need
+# to reboot the iPod to have the change take effect, however. (I'm
+# using firmware version 1.3.)
+#
+# If you know of more encodings, please let me know, so they can be
+# added here:
+#
+# iPod language      encoding expected
+# ----------------------------------------
+# German             ISO-8859-15
+# Japanese           SHIFT-JIS
+
+
+# Changelog:
+#
+# 2005/05/18 (Clinton Gormley <clint at traveljury dot com>):
+# adapted sync-kaddressbook to work with thunderbird.
+#
+# 2004/12/15 (Jorg Schuler <jcsjcs at users dot sourceforge dot net>):
+# Split evolution support into a new file.
+#
+# 2005/06/23 (Jorg Schuler <jcsjcs at users dot sourceforge dot net>):
+# use 'iconv' instead of 'recode'
+
+
+# overwrite default settings with optional command line arguments
+while getopts i:d:e:n: option; do
+    case $option in
+        i) IPOD_MOUNT=$OPTARG;;
+        d) THUNPATH=$OPTARG;;
+        e) ENCODING=$OPTARG;;
+	n) NAME=$OPTARG;;
+        
+        \?) echo "Usage: `basename $0 ` [-i <ipod mountpoint>] [-e <encoding>] [-d <path to thunderbird address book>] [-n <name of exported file>]"
+	    exit 1;;
+    esac
+done
+
+
+# set the RECODE command
+if [ $ENCODING = "none" ] || [ $ENCODING = "NONE" ]; then
+    RECODE="cat"    # no conversion
+else
+    RECODE="iconv -f UTF-8 -t $ENCODING"
+fi
+
+
+echo "Trying to export from thunderbird:"
+
+MAB2VCARD=`dirname $0`/mab2vcard
+
+# remove all empty lines and recode if necessary
+echo -n "Syncing iPod ... [Contacts] "
+$MAB2VCARD $THUNPATH | grep -v '^[[:space:]]$\|^$' | $RECODE > $IPOD_MOUNT/Contacts/${NAME}.vcf
+echo "done!"


Property changes on: trunk/scripts/sync-thunderbird.sh
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/scripts/sync-tomboy.sh
===================================================================
--- trunk/scripts/sync-tomboy.sh	                        (rev 0)
+++ trunk/scripts/sync-tomboy.sh	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,167 @@
+#!/bin/sh
+# (c) 2004 Markus Gaugusch <markus at gaugusch.at>
+# Script for syncing notes from tomboy with iPod
+
+# Tomboy Stuff By Tejas Dinkar <tejasdinkar AT gmail DOT com>
+
+# Usage:
+# 
+# sync-notes.sh [-i <ipod mountpoint>] [-d <path to folder containing notes (~/ipod_notes by default)>]
+#           ...        [-e <encoding>]
+#
+# with the following defaults: 
+
+IPOD_MOUNT=/media/ipod                    # mountpoint of ipod
+NOTESPATH=~/.tomboy			  # path to folder containing notes
+ENCODING=ISO-8859-15                      # encoding used by ipod
+
+# Unless called with "-e=none" this script requires "iconv" available
+# from http://www.gnu.org/software/libiconv/
+
+# About the encoding used by the iPod (by Jorg Schuler):
+#
+# For some reason the encoding used for the contact files and
+# calenader files depends on the language you have set your iPod
+# to. If you set your iPod to German, iso-8859-15 (or -1?) is
+# expected. If you set it to Japanese, SHIFT-JIS is expected. You need
+# to reboot the iPod to have the change take effect, however. (I'm
+# using firmware version 1.3.)
+#
+# If you know of more encodings, please let me know, so they can be
+# added here:
+#
+# iPod language      encoding expected
+# ----------------------------------------
+# German             ISO-8859-15
+# Japanese           SHIFT-JIS
+
+
+# Changelog:
+#
+# 2004/06/27 (Jorg Schuler <jcsjcs at users dot sourceforge dot net>):
+# Changed to accept ipod-mountpath and encoding as command line
+# option
+#
+# Split into two files -- one for contacts, one for calendar.
+#
+# Placed under GPL in agreement with Markus Gaugusch.
+#
+# Added note about encoding used by the iPod.
+#
+# 2004/07/02 (Jorg Schuler <jcsjcs at users dot sourceforge dot net>):
+# Added Usage-line, added check for vcard file, rearranged source
+#
+# 2004/07/03 (Jorg Schuler <jcsjcs at users dot sourceforge dot net>):
+# Made "iconv" optional (call with -e="none")
+#
+# Removed "dos2unix" as my iPod (firmware 1.3) happily accepted
+# DOS-type vcards as well. Instead changed the "grep" pattern to
+# catch \cr\lf as well.
+#
+# 2004/12/15 (Clinton Gormley <clint at traveljury dot com>):
+# adapted sync-korganiser to synchronise a folder containing notes
+#
+# 2005/04/02 (Thomas Perl <thp at perli dot net>):
+# * added features to remove gedit backup files (*~) from source 
+#   folder before syncing, better would be to modify the find 
+#   command to exclude such backup files instead of deleting them
+# * added support for directories inside of notes, syncing only 
+#   directories containing files
+# * added check to see if recode is installed
+# 
+# 2005/06/12 (Jorg Schuler <jcsjcs at users dot sourceforge dot net>):
+# * added patch by Alexey Dokuchaev to replace recode by iconv
+# * changed check for recode to check of iconv
+#
+# 2007/05/31 (Jorg Schuler <jcsjcs at users dot sourceforge dot net>):
+# Corrections By Oliver Sherouse <oliver.sherouse AT gmail DOT com>
+# (replaced some arithmetic expressions, improved conversion, correctly
+# indicate "-d" in 'usage' instead of "-p")
+
+# overwrite default settings with optional command line arguments
+while getopts i:d:e: option; do
+    case $option in
+        i) IPOD_MOUNT=$OPTARG;;
+        d) NOTESPATH=$OPTARG;;
+        e) ENCODING=$OPTARG;;
+        \?) echo "Usage: `basename $0` [-i <ipod mountpoint>] [-p <path to folder containing notes (~/ipod_notes by default)>] [-e <encoding>]"
+	    exit 1;;
+    esac
+done
+
+
+# set the RECODE command
+if [ $ENCODING = "none" ] || [ $ENCODING = "NONE" ]; then
+    RECODE="cat"    # no conversion
+else
+    which iconv >/dev/null 2>&1
+    if [ "$?" != "0" ]; then
+      echo "iconv utility not found. please install 'iconv'."
+      exit
+    fi
+    RECODE="iconv -f UTF-8 -t $ENCODING"
+fi
+
+
+# check if NOTESPATH exists
+if [ ! -d $NOTESPATH ]; then
+    echo "Error: folder $NOTESPATH does not exist"
+    exit 1
+fi
+
+# check if iPod mountpoint exists
+if [ ! -d "$IPOD_MOUNT/Notes" ]; then
+    echo "Error: Cannot find iPod at $IPOD_MOUNT"
+    exit 1
+fi
+
+
+# remove existing files on iPod and transfer (recode if necessary) all current files to iPod
+# Seeing all notes should be under 4K, easier to delete and recopy rather than checking all files sizes
+
+echo -n "Syncing iPod ... [Notes] "
+rm -rf "$IPOD_MOUNT/Notes/*"
+rm -f $NOTESPATH/*~
+cd $NOTESPATH
+
+I=0
+
+ls *.note |
+(
+  read FILE
+  while [ "$?" = "0" ]; do
+	I=`expr $I + 1`
+
+	# Get the starting and ending lines for the data
+	LIMITS=`cat $FILE | grep -n  note-content | cut -d ":" -f 1 | tr "\n" " "`
+	START=`echo $LIMITS | cut -d " " -f 1`
+	END=`echo $LIMITS | cut -d " " -f 2`
+
+	DATA=`cat "$FILE"`
+
+	# Strip the tomboy stuff :(
+	for i in "<\/note-content>" "<\/text>" "<link:broken>" "<\/link:broken>" "<link:internal>" "<\/link:internal>" "<link:external>" "<\/link:external>" "<\/list>" "<list>" "<\/list-item>" "<list-item dir=\"ltr\">"; do
+		DATA=`printf "$DATA" | sed "s/$i//g"`
+	done
+
+	# Get the notes titles, we can use this as the filename
+	TITLE=`echo "$DATA" | cut -d "
+" -f $START | cut -d ">" -f 3 | tr : -`
+
+	# Get the Lines with the useful data
+	DATA=`echo "$DATA" | cut -d "
+" -f $(( $START + 2 ))-$END`
+
+	printf "$DATA" | $RECODE > "$IPOD_MOUNT/Notes/$TITLE"
+
+	read FILE
+  done
+  echo  
+  case $I in 
+	0) echo "No notes found to copy";;
+	1) echo "1 note copied";;
+	*) echo "$I notes copied";;
+  esac
+)
+
+echo "done!"


Property changes on: trunk/scripts/sync-tomboy.sh
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/scripts/sync-webcalendar.sh
===================================================================
--- trunk/scripts/sync-webcalendar.sh	                        (rev 0)
+++ trunk/scripts/sync-webcalendar.sh	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,63 @@
+#!/bin/sh
+# (c) 2005 Daniel Kercher
+# sync ipod with webcalendar
+
+# Usage:
+#
+# sync-webcalendar.sh [-i <ipod mountpoint>] [-d <webcalendar uri>] [-c <calendar name>]
+#
+# with the following defaults:
+
+# mount point of ipod
+IPOD_MOUNT='/mnt/ipod'
+# uri for webcalendar (example)
+DATAFILE='https://somewhere.local/calendar.ics'
+# calendar name
+CALENDAR='webcalendar'
+# special options for wget
+WGET_OPTIONS='--no-check-certificate'
+
+# About the encoding used by the iPod (by Jorg Schuler):
+#
+# For some reason the encoding used for the contact files and
+# calenader files depends on the language you have set your iPod
+# to. If you set your iPod to German, iso-8859-15 (or -1?) is
+# expected. If you set it to Japanese, SHIFT-JIS is expected. You need
+# to reboot the iPod to have the change take effect, however. (I'm
+# using firmware version 1.3.)
+#
+# If you know of more encodings, please let me know, so they can be
+# added here:
+#
+# iPod language      encoding expected
+# ----------------------------------------
+# German             ISO-8859-15
+# Japanese           SHIFT-JIS
+
+# Changelog
+#
+# 2007/02/01 (Giray Devlet <giray at devlet.cc>): Multi Calendar Support
+#
+# 2005/06/15 (Jorg Schuler <jcsjcs at users dot sourceforge dot net>):
+# Received original script from Daniel Kercher and added command line
+# options
+#
+# 2007/05/31 (Jorg Schuler <jcsjcs at users dot sourceforge dot net>):
+# Set a more reasonable default datafile.
+#
+# FIXME: some way to convert the character set
+
+# overwrite default settings with optional command line arguments
+while getopts i:d:c: option; do
+    case $option in
+        i) IPOD_MOUNT=$OPTARG;;
+        d) DATAFILE=$OPTARG;;
+        c) CALENDAR=$OPTARG;;
+        \?) echo "Usage: `basename $0` [-i <ipod mountpoint>] [-d <webcalendar uri>] [-c <calendar_name>]"
+            exit 1;;
+    esac
+done
+
+echo -n "Syncing Web Calendar \"${CALENDAR}\" to iPod... "
+wget -q $WGET_OPTIONS -O ${IPOD_MOUNT}/Calendars/${CALENDAR}.ics $DATAFILE
+echo "done!"


Property changes on: trunk/scripts/sync-webcalendar.sh
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/src/Makefile.am
===================================================================
--- trunk/src/Makefile.am	                        (rev 0)
+++ trunk/src/Makefile.am	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,60 @@
+## Process this file with automake to produce Makefile.in
+
+INCLUDES = -DMOUNT_BIN=\""@MOUNT@\"" \
+	   -DUMOUNT_BIN=\""@UMOUNT@\"" \
+	   -DPACKAGE_DATA_DIR=\""$(datadir)"\" \
+	   -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" 
+
+bin_PROGRAMS = gtkpod
+
+## I'm using %option outfile="lex.yy.c" in the parser files,
+## so this should be portable
+LEX_OUTPUT_ROOT = lex.yy
+
+
+gtkpod_SOURCES = \
+    autodetection.c autodetection.h \
+    charset.c charset.h \
+    clientserver.c clientserver.h \
+    confirmation.c confirmation.h \
+    context_menus.c context_menus.h \
+    date_parser.l date_parser2.l date_parser.h \
+    details.c details.h \
+    display_coverart.c display_coverart.h \
+    display.c display_playlists.c display_sorttabs.c \
+    display.h display_private.h \
+    display_itdb.c display_itdb.h \
+    display_photo.c display_photo.h \
+    display_spl.c display_tracks.c \
+    fetchcover.c fetchcover.h \
+    file.c file.h file_export.c \
+    file_convert.c file_convert.h \
+    file_itunesdb.c \
+    fileselection.h fileselection.c \
+    flacfile.c flacfile.h \
+    info.c info.h \
+    ipod_init.c ipod_init.h \
+    itdb.h \
+    main.c \
+    misc.c misc.h \
+    misc_confirm.c misc_conversion.c misc_input.c \
+    misc_playlist.c \
+    misc_track.c misc_track.h \
+    mp3file.c mp3file.h \
+    mp4file.c mp4file.h \
+    oggfile.c oggfile.h \
+    podcast.c podcast.h \
+    prefs.c prefs.h \
+    prefs_window.c prefs_window.h \
+    repository.c repository.h \
+    sha1.c sha1.h \
+    stock_icons.c stock_icons.h \
+    syncdir.c syncdir.h \
+    tools.c tools.h \
+    wavfile.c wavfile.h
+
+gtkpod_LDADD = $(LIBS) $(INTLLIBS) @LIBOBJS@
+
+EXTRA_DIST = getopt.h
+
+CLEANFILES = date_parser.c date_parser2.c

Added: trunk/src/Makefile.in
===================================================================
--- trunk/src/Makefile.in	                        (rev 0)
+++ trunk/src/Makefile.in	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,608 @@
+# Makefile.in generated by automake 1.10 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = gtkpod$(EXEEXT)
+subdir = src
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	date_parser.c date_parser2.c getopt.c getopt1.c
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)"
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS)
+am_gtkpod_OBJECTS = autodetection.$(OBJEXT) charset.$(OBJEXT) \
+	clientserver.$(OBJEXT) confirmation.$(OBJEXT) \
+	context_menus.$(OBJEXT) date_parser.$(OBJEXT) \
+	date_parser2.$(OBJEXT) details.$(OBJEXT) \
+	display_coverart.$(OBJEXT) display.$(OBJEXT) \
+	display_playlists.$(OBJEXT) display_sorttabs.$(OBJEXT) \
+	display_itdb.$(OBJEXT) display_photo.$(OBJEXT) \
+	display_spl.$(OBJEXT) display_tracks.$(OBJEXT) \
+	fetchcover.$(OBJEXT) file.$(OBJEXT) file_export.$(OBJEXT) \
+	file_convert.$(OBJEXT) file_itunesdb.$(OBJEXT) \
+	fileselection.$(OBJEXT) flacfile.$(OBJEXT) info.$(OBJEXT) \
+	ipod_init.$(OBJEXT) main.$(OBJEXT) misc.$(OBJEXT) \
+	misc_confirm.$(OBJEXT) misc_conversion.$(OBJEXT) \
+	misc_input.$(OBJEXT) misc_playlist.$(OBJEXT) \
+	misc_track.$(OBJEXT) mp3file.$(OBJEXT) mp4file.$(OBJEXT) \
+	oggfile.$(OBJEXT) podcast.$(OBJEXT) prefs.$(OBJEXT) \
+	prefs_window.$(OBJEXT) repository.$(OBJEXT) sha1.$(OBJEXT) \
+	stock_icons.$(OBJEXT) syncdir.$(OBJEXT) tools.$(OBJEXT) \
+	wavfile.$(OBJEXT)
+gtkpod_OBJECTS = $(am_gtkpod_OBJECTS)
+am__DEPENDENCIES_1 =
+gtkpod_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+	@LIBOBJS@ $(am__empty)
+DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+ at MAINTAINER_MODE_FALSE@am__skiplex = test -f $@ ||
+LEXCOMPILE = $(LEX) $(LFLAGS) $(AM_LFLAGS)
+YLWRAP = $(top_srcdir)/ylwrap
+SOURCES = $(gtkpod_SOURCES)
+DIST_SOURCES = $(gtkpod_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALL_LINGUAS = @ALL_LINGUAS@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CURL_CFLAGS = @CURL_CFLAGS@
+CURL_LIBS = @CURL_LIBS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GMODULE_CFLAGS = @GMODULE_CFLAGS@
+GMODULE_LIBS = @GMODULE_LIBS@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GNOME_VFS_CFLAGS = @GNOME_VFS_CFLAGS@
+GNOME_VFS_LIBS = @GNOME_VFS_LIBS@
+GREP = @GREP@
+GTHREAD_CFLAGS = @GTHREAD_CFLAGS@
+GTHREAD_LIBS = @GTHREAD_LIBS@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
+HAL_CFLAGS = @HAL_CFLAGS@
+HAL_LIBS = @HAL_LIBS@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
+INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
+INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
+INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
+INTLTOOL_PERL = @INTLTOOL_PERL@
+INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
+INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
+INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
+INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
+INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
+INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
+INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
+INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
+INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
+INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
+INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
+INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
+LDFLAGS = @LDFLAGS@
+LEX = @LEX@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = lex.yy
+LIBGLADE_CFLAGS = @LIBGLADE_CFLAGS@
+LIBGLADE_LIBS = @LIBGLADE_LIBS@
+LIBGNOMECANVAS_CFLAGS = @LIBGNOMECANVAS_CFLAGS@
+LIBGNOMECANVAS_LIBS = @LIBGNOMECANVAS_LIBS@
+LIBGPOD_CFLAGS = @LIBGPOD_CFLAGS@
+LIBGPOD_LIBS = @LIBGPOD_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MOUNT = @MOUNT@
+MSGFMT = @MSGFMT@
+MSGFMT_OPTS = @MSGFMT_OPTS@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+POFILES = @POFILES@
+POSUB = @POSUB@
+PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
+PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+UMOUNT = @UMOUNT@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+INCLUDES = -DMOUNT_BIN=\""@MOUNT@\"" \
+	   -DUMOUNT_BIN=\""@UMOUNT@\"" \
+	   -DPACKAGE_DATA_DIR=\""$(datadir)"\" \
+	   -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" 
+
+gtkpod_SOURCES = \
+    autodetection.c autodetection.h \
+    charset.c charset.h \
+    clientserver.c clientserver.h \
+    confirmation.c confirmation.h \
+    context_menus.c context_menus.h \
+    date_parser.l date_parser2.l date_parser.h \
+    details.c details.h \
+    display_coverart.c display_coverart.h \
+    display.c display_playlists.c display_sorttabs.c \
+    display.h display_private.h \
+    display_itdb.c display_itdb.h \
+    display_photo.c display_photo.h \
+    display_spl.c display_tracks.c \
+    fetchcover.c fetchcover.h \
+    file.c file.h file_export.c \
+    file_convert.c file_convert.h \
+    file_itunesdb.c \
+    fileselection.h fileselection.c \
+    flacfile.c flacfile.h \
+    info.c info.h \
+    ipod_init.c ipod_init.h \
+    itdb.h \
+    main.c \
+    misc.c misc.h \
+    misc_confirm.c misc_conversion.c misc_input.c \
+    misc_playlist.c \
+    misc_track.c misc_track.h \
+    mp3file.c mp3file.h \
+    mp4file.c mp4file.h \
+    oggfile.c oggfile.h \
+    podcast.c podcast.h \
+    prefs.c prefs.h \
+    prefs_window.c prefs_window.h \
+    repository.c repository.h \
+    sha1.c sha1.h \
+    stock_icons.c stock_icons.h \
+    syncdir.c syncdir.h \
+    tools.c tools.h \
+    wavfile.c wavfile.h
+
+gtkpod_LDADD = $(LIBS) $(INTLLIBS) @LIBOBJS@
+EXTRA_DIST = getopt.h
+CLEANFILES = date_parser.c date_parser2.c
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .l .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  src/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  src/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-binPROGRAMS: $(bin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  if test -f $$p \
+	  ; then \
+	    f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+	   echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+	   $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+	  else :; fi; \
+	done
+
+uninstall-binPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+	  echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(bindir)/$$f"; \
+	done
+
+clean-binPROGRAMS:
+	-test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+gtkpod$(EXEEXT): $(gtkpod_OBJECTS) $(gtkpod_DEPENDENCIES) 
+	@rm -f gtkpod$(EXEEXT)
+	$(LINK) $(gtkpod_OBJECTS) $(gtkpod_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getopt.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getopt1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/autodetection.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/charset.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/clientserver.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/confirmation.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/context_menus.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/date_parser.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/date_parser2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/details.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/display.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/display_coverart.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/display_itdb.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/display_photo.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/display_playlists.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/display_sorttabs.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/display_spl.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/display_tracks.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fetchcover.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_convert.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_export.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_itunesdb.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fileselection.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/flacfile.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/info.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ipod_init.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/main.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/misc.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/misc_confirm.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/misc_conversion.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/misc_input.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/misc_playlist.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/misc_track.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mp3file.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mp4file.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/oggfile.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/podcast.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/prefs.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/prefs_window.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/repository.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/sha1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/stock_icons.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/syncdir.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tools.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/wavfile.Po at am__quote@
+
+.c.o:
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCC_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(COMPILE) -c $<
+
+.c.obj:
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCC_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.l.c:
+	$(am__skiplex) $(SHELL) $(YLWRAP) $< $(LEX_OUTPUT_ROOT).c $@ -- $(LEXCOMPILE)
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS)
+installdirs:
+	for dir in "$(DESTDIR)$(bindir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+	-rm -f date_parser.c
+	-rm -f date_parser2.c
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf $(DEPDIR) ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf $(DEPDIR) ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
+	clean-generic ctags distclean distclean-compile \
+	distclean-generic distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-binPROGRAMS \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
+	uninstall-am uninstall-binPROGRAMS
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:

Added: trunk/src/autodetection.c
===================================================================
--- trunk/src/autodetection.c	                        (rev 0)
+++ trunk/src/autodetection.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,455 @@
+/*
+|  Copyright (C) 2007 Jorg Schuler <jcsjcs at users.sourceforge.net>
+|  Part of the gtkpod project.
+|
+|  URL: http://gtkpod.sourceforge.net/
+|  URL: http://www.gtkpod.org
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: autodetection.c 1681 2007-08-18 06:16:04Z jcsjcs $
+*/
+
+
+#include "autodetection.h"
+#include "config.h"
+#include "misc.h"
+#include "prefs.h"
+#include <stdio.h>
+#include <string.h>
+
+
+
+#ifdef HAVE_GNOME_VFS
+#include <libgnomevfs/gnome-vfs.h>
+#endif
+#ifdef HAVE_HAL
+#include <libhal.h>
+#include <dbus/dbus.h>
+#endif
+
+#undef DEBUG_AUTO
+#ifdef DEBUG_AUTO
+#   define _TO_STR(x) #x
+#   define TO_STR(x) _TO_STR(x)
+#   define debug(...) do { fprintf(stderr,  __FILE__ ":" TO_STR(__LINE__) ":" __VA_ARGS__); } while(0)
+#else
+#   define debug(...)
+#endif
+
+
+
+/* Find out if an itdb uses the mountpoint @mountpoint and return that
+   itdb */
+static iTunesDB *ad_find_repository_with_mountpoint (const gchar *mountpoint)
+{
+    GList *gl;
+    gchar *mp;
+    gint lenmp;
+    iTunesDB *result = NULL;
+    struct itdbs_head *itdbs;
+
+    g_return_val_if_fail (mountpoint, NULL);
+
+    itdbs = gp_get_itdbs_head (gtkpod_window);
+    g_return_val_if_fail (itdbs, NULL);
+
+    /* eliminate trailing dir separators ('/') */
+    mp = g_strdup (mountpoint);
+    lenmp = strlen (mountpoint);
+    if ((lenmp > 0) && (mp[lenmp-1] == G_DIR_SEPARATOR))
+    {
+	mp[lenmp-1] = 0;
+    }
+
+    for (gl=itdbs->itdbs; gl; gl=gl->next)
+    {
+	iTunesDB *itdb = gl->data;
+	g_return_val_if_fail (itdb, NULL);
+
+	if (itdb->usertype & GP_ITDB_TYPE_IPOD)
+	{
+	    gchar *imp = get_itdb_prefs_string (itdb, KEY_MOUNTPOINT);
+	    if (imp)
+	    {
+		gint comp;
+		gint lenimp = strlen (imp);
+
+		/* eliminate trailing dir separators ('/') */
+		if ((lenimp > 0) && (imp[lenimp-1] == G_DIR_SEPARATOR))
+		{
+		    imp[lenmp-1] = 0;
+		}
+
+		comp = strcmp (mp, imp);
+
+		g_free (imp);
+
+		if (comp == 0)
+		{
+		    result = itdb;
+		    break;
+		}
+	    }
+	}
+    }
+
+    g_free (mp);
+
+    return result;
+}
+
+
+
+
+#ifdef HAVE_GNOME_VFS
+typedef struct _AutoDetect AutoDetect;
+
+static gboolean ad_timeout_cb (gpointer data);
+
+
+struct _AutoDetect
+{
+    GMutex *mutex;              /* shared lock */
+    GList *new_ipod_uris;       /* list of new mounts */
+    guint timeout_id;
+};    
+
+static AutoDetect *autodetect;
+
+
+#ifdef HAVE_HAL
+/* from rb-ipod-source.c (rhythmbox ipod plugin) */
+static gboolean
+hal_udi_is_ipod (const char *udi)
+{
+	LibHalContext *ctx;
+	DBusConnection *conn;
+	char *parent_udi;
+	char *parent_name;
+	gboolean result;
+	DBusError error;
+	gboolean inited = FALSE;
+
+	result = FALSE;
+	dbus_error_init (&error);
+
+	conn = NULL;
+	parent_udi = NULL;
+	parent_name = NULL;
+
+	ctx = libhal_ctx_new ();
+	if (ctx == NULL) {
+		/* FIXME: should we return an error somehow so that we can
+		 * fall back to a check for iTunesDB presence instead ?
+		 */
+		debug ("cannot connect to HAL");
+		goto end;
+	}
+	conn = dbus_bus_get (DBUS_BUS_SYSTEM, &error);
+	if (conn == NULL || dbus_error_is_set (&error))
+		goto end;
+
+	libhal_ctx_set_dbus_connection (ctx, conn);
+	if (!libhal_ctx_init (ctx, &error) || dbus_error_is_set (&error))
+		goto end;
+
+	inited = TRUE;
+	parent_udi = libhal_device_get_property_string (ctx, udi,
+			"info.parent", &error);
+	if (parent_udi == NULL || dbus_error_is_set (&error))
+		goto end;
+
+	parent_name = libhal_device_get_property_string (ctx, parent_udi,
+			"storage.model", &error);
+	if (parent_name == NULL || dbus_error_is_set (&error))
+		goto end;
+
+	if (strcmp (parent_name, "iPod") == 0)
+		result = TRUE;
+
+end:
+	g_free (parent_udi);
+	g_free (parent_name);
+
+	if (dbus_error_is_set (&error)) {
+		debug ("Error: %s\n", error.message);
+		dbus_error_free (&error);
+		dbus_error_init (&error);
+	}
+
+	if (ctx) {
+		if (inited)
+			libhal_ctx_shutdown (ctx, &error);
+		libhal_ctx_free(ctx);
+	}
+
+	dbus_error_free (&error);
+
+	return result;
+}
+#endif
+
+
+/* adapted from rb-ipod-source.c (rhythmbox ipod plugin) */
+static gchar *ad_get_itunes_dir (GnomeVFSVolume *volume)
+{
+    gchar *mount_point_uri;
+    gchar *result = NULL;
+
+    mount_point_uri = gnome_vfs_volume_get_activation_uri (volume);
+    if (mount_point_uri)
+    {
+	gchar *mount_point;
+	mount_point = g_filename_from_uri (mount_point_uri, NULL, NULL);
+	if (mount_point)
+	{
+	    result = itdb_get_itunes_dir (mount_point);
+	    g_free (mount_point);
+	}
+	g_free (mount_point_uri);
+    }
+    return result;
+}
+
+
+/* adapted from rb-ipod-source.c (rhythmbox ipod plugin) */
+static gboolean ad_volume_has_ipod_dir (GnomeVFSVolume *volume)
+{
+    gchar *itunes_dir;
+    gboolean result = FALSE;
+
+    itunes_dir = ad_get_itunes_dir (volume);
+
+    if (itunes_dir)
+    {
+	result = g_file_test (itunes_dir, G_FILE_TEST_EXISTS);
+    }
+
+    g_free (itunes_dir);
+
+    return result;
+}
+
+/* adapted from rb-ipod-source.c (rhythmbox ipod plugin) */
+static gboolean ad_volume_is_ipod (GnomeVFSVolume *volume)
+{
+#ifdef HAVE_HAL
+    gchar *udi;
+#endif
+    if (gnome_vfs_volume_get_volume_type (volume) != GNOME_VFS_VOLUME_TYPE_MOUNTPOINT)
+    {
+	return FALSE;
+    }
+
+#ifdef HAVE_HAL
+    udi = gnome_vfs_volume_get_hal_udi (volume);
+    if (udi != NULL)
+    {
+	gboolean result;
+
+	result = hal_udi_is_ipod (udi);
+	g_free (udi);
+	if (result == FALSE)
+	{
+	    return FALSE;
+	}
+    }
+#endif
+
+    return ad_volume_has_ipod_dir (volume);
+}
+
+
+
+static void ad_volume_mounted_cb (GnomeVFSVolumeMonitor *vfsvolumemonitor,
+				  GnomeVFSVolume *volume,
+				  AutoDetect *ad)
+{
+    g_return_if_fail (volume && ad);
+
+    if (ad_volume_is_ipod (volume))
+    {
+	gchar *uri;
+
+	uri = gnome_vfs_volume_get_activation_uri (volume);
+
+	debug ("mounted iPod: '%s'\n", uri);
+
+	g_mutex_lock (ad->mutex);
+	ad->new_ipod_uris = g_list_prepend (ad->new_ipod_uris, uri);
+	g_mutex_unlock (ad->mutex);
+    }
+}
+
+
+void autodetection_init ()
+{
+    if (autodetect == NULL)
+    {
+	GList *volumes, *gl;
+
+	if (!gnome_vfs_init ())
+	{
+	    gtkpod_warning (_("Could not initialize GnomeVFS\n"));
+	    g_return_if_reached ();
+	}
+
+	autodetect = g_new0 (AutoDetect, 1);
+	autodetect->mutex = g_mutex_new ();
+
+	/* Check if an iPod is already mounted and add it to the list */
+	volumes = gnome_vfs_volume_monitor_get_mounted_volumes (
+	    gnome_vfs_get_volume_monitor ());
+
+	for (gl=volumes; gl; gl=gl->next)
+	{
+	    GnomeVFSVolume *volume = gl->data;
+	    g_return_if_fail (volume);
+	    ad_volume_mounted_cb (NULL, volume, autodetect);
+	    gnome_vfs_volume_unref (volume);
+	}
+	g_list_free (volumes);
+
+	g_signal_connect (G_OBJECT (gnome_vfs_get_volume_monitor ()),
+			  "volume-mounted",
+			  G_CALLBACK (ad_volume_mounted_cb),
+			  autodetect);
+
+	/* start timeout function for the monitor */
+	autodetect->timeout_id = g_timeout_add (100,   /* every 100 ms */
+						ad_timeout_cb,
+						autodetect);
+    }
+}
+
+
+static gboolean ad_timeout_cb (gpointer data)
+{
+    AutoDetect *ad = data;
+    g_return_val_if_fail (ad, FALSE);
+
+
+    /* Don't interfere with a blocked display -- try again later */
+    if (!widgets_blocked)
+    {
+	gdk_threads_enter ();
+	g_mutex_lock (ad->mutex);
+
+	while (ad->new_ipod_uris)
+	{
+	    iTunesDB *itdb, *loaded_itdb = NULL;
+	    gchar *mountpoint;
+	    struct itdbs_head *itdbs;
+	    GList *gl = ad->new_ipod_uris;
+	    gchar *mount_uri = gl->data;
+
+	    ad->new_ipod_uris = g_list_delete_link (ad->new_ipod_uris, gl);
+
+	    g_mutex_unlock (ad->mutex);
+
+	    g_return_val_if_fail (mount_uri, (gdk_threads_leave(), release_widgets(), TRUE));
+
+	    mountpoint = g_filename_from_uri (mount_uri, NULL, NULL);
+	    g_free (mount_uri);
+	    debug ("Mounted iPod at '%s'\n", mountpoint);
+
+	    itdb = ad_find_repository_with_mountpoint (mountpoint);
+
+	    itdbs = gp_get_itdbs_head (gtkpod_window);
+	    g_return_val_if_fail (itdbs, (gdk_threads_leave(), release_widgets(), TRUE));
+
+	    block_widgets ();
+
+	    if (itdb)
+	    {
+		ExtraiTunesDBData *eitdb = itdb->userdata;
+		g_return_val_if_fail (eitdb,(gdk_threads_leave(), release_widgets(), TRUE));
+
+		debug ("...used by itdb %p\n", itdb);
+
+		if (!eitdb->itdb_imported)
+		{
+		    loaded_itdb = gp_load_ipod (itdb);
+		    if (loaded_itdb)
+		    {
+			loaded_itdb->usertype |= GP_ITDB_TYPE_AUTOMATIC;
+			set_itdb_prefs_int (loaded_itdb, "type", loaded_itdb->usertype);
+		    }
+		    else
+		    {
+			gtkpod_warning (_("Newly mounted iPod at '%s' could not be loaded into gtkpod.\n\n"),
+					mountpoint);
+		    }
+		}
+		else
+		{
+		    gtkpod_warning (_("Newly mounted iPod at '%s' appears to be already loaded!\n\n"),
+                                    mountpoint);
+		}
+		debug ("...OK (used)\n");
+	    }
+	    else
+	    {   /* Set up new itdb (which we'll add to the end of the list) */
+		iTunesDB *new_itdb;
+		gint index = g_list_length (itdbs->itdbs);
+		debug ("...not used by any itdb.\n");
+		set_itdb_index_prefs_string (index,
+					     KEY_MOUNTPOINT, mountpoint);
+		set_itdb_index_prefs_string (index,
+					     "name", _("New iPod"));
+		set_itdb_index_prefs_int (index,
+					  "type", GP_ITDB_TYPE_IPOD |
+					          GP_ITDB_TYPE_AUTOMATIC);
+		new_itdb = setup_itdb_n (index);
+		g_return_val_if_fail (new_itdb,
+				      (gdk_threads_leave(), release_widgets(), TRUE));
+		/* add to display */
+		gp_itdb_add (new_itdb, -1);
+		/* load prefs from iPod */
+		loaded_itdb = gp_load_ipod (new_itdb);
+		if (!loaded_itdb)
+		{   /* remove itdb and all associated keys again */
+		    remove_itdb_prefs (itdb);
+		    gp_itdb_remove (new_itdb);
+		    gp_itdb_free (new_itdb);
+		}
+		debug ("...OK (new)\n");
+	    }
+
+	    release_widgets ();
+
+	    g_free (mountpoint);
+
+	    g_mutex_lock (ad->mutex);
+	}
+	g_mutex_unlock (ad->mutex);
+	gdk_threads_leave();
+    }
+
+    return TRUE;
+}
+
+#else
+/* No GNOME_VFS support */
+
+void autodetection_init ()
+{
+}
+#endif

Added: trunk/src/autodetection.h
===================================================================
--- trunk/src/autodetection.h	                        (rev 0)
+++ trunk/src/autodetection.h	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,33 @@
+/*
+|  Copyright (C) 2007 Jorg Schuler <jcsjcs at users.sourceforge.net>
+|  Part of the gtkpod project.
+|
+|  URL: http://gtkpod.sourceforge.net/
+|  URL: http://www.gtkpod.org
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: autodetection.h 1070 2007-05-11 15:41:53Z jcsjcs $
+*/
+
+#ifndef AUTODETECTION_H
+#include "config.h"
+void autodetection_init ();
+
+#endif

Added: trunk/src/charset.c
===================================================================
--- trunk/src/charset.c	                        (rev 0)
+++ trunk/src/charset.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,516 @@
+/* Time-stamp: <2006-05-01 15:04:54 jcs>
+|
+|  Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+| 
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+| 
+|  iTunes and iPod are trademarks of Apple
+| 
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: charset.c 955 2007-01-16 10:15:27Z jcsjcs $
+*/
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <string.h>
+#include <gtk/gtk.h>
+#include "prefs.h"
+#include "charset.h"
+#include "misc.h"
+
+/* If Japanese auto-conversion is being used, this variable is being
+   set with each call of charset_to_utf8(). You can get a copy of its
+   value by calling charset_get_auto().
+   This variable will only be reset by calling charset_reset_auto(). */
+static gchar *auto_charset = NULL;
+
+typedef struct {
+	gchar *descr;
+	gchar *name;
+} CharsetInfo;
+
+
+static const CharsetInfo charset_info[] = { 
+    {N_("Arabic (IBM-864)"),                  "IBM864"        },
+    {N_("Arabic (ISO-8859-6)"),               "ISO-8859-6"    },
+    {N_("Arabic (Windows-1256)"),             "windows-1256"  },
+    {N_("Baltic (ISO-8859-13)"),              "ISO-8859-13"   },
+    {N_("Baltic (ISO-8859-4)"),               "ISO-8859-4"    },
+    {N_("Baltic (Windows-1257)"),             "windows-1257"  },
+    {N_("Celtic (ISO-8859-14)"),              "ISO-8859-14"   },
+    {N_("Central European (IBM-852)"),        "IBM852"        },
+    {N_("Central European (ISO-8859-2)"),     "ISO-8859-2"    },
+    {N_("Central European (Windows-1250)"),   "windows-1250"  },
+    {N_("Chinese Simplified (GB18030)"),      "gb18030"       },
+    {N_("Chinese Simplified (GB2312)"),       "GB2312"        },
+    {N_("Chinese Traditional (Big5)"),        "Big5"          },
+    {N_("Chinese Traditional (Big5-HKSCS)"),  "Big5-HKSCS"    },
+    {N_("Cyrillic (IBM-855)"),                "IBM855"        },
+    {N_("Cyrillic (ISO-8859-5)"),             "ISO-8859-5"    },
+    {N_("Cyrillic (ISO-IR-111)"),             "ISO-IR-111"    },
+    {N_("Cyrillic (KOI8-R)"),                 "KOI8-R"        },
+    {N_("Cyrillic (Windows-1251)"),           "windows-1251"  },
+    {N_("Cyrillic/Russian (CP-866)"),         "IBM866"        },
+    {N_("Cyrillic/Ukrainian (KOI8-U)"),       "KOI8-U"        },
+    {N_("English (US-ASCII)"),                "us-ascii"      },
+    {N_("Greek (ISO-8859-7)"),                "ISO-8859-7"    },
+    {N_("Greek (Windows-1253)"),              "windows-1253"  },
+    {N_("Hebrew (IBM-862)"),                  "IBM862"        },
+    {N_("Hebrew (Windows-1255)"),             "windows-1255"  },
+    {N_("Japanese (automatic detection)"),    GTKPOD_JAPAN_AUTOMATIC},
+    {N_("Japanese (EUC-JP)"),                 "EUC-JP"        },
+    {N_("Japanese (ISO-2022-JP)"),            "ISO-2022-JP"   },
+    {N_("Japanese (Shift_JIS)"),              "Shift_JIS"     },
+    {N_("Korean (EUC-KR)"),                   "EUC-KR"        },
+    {N_("Nordic (ISO-8859-10)"),              "ISO-8859-10"   },
+    {N_("South European (ISO-8859-3)"),       "ISO-8859-3"    },
+    {N_("Thai (TIS-620)"),                    "TIS-620"       },
+    {N_("Turkish (IBM-857)"),                 "IBM857"        },
+    {N_("Turkish (ISO-8859-9)"),              "ISO-8859-9"    },
+    {N_("Turkish (Windows-1254)"),            "windows-1254"  },
+    {N_("Unicode (UTF-7)"),                   "UTF-7"         },
+    {N_("Unicode (UTF-8)"),                   "UTF-8"         },
+    {N_("Unicode (UTF-16BE)"),                "UTF-16BE"      },
+    {N_("Unicode (UTF-16LE)"),                "UTF-16LE"      },
+    {N_("Unicode (UTF-32BE)"),                "UTF-32BE"      },
+    {N_("Unicode (UTF-32LE)"),                "UTF-32LE"      },
+    {N_("Vietnamese (VISCII)"),               "VISCII"        },
+    {N_("Vietnamese (Windows-1258)"),         "windows-1258"  },
+    {N_("Visual Hebrew (ISO-8859-8)"),        "ISO-8859-8"    },
+    {N_("Western (IBM-850)"),                 "IBM850"        },
+    {N_("Western (ISO-8859-1)"),              "ISO-8859-1"    },
+    {N_("Western (ISO-8859-15)"),             "ISO-8859-15"   },
+    {N_("Western (Windows-1252)"),            "windows-1252"  },
+    /*
+     * From this point, character sets aren't supported by iconv
+     */
+/*    {N_("Arabic (IBM-864-I)"),                "IBM864i"              },
+    {N_("Arabic (ISO-8859-6-E)"),             "ISO-8859-6-E"         },
+    {N_("Arabic (ISO-8859-6-I)"),             "ISO-8859-6-I"         },
+    {N_("Arabic (MacArabic)"),                "x-mac-arabic"         },
+    {N_("Armenian (ARMSCII-8)"),              "armscii-8"            },
+    {N_("Central European (MacCE)"),          "x-mac-ce"             },
+    {N_("Chinese Simplified (GBK)"),          "x-gbk"                },
+    {N_("Chinese Simplified (HZ)"),           "HZ-GB-2312"           },
+    {N_("Chinese Traditional (EUC-TW)"),      "x-euc-tw"             },
+    {N_("Croatian (MacCroatian)"),            "x-mac-croatian"       },
+    {N_("Cyrillic (MacCyrillic)"),            "x-mac-cyrillic"       },
+    {N_("Cyrillic/Ukrainian (MacUkrainian)"), "x-mac-ukrainian"      },
+    {N_("Farsi (MacFarsi)"),                  "x-mac-farsi"},
+    {N_("Greek (MacGreek)"),                  "x-mac-greek"          },
+    {N_("Gujarati (MacGujarati)"),            "x-mac-gujarati"       },
+    {N_("Gurmukhi (MacGurmukhi)"),            "x-mac-gurmukhi"       },
+    {N_("Hebrew (ISO-8859-8-E)"),             "ISO-8859-8-E"         },
+    {N_("Hebrew (ISO-8859-8-I)"),             "ISO-8859-8-I"         },
+    {N_("Hebrew (MacHebrew)"),                "x-mac-hebrew"         },
+    {N_("Hindi (MacDevanagari)"),             "x-mac-devanagari"     },
+    {N_("Icelandic (MacIcelandic)"),          "x-mac-icelandic"      },
+    {N_("Korean (JOHAB)"),                    "x-johab"              },
+    {N_("Korean (UHC)"),                      "x-windows-949"        },
+    {N_("Romanian (MacRomanian)"),            "x-mac-romanian"       },
+    {N_("Turkish (MacTurkish)"),              "x-mac-turkish"        },
+    {N_("User Defined"),                      "x-user-defined"       },
+    {N_("Vietnamese (TCVN)"),                 "x-viet-tcvn5712"      },
+    {N_("Vietnamese (VPS)"),                  "x-viet-vps"           },
+    {N_("Western (MacRoman)"),                "x-mac-roman"          },
+    // charsets whithout posibly translatable names
+    {"T61.8bit",                              "T61.8bit"             },
+    {"x-imap4-modified-utf7",                 "x-imap4-modified-utf7"},
+    {"x-u-escaped",                           "x-u-escaped"          },
+    {"windows-936",                           "windows-936"          }
+*/
+    {NULL, NULL}
+};
+
+
+
+/* Sets up the charsets to choose from in the "combo". It presets the
+   charset stored in cfg->charset (or "System Charset" if none is set
+   there */
+void charset_init_combo (GtkCombo *combo)
+{
+    gchar *current_charset;
+    gchar *description;
+    const CharsetInfo *ci;
+    static GList *charsets = NULL; /* list with choices -- takes a while to
+				     * initialize, so we only do it once */
+    
+    current_charset = prefs_get_string("charset");
+    if ((current_charset == NULL) || (strlen (current_charset) == 0))
+    {
+	description = g_strdup (_("System Charset"));
+    }
+    else
+    {
+	description = charset_to_description (current_charset);
+    }
+    if (charsets == NULL)
+    { /* set up list with charsets */
+	FILE *fp;
+
+	charsets = g_list_append (charsets, _("System Charset"));
+	/* now add all the charset descriptions in the list above */
+	ci=charset_info;
+	while (ci->descr != NULL)
+	{
+	    charsets = g_list_append (charsets, _(ci->descr));
+	    ++ci;
+	}
+	/* let's add all available charsets returned by "iconv -l" */
+	/* The code assumes that "iconv -l" returns a list with the
+	   name of one charset in each line, each valid line being
+	   terminated by "//".  */
+	fp = popen ("iconv -l", "r");
+	if (fp)
+	{
+	    gchar buf[PATH_MAX];
+	    /* read one line of output at a time */
+	    while (fgets (buf, PATH_MAX, fp))
+	    {
+		/* only consider lines ending on "//" */
+		gchar *bufp = g_strrstr (buf, "//\n");
+		if (bufp)
+		{  /* add everything before "//" to our charset list */
+		    gchar *bufpp = buf;
+		    *bufp = 0;  /* shorten string */
+		    while ((*bufpp == ' ') || (*bufpp == 0x09))
+			++bufpp; /* skip whitespace */
+		    if (*bufpp)
+			charsets = g_list_append (charsets, g_strdup (bufpp));
+		}
+	    }
+	    pclose (fp);
+	}
+    }
+    /* set pull down items */
+    gtk_combo_set_popdown_strings (GTK_COMBO (combo), charsets); 
+    /* set standard entry */
+    gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (combo)->entry), description);
+    g_free (description);
+    g_free(current_charset);
+}
+
+
+/* returns the charset name belonging to the description "descr"
+ * chosen from the combo. Return "NULL" when it could not be found, or
+ * if it is the System Default Charset (locale). You must g_free
+ * the charset received (unlike g_get_charset ()) */
+gchar *charset_from_description (gchar *descr)
+{
+    const CharsetInfo *ci;
+
+    if (!descr) return NULL; /* sanity! */
+    /* check for "System Charset" and return NULL */
+    if (g_utf8_collate (descr, _("System Charset")) == 0)   return NULL;
+    /* check if description matches one of the descriptions in
+     * charset_info[], and if so, return the charset name */
+    ci = charset_info;
+    while (ci->descr != NULL)
+    {
+	if (g_utf8_collate (descr, _(ci->descr)) == 0)
+	{
+	    return g_strdup (ci->name);
+	}
+	++ci;
+    }
+    /* OK, it was not in the charset_info[] list. Therefore it must be
+     * from the "iconv -l" list. We just return a copy of it */
+    return g_strdup (descr);
+}
+
+
+/* Returns the description belonging to the charset "charset"
+ * Returns the description (if found) or just a copy of "charset"
+ * You must g_free the charset received */
+gchar *charset_to_description (gchar *charset)
+{
+    const CharsetInfo *ci;
+
+    if (!charset) return NULL; /* sanity! */
+    /* check if charset matches one of the charsets in
+     * charset_info[], and if so, return the description */
+    ci = charset_info;
+    while (ci->descr != NULL)
+    {
+	if (compare_string_case_insensitive (charset, ci->name) == 0)
+	{
+	    return g_strdup (_(ci->descr));
+	}
+	++ci;
+    }
+    /* OK, it was not in the charset_info[] list. Therefore it must be
+     * from the "iconv -l" list. We just return a copy of it */
+    return g_strdup (charset);
+}
+
+
+/* code for automatic detection of Japanese char-subset donated by
+   Hiroshi Kawashima */
+static const gchar *charset_check_k_code (const gchar *p2)
+{
+    static const char* charsets[] = {
+	    "UTF-8",
+	    "EUC-JP",
+	    "CP932",
+	    "ISO-2022-JP",
+	    NULL
+    };
+    int i;
+    gchar *ret;
+    gssize len;
+
+    if (p2 == NULL) return NULL;
+ 
+    len = strlen ((gchar*)p2);
+    for (i=0; charsets[i]; i++) {
+      ret = g_convert ((gchar*)p2,            /* string to convert */
+		       len,                  /* length of string  */
+		       "UTF-8",              /* to_codeset        */
+		       charsets[i],          /* from_codeset      */
+		       NULL,                 /* *bytes_read       */
+		       NULL,                 /* *bytes_written    */
+		       NULL);                /* GError **error    */
+      if (ret != NULL) {
+        g_free(ret);
+        return charsets[i];
+      }
+    }
+    return (NULL);
+}
+
+/* same as check_k_code, but defaults to "UTF-8" if no match is found */
+static const gchar *charset_check_k_code_with_default (const guchar *p)
+{
+    const gchar *result=NULL;
+
+    if (p)       result = charset_check_k_code (p);
+    if (!result) result = "UTF-8";
+    return result;
+}
+
+/* return the charset actually used for the "auto detection"
+ * feature. So far only Japanese Auto Detecion is implemented */
+static gchar *charset_check_auto (const gchar *str)
+{
+    gchar *charset;
+    gchar *result;
+
+    if (str == NULL) return NULL; /* sanity */
+
+    charset = prefs_get_string("charset");
+
+    if (charset && (strcmp (charset, GTKPOD_JAPAN_AUTOMATIC) == 0))
+	result = g_strdup(charset_check_k_code (str));
+    else
+	result = NULL;
+
+    g_free(charset);
+    return result;
+}
+
+/* See description at the definition of gchar *auto_charset; for
+   details */
+gchar *charset_get_auto (void)
+{
+    return g_strdup (auto_charset);
+}
+
+void charset_reset_auto (void)
+{
+    auto_charset = NULL;
+}
+
+
+/* Convert "str" (in the charset specified in cfg->charset) to
+ * utf8. If cfg->charset is NULL, "str" is assumed to be in the
+ * current locale charset */
+/* Must free the returned string yourself */
+gchar *charset_to_utf8 (const gchar *str)
+{
+    gchar *charset;  /* From prefs */
+    const gchar *locale_charset; /* Used if prefs doesn't have a charset */
+    gchar *result;
+
+    if (str == NULL) return NULL;  /* sanity */
+    charset = charset_check_auto (str);
+    if (charset)
+    {
+	g_free(auto_charset);
+	auto_charset = g_strdup(charset);
+    }
+    else
+    {
+	charset = prefs_get_string("charset");
+	if (!charset || !strlen (charset))
+	{    /* use standard locale charset */
+	    g_free(charset);
+	    g_get_charset (&locale_charset);
+	    charset = g_strdup(locale_charset);
+	}
+    }
+    
+    result = charset_to_charset (charset, "UTF-8", str);
+    g_free(charset);
+    return result;
+}
+
+
+/* Convert "str" from utf8 to the charset specified in
+ * cfg->charset. If cfg->charset is NULL, "str" is converted to the
+ * current locale charset */
+/* Must free the returned string yourself */
+gchar *charset_from_utf8 (const gchar *str)
+{
+    gchar *charset;
+    const gchar *locale_charset;
+    gchar *result;
+
+    if (str == NULL) return NULL;  /* sanity */
+    charset = prefs_get_string("charset");
+    if (!charset || !strlen (charset))
+    {   
+       /* use standard locale charset */
+	g_free(charset);
+	g_get_charset (&locale_charset);
+	charset = g_strdup(locale_charset);
+    }
+
+    result = charset_to_charset ("UTF-8", charset, str);
+    g_free(charset);
+    return result;
+}
+
+/* Convert "str" from utf8 to the charset specified in @s->charset. If
+ * this is NULL, try cfg->charset. If cfg->charset is also NULL, "str"
+ * is converted to the current locale charset */
+/* Must free the returned string yourself */
+gchar *charset_track_charset_from_utf8 (Track *s, const gchar *str)
+{
+    gchar *charset;
+    const gchar *locale_charset;
+    gchar *result;
+    ExtraTrackData *etd;
+
+    g_return_val_if_fail (s, NULL);
+    g_return_val_if_fail (s->userdata, NULL);
+
+    if (str == NULL) return NULL;  /* sanity */
+
+    etd = s->userdata;
+
+    if (etd->charset && strlen (etd->charset))
+	   charset = g_strdup(etd->charset);
+    else   
+	charset = prefs_get_string("charset");
+   
+    if (!charset || !strlen (charset))
+    {    /* use standard locale charset */
+	g_free(charset);
+	g_get_charset (&locale_charset);
+	charset = g_strdup(locale_charset);
+    }
+
+    result = charset_to_charset ("UTF-8", charset, str);
+    g_free(charset);
+    return result;
+}
+
+/* Convert "str" from "from_charset" to "to_charset", trying to skip
+   illegal character as best as possible */
+/* Must free the returned string yourself */
+gchar *charset_to_charset (const gchar *from_charset,
+			   const gchar *to_charset,
+			   const gchar *str)
+{
+    gchar *ret;
+    gssize len;
+    gsize bytes_read;
+
+    if (!str) return NULL;
+
+    /* Handle automatic selection of Japanese charset */
+    if (from_charset && (strcmp (from_charset, GTKPOD_JAPAN_AUTOMATIC) == 0))
+	from_charset = charset_check_k_code_with_default (str);
+    /* Automatic selection of Japanese charset when encoding to
+       Japanese is a bit of a problem... we simply fall back on EUC-JP
+       (defined in check_k_code_with_default ) if this situation
+       occurs. */
+    if (to_charset && (strcmp (to_charset, GTKPOD_JAPAN_AUTOMATIC) == 0))
+	to_charset = charset_check_k_code_with_default (NULL);
+
+    len = strlen (str);
+    /* do the conversion! */
+    ret = g_convert (str,                  /* string to convert */
+		     len,                  /* length of string  */
+		     to_charset,           /* to_codeset        */
+		     from_charset,         /* from_codeset      */
+		     &bytes_read,          /* *bytes_read       */
+		     NULL,                 /* *bytes_written    */
+		     NULL);                /* GError **error    */
+    if (ret == NULL)
+    { /* We probably had illegal characters. We try to convert as much
+       * as possible. "bytes_read" tells how many chars were converted
+       * successfully, and we try to fill up with spaces 0x20, which
+       * will work for most charsets (except those using 16 Bit or 32
+       * Bit representation (0x2020 or 0x20202020 != 0x0020 or
+       * 0x00000020) */
+	gchar *strc = g_strdup (str);
+	gsize br0 = bytes_read;
+	gsize br;
+	while (!ret && (bytes_read < len))
+	{
+	    strc[bytes_read] = 0x20;
+	    br = bytes_read;
+	    ret = g_convert (strc,         /* string to convert */
+			     len,          /* length of string  */
+			     to_charset,   /* to_codeset        */
+			     from_charset, /* from_codeset      */
+			     &bytes_read,  /* *bytes_read       */
+			     NULL,         /* *bytes_written    */
+			     NULL);        /* GError **error    */
+	    /* max. nr. of converted Bytes */
+	    if (bytes_read > br0)  br0 = bytes_read;
+	    /* don't do an infinite loop */
+	    if (bytes_read <= br)  bytes_read = br + 1;
+	}
+	if (ret == NULL)
+	{ /* still no valid string */
+	    if (br0 != 0)
+	    { /* ok, at least something we can use! */
+		ret = g_convert (strc,         /* string to convert */
+				 br0,          /* length of string  */
+				 to_charset,   /* to_codeset        */
+				 from_charset, /* from_codeset      */
+				 &bytes_read,  /* *bytes_read       */
+				 NULL,         /* *bytes_written    */
+				 NULL);        /* GError **error    */
+	    }
+	    if (ret == NULL)
+	    { /* Well... what do you think we should return? */
+		/* ret = g_strdup (_("gtkpod: Invalid Conversion")); */
+		ret = g_strdup ("");
+	    }
+	}
+	g_free (strc);
+    }
+    return ret;
+}

Added: trunk/src/charset.h
===================================================================
--- trunk/src/charset.h	                        (rev 0)
+++ trunk/src/charset.h	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,54 @@
+/* Time-stamp: <2005-06-17 22:25:31 jcs>
+|
+|  Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+| 
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+| 
+|  iTunes and iPod are trademarks of Apple
+| 
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: charset.h 589 2005-06-17 13:30:05Z jcsjcs $
+*/
+
+#ifndef __CHARSET_H__
+#define __CHARSET_H__
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <gtk/gtk.h>
+#include <stdio.h>
+#include "itdb.h"
+
+#define GTKPOD_JAPAN_AUTOMATIC "gtkpod-japan-automatic"
+
+void charset_init_combo (GtkCombo *combo);
+gchar *charset_from_description (gchar *descr);
+gchar *charset_to_description (gchar *charset);
+gchar *charset_to_utf8 (const gchar *str);
+gchar *charset_from_utf8 (const gchar *str);
+gchar *charset_track_charset_from_utf8 (Track *s, const gchar *str);
+gchar *charset_to_charset (const gchar *from_charset,
+			   const gchar *to_charset,
+			   const gchar *str);
+gchar *charset_get_auto (void);
+void charset_reset_auto (void);
+#endif 

Added: trunk/src/clientserver.c
===================================================================
--- trunk/src/clientserver.c	                        (rev 0)
+++ trunk/src/clientserver.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,323 @@
+/*
+|  Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: clientserver.c 1023 2007-04-07 04:43:15Z jcsjcs $
+*/
+
+#include "config.h"
+#include "clientserver.h"
+#include "sha1.h"
+#include "misc.h"
+#include "display_itdb.h"
+#include "prefs.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <gdk/gdk.h>
+#include <glib.h>
+#include <gtk/gtk.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/file.h>
+#include <sys/socket.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/un.h>
+#include <unistd.h>
+
+static gint ssock=-1;
+static struct sockaddr_un *saddr = NULL;
+static guint inp_handler;
+
+const gchar *SOCKET_TEST="TEST:";
+const gchar *SOCKET_PLYC="PLYC:";
+
+
+#ifndef HAVE_FLOCK
+/* emulate flock on systems that do not have it */
+int flock(int fd, int operation)
+{
+    struct flock      f;
+    memset(&f, 0, sizeof (f));
+
+    switch (operation)
+    {
+    case LOCK_EX:
+	f.l_type = F_WRLCK;
+	return fcntl(fd, F_SETLKW, &f);
+    default:
+	g_warning ("*** flock operation '%d' not implemented.\n",
+		   operation);
+	return -1;
+    }
+}
+#endif
+
+
+/* set the path to the socket name */
+static void set_path (struct sockaddr_un *saddr)
+{
+    snprintf (saddr->sun_path, sizeof (saddr->sun_path), "%s%sgtkpod-%s",
+	      g_get_tmp_dir(), G_DIR_SEPARATOR_S, g_get_user_name());
+}
+
+
+/* checks if the socket "/tmp/gtkpod-<user>" is already being used.
+   Return value:
+   TRUE: socket already being used
+   FALSE: socket not being used */
+static gboolean socket_used ()
+{
+    struct sockaddr_un *server;
+    gboolean result = FALSE;
+
+    server = g_malloc0 (sizeof (struct sockaddr_un));
+    set_path (server);
+    if (g_file_test (server->sun_path, G_FILE_TEST_EXISTS))
+    {
+	gint csock = socket(AF_UNIX, SOCK_STREAM, 0);
+	if (csock != -1)
+	{
+	    server->sun_family = AF_UNIX;
+	    if (connect(csock, (struct sockaddr *)server,
+			sizeof(struct sockaddr_un)) != -1)
+	    {
+		if (write(csock, SOCKET_TEST, strlen(SOCKET_TEST)) == 
+		    strlen (SOCKET_TEST))
+		    result = TRUE;
+	    }
+	    close(csock);
+	}
+    }
+    g_free (server);
+    return result;
+}
+
+
+/* append the filename <file> to ~/.gtkpod/offline_playcount */
+static gboolean register_playcount (gchar *file)
+{
+    if (file && *file)
+    {
+	gchar *cfgdir = prefs_get_cfgdir ();
+
+	if (cfgdir)
+	{
+	    gchar *offlplyc = g_strdup_printf (
+		"%s%c%s", cfgdir, G_DIR_SEPARATOR, "offline_playcount");
+	    int fd = open (offlplyc, O_WRONLY|O_CREAT|O_APPEND,
+			   S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
+	    if (fd != -1)
+	    {
+		if (flock (fd, LOCK_EX) == 0)
+		{
+		    gchar *sha1 = sha1_hash_on_filename (file, TRUE);
+		    write (fd, SOCKET_PLYC, strlen (SOCKET_PLYC));
+		    if (sha1) write (fd, sha1, strlen (sha1));
+		    write (fd, " ", 1);
+		    write (fd, file, strlen (file));
+		    write (fd, "\n", 1);
+		    g_free (sha1);
+		}
+		else
+		{
+		    fprintf (stderr, "couldn't lock %s\n", file);
+		}
+		close (fd);
+	    }
+	    else
+	    {
+		fprintf (stderr, "couldn't open %s\n", file);
+	    }
+	    g_free (offlplyc);
+	    g_free (cfgdir);
+	}
+    }
+    return TRUE;
+}
+
+
+void received_message (gpointer data, gint source, GdkInputCondition condition)
+{
+    gint csock, rval;
+    gchar *buf;
+/*    printf("received message\n");*/
+
+    buf = g_malloc (PATH_MAX);
+    while ((csock = accept(source, 0, 0)) != -1)
+    {
+	do
+	{
+	    bzero(buf, PATH_MAX);
+	    if ((rval = read(csock, buf, PATH_MAX)) < 0)
+	    {
+		fprintf(stderr,"server: read error: %s",strerror(errno));
+		continue;
+	    }
+	    else if (rval == 0)
+	    {
+		/* forget about it */
+	    }
+	    else
+	    {
+		if (strncmp (buf, SOCKET_TEST, strlen (SOCKET_TEST)) == 0)
+		{
+		    continue;  /* skip socket tests */
+		}
+		if (strncmp (buf, SOCKET_PLYC, strlen (SOCKET_PLYC)) == 0)
+		{
+		    gchar *file = buf + strlen (SOCKET_PLYC);
+		    if (gp_increase_playcount (NULL, file, 1) == FALSE)
+		    {   /* didn't find the track --> write to
+			   offline_playcount */
+			register_playcount (file);
+		    }
+		}
+	    }
+	}
+	while (rval > 0);
+	close(csock);
+    }
+    g_free (buf);
+}
+
+
+void server_setup (void)
+{
+    if (ssock != -1) return;  /* already opened */
+    if (socket_used ())
+    {  /* we are not the first instance of gtkpod -- the socket is
+	  already being used, so we pass */
+	gtkpod_warning (_("Another instance of gtkpod was detected. Playcount server not started.\n"));
+	return;
+    }
+    ssock = socket(AF_UNIX, SOCK_STREAM, 0);
+    if (ssock != -1)
+    {
+	if (saddr == NULL)
+	{
+	    saddr = g_malloc0 (sizeof (struct sockaddr_un));
+	    saddr->sun_family = AF_UNIX;
+	}
+	set_path (saddr);
+	unlink (saddr->sun_path);
+	if (bind(ssock, (struct sockaddr *)saddr,
+		 sizeof(struct sockaddr_un)) != -1)
+	{
+	    listen(ssock, 5);
+	    /* socket must be non-blocking -- otherwise
+	       received_message() will block */
+	    fcntl (ssock, F_SETFL, O_NONBLOCK);
+	    inp_handler = gtk_input_add_full (ssock, GDK_INPUT_READ,
+					      received_message, NULL,
+					      NULL, NULL);
+	}
+	else
+	{
+	    fprintf(stderr,"server: bind error: %s",strerror(errno));
+	    close (ssock);
+	    ssock = -1;
+	}
+    }
+    else
+    {
+	fprintf(stderr,"server: socket error: %s",strerror(errno));
+    }
+}
+
+
+void server_shutdown (void)
+{
+    if (ssock != -1)
+    {
+	gtk_input_remove (inp_handler);
+	close (ssock);
+	ssock = -1;
+    }
+    if (saddr)
+    {
+	if (strlen (saddr->sun_path) != 0)  unlink (saddr->sun_path);
+	g_free (saddr);
+	saddr = 0;
+    }
+}
+
+/* Increment the playcount of <file> by one. Either connect to a
+   running instance of gtkpod and transfer the filename, or write the
+   name to ~/.gtkpod/offline_playcounts.
+   Return value: TRUE on success, FALSE if a non-recoverable error
+   occurred */
+gboolean client_playcount (gchar *file)
+{
+    if (socket_used ())
+    {   /* send filename to currently running gtkpod instance */
+	struct sockaddr_un *server;
+
+	server = g_malloc0 (sizeof (struct sockaddr_un));
+	set_path (server);
+	if (g_file_test (server->sun_path, G_FILE_TEST_EXISTS))
+	{
+	    gint csock = socket(AF_UNIX, SOCK_STREAM, 0);
+	    if (csock != -1)
+	    {
+		server->sun_family = AF_UNIX;
+		if (connect(csock, (struct sockaddr *)server,
+			    sizeof(struct sockaddr_un)) != -1)
+		{
+		    gchar *buf = g_strdup_printf ("%s%s",
+						  SOCKET_PLYC, file);
+		    if (write(csock, buf, strlen(buf)) != strlen (buf))
+		    {
+			fprintf (stderr, "Error communicating to server. Playcount registered in offline database.\n");
+			register_playcount (file);
+		    }
+		    g_free (buf);
+		}
+		close(csock);
+	    }
+	}
+	g_free (server);
+    }
+    else
+    {   /* write filename to ~/.gtkpod/offline_playcounts */
+	register_playcount (file);
+    }
+    return TRUE;
+}
+
+
+/* print out the "sha1" hash of a filename <file> */
+gboolean print_sha1_hash (gchar *file)
+{
+    if (file && *file)
+    {
+	gchar *hash = sha1_hash_on_filename (file, TRUE);
+	if (hash) fprintf (stdout, "%s\n", hash);
+	g_free (hash);
+    }
+    return TRUE;
+}
+

Added: trunk/src/clientserver.h
===================================================================
--- trunk/src/clientserver.h	                        (rev 0)
+++ trunk/src/clientserver.h	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,56 @@
+/* Time-stamp: <2005-06-17 22:25:30 jcs>
+|
+|  Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: clientserver.h 933 2006-11-24 06:48:25Z jcsjcs $
+*/
+
+#ifndef CLIENTSERVERH_INCLUDED
+#define CLIENTSERVERH_INCLUDED 1
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <glib.h>
+#include <sys/file.h>
+
+extern const gchar *SOCKET_TEST;
+extern const gchar *SOCKET_PLYC;
+
+void server_setup (void);
+void server_shutdown (void);
+gboolean client_playcount (gchar *file);
+gboolean print_sha1_hash (gchar *file);
+#ifndef HAVE_FLOCK
+#include <unistd.h>
+#include <fcntl.h>
+/* emulate flock on systems that do not have it */
+int flock(int fd, int operation);
+#ifndef LOCK_EX
+#define LOCK_EX 2
+#endif
+#endif
+#endif

Added: trunk/src/confirmation.c
===================================================================
--- trunk/src/confirmation.c	                        (rev 0)
+++ trunk/src/confirmation.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,542 @@
+/* Time-stamp: <2007-02-23 00:04:30 jcs>
+|
+|  Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: confirmation.c 995 2007-02-22 15:05:53Z jcsjcs $
+*/
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <string.h>
+#include "misc.h"
+#include "confirmation.h"
+#include "prefs.h"
+
+
+static GHashTable *id_hash = NULL;
+
+typedef struct {
+    GtkWidget *window;
+    GladeXML *window_xml;
+    gboolean  scrolled;
+    gchar *option1_key;
+    gboolean option1_invert;
+    gchar *option2_key;
+    gboolean option2_invert;
+    gchar *confirm_again_key;
+    ConfHandler ok_handler;
+    ConfHandler apply_handler;
+    ConfHandler cancel_handler;
+    gpointer user_data1;
+    gpointer user_data2;
+} ConfData;
+
+
+
+/* cleanup hash, store window size */
+static void cleanup (gpointer id)
+{
+    ConfData *cd;
+
+    cd = g_hash_table_lookup (id_hash, id);
+    if (cd)
+    {
+	gint defx, defy;
+	gtk_window_get_size (GTK_WINDOW (cd->window), &defx, &defy);
+	if (cd->scrolled)
+	{
+		prefs_set_int("size_conf_sw.x", defx);
+		prefs_set_int("size_conf_sw.y", defy);
+	}
+	else
+	{
+		prefs_set_int("size_conf.x", defx);
+		prefs_set_int("size_conf.y", defy);
+	}
+
+	gtk_widget_destroy (cd->window);
+	g_free (cd->option1_key);
+	g_free (cd->option2_key);
+	g_free (cd->confirm_again_key);
+
+	g_hash_table_remove (id_hash, id);
+    }
+}
+
+
+static void on_ok_clicked (GtkWidget *w, gpointer id)
+{
+    ConfData *cd;
+
+    cd = g_hash_table_lookup (id_hash, id);
+    if (cd)
+    {
+	gtk_widget_set_sensitive (cd->window, FALSE);
+	if (cd->ok_handler)
+	    cd->ok_handler (cd->user_data1, cd->user_data2);
+	cleanup (id);
+    }
+}
+
+static void on_apply_clicked (GtkWidget *w, gpointer id)
+{
+    ConfData *cd;
+
+    cd = g_hash_table_lookup (id_hash, id);
+    if (cd)
+    {
+	gtk_widget_set_sensitive (cd->window, FALSE);
+	if (cd->apply_handler)
+	    cd->apply_handler (cd->user_data1, cd->user_data2);
+	gtk_widget_set_sensitive (cd->window, TRUE);
+    }
+}
+
+static void on_cancel_clicked (GtkWidget *w, gpointer id)
+{
+    ConfData *cd;
+
+    cd = g_hash_table_lookup (id_hash, id);
+    if (cd)
+    {
+	gtk_widget_set_sensitive (cd->window, FALSE);
+	if (cd->cancel_handler)
+	    cd->cancel_handler (cd->user_data1, cd->user_data2);
+	cleanup (id);
+    }
+}
+
+
+/* Handler to be used when the button should be displayed, but no
+   action is required */
+void CONF_NULL_HANDLER (gpointer d1, gpointer d2)
+{
+    return;
+}
+
+
+static void on_never_again_toggled (GtkToggleButton *t, gpointer id)
+{
+    ConfData *cd;
+
+    cd = g_hash_table_lookup (id_hash, id);
+    if (cd)
+    {
+	if (cd->confirm_again_key)
+	    prefs_set_int(cd->confirm_again_key, !gtk_toggle_button_get_active(t));
+    }
+}
+
+static void on_option1_toggled (GtkToggleButton *t, gpointer id)
+{
+    ConfData *cd;
+
+    cd = g_hash_table_lookup (id_hash, id);
+    if (cd)
+    {
+	if (cd->option1_key)
+	{
+	    gboolean state = gtk_toggle_button_get_active(t);
+	    if (cd->option1_invert)  prefs_set_int (cd->option1_key, !state);
+	    else                     prefs_set_int (cd->option1_key, state);
+	}
+    }
+}
+
+static void on_option2_toggled (GtkToggleButton *t, gpointer id)
+{
+    ConfData *cd;
+
+    cd = g_hash_table_lookup (id_hash, id);
+    if (cd)
+    {
+	if (cd->option2_key)
+	{
+	    gboolean state = gtk_toggle_button_get_active(t);
+	    if (cd->option2_invert)  prefs_set_int (cd->option2_key, !state);
+	    else                     prefs_set_int (cd->option2_key, state);
+	}
+    }
+}
+
+static void on_response (GtkWidget *w, gint response, gpointer id)
+{
+    ConfData *cd;
+/*     printf ("r: %d, i: %d\n", response, id); */
+    cd = g_hash_table_lookup (id_hash, id);
+    if (cd)
+    {
+	switch (response)
+	{
+	case GTK_RESPONSE_OK:
+	    on_ok_clicked (w, id);
+	    break;
+	case GTK_RESPONSE_NONE:
+	case GTK_RESPONSE_CANCEL:
+	case GTK_RESPONSE_DELETE_EVENT:
+	    on_cancel_clicked (w, id);
+	    break;
+	case GTK_RESPONSE_APPLY:
+	    on_apply_clicked (w, id);
+	    break;
+	default:
+	    g_warning ("Programming error: resonse '%d' received in on_response()\n", response);
+	    on_cancel_clicked (w, id);
+	    break;
+	}
+    }
+}
+
+
+/* gtkpod_confirmation(): open a confirmation window with the
+   information given. If "OK" is clicked, ok_handler() is called,
+   otherwise cancel_handler() is called, each with the parameters
+   "user_data1" and "user_data2". Use "NULL" if you want to
+   omit a parameter. If "confirm_again" is FALSE, ok_handler() is called
+   directly.
+
+   @id:    an ID: only one window with a given positive id can be
+           open. Use negative ID if you don't care how many windows
+	   are open at the same time (e.g. because they are modal).
+	   With positive IDs @text is added to an already open window
+           with the same ID.
+   @modal: should the window be modal (i.e. block the program)?
+   @title: title of the window
+   @label: the text at the top of the window
+   @text:  the text displayed in a scrolled window
+   @option_text: text for the option checkbox (or NULL)
+   @option_state: initial state of the option + a flag indicating
+           whether the handler should be called with the inverse state
+           of the toggle button: CONF_STATE_TRUE, CONF_STATE_FALSE,
+	   CONF_STATE_INVERT_TRUE, CONF_STATE_INVERT_FALSE
+   @option_key: prefs key for the option (is set to the state of the
+           toggle box)
+   @confirm_again:    state of the "confirm again" flag
+   @confirm_again_key: prefs key for the 'never show this dialog
+           again' toggle box (is set to the inverted current state
+	   of the toggle box)
+   @ok_handler:     function to be called when the OK button is pressed
+   @apply_handler:  function to be called when the Apply button is pressed
+   @cancel_handler: function to be called when the cancel button is pressed
+	   Note: in modal windows, the ok_, apply_, and cancel_handlers
+	   must be set to CONF_NULL_HANDLER if the button is to be shown.
+   @user_data1:     first argument to be passed to the ConfHandler
+   @user_data1:     second argument to be passed to the ConfHandler
+
+   Pass NULL as "handler" if you want the corresponding button to be
+   hidden.
+
+   Pass CONF_NULL_HANDLER if you want the corresponding button to be
+   shown, but don't want to specify a handler.
+
+   Return value:
+
+   non-modal dialogs:
+
+     GTK_RESPONSE_REJECT: no window was opened because another window
+     with the same ID is already open. Text was appended.
+
+     GTK_RESPONSE_ACCEPT: either a window was opened, or ok_handler()
+     was called directly.
+
+   modal dialogs:
+
+     GTK_RESPONSE_REJECT: no window was opened because another window
+     with the same ID is already open. Text was appended. 
+
+     GTK_RESPONSE_OK, GTK_RESPONSE_CANCEL, GTK_RESPONSE_APPLY:
+     OK/CANCEL/APPLY pressed. If the window is closed by the user,
+     GTK_RESPONSE_CANCEL will be returned.
+ */
+
+GtkResponseType gtkpod_confirmation (gint id,
+				     gboolean modal,
+				     const gchar *title,
+				     const gchar *label,
+				     const gchar *text,
+				     const gchar *option1_text,
+				     CONF_STATE option1_state,
+				     const gchar *option1_key,
+				     const gchar *option2_text,
+				     CONF_STATE option2_state,
+				     const gchar *option2_key,
+				     gboolean confirm_again,
+				     const gchar *confirm_again_key,
+				     ConfHandler ok_handler,
+				     ConfHandler apply_handler,
+				     ConfHandler cancel_handler,
+				     gpointer user_data1,
+				     gpointer user_data2)
+{
+    GtkWidget *window, *w;
+    ConfData *cd;
+    gint defx, defy;
+    GladeXML *confirm_xml;
+
+    if (id_hash == NULL)
+    {  /* initialize hash table to store IDs */
+	id_hash = g_hash_table_new_full (g_direct_hash, g_direct_equal,
+					      NULL, g_free);
+    }
+    if (id >= 0)
+    {
+	if ((cd = g_hash_table_lookup (id_hash, GINT_TO_POINTER(id))))
+	{ /* window with same ID already open -- add @text and return
+	   * */
+	    if (text && *text &&
+		cd->window && ((w = gtkpod_xml_get_widget (cd->window_xml, "text"))))
+	    {
+		GtkTextIter ti;
+		GtkTextBuffer *tb = gtk_text_view_get_buffer(GTK_TEXT_VIEW(w));
+		if (!tb)
+		{   /* text buffer doesn't exist yet */
+		    GtkWidget *w1;
+		    tb = gtk_text_buffer_new(NULL);
+		    gtk_text_view_set_buffer(GTK_TEXT_VIEW(w), tb);
+		    gtk_text_view_set_editable(GTK_TEXT_VIEW(w), FALSE);
+		    gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(w), FALSE);
+		    if ((w1 =  gtkpod_xml_get_widget (cd->window_xml, "scroller")))
+			gtk_widget_show (w1);
+		    cd->scrolled = TRUE;
+		}
+		/* append new text to the end */
+		gtk_text_buffer_get_end_iter (tb, &ti);
+		gtk_text_buffer_insert (tb, &ti, text, -1);
+		/* scroll window such that new text is visible */
+		gtk_text_view_scroll_mark_onscreen (GTK_TEXT_VIEW (w),
+                                    gtk_text_buffer_get_insert (tb));
+	    }
+	    return GTK_RESPONSE_REJECT;
+	}
+    }
+    else /* find free ID */
+    {
+	id = 0;
+	do
+	{
+	    --id;
+	    cd = g_hash_table_lookup (id_hash, GINT_TO_POINTER(id));
+	} while (cd != NULL);
+    }
+
+    if (!confirm_again)
+    { /* This question was supposed to be asked "never again" ("don't
+	 confirm again" -- so we just call the ok_handler */
+	if (ok_handler && !modal)
+	    ok_handler (user_data1, user_data2);
+	if (!modal)  return GTK_RESPONSE_ACCEPT;
+	else         return GTK_RESPONSE_OK;
+    }
+
+    /* window = create_confirm_dialog (); */
+    confirm_xml = glade_xml_new (xml_file, "confirm_dialog", NULL);
+    window = gtkpod_xml_get_widget (confirm_xml, "confirm_dialog");
+
+    /* insert ID into hash table */
+    cd = g_malloc (sizeof (ConfData));
+    cd->window = window;
+    cd->window_xml = confirm_xml;
+    cd->option1_key = g_strdup(option1_key);
+    cd->option2_key = g_strdup(option2_key);
+    cd->confirm_again_key = g_strdup(confirm_again_key);
+    cd->ok_handler = ok_handler;
+    cd->apply_handler = apply_handler;
+    cd->cancel_handler = cancel_handler;
+    cd->user_data1 = user_data1;
+    cd->user_data2 = user_data2;
+    g_hash_table_insert (id_hash, GINT_TO_POINTER(id), cd);
+
+    /* Set title */
+    if (title)
+	gtk_window_set_title (GTK_WINDOW(window), title);
+    else
+	gtk_window_set_title (GTK_WINDOW(window), _("Confirmation Dialogue"));
+
+    /* Set label */
+    w = gtkpod_xml_get_widget (confirm_xml, "label");
+    if (label)
+    {
+	gtk_widget_show (w);
+	gtk_label_set_text(GTK_LABEL(w), label);
+    }
+    else
+    {
+	gtk_widget_hide (w);
+    }
+
+    /* Set text */
+    w = gtkpod_xml_get_widget (confirm_xml, "text");
+    if (text)
+    {
+	if (w)
+	{
+	    GtkTextBuffer *tb = gtk_text_buffer_new(NULL);
+	    gtk_text_buffer_set_text(tb, text, strlen(text));
+	    gtk_text_view_set_buffer(GTK_TEXT_VIEW(w), tb);
+	    gtk_text_view_set_editable(GTK_TEXT_VIEW(w), FALSE);
+	    gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(w), FALSE);
+	}
+	cd->scrolled = TRUE;
+	defx = prefs_get_int("size_conf_sw.x");
+	defy = prefs_get_int("size_conf_sw.y");
+    }
+    else
+    { /* no text -> hide widget */
+	if ((w = gtkpod_xml_get_widget (confirm_xml, "scroller")))
+	    gtk_widget_hide (w);
+	cd->scrolled = FALSE;
+	defx = prefs_get_int("size_conf.x");
+	defy = prefs_get_int("size_conf.y");
+    }
+    gtk_window_set_default_size (GTK_WINDOW (window), defx, defy);
+
+    /* Set "Option 1" checkbox */
+    w = gtkpod_xml_get_widget (confirm_xml, "option_vbox");
+    if (w && option1_key && option1_text)
+    {
+	gboolean state, invert;
+	GtkWidget *option1_button =
+	    gtk_check_button_new_with_mnemonic (option1_text);
+
+	if ((option1_state==CONF_STATE_INVERT_TRUE) ||
+	    (option1_state==CONF_STATE_TRUE))  state = TRUE;
+	else                                   state = FALSE;
+	if ((option1_state==CONF_STATE_INVERT_FALSE) ||
+	    (option1_state==CONF_STATE_INVERT_TRUE))  invert = TRUE;
+	else                                          invert = FALSE;
+	cd->option1_invert = invert;
+
+	gtk_widget_show (option1_button);
+	gtk_box_pack_start (GTK_BOX (w), option1_button, FALSE, FALSE, 0);
+	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(option1_button),
+				     state);
+	g_signal_connect ((gpointer)option1_button,
+			  "toggled",
+			  G_CALLBACK (on_option1_toggled),
+			  GINT_TO_POINTER(id));
+    }
+
+    /* Set "Option 2" checkbox */
+    w = gtkpod_xml_get_widget (confirm_xml, "option_vbox");
+    if (w && option2_key && option2_text)
+    {
+	gboolean state, invert;
+	GtkWidget *option2_button =
+	    gtk_check_button_new_with_mnemonic (option2_text);
+
+	if ((option2_state==CONF_STATE_INVERT_TRUE) ||
+	    (option2_state==CONF_STATE_TRUE))  state = TRUE;
+	else                                   state = FALSE;
+	if ((option2_state==CONF_STATE_INVERT_FALSE) ||
+	    (option2_state==CONF_STATE_INVERT_TRUE))  invert = TRUE;
+	else                                          invert = FALSE;
+	cd->option2_invert = invert;
+
+	gtk_widget_show (option2_button);
+	gtk_box_pack_start (GTK_BOX (w), option2_button, FALSE, FALSE, 0);
+	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(option2_button),
+				     state);
+	g_signal_connect ((gpointer)option2_button,
+			  "toggled",
+			  G_CALLBACK (on_option2_toggled),
+			  GINT_TO_POINTER(id));
+    }
+
+    /* Set "Never Again" checkbox */
+    w = gtkpod_xml_get_widget (confirm_xml, "never_again");
+    if (w && confirm_again_key)
+    { /* connect signal */
+	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+				     !confirm_again);
+	g_signal_connect ((gpointer)w,
+			  "toggled",
+			  G_CALLBACK (on_never_again_toggled),
+			  GINT_TO_POINTER(id));
+    }
+    else if (w)
+    { /* hide "never again" button */
+	gtk_widget_hide (w);
+    }
+
+    /* Hide and set "default" button that can be activated by pressing
+       ENTER in the window (usually OK)*/
+    /* Hide or default CANCEL button */
+    if ((w = gtkpod_xml_get_widget (confirm_xml, "cancel")))
+    {
+	GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
+	gtk_widget_grab_default (w);
+	if (!cancel_handler)  gtk_widget_hide (w);
+    }
+
+    /* Hide or default APPLY button */
+    if ((w = gtkpod_xml_get_widget (confirm_xml, "apply")))
+    {
+	GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
+	gtk_widget_grab_default (w);
+	if (!apply_handler)   gtk_widget_hide (w);
+    }
+
+    /* Hide or default OK button */
+    if ((w = gtkpod_xml_get_widget (confirm_xml, "ok")))
+    {
+	GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
+	gtk_widget_grab_default (w);
+	if (!ok_handler)     gtk_widget_hide (w);
+    }
+
+    /* Connect Close window */
+    g_signal_connect (GTK_OBJECT (window),
+		      "delete_event",
+		      G_CALLBACK (on_cancel_clicked),
+		      GINT_TO_POINTER(id));
+
+    if (modal)
+    {
+	/* use gtk_dialog_run() to block the application */
+	gint response = gtk_dialog_run (GTK_DIALOG (window));
+	/* cleanup hash, store window size */
+	cleanup (GINT_TO_POINTER(id));
+	switch (response)
+	{
+	case GTK_RESPONSE_OK:
+	case GTK_RESPONSE_APPLY:
+	    return response;
+	default:
+	    return GTK_RESPONSE_CANCEL;
+	}
+    }
+    else
+    {
+	/* Make sure we catch the response */
+	g_signal_connect (GTK_OBJECT (window),
+			  "response",
+			  G_CALLBACK (on_response),
+			  GINT_TO_POINTER(id));
+	gtk_widget_show (window);
+	return GTK_RESPONSE_ACCEPT;
+    }
+}

Added: trunk/src/confirmation.h
===================================================================
--- trunk/src/confirmation.h	                        (rev 0)
+++ trunk/src/confirmation.h	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,79 @@
+/*
+|  Copyright (C) 2002-2007 Jorg Schuler <jcsjcs at users.sourceforge.net>
+|  Part of the gtkpod project.
+|
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: confirmation.h 1065 2007-05-06 14:16:17Z jcsjcs $
+*/
+
+#ifndef __CONFIRMATION_H__
+#define __CONFIRMATION_H__
+
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <gtk/gtk.h>
+
+typedef void (*ConfHandler)(gpointer user_data1, gpointer user_data2);
+
+/* states for gtkpod_confirmation options */
+typedef enum {
+    CONF_STATE_TRUE,
+    CONF_STATE_FALSE,
+    CONF_STATE_INVERT_TRUE,
+    CONF_STATE_INVERT_FALSE,
+} CONF_STATE;
+
+GtkResponseType gtkpod_confirmation (gint id,
+				     gboolean modal,
+				     const gchar *title,
+				     const gchar *label,
+				     const gchar *text,
+				     const gchar *option1_text,
+				     CONF_STATE option1_state,
+				     const gchar *option1_key,
+				     const gchar *option2_text,
+				     CONF_STATE option2_state,
+				     const gchar *option2_key,
+				     gboolean confirm_again,
+				     const gchar *confirm_again_key,
+				     ConfHandler ok_handler,
+				     ConfHandler apply_handler,
+				     ConfHandler cancel_handler,
+				     gpointer user_data1,
+				     gpointer user_data2);
+
+/* predefined IDs for use with gtkpod_confirmation() */
+enum {
+    CONF_ID_IPOD_DIR = 0,
+    CONF_ID_GTKPOD_WARNING,
+    CONF_ID_DANGLING0,
+    CONF_ID_DANGLING1,
+    CONF_ID_SYNC_SUMMARY,
+    CONF_ID_TRANSFER
+} CONF_ID;
+
+void CONF_NULL_HANDLER (gpointer d1, gpointer d2);
+
+#endif

Added: trunk/src/context_menus.c
===================================================================
--- trunk/src/context_menus.c	                        (rev 0)
+++ trunk/src/context_menus.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,1249 @@
+/*
+|  Copyright (C) 2003 Corey Donohoe <atmos at atmos dot org>
+|  Copyright (C) 2003-2007 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+| 
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+| 
+|  iTunes and iPod are trademarks of Apple
+| 
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: context_menus.c 1827 2007-12-13 22:55:50Z phantom_sf $
+*/
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "itdb.h"
+#include "info.h"
+#include "details.h"
+#include "display.h"
+#include "display_itdb.h"
+#include "file.h"
+#include "misc.h"
+#include "misc_track.h"
+#include "prefs.h"
+#include "tools.h"
+#include "repository.h"
+#include "syncdir.h"
+#include "display_coverart.h"
+#include "display_photo.h"
+
+#define LOCALDEBUG 0
+
+static guint entry_inst = -1;
+static GList *selected_tracks = NULL;
+static Playlist *selected_playlist = NULL;
+static TabEntry *selected_entry = NULL; 
+static iTunesDB *active_itdb = NULL;
+/* types of context menus (PM/ST/TM) */
+typedef enum {
+    CM_PL = 0,
+    CM_ST,
+    CM_TM,
+    CM_NUM,
+    CM_CAD,
+    CM_PH_AV,
+    CM_PH_IV
+} CM_type;
+
+
+
+#if LOCALDEBUG
+/**
+ * do_special - for debugging: change as needed to obtain information
+ * on selected tracks
+ * @mi - the menu item selected
+ * @data - ignored, should be NULL
+ */
+static void 
+do_special(GtkWidget *w, gpointer data)
+{
+    GList *gl;
+
+    for (gl=selected_tracks; gl; gl=gl->next)
+    {
+	gchar *mp;
+	Track *tr = gl->data;
+	g_return_if_fail (tr);
+	g_object_get (tr->itdb->device, "mount-point", &mp, NULL);
+	printf ("mountpoint: %s\n", mp);
+	g_free (mp);
+
+	printf ("track: %p: thumbnails: %p id: %d num: %d\n",
+		tr, tr->artwork->thumbnails, tr->artwork->id, g_list_length (tr->artwork->thumbnails));
+	if (tr->artwork->thumbnails)
+	{
+	    GList *gl2;
+	    for (gl2=tr->artwork->thumbnails; gl2; gl2=gl2->next)
+	    {
+		Thumb *img = gl2->data;
+		g_return_if_fail (img);
+		printf ("  %s offset: %d size: %d width: %d height: %d\n", img->filename, img->offset, img->size, img->width, img->height);
+	    }
+	}
+    }
+}
+#endif
+
+
+
+/**
+ * export_entries - export the currently selected files to disk
+ * @mi - the menu item selected
+ * @data - ignored, should be NULL
+ */
+static void 
+export_entries(GtkWidget *w, gpointer data)
+{
+    if(selected_tracks)
+	export_files_init (selected_tracks, NULL, FALSE, NULL);
+}
+
+/**
+ * create_playlist_file - write a playlist file containing the
+ * currently selected tracks.
+ * @mi - the menu item selected
+ * @data - ignored, should be NULL
+ */
+static void 
+create_playlist_file(GtkWidget *w, gpointer data)
+{
+    if(selected_tracks)
+	export_playlist_file_init(selected_tracks);
+}
+
+
+/*
+ * play_entries_now - play the entries currently selected in xmms
+ * @mi - the menu item selected
+ * @data - Ignored, should be NULL
+ */
+static void 
+play_entries_now (GtkMenuItem *mi, gpointer data)
+{
+    tools_play_tracks (selected_tracks);
+}
+
+/*
+ * play_entries_now - play the entries currently selected in xmms
+ * @mi - the menu item selected
+ * @data - Ignored, should be NULL
+ */
+static void 
+play_entries_enqueue (GtkMenuItem *mi, gpointer data)
+{
+    tools_enqueue_tracks (selected_tracks);
+}
+
+
+/*
+ * show_details_entries - show details of tracks currently selected
+ * @mi - the menu item selected
+ * @data - Ignored, should be NULL
+ */
+static void 
+edit_details_entries(GtkMenuItem *mi, gpointer data)
+{
+    if (selected_playlist)
+	details_edit (selected_playlist->members);
+    else if(selected_entry)
+	details_edit (selected_entry->members);
+    else if(selected_tracks)
+	details_edit (selected_tracks);
+}
+
+/*
+ * display the dialog with the full size cd artwork cover
+ * @mi - the menu item selected
+ * @data - Ignored, should be NULL
+ */
+static void
+display_track_artwork(GtkMenuItem *mi, gpointer data)
+{
+	if (selected_tracks)
+		coverart_display_big_artwork (selected_tracks);
+}
+
+/*
+ * update_entries - update the entries currently selected
+ * @mi - the menu item selected
+ * @data - Ignored, should be NULL
+ */
+static void 
+update_entries(GtkMenuItem *mi, gpointer data)
+{
+    if (selected_playlist)
+	gp_do_selected_playlist (update_tracks);
+    else if(selected_entry)
+	gp_do_selected_entry (update_tracks, entry_inst);
+    else if(selected_tracks)
+	gp_do_selected_tracks (update_tracks);
+}
+
+/*
+ * sync_dirs_ entries - sync the directories of the selected playlist
+ *
+ * @mi - the menu item selected
+ * @data - Ignored, should be NULL
+ */
+static void 
+sync_dirs (GtkMenuItem *mi, gpointer data)
+{
+    if (selected_playlist)
+    {
+	sync_playlist (selected_playlist, NULL,
+		       KEY_SYNC_CONFIRM_DIRS, 0,
+		       KEY_SYNC_DELETE_TRACKS, 0,
+		       KEY_SYNC_CONFIRM_DELETE, 0,
+		       KEY_SYNC_SHOW_SUMMARY, 0);
+    }
+    else
+    {
+	g_return_if_reached ();
+    }
+}
+
+/**
+ * delete_entries - delete the currently selected entry, be it a playlist,
+ * items in a sort tab, or tracks
+ * @mi - the menu item selected
+ * @data - ignored, should be NULL
+ */
+static void 
+delete_entries(GtkMenuItem *mi, gpointer data)
+{
+    DeleteAction deleteaction = GPOINTER_TO_INT (data);
+
+    if (selected_playlist)
+	delete_playlist_head (deleteaction);
+    else if(selected_entry)
+	delete_entry_head (entry_inst, deleteaction);
+    else if(selected_tracks)
+	delete_track_head (deleteaction);
+}
+
+/* Edit selected smart playlist */
+static void edit_spl (GtkMenuItem *mi, gpointer data)
+{
+    Playlist *pl = NULL;
+
+    if (selected_tracks)   pl = pm_get_selected_playlist ();
+    if (selected_entry)    pl = pm_get_selected_playlist ();
+    if (selected_playlist) pl = selected_playlist;
+
+    spl_edit (pl);
+}
+
+/* Display repository options */
+static void edit_properties (GtkMenuItem *mi, gpointer data)
+{
+    g_return_if_fail (selected_playlist);
+
+    repository_edit (selected_playlist->itdb, selected_playlist);
+}
+
+
+static void
+create_playlist_from_entries (GtkMenuItem *mi, gpointer data)
+{
+    generate_new_playlist (active_itdb, selected_tracks);
+}
+
+/**
+ * alphabetize - alphabetize the currently selected entry
+ * sort tab). The sort order is being cycled through.
+ * @mi - the menu item selected
+ * @data - ignored, should be NULL
+ */
+static void 
+alphabetize(GtkMenuItem *mi, gpointer data)
+{
+    if (selected_entry)
+    {
+	switch (prefs_get_int("st_sort"))
+	{
+	case SORT_ASCENDING:
+	    prefs_set_int("st_sort", SORT_DESCENDING);
+	    break;
+	case SORT_DESCENDING:
+	    prefs_set_int("st_sort", SORT_NONE);
+	    break;
+	case SORT_NONE:
+	    prefs_set_int("st_sort", SORT_ASCENDING);
+	    break;
+	}
+	st_sort (prefs_get_int("st_sort"));
+    }
+}
+
+
+static void load_ipod (GtkMenuItem *mi, gpointer data)
+{
+    g_return_if_fail (selected_playlist);
+
+    gp_load_ipod (selected_playlist->itdb);
+}
+
+
+static void eject_ipod (GtkMenuItem *mi, gpointer data)
+{
+    iTunesDB *itdb;
+    ExtraiTunesDBData *eitdb;
+
+    /* all of the checks below indicate a programming error -> give a
+       warning through the g_..._fail macros */
+    g_return_if_fail (selected_playlist);
+    itdb = selected_playlist->itdb;
+    g_return_if_fail (itdb);
+    g_return_if_fail (itdb->usertype & GP_ITDB_TYPE_IPOD);
+    eitdb = itdb->userdata;
+    g_return_if_fail (eitdb);
+    g_return_if_fail (eitdb->itdb_imported == TRUE);
+
+    gp_eject_ipod (itdb);
+}
+
+
+static void save_changes (GtkMenuItem *mi, gpointer data)
+{
+    g_return_if_fail (selected_playlist);
+
+    gp_save_itdb (selected_playlist->itdb);
+}
+
+
+
+
+/* ------------------------------------------------------------
+
+      Copying selected item(s) to target destination
+
+   ------------------------------------------------------------ */
+
+
+/*
+ * Copy the selected playlist to a specified itdb.
+ */
+void
+copy_playlist_to_target_itdb (Playlist     *pl,
+			      iTunesDB     *t_itdb)
+{
+    Playlist	*pl_n;
+    GList	*addtracks = NULL;
+    g_return_if_fail (pl);
+    g_return_if_fail (t_itdb);
+    if (pl->itdb != t_itdb)
+    {
+	addtracks = export_trackglist_when_necessary (pl->itdb,
+						      t_itdb,
+						      pl->members);
+	if (addtracks || !pl->members)
+	{
+	    pl_n = gp_playlist_add_new(t_itdb, pl->name, FALSE, -1);
+	    add_trackglist_to_playlist (pl_n, addtracks);
+	    gtkpod_statusbar_message (_("Copied \"%s\" playlist to %s"),
+				      pl->name, (itdb_playlist_mpl (t_itdb))->name);
+	}
+	g_list_free (addtracks);
+	addtracks = NULL;
+    }
+    else
+    {
+	pl_n = itdb_playlist_duplicate (pl);
+	g_return_if_fail (pl_n);
+	gp_playlist_add (t_itdb, pl_n, -1);
+    }
+}
+
+
+/*
+ * Copy selected tracks to a specified itdb.
+ */
+void
+copy_tracks_to_target_itdb (GList        *tracks,
+			    iTunesDB     *t_itdb)
+{
+    GList       *addtracks = NULL;
+    Track	*first = tracks->data;
+    Playlist    *mpl;
+    gint        n;
+
+    g_return_if_fail(tracks);
+    g_return_if_fail(t_itdb);
+
+    mpl = itdb_playlist_mpl (t_itdb);
+    g_return_if_fail(mpl);
+
+    addtracks = export_trackglist_when_necessary (first->itdb, t_itdb, tracks);
+
+    if (addtracks)
+    {
+	add_trackglist_to_playlist (mpl, addtracks);
+	n = g_list_length (addtracks);
+	gtkpod_statusbar_message (ngettext ("Copied %d track to '%s'",
+					    "Copied %d tracks to '%s'", n),
+				  n, mpl->name);
+	g_list_free (addtracks);
+	addtracks = NULL;
+    }
+}
+
+
+void
+copy_playlist_to_target_playlist (Playlist     *pl,
+				  Playlist     *t_pl)
+{
+    GList	*addtracks = NULL;
+    Playlist    *t_mpl;
+
+    g_return_if_fail (pl);
+    g_return_if_fail (t_pl);
+
+    t_mpl = itdb_playlist_mpl (t_pl->itdb);
+    g_return_if_fail(t_mpl);
+
+    addtracks = export_trackglist_when_necessary (pl->itdb,
+						  t_pl->itdb,
+						  pl->members);
+    if (addtracks || !pl->members)
+    {
+	add_trackglist_to_playlist (t_pl, addtracks);
+	gtkpod_statusbar_message (_("Copied '%s' playlist to '%s' in '%s'"),
+				  pl->name, t_pl->name, t_mpl->name);
+	g_list_free(addtracks);
+	addtracks = NULL;
+    }
+}
+
+
+
+void
+copy_tracks_to_target_playlist (GList        *tracks,
+				Playlist     *t_pl)
+{
+    GList	*addtracks = NULL;
+    Track	*first;
+    Playlist    *mpl;
+    gint        n;
+
+    g_return_if_fail (tracks);
+    g_return_if_fail (t_pl);
+    g_return_if_fail (t_pl->itdb);
+
+    mpl = itdb_playlist_mpl (t_pl->itdb);
+    g_return_if_fail(mpl);
+
+    if (tracks)
+    {
+	first = tracks->data;
+	g_return_if_fail (first);
+	addtracks = export_trackglist_when_necessary (first->itdb, t_pl->itdb, tracks);
+	add_trackglist_to_playlist (t_pl, addtracks);
+    }
+    n = g_list_length (addtracks);
+    gtkpod_statusbar_message (ngettext ("Copied %d track to '%s' in '%s'",
+					"Copied %d tracks to %s in '%s'", n),
+			      n, t_pl->name, mpl->name);
+    g_list_free (addtracks);
+    addtracks = NULL;
+}
+
+
+
+static void copy_selected_to_target_itdb (GtkMenuItem *mi, gpointer *userdata)
+{
+    iTunesDB *t_itdb = *userdata;
+    g_return_if_fail (t_itdb);
+    if (selected_playlist)
+	copy_playlist_to_target_itdb (selected_playlist, t_itdb);
+    else if (selected_entry)
+	copy_tracks_to_target_itdb (selected_entry->members, t_itdb);
+    else if (selected_tracks)
+	copy_tracks_to_target_itdb (selected_tracks, t_itdb);
+}
+
+
+static void copy_selected_to_target_playlist (GtkMenuItem *mi, gpointer *userdata)
+{
+    Playlist *t_pl = *userdata;
+    g_return_if_fail (t_pl);
+    if (selected_playlist)
+	copy_playlist_to_target_playlist (selected_playlist, t_pl);
+    else if (selected_entry)
+	copy_tracks_to_target_playlist (selected_entry->members, t_pl);
+    else if (selected_tracks)
+	copy_tracks_to_target_playlist (selected_tracks, t_pl);
+}
+
+
+/* Attach a menu item to your context menu */
+/* @m - the GtkMenu we're attaching to
+ * @str - a gchar* with the menu label
+ * @stock - name of the stock icon (or NULL if none is to be used)
+ * @func - the callback for when the item is selected (or NULL)
+ * @mi - the GtkWidget we're gonna hook into the menu
+ */
+GtkWidget *hookup_mi (GtkWidget *m,
+		      const gchar *str,
+		      const gchar *stock,
+		      GCallback func,
+		      gpointer userdata)
+{
+    GtkWidget *mi;
+
+    if (stock)
+    {
+	GtkWidget *image;
+	mi = gtk_image_menu_item_new_with_mnemonic (str);
+	image = gtk_image_new_from_stock (stock, GTK_ICON_SIZE_MENU);
+	gtk_widget_show (image);
+	gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mi), image);
+    }
+    else
+    {
+	mi = gtk_menu_item_new_with_label(str);
+    }
+    gtk_widget_show(mi);
+    gtk_widget_set_sensitive(mi, TRUE);
+    gtk_widget_add_events(mi, GDK_BUTTON_RELEASE_MASK);
+    if (func)
+	g_signal_connect(G_OBJECT(mi), "activate", func, userdata);
+    gtk_container_add (GTK_CONTAINER (m), mi);
+    return mi;
+}
+
+
+/* Add separator to Menu @m and return pointer to separator widget */
+GtkWidget *add_separator (GtkWidget *m)
+{
+    GtkWidget *sep = NULL;
+    if (m)
+    {
+	sep = gtk_separator_menu_item_new ();
+	gtk_widget_show(sep);
+	gtk_widget_set_sensitive(sep, TRUE);
+	gtk_container_add (GTK_CONTAINER (m), sep);
+    }
+    return sep;
+}
+
+
+static GtkWidget *add_copy_selected_to_target_itdb (GtkWidget *menu,
+						    const gchar *title)
+{
+    GtkWidget *mi;
+    GtkWidget *sub;
+    GtkWidget *pl_mi;
+    GtkWidget *pl_sub;
+    GList *itdbs;
+    GList *db;
+    struct itdbs_head *itdbs_head;
+    iTunesDB *itdb;
+    gchar *stock_id = NULL;
+    Playlist *pl;
+
+  
+    g_return_val_if_fail (gtkpod_window, NULL);
+    itdbs_head = g_object_get_data (G_OBJECT (gtkpod_window),
+                                    "itdbs_head");
+
+    mi = hookup_mi (menu, title,
+		    GTK_STOCK_COPY,
+		    NULL, NULL);
+    sub = gtk_menu_new ();
+    gtk_widget_show (sub);
+    gtk_menu_item_set_submenu (GTK_MENU_ITEM (mi), sub);
+
+    for (itdbs=itdbs_head->itdbs; itdbs; itdbs=itdbs->next)
+	    {
+		itdb = itdbs->data;
+		ExtraiTunesDBData *eitdb=itdb->userdata;
+		if (itdb->usertype & GP_ITDB_TYPE_LOCAL)
+		{
+			stock_id = GTK_STOCK_HARDDISK;
+		}
+		else
+		{
+		    if (eitdb->itdb_imported)
+		    {
+		        stock_id = GTK_STOCK_CONNECT;
+		    }
+		    else
+		    {
+		        stock_id = GTK_STOCK_DISCONNECT;
+		    }
+		}
+		pl_mi = hookup_mi (sub, _(itdb_playlist_mpl(itdb)->name),
+				   stock_id, NULL, NULL);
+		pl_sub = gtk_menu_new ();
+		gtk_widget_show (pl_sub);
+		gtk_menu_item_set_submenu (GTK_MENU_ITEM (pl_mi), pl_sub);
+		hookup_mi (pl_sub, _(itdb_playlist_mpl(itdb)->name),
+			   stock_id, G_CALLBACK(copy_selected_to_target_itdb), &itdbs->data);
+		add_separator(pl_sub);
+		for (db=itdb->playlists; db; db=db->next)
+		{
+			pl=db->data;
+			if (!itdb_playlist_is_mpl (pl))
+			{
+				if (pl->is_spl)
+					stock_id = GTK_STOCK_PROPERTIES;
+				else
+					stock_id = GTK_STOCK_JUSTIFY_LEFT;
+				hookup_mi(pl_sub, _(pl->name), stock_id, 
+				G_CALLBACK(copy_selected_to_target_playlist) , &db->data);
+			}
+		}
+	    }
+    return mi;
+}
+
+
+static GtkWidget *add_play_now (GtkWidget *menu)
+{
+    return hookup_mi (menu, _("Play Now"), GTK_STOCK_CDROM,
+		      G_CALLBACK (play_entries_now), NULL);
+}
+
+static GtkWidget *add_enqueue (GtkWidget *menu)
+{
+    return hookup_mi (menu, _("Enqueue"), GTK_STOCK_CDROM,
+		      G_CALLBACK (play_entries_enqueue), NULL);
+}
+
+static GtkWidget *add_copy_track_to_filesystem (GtkWidget *menu)
+{
+    return hookup_mi (menu, _("Copy Tracks to Filesystem"),
+		      GTK_STOCK_SAVE_AS,
+		      G_CALLBACK (export_entries), NULL);
+}
+
+static GtkWidget *add_create_playlist_file (GtkWidget *menu)
+{
+    return hookup_mi (menu, _("Create Playlist File"),
+		      GTK_STOCK_SAVE_AS,
+		      G_CALLBACK (create_playlist_file), NULL);
+}
+
+static GtkWidget *add_create_new_playlist (GtkWidget *menu)
+{
+    return hookup_mi (menu, _("Create new Playlist"),
+		      GTK_STOCK_JUSTIFY_LEFT,
+		      G_CALLBACK (create_playlist_from_entries), NULL);
+}
+
+static GtkWidget *add_update_tracks_from_file (GtkWidget *menu)
+{
+    return hookup_mi (menu, _("Update Tracks from File"),
+		      GTK_STOCK_REFRESH,
+		      G_CALLBACK (update_entries), NULL);
+}
+
+static GtkWidget *add_edit_smart_playlist (GtkWidget *menu)
+{
+    return hookup_mi (menu, _("Edit Smart Playlist"),
+		      GTK_STOCK_PROPERTIES,
+		      G_CALLBACK (edit_spl), NULL);
+}
+
+static GtkWidget *add_sync_playlist_with_dirs (GtkWidget *menu)
+{
+    return hookup_mi (menu, _("Sync Playlist with Dir(s)"),
+		      GTK_STOCK_REFRESH,
+		      G_CALLBACK (sync_dirs), NULL);
+}
+
+static GtkWidget *add_remove_all_tracks_from_ipod (GtkWidget *menu)
+{
+    GtkWidget *mi;
+    GtkWidget *sub;
+
+    mi = hookup_mi (menu, _("Remove All Tracks from iPod"),
+		    GTK_STOCK_DELETE,
+		    NULL, NULL);
+    sub = gtk_menu_new ();
+    gtk_widget_show (sub);
+    gtk_menu_item_set_submenu (GTK_MENU_ITEM (mi), sub);
+    hookup_mi (sub, _("I'm sure"),
+	       NULL,
+	       G_CALLBACK (delete_entries),
+	       GINT_TO_POINTER (DELETE_ACTION_IPOD));
+    return mi;
+}
+
+static GtkWidget *add_remove_all_podcasts_from_ipod (GtkWidget *menu)
+{
+    GtkWidget *mi;
+    GtkWidget *sub;
+
+    mi = hookup_mi (menu, _("Remove All Podcasts from iPod"),
+		    GTK_STOCK_DELETE,
+		    NULL, NULL);
+    sub = gtk_menu_new ();
+    gtk_widget_show (sub);
+    gtk_menu_item_set_submenu (GTK_MENU_ITEM (mi), sub);
+    hookup_mi (sub, _("I'm sure"),
+	       NULL,
+	       G_CALLBACK (delete_entries),
+	       GINT_TO_POINTER (DELETE_ACTION_IPOD));
+    return mi;
+}
+
+static GtkWidget *add_delete_including_tracks (GtkWidget *menu)
+{
+    return hookup_mi (menu,  _("Delete Including Tracks"),
+		      GTK_STOCK_DELETE,
+		      G_CALLBACK (delete_entries),
+		      GINT_TO_POINTER (DELETE_ACTION_IPOD));
+}
+
+static GtkWidget *add_delete_but_keep_tracks (GtkWidget *menu)
+{
+    return hookup_mi (menu,  _("Delete But Keep Tracks"),
+		      GTK_STOCK_DELETE,
+		      G_CALLBACK (delete_entries),
+		      GINT_TO_POINTER (DELETE_ACTION_PLAYLIST));
+}
+
+static GtkWidget *add_edit_ipod_properties (GtkWidget *menu)
+{
+    return hookup_mi (menu,  _("Edit iPod Properties"),
+		      GTK_STOCK_PREFERENCES,
+		      G_CALLBACK (edit_properties), NULL);
+}
+
+static GtkWidget *add_edit_repository_properties (GtkWidget *menu)
+{
+    return hookup_mi (menu,  _("Edit Repository Properties"),
+		      GTK_STOCK_PREFERENCES,
+		      G_CALLBACK (edit_properties), NULL);
+}
+
+static GtkWidget *add_edit_playlist_properties (GtkWidget *menu)
+{
+    return hookup_mi (menu,  _("Edit Playlist Properties"),
+		      GTK_STOCK_PREFERENCES,
+		      G_CALLBACK (edit_properties), NULL);
+}
+
+static GtkWidget *add_edit_track_details (GtkWidget *menu)
+{
+    return hookup_mi (menu,  _("Edit Track Details"),
+		      GTK_STOCK_EDIT,
+		      G_CALLBACK (edit_details_entries), NULL);
+}
+
+static GtkWidget *add_display_big_coverart (GtkWidget *menu)
+{
+    const gchar *icon;
+/* gets defined in gtk+ V2.8, but we only require V2.6 */
+#ifndef GTK_STOCK_FULLSCREEN
+#define GTK_STOCK_FULLSCREEN "gtk-fullscreen"
+#endif
+    if (gtk_check_version (2,8,0) == NULL)
+    {
+	icon = GTK_STOCK_FULLSCREEN;
+    }
+    else
+    {
+	icon = NULL;
+    }
+
+    return hookup_mi (menu,  _("View Full Size Artwork"),
+		      icon,
+		      G_CALLBACK (display_track_artwork), NULL);	
+}
+
+static GtkWidget *add_get_cover_from_file (GtkWidget *menu)
+{
+		return hookup_mi (menu, _("Select Cover From File"),
+					GTK_STOCK_FLOPPY,
+					G_CALLBACK (coverart_set_cover_from_file), NULL);
+}
+
+static GtkWidget *add_check_ipod_files (GtkWidget *menu)
+{
+    /* FIXME */
+    return NULL;
+}
+
+static GtkWidget *add_load_ipod (GtkWidget *menu)
+{
+    return hookup_mi (menu,  _("Load iPod"),
+		      GTK_STOCK_CONNECT,
+		      G_CALLBACK (load_ipod), NULL);
+}
+
+static GtkWidget *add_eject_ipod (GtkWidget *menu)
+{
+    return hookup_mi (menu,  _("Eject iPod"),
+		      GTK_STOCK_DISCONNECT,
+		      G_CALLBACK (eject_ipod), NULL);
+}
+
+static GtkWidget *add_save_changes (GtkWidget *menu)
+{
+    return hookup_mi (menu,  _("Save Changes"),
+		      GTK_STOCK_SAVE,
+		      G_CALLBACK (save_changes), NULL);
+}
+
+static GtkWidget *add_remove_all_tracks_from_database (GtkWidget *menu)
+{
+    GtkWidget *mi;
+    GtkWidget *sub;
+
+    mi = hookup_mi (menu, _("Remove All Tracks from Database"),
+		    GTK_STOCK_DELETE,
+		    NULL, NULL);
+    sub = gtk_menu_new ();
+    gtk_widget_show (sub);
+    gtk_menu_item_set_submenu (GTK_MENU_ITEM (mi), sub);
+    hookup_mi (sub, _("I'm sure"),
+	       NULL,
+	       G_CALLBACK (delete_entries),
+	       GINT_TO_POINTER (DELETE_ACTION_DATABASE));
+    return mi;
+}
+
+static GtkWidget *add_delete_including_tracks_harddisk (GtkWidget *menu)
+{
+    return hookup_mi (menu,  _("Delete Including Tracks (Harddisk)"),
+		      GTK_STOCK_DELETE,
+		      G_CALLBACK (delete_entries),
+		      GINT_TO_POINTER (DELETE_ACTION_LOCAL));
+}
+
+static GtkWidget *add_delete_including_tracks_database (GtkWidget *menu)
+{
+    return hookup_mi (menu,  _("Delete Including Tracks (Database)"),
+		      GTK_STOCK_DELETE,
+		      G_CALLBACK (delete_entries),
+		      GINT_TO_POINTER (DELETE_ACTION_DATABASE));
+}
+
+static GtkWidget *add_delete_from_ipod (GtkWidget *menu)
+{
+    return hookup_mi (menu,  _("Delete From iPod"),
+		      GTK_STOCK_DELETE,
+		      G_CALLBACK (delete_entries),
+		      GINT_TO_POINTER (DELETE_ACTION_IPOD));
+}
+
+static GtkWidget *add_delete_from_playlist (GtkWidget *menu)
+{
+    return hookup_mi (menu,  _("Delete From Playlist"),
+		      GTK_STOCK_DELETE,
+		      G_CALLBACK (delete_entries),
+		      GINT_TO_POINTER (DELETE_ACTION_PLAYLIST));
+}
+
+static GtkWidget *add_delete_from_harddisk (GtkWidget *menu)
+{
+    return hookup_mi (menu,  _("Delete From Harddisk"),
+		      GTK_STOCK_DELETE,
+		      G_CALLBACK (delete_entries),
+		      GINT_TO_POINTER (DELETE_ACTION_LOCAL));
+}
+
+static GtkWidget *add_delete_from_database (GtkWidget *menu)
+{
+    return hookup_mi (menu,  _("Delete From Database"),
+		      GTK_STOCK_DELETE,
+		      G_CALLBACK (delete_entries),
+		      GINT_TO_POINTER (DELETE_ACTION_DATABASE));
+}
+
+static GtkWidget *add_alphabetize (GtkWidget *menu)
+{
+    return hookup_mi (menu,  _("Alphabetize"),
+		      GTK_STOCK_SORT_ASCENDING,
+		      G_CALLBACK (alphabetize), NULL);
+}
+
+#if LOCALDEBUG
+static GtkWidget *add_special (GtkWidget *menu)
+{
+    return hookup_mi (menu, "Special",
+		      GTK_STOCK_STOP,
+		      G_CALLBACK (do_special), NULL);
+}
+#endif
+
+GtkWidget *gphoto_menuitem_remove_album_from_db_item(GtkWidget *menu)
+{
+	return hookup_mi (
+			menu, 
+			_("Remove Album"), 
+			GTK_STOCK_DELETE, 
+			G_CALLBACK (gphoto_remove_album_from_database), 
+			NULL);
+}
+
+GtkWidget *gphoto_menuitem_remove_photo_from_album_item(GtkWidget *menu)
+{
+	GtkWidget *mitem = hookup_mi (
+			menu, 
+			_("Remove Photo"),
+			GTK_STOCK_DELETE, 
+			G_CALLBACK (gphoto_remove_selected_photos_from_album), 
+			NULL);
+	
+	if (gphoto_get_selected_photo_count() == 0)
+		gtk_widget_set_sensitive (mitem, FALSE);
+	else
+		gtk_widget_set_sensitive (mitem, TRUE);
+	
+	return mitem;
+}
+
+GtkWidget *gphoto_menuitem_rename_photoalbum_item(GtkWidget *menu)
+{
+	return hookup_mi (
+			menu, 
+			_("Rename Album"),
+			GTK_STOCK_DELETE, 
+			G_CALLBACK (gphoto_rename_selected_album), 
+			NULL);
+}
+
+void create_context_menu (CM_type type)
+{
+    static GtkWidget *menu = NULL;
+    Playlist *pl;
+
+    if (menu)
+    {   /* free memory for last menu */
+	gtk_widget_destroy (menu);
+	menu = NULL;
+    }
+
+    pl = pm_get_selected_playlist();
+    if (pl)
+    {
+	ExtraiTunesDBData *eitdb;
+	iTunesDB *itdb = pl->itdb;
+	g_return_if_fail (itdb);
+	eitdb = itdb->userdata;
+	g_return_if_fail (eitdb);
+
+	menu = gtk_menu_new ();
+
+	switch (type)
+	{
+	case CM_PL:
+	    if (itdb->usertype & GP_ITDB_TYPE_IPOD)
+	    {
+		if (eitdb->itdb_imported)
+		{
+		    add_play_now (menu);
+		    add_enqueue (menu);
+		    add_copy_track_to_filesystem (menu);
+		    add_create_playlist_file (menu);
+		    add_update_tracks_from_file (menu);
+		    if (!pl->is_spl)
+		    {
+			add_sync_playlist_with_dirs (menu);
+		    }
+		    add_separator (menu);
+		    if (itdb_playlist_is_mpl (pl))
+		    {
+			add_remove_all_tracks_from_ipod (menu);
+		    }
+		    else if (itdb_playlist_is_podcasts (pl))
+		    {
+			add_remove_all_podcasts_from_ipod (menu);
+		    }
+		    else
+		    {
+			add_delete_including_tracks (menu);
+			add_delete_but_keep_tracks (menu);
+		    }
+		    add_copy_selected_to_target_itdb (menu,
+						      _("Copy selected playlist to..."));
+		    add_separator (menu);
+		    add_edit_track_details (menu);
+		    if (pl->is_spl)
+		    {
+			add_edit_smart_playlist (menu);
+		    }
+		    if (itdb_playlist_is_mpl (pl))
+		    {
+			add_edit_ipod_properties (menu);
+		    }
+		    else
+		    {
+			add_edit_playlist_properties (menu);
+		    }
+		    add_check_ipod_files (menu);
+		    add_eject_ipod (menu);
+		}
+		else
+		{   /* not imported */
+		    add_edit_ipod_properties (menu);
+		    add_check_ipod_files (menu);
+		    add_separator (menu);
+		    add_load_ipod (menu);
+		}
+	    }
+	    if (itdb->usertype & GP_ITDB_TYPE_LOCAL)
+	    {
+		add_play_now (menu);
+		add_enqueue (menu);
+		add_copy_track_to_filesystem (menu);
+		add_create_playlist_file (menu);
+		add_update_tracks_from_file (menu);
+		if (!pl->is_spl)
+		{
+		    add_sync_playlist_with_dirs (menu);
+		}
+		add_separator (menu);
+		if (itdb_playlist_is_mpl (pl))
+		{
+		    add_remove_all_tracks_from_database (menu);
+		}
+		else
+		{
+		    add_delete_including_tracks_database (menu);
+		    add_delete_including_tracks_harddisk (menu);
+		    add_delete_but_keep_tracks (menu);
+		}
+		add_copy_selected_to_target_itdb (menu,
+						  _("Copy selected playlist to..."));
+		add_separator (menu);
+		add_edit_track_details (menu);
+		if (pl->is_spl)
+		{
+		    add_edit_smart_playlist (menu);
+		}
+		if (itdb_playlist_is_mpl (pl))
+		{
+		    add_edit_repository_properties (menu);
+		}
+		else
+		{
+		    add_edit_playlist_properties (menu);
+		}
+		add_save_changes (menu);
+	    }
+	    break;
+	case CM_ST:
+	case CM_TM:
+	    add_play_now (menu);
+	    add_enqueue (menu);
+	    add_copy_track_to_filesystem (menu);
+	    add_create_playlist_file (menu);
+	    add_create_new_playlist (menu);
+	    add_update_tracks_from_file (menu);
+	    if (!pl->is_spl)
+	    {
+		add_sync_playlist_with_dirs (menu);
+	    }
+	    if (type == CM_ST)
+	    {
+		add_alphabetize (menu);
+	    }
+	    add_separator (menu);
+	    if (itdb->usertype & GP_ITDB_TYPE_IPOD)
+	    {
+		add_delete_from_ipod (menu);
+		if (!itdb_playlist_is_mpl (pl))
+		{
+		    add_delete_from_playlist (menu);
+		}
+	    }
+	    if (itdb->usertype & GP_ITDB_TYPE_LOCAL)
+	    {
+		add_delete_from_harddisk (menu);
+		add_delete_from_database (menu);
+		if (!itdb_playlist_is_mpl (pl))
+		{
+		    add_delete_from_playlist (menu);
+		}
+	    }
+	    add_copy_selected_to_target_itdb (menu,
+					      _("Copy selected track(s) to..."));
+	    add_separator (menu);
+	    add_edit_track_details (menu);
+#if LOCALDEBUG
+	    /* This is for debugging purposes -- this allows to inspect
+	     * any track with a custom function */
+	    if (type == CM_TM)
+	    {
+		add_special (menu);
+	    }
+#endif
+	    break;
+	case CM_CAD:
+			add_get_cover_from_file (menu);
+			add_display_big_coverart (menu);
+			add_edit_track_details (menu);
+			break;
+	case CM_PH_AV:
+			gphoto_menuitem_remove_album_from_db_item (menu);
+			gphoto_menuitem_rename_photoalbum_item (menu);
+			break;
+	case CM_PH_IV:
+			gphoto_menuitem_remove_photo_from_album_item (menu);
+			break;
+	case CM_NUM:
+	    g_return_if_reached ();
+	}
+    }
+    /* 
+     * button should be button 0 as per the docs because we're calling
+     * from a button release event
+     */
+    if (menu)
+    {
+	gtk_menu_popup (GTK_MENU (menu), NULL, NULL,
+			NULL, NULL, 0, gtk_get_current_event_time()); 
+    }
+}
+
+
+/**
+ * tm_context_menu_init - initialize the right click menu for tracks
+ */
+void
+tm_context_menu_init(void)
+{
+    if (widgets_blocked) return;
+
+    tm_stop_editing (TRUE);
+
+    selected_entry = NULL; 
+    selected_playlist = NULL;
+    active_itdb = gp_get_selected_itdb ();
+    entry_inst = -1;
+    if (selected_tracks)  g_list_free (selected_tracks);
+    selected_tracks = tm_get_selected_tracks();
+    if(selected_tracks)
+    {
+	create_context_menu (CM_TM);
+    }
+}
+
+/**
+ * cad_context_menu_init - initialize the right click menu for coverart display 
+ */
+void
+cad_context_menu_init(void)
+{
+    if (widgets_blocked) return;
+    
+    selected_entry = NULL; 
+    selected_playlist = NULL;
+    selected_tracks = NULL;
+    active_itdb = gp_get_selected_itdb ();
+    entry_inst = -1;
+    
+     if (selected_tracks) g_list_free (selected_tracks);
+    	selected_tracks = g_list_copy (coverart_get_displayed_tracks());
+    /*
+    int i;
+    for (i = 0; i < g_list_length(selected_tracks); ++i)
+    {
+    	Track *track;
+    	track = g_list_nth_data (selected_tracks, i);
+    	printf ("context_menu_init - Artist:%s  Album:%s  Title:%s\n", track->artist, track->album, track->title);
+    }
+    */
+    if(selected_tracks)
+			create_context_menu (CM_CAD);
+}
+
+/**
+ * photo_context_menu_init - initialize the right click menu for photo management display 
+ */
+void
+gphoto_context_menu_init (gint component)
+{
+    if (widgets_blocked) return;
+    
+    selected_entry = NULL; 
+    selected_playlist = NULL;
+    selected_tracks = NULL;
+    active_itdb = gp_get_selected_itdb ();
+    entry_inst = -1;
+    
+     if (selected_tracks) g_list_free (selected_tracks);
+
+     switch (component)
+     {
+    	 case GPHOTO_ALBUM_VIEW:
+    		 create_context_menu (CM_PH_AV);
+    		 break;
+    	 case GPHOTO_ICON_VIEW:
+    		 create_context_menu (CM_PH_IV);
+     }
+}
+
+/**
+ * pm_context_menu_init - initialize the right click menu for playlists 
+ */
+void
+pm_context_menu_init(void)
+{
+    if (widgets_blocked) return;
+    
+    pm_stop_editing (TRUE);
+
+    if (selected_tracks)  g_list_free (selected_tracks);
+    selected_tracks = NULL;
+    selected_entry = NULL;
+    entry_inst = -1;
+    selected_playlist = pm_get_selected_playlist();
+    
+    /* Dont allow context menu to display if the playlist is the photo one */
+    if (gphoto_is_photo_playlist (selected_playlist)) return;
+        
+    active_itdb = gp_get_selected_itdb ();
+    if(selected_playlist)
+    {
+	selected_tracks = g_list_copy (selected_playlist->members);
+	create_context_menu (CM_PL);
+    }
+}
+
+/**
+ * st_context_menu_init - initialize the right click menu for sort tabs 
+ * FIXME: This needs to be hooked in.
+ */
+void
+st_context_menu_init(gint inst)
+{
+    if (widgets_blocked) return;
+
+    st_stop_editing (inst, TRUE);
+
+    if (selected_tracks)  g_list_free (selected_tracks);
+    selected_tracks = NULL;
+    selected_playlist = NULL;
+    selected_entry = st_get_selected_entry (inst);
+    active_itdb = gp_get_selected_itdb ();
+    if(selected_entry)
+    {
+	entry_inst = inst;
+	selected_tracks = g_list_copy (selected_entry->members);
+	create_context_menu (CM_ST);
+    }
+}

Added: trunk/src/context_menus.h
===================================================================
--- trunk/src/context_menus.h	                        (rev 0)
+++ trunk/src/context_menus.h	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,38 @@
+/*
+|  Copyright (C) 2003 Corey Donohoe <atmos at atmos dot org>
+|  Part of the gtkpod project.
+| 
+|  URL: http://gtkpod.sourceforge.net/
+| 
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+| 
+|  iTunes and iPod are trademarks of Apple
+| 
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: context_menus.h 1750 2007-11-01 21:57:01Z phantom_sf $
+*/
+#ifndef CONTEXT_MENUS_H
+#define CONTEXT_MENUS_H
+
+#include<gtk/gtk.h>
+
+void tm_context_menu_init(void);
+void st_context_menu_init(gint inst);
+void pm_context_menu_init(void);
+void cad_context_menu_init(void);
+void gphoto_context_menu_init (gint component);
+
+#endif

Added: trunk/src/date_parser.c
===================================================================
--- trunk/src/date_parser.c	                        (rev 0)
+++ trunk/src/date_parser.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,2148 @@
+#line 2 "date_parser.c"
+
+#line 4 "date_parser.c"
+
+#define  YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+#define yy_create_buffer lexdp_create_buffer
+#define yy_delete_buffer lexdp_delete_buffer
+#define yy_flex_debug lexdp_flex_debug
+#define yy_init_buffer lexdp_init_buffer
+#define yy_flush_buffer lexdp_flush_buffer
+#define yy_load_buffer_state lexdp_load_buffer_state
+#define yy_switch_to_buffer lexdp_switch_to_buffer
+#define yyin lexdpin
+#define yyleng lexdpleng
+#define yylex lexdplex
+#define yylineno lexdplineno
+#define yyout lexdpout
+#define yyrestart lexdprestart
+#define yytext lexdptext
+#define yywrap lexdpwrap
+#define yyalloc lexdpalloc
+#define yyrealloc lexdprealloc
+#define yyfree lexdpfree
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+#define YY_FLEX_SUBMINOR_VERSION 33
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+/* First, we deal with  platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/* end standard C headers. */
+
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if __STDC_VERSION__ >= 199901L
+
+/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
+ * if you want the limit (max/min) macros for int types. 
+ */
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t; 
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+#endif /* ! C99 */
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN               (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN              (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN              (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX               (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX              (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX              (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX              (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX             (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX             (4294967295U)
+#endif
+
+#endif /* ! FLEXINT_H */
+
+#ifdef __cplusplus
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else	/* ! __cplusplus */
+
+#if __STDC__
+
+#define YY_USE_CONST
+
+#endif	/* __STDC__ */
+#endif	/* ! __cplusplus */
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index.  If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition.  This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN (yy_start) = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state.  The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START (((yy_start) - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE lexdprestart(lexdpin  )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#define YY_BUF_SIZE 16384
+#endif
+
+/* The state buf must be large enough to hold one state per character in the main buffer.
+ */
+#define YY_STATE_BUF_SIZE   ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+extern int lexdpleng;
+
+extern FILE *lexdpin, *lexdpout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+    #define YY_LESS_LINENO(n)
+    
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+	do \
+		{ \
+		/* Undo effects of setting up lexdptext. */ \
+        int yyless_macro_arg = (n); \
+        YY_LESS_LINENO(yyless_macro_arg);\
+		*yy_cp = (yy_hold_char); \
+		YY_RESTORE_YY_MORE_OFFSET \
+		(yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+		YY_DO_BEFORE_ACTION; /* set up lexdptext again */ \
+		} \
+	while ( 0 )
+
+#define unput(c) yyunput( c, (yytext_ptr)  )
+
+/* The following is because we cannot portably get our hands on size_t
+ * (without autoconf's help, which isn't available because we want
+ * flex-generated scanners to compile on their own).
+ */
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef unsigned int yy_size_t;
+#endif
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+	{
+	FILE *yy_input_file;
+
+	char *yy_ch_buf;		/* input buffer */
+	char *yy_buf_pos;		/* current position in input buffer */
+
+	/* Size of input buffer in bytes, not including room for EOB
+	 * characters.
+	 */
+	yy_size_t yy_buf_size;
+
+	/* Number of characters read into yy_ch_buf, not including EOB
+	 * characters.
+	 */
+	int yy_n_chars;
+
+	/* Whether we "own" the buffer - i.e., we know we created it,
+	 * and can realloc() it to grow it, and should free() it to
+	 * delete it.
+	 */
+	int yy_is_our_buffer;
+
+	/* Whether this is an "interactive" input source; if so, and
+	 * if we're using stdio for input, then we want to use getc()
+	 * instead of fread(), to make sure we stop fetching input after
+	 * each newline.
+	 */
+	int yy_is_interactive;
+
+	/* Whether we're considered to be at the beginning of a line.
+	 * If so, '^' rules will be active on the next match, otherwise
+	 * not.
+	 */
+	int yy_at_bol;
+
+    int yy_bs_lineno; /**< The line count. */
+    int yy_bs_column; /**< The column count. */
+    
+	/* Whether to try to fill the input buffer when we reach the
+	 * end of it.
+	 */
+	int yy_fill_buffer;
+
+	int yy_buffer_status;
+
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+	/* When an EOF's been seen but there's still some text to process
+	 * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+	 * shouldn't try reading from the input source any more.  We might
+	 * still have a bunch of tokens to match, though, because of
+	 * possible backing-up.
+	 *
+	 * When we actually see the EOF, we change the status to "new"
+	 * (via lexdprestart()), so that the user can continue scanning by
+	 * just pointing lexdpin at a new input file.
+	 */
+#define YY_BUFFER_EOF_PENDING 2
+
+	};
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* Stack of input buffers. */
+static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
+static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
+static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
+                          ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
+                          : NULL)
+
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
+
+/* yy_hold_char holds the character lost when lexdptext is formed. */
+static char yy_hold_char;
+static int yy_n_chars;		/* number of characters read into yy_ch_buf */
+int lexdpleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 0;		/* whether we need to initialize */
+static int yy_start = 0;	/* start state number */
+
+/* Flag which is used to allow lexdpwrap()'s to do buffer switches
+ * instead of setting up a fresh lexdpin.  A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void lexdprestart (FILE *input_file  );
+void lexdp_switch_to_buffer (YY_BUFFER_STATE new_buffer  );
+YY_BUFFER_STATE lexdp_create_buffer (FILE *file,int size  );
+void lexdp_delete_buffer (YY_BUFFER_STATE b  );
+void lexdp_flush_buffer (YY_BUFFER_STATE b  );
+void lexdppush_buffer_state (YY_BUFFER_STATE new_buffer  );
+void lexdppop_buffer_state (void );
+
+static void lexdpensure_buffer_stack (void );
+static void lexdp_load_buffer_state (void );
+static void lexdp_init_buffer (YY_BUFFER_STATE b,FILE *file  );
+
+#define YY_FLUSH_BUFFER lexdp_flush_buffer(YY_CURRENT_BUFFER )
+
+YY_BUFFER_STATE lexdp_scan_buffer (char *base,yy_size_t size  );
+YY_BUFFER_STATE lexdp_scan_string (yyconst char *yy_str  );
+YY_BUFFER_STATE lexdp_scan_bytes (yyconst char *bytes,int len  );
+
+void *lexdpalloc (yy_size_t  );
+void *lexdprealloc (void *,yy_size_t  );
+void lexdpfree (void *  );
+
+#define yy_new_buffer lexdp_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+	{ \
+	if ( ! YY_CURRENT_BUFFER ){ \
+        lexdpensure_buffer_stack (); \
+		YY_CURRENT_BUFFER_LVALUE =    \
+            lexdp_create_buffer(lexdpin,YY_BUF_SIZE ); \
+	} \
+	YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+	}
+
+#define yy_set_bol(at_bol) \
+	{ \
+	if ( ! YY_CURRENT_BUFFER ){\
+        lexdpensure_buffer_stack (); \
+		YY_CURRENT_BUFFER_LVALUE =    \
+            lexdp_create_buffer(lexdpin,YY_BUF_SIZE ); \
+	} \
+	YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+	}
+
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+/* Begin user sect3 */
+
+#define lexdpwrap(n) 1
+#define YY_SKIP_YYWRAP
+
+typedef unsigned char YY_CHAR;
+
+FILE *lexdpin = (FILE *) 0, *lexdpout = (FILE *) 0;
+
+typedef int yy_state_type;
+
+extern int lexdplineno;
+
+int lexdplineno = 1;
+
+extern char *lexdptext;
+#define yytext_ptr lexdptext
+
+static yy_state_type yy_get_previous_state (void );
+static yy_state_type yy_try_NUL_trans (yy_state_type current_state  );
+static int yy_get_next_buffer (void );
+static void yy_fatal_error (yyconst char msg[]  );
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up lexdptext.
+ */
+#define YY_DO_BEFORE_ACTION \
+	(yytext_ptr) = yy_bp; \
+	lexdpleng = (size_t) (yy_cp - yy_bp); \
+	(yy_hold_char) = *yy_cp; \
+	*yy_cp = '\0'; \
+	(yy_c_buf_p) = yy_cp;
+
+#define YY_NUM_RULES 11
+#define YY_END_OF_BUFFER 12
+/* This struct is not used in this scanner,
+   but its presence is necessary. */
+struct yy_trans_info
+	{
+	flex_int32_t yy_verify;
+	flex_int32_t yy_nxt;
+	};
+static yyconst flex_int16_t yy_accept[29] =
+    {   0,
+        9,    9,   12,   10,    9,   11,   10,   10,    9,    0,
+        0,    0,    0,    7,    0,    8,    3,    1,    0,    5,
+        0,    0,    0,    0,    4,    2,    6,    0
+    } ;
+
+static yyconst flex_int32_t yy_ec[256] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    2,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    4,    1,    4,    1,    5,    6,    6,    6,
+        6,    6,    6,    6,    6,    6,    6,    7,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    8,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    8,
+
+        1,    1,    1,    8,    1,    1,    1,    1,    8,    1,
+        1,    1,    1,    1,    8,    1,    1,    1,    8,    1,
+        8,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1
+    } ;
+
+static yyconst flex_int32_t yy_meta[9] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1
+    } ;
+
+static yyconst flex_int16_t yy_base[29] =
+    {   0,
+        0,    0,   40,   41,   37,   41,   32,    4,   35,    7,
+       30,    0,   29,   28,   27,   26,   11,   12,   14,   17,
+       19,   25,   24,   23,   22,   20,   15,   41
+    } ;
+
+static yyconst flex_int16_t yy_def[29] =
+    {   0,
+       28,    1,   28,   28,   28,   28,   28,   28,   28,   28,
+       28,    8,   28,   28,   28,   28,   28,   28,   28,   28,
+       28,   28,   28,   28,   28,   28,   28,    0
+    } ;
+
+static yyconst flex_int16_t yy_nxt[50] =
+    {   0,
+        4,    5,    6,    7,    4,    8,    4,    4,   11,   12,
+       13,   14,   10,   15,   16,   22,   17,   18,   23,   19,
+       27,   14,   20,   24,   21,   26,   16,   25,   27,   26,
+       25,   21,   20,   19,   18,   17,    9,   10,    9,   28,
+        3,   28,   28,   28,   28,   28,   28,   28,   28
+    } ;
+
+static yyconst flex_int16_t yy_chk[50] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    8,    8,
+        8,    8,   10,   10,   10,   17,   17,   18,   18,   19,
+       27,   19,   20,   20,   21,   26,   21,   25,   24,   23,
+       22,   16,   15,   14,   13,   11,    9,    7,    5,    3,
+       28,   28,   28,   28,   28,   28,   28,   28,   28
+    } ;
+
+static yy_state_type yy_last_accepting_state;
+static char *yy_last_accepting_cpos;
+
+extern int lexdp_flex_debug;
+int lexdp_flex_debug = 0;
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *lexdptext;
+#line 1 "date_parser.l"
+/* -*- mode: c -*-
+| Time-stamp: <2007-01-19 01:52:29 jcs>
+|
+|  Copyright (C) 2002-2003 Jorg Schuler <jcsjcs at users.sourceforge.net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://gtkpod.sourceforge.net/
+| 
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+| 
+|  iTunes and iPod are trademarks of Apple
+| 
+|  This product is not supported/written/published by Apple!
+*/
+/* This parser (dp_parse()) will take one date specification (like
+ * 9/6/03, or -5d) and convert it into a timestamp. More details
+ * below. */
+#line 33 "date_parser.l"
+#include <stdlib.h>
+#include "date_parser.h"
+#include "misc.h"
+    static gchar *dp_strp = NULL;
+    /* time stamp (result!) */
+    static time_t tstamp;
+    /* already parsed time? */
+    static gboolean parsed_time;
+    /* are we reading a lower bound (TRUE) or upper bound (FALSE) */
+    static gboolean lower;
+    /* did an error occur? */
+    static gboolean dp_error;
+    /* should relative dates be read strictly (TRUE: no changing of seconds
+     * to 0 or 59 when minutes are set) or not. It's only set to FALSE
+     * for the "=..." format. */
+    static gboolean rel_strict;
+    typedef enum {
+	DP_SEC,
+	DP_MIN,
+	DP_HOUR,
+	DP_DAY,
+	DP_WEEK,
+	DP_MONTH,
+	DP_YEAR,
+	DP_INF
+    } RelTime;
+    /* Which is the lowest relative time specifier already parsed? */
+    RelTime reltime;
+    static void dp_reltime (gchar *str, gint32 sign);
+/* We don't read from a stream but from a string buffer. This macro
+   will copy a maximum of @max_size chars from dp_strp to @buf,
+   writing the number of chars copied into @result. If no characters
+   are copied, YY_NULL is written into @result. */
+#define YY_INPUT(buf,result,max_size) \
+    { \
+    if (!dp_strp || !dp_strp[0]) result = YY_NULL; \
+    else \
+      { \
+        gint i; \
+        for (i=0; (i<max_size && *dp_strp); ++i)  buf[i] = *dp_strp++; \
+        result = i; \
+      } \
+    }
+/* stop parsing after end of string is reached */
+/* avoid compiler warning: `yyunput' defined but not used */
+/* We have several parsers in one executable, so we must use the
+   prefix option to avoid name space clashes. Note that this only
+   works with flex, but not with lex. */
+/* Unfortunately, the prefix option also changes the output filename
+   and thereby breaks the automake script. Therefore I define the
+   output filename here. However, this is not portable -- on other
+   systems the default output filename expected by the automake
+   scripts may be lexyy.c or similar. To make the code portable again
+   (hopefully), I also define "LEX_OUTPUT_ROOT = lex.yy" in
+   Makefile.am */
+/* definitions for time formats */
+/* e.g. 8:54               */
+/* e.g. 8:54:23            */
+/* e.g. 9/6 (for June 9th) */
+/* e.g. 9/6/3  or 9/6/2003 */
+/* e.g. -8:54              */
+/* e.g. +8:54.23           */
+/* e.g. 5d6m3s             */
+/* e.g. -3M5d              */
+#line 584 "date_parser.c"
+
+#define INITIAL 0
+
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#include <unistd.h>
+#endif
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
+
+static int yy_init_globals (void );
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int lexdpwrap (void );
+#else
+extern int lexdpwrap (void );
+#endif
+#endif
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char *,yyconst char *,int );
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * );
+#endif
+
+#ifndef YY_NO_INPUT
+
+#ifdef __cplusplus
+static int yyinput (void );
+#else
+static int input (void );
+#endif
+
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 8192
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO (void) fwrite( lexdptext, lexdpleng, 1, lexdpout )
+#endif
+
+/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+	if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
+		{ \
+		int c = '*'; \
+		size_t n; \
+		for ( n = 0; n < max_size && \
+			     (c = getc( lexdpin )) != EOF && c != '\n'; ++n ) \
+			buf[n] = (char) c; \
+		if ( c == '\n' ) \
+			buf[n++] = (char) c; \
+		if ( c == EOF && ferror( lexdpin ) ) \
+			YY_FATAL_ERROR( "input in flex scanner failed" ); \
+		result = n; \
+		} \
+	else \
+		{ \
+		errno=0; \
+		while ( (result = fread(buf, 1, max_size, lexdpin))==0 && ferror(lexdpin)) \
+			{ \
+			if( errno != EINTR) \
+				{ \
+				YY_FATAL_ERROR( "input in flex scanner failed" ); \
+				break; \
+				} \
+			errno=0; \
+			clearerr(lexdpin); \
+			} \
+		}\
+\
+
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* end tables serialization structures and prototypes */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL_IS_OURS 1
+
+extern int lexdplex (void);
+
+#define YY_DECL int lexdplex (void)
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after lexdptext and lexdpleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+	YY_USER_ACTION
+
+/** The main scanner function which does all the work.
+ */
+YY_DECL
+{
+	register yy_state_type yy_current_state;
+	register char *yy_cp, *yy_bp;
+	register int yy_act;
+    
+#line 116 "date_parser.l"
+
+
+#line 738 "date_parser.c"
+
+	if ( !(yy_init) )
+		{
+		(yy_init) = 1;
+
+#ifdef YY_USER_INIT
+		YY_USER_INIT;
+#endif
+
+		if ( ! (yy_start) )
+			(yy_start) = 1;	/* first start state */
+
+		if ( ! lexdpin )
+			lexdpin = stdin;
+
+		if ( ! lexdpout )
+			lexdpout = stdout;
+
+		if ( ! YY_CURRENT_BUFFER ) {
+			lexdpensure_buffer_stack ();
+			YY_CURRENT_BUFFER_LVALUE =
+				lexdp_create_buffer(lexdpin,YY_BUF_SIZE );
+		}
+
+		lexdp_load_buffer_state( );
+		}
+
+	while ( 1 )		/* loops until end-of-file is reached */
+		{
+		yy_cp = (yy_c_buf_p);
+
+		/* Support of lexdptext. */
+		*yy_cp = (yy_hold_char);
+
+		/* yy_bp points to the position in yy_ch_buf of the start of
+		 * the current run.
+		 */
+		yy_bp = yy_cp;
+
+		yy_current_state = (yy_start);
+yy_match:
+		do
+			{
+			register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+			if ( yy_accept[yy_current_state] )
+				{
+				(yy_last_accepting_state) = yy_current_state;
+				(yy_last_accepting_cpos) = yy_cp;
+				}
+			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+				{
+				yy_current_state = (int) yy_def[yy_current_state];
+				if ( yy_current_state >= 29 )
+					yy_c = yy_meta[(unsigned int) yy_c];
+				}
+			yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+			++yy_cp;
+			}
+		while ( yy_base[yy_current_state] != 41 );
+
+yy_find_action:
+		yy_act = yy_accept[yy_current_state];
+		if ( yy_act == 0 )
+			{ /* have to back up */
+			yy_cp = (yy_last_accepting_cpos);
+			yy_current_state = (yy_last_accepting_state);
+			yy_act = yy_accept[yy_current_state];
+			}
+
+		YY_DO_BEFORE_ACTION;
+
+do_action:	/* This label is used only to access EOF actions. */
+
+		switch ( yy_act )
+	{ /* beginning of action switch */
+			case 0: /* must back up */
+			/* undo the effects of YY_DO_BEFORE_ACTION */
+			*yy_cp = (yy_hold_char);
+			yy_cp = (yy_last_accepting_cpos);
+			yy_current_state = (yy_last_accepting_state);
+			goto yy_find_action;
+
+case 1:
+YY_RULE_SETUP
+#line 118 "date_parser.l"
+{
+    gchar *ptr1 = lexdptext;
+    struct tm *lt = localtime (&tstamp);
+    lt->tm_hour = strtol (ptr1, &ptr1, 10);
+    ++ptr1;
+    lt->tm_min = strtol (ptr1, &ptr1, 10);
+    if (lower)    lt->tm_sec = 0;
+    else          lt->tm_sec = 59;
+    tstamp = mktime (lt);
+    parsed_time = TRUE;
+#if DP_DEBUG
+    printf ("Time with minutes: '%s'\n", lexdptext);
+    printf ("tstamp: %d: %s", (int)tstamp, asctime (lt));
+#endif
+}
+	YY_BREAK
+case 2:
+YY_RULE_SETUP
+#line 134 "date_parser.l"
+{
+    gchar *ptr1 = lexdptext;
+    struct tm *lt = localtime (&tstamp);
+    lt->tm_hour = strtol (ptr1, &ptr1, 10);
+    ++ptr1;
+    lt->tm_min = strtol (ptr1, &ptr1, 10);
+    ++ptr1;
+    lt->tm_sec = strtol (ptr1, &ptr1, 10);
+    tstamp = mktime (lt);
+    parsed_time = TRUE;
+#if DP_DEBUG
+    printf ("Time with seconds: '%s'\n", lexdptext);
+    printf ("tstamp: %d: %s", (int)tstamp, asctime (lt));
+#endif
+}
+	YY_BREAK
+case 3:
+YY_RULE_SETUP
+#line 150 "date_parser.l"
+{
+    gchar *ptr1 = lexdptext;
+    struct tm *lt = localtime (&tstamp);
+    if (!parsed_time)
+    {
+	if (lower)
+	{
+	    lt->tm_hour = 0;
+	    lt->tm_min = 0;
+	    lt->tm_sec = 0;
+	}
+	else
+	{
+	    lt->tm_hour = 23;
+	    lt->tm_min = 59;
+	    lt->tm_sec = 59;
+	}
+    }
+    lt->tm_mday = strtol (ptr1, &ptr1, 10);
+    ++ptr1;
+    lt->tm_mon = strtol (ptr1, &ptr1, 10) - 1;
+    tstamp = mktime (lt);
+#if DP_DEBUG
+    printf ("Date without year: '%s'\n", lexdptext);
+    printf ("tstamp: %d: %s", (int)tstamp, asctime (lt));
+#endif
+}
+	YY_BREAK
+case 4:
+YY_RULE_SETUP
+#line 178 "date_parser.l"
+{
+    gchar *ptr1 = lexdptext;
+    struct tm *lt = localtime (&tstamp);
+    if (!parsed_time)
+    {
+	if (lower)
+	{
+	    lt->tm_hour = 0;
+	    lt->tm_min = 0;
+	    lt->tm_sec = 0;
+	}
+	else
+	{
+	    lt->tm_hour = 23;
+	    lt->tm_min = 59;
+	    lt->tm_sec = 59;
+	}
+    }
+    lt->tm_mday = strtol (ptr1, &ptr1, 10);
+    ++ptr1;
+    lt->tm_mon = strtol (ptr1, &ptr1, 10) - 1;
+    ++ptr1;
+    lt->tm_year = strtol (ptr1, &ptr1, 10);
+    if (lt->tm_year < 70)
+	lt->tm_year += 2000;
+    if ((lt->tm_year < 100) && (lt->tm_year >=70))
+	lt->tm_year += 1900;
+    /* tm_year is years since 1900 */
+    lt->tm_year -= 1900;
+    tstamp = mktime (lt);
+#if DP_DEBUG
+    printf ("Date with year: '%s'\n", lexdptext);
+    printf ("tstamp: %d: %s", (int)tstamp, asctime (lt));
+#endif
+}
+	YY_BREAK
+case 5:
+YY_RULE_SETUP
+#line 214 "date_parser.l"
+{ /* [+-]{TIMESHORT} */
+    gchar *ptr1 = lexdptext;
+    gint32 hours, mins, sign;
+    if (*ptr1 == '+')  sign = 1;
+    else               sign = -1;
+    ++ptr1;
+    hours = strtol (ptr1, &ptr1, 10);
+    ++ptr1;
+    mins = strtol (ptr1, &ptr1, 10);
+    tstamp += sign * (hours*3600 + mins*60);
+    if (DP_MIN < reltime)   reltime = DP_MIN;
+#if DP_DEBUG
+    printf ("[+-]{TIMESHORT} '%s'\n", lexdptext);
+    printf ("tstamp: %d: %s", (int)tstamp, ctime (&tstamp));
+#endif
+}
+	YY_BREAK
+case 6:
+YY_RULE_SETUP
+#line 231 "date_parser.l"
+{ /* [+-]{TIMEFULL} */
+    gchar *ptr1 = lexdptext;
+    gint32 hours, mins, secs, sign;
+    if (*ptr1 == '+')  sign = 1;
+    else               sign = -1;
+    ++ptr1;
+    hours = strtol (ptr1, &ptr1, 10);
+    ++ptr1;
+    mins = strtol (ptr1, &ptr1, 10);
+    ++ptr1;
+    secs = strtol (ptr1, &ptr1, 10);
+    tstamp += sign * (hours*3600 + mins*60 + secs);
+    reltime = DP_SEC;
+#if DP_DEBUG
+    printf ("[+-]{TIMEFULL} '%s'\n", lexdptext);
+    printf ("tstamp: %d: %s", (int)tstamp, ctime (&tstamp));
+#endif
+}
+	YY_BREAK
+case 7:
+YY_RULE_SETUP
+#line 250 "date_parser.l"
+{ /* ({NUM}[smhdwMy])+ */
+#if DP_DEBUG
+    printf ("RELTIME: '%s'\n", lexdptext);
+#endif
+    /* call reltime with negative sign */
+    dp_reltime (lexdptext, -1);
+}
+	YY_BREAK
+case 8:
+YY_RULE_SETUP
+#line 258 "date_parser.l"
+{ /* [+-]{RELTIME} */
+#if DP_DEBUG
+    printf ("SRELTIME: '%s'\n", lexdptext);
+#endif
+    if (*lexdptext == '+')  dp_reltime (lexdptext+1, +1);
+    else                 dp_reltime (lexdptext+1, -1);
+}
+	YY_BREAK
+case 9:
+YY_RULE_SETUP
+#line 266 "date_parser.l"
+/* ignore */
+	YY_BREAK
+case 10:
+YY_RULE_SETUP
+#line 268 "date_parser.l"
+{
+    gtkpod_warning (_("Date format error: unrecognized character: '%s'\n"), lexdptext );
+    dp_error = TRUE;
+}
+	YY_BREAK
+case 11:
+YY_RULE_SETUP
+#line 273 "date_parser.l"
+ECHO;
+	YY_BREAK
+#line 1011 "date_parser.c"
+case YY_STATE_EOF(INITIAL):
+	yyterminate();
+
+	case YY_END_OF_BUFFER:
+		{
+		/* Amount of text matched not including the EOB char. */
+		int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
+
+		/* Undo the effects of YY_DO_BEFORE_ACTION. */
+		*yy_cp = (yy_hold_char);
+		YY_RESTORE_YY_MORE_OFFSET
+
+		if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+			{
+			/* We're scanning a new file or input source.  It's
+			 * possible that this happened because the user
+			 * just pointed lexdpin at a new source and called
+			 * lexdplex().  If so, then we have to assure
+			 * consistency between YY_CURRENT_BUFFER and our
+			 * globals.  Here is the right place to do so, because
+			 * this is the first action (other than possibly a
+			 * back-up) that will match for the new input source.
+			 */
+			(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+			YY_CURRENT_BUFFER_LVALUE->yy_input_file = lexdpin;
+			YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+			}
+
+		/* Note that here we test for yy_c_buf_p "<=" to the position
+		 * of the first EOB in the buffer, since yy_c_buf_p will
+		 * already have been incremented past the NUL character
+		 * (since all states make transitions on EOB to the
+		 * end-of-buffer state).  Contrast this with the test
+		 * in input().
+		 */
+		if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+			{ /* This was really a NUL. */
+			yy_state_type yy_next_state;
+
+			(yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
+
+			yy_current_state = yy_get_previous_state(  );
+
+			/* Okay, we're now positioned to make the NUL
+			 * transition.  We couldn't have
+			 * yy_get_previous_state() go ahead and do it
+			 * for us because it doesn't know how to deal
+			 * with the possibility of jamming (and we don't
+			 * want to build jamming into it because then it
+			 * will run more slowly).
+			 */
+
+			yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+			yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+
+			if ( yy_next_state )
+				{
+				/* Consume the NUL. */
+				yy_cp = ++(yy_c_buf_p);
+				yy_current_state = yy_next_state;
+				goto yy_match;
+				}
+
+			else
+				{
+				yy_cp = (yy_c_buf_p);
+				goto yy_find_action;
+				}
+			}
+
+		else switch ( yy_get_next_buffer(  ) )
+			{
+			case EOB_ACT_END_OF_FILE:
+				{
+				(yy_did_buffer_switch_on_eof) = 0;
+
+				if ( lexdpwrap( ) )
+					{
+					/* Note: because we've taken care in
+					 * yy_get_next_buffer() to have set up
+					 * lexdptext, we can now set up
+					 * yy_c_buf_p so that if some total
+					 * hoser (like flex itself) wants to
+					 * call the scanner after we return the
+					 * YY_NULL, it'll still work - another
+					 * YY_NULL will get returned.
+					 */
+					(yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
+
+					yy_act = YY_STATE_EOF(YY_START);
+					goto do_action;
+					}
+
+				else
+					{
+					if ( ! (yy_did_buffer_switch_on_eof) )
+						YY_NEW_FILE;
+					}
+				break;
+				}
+
+			case EOB_ACT_CONTINUE_SCAN:
+				(yy_c_buf_p) =
+					(yytext_ptr) + yy_amount_of_matched_text;
+
+				yy_current_state = yy_get_previous_state(  );
+
+				yy_cp = (yy_c_buf_p);
+				yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+				goto yy_match;
+
+			case EOB_ACT_LAST_MATCH:
+				(yy_c_buf_p) =
+				&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
+
+				yy_current_state = yy_get_previous_state(  );
+
+				yy_cp = (yy_c_buf_p);
+				yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+				goto yy_find_action;
+			}
+		break;
+		}
+
+	default:
+		YY_FATAL_ERROR(
+			"fatal flex scanner internal error--no action found" );
+	} /* end of action switch */
+		} /* end of scanning one token */
+} /* end of lexdplex */
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ *	EOB_ACT_LAST_MATCH -
+ *	EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ *	EOB_ACT_END_OF_FILE - end of file
+ */
+static int yy_get_next_buffer (void)
+{
+    	register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+	register char *source = (yytext_ptr);
+	register int number_to_move, i;
+	int ret_val;
+
+	if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
+		YY_FATAL_ERROR(
+		"fatal flex scanner internal error--end of buffer missed" );
+
+	if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+		{ /* Don't try to fill the buffer, so this is an EOF. */
+		if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
+			{
+			/* We matched a single character, the EOB, so
+			 * treat this as a final EOF.
+			 */
+			return EOB_ACT_END_OF_FILE;
+			}
+
+		else
+			{
+			/* We matched some text prior to the EOB, first
+			 * process it.
+			 */
+			return EOB_ACT_LAST_MATCH;
+			}
+		}
+
+	/* Try to read more data. */
+
+	/* First move last chars to start of buffer. */
+	number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
+
+	for ( i = 0; i < number_to_move; ++i )
+		*(dest++) = *(source++);
+
+	if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+		/* don't do the read, it's not guaranteed to return an EOF,
+		 * just force an EOF
+		 */
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
+
+	else
+		{
+			int num_to_read =
+			YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+		while ( num_to_read <= 0 )
+			{ /* Not enough room in the buffer - grow it. */
+
+			/* just a shorter name for the current buffer */
+			YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
+
+			int yy_c_buf_p_offset =
+				(int) ((yy_c_buf_p) - b->yy_ch_buf);
+
+			if ( b->yy_is_our_buffer )
+				{
+				int new_size = b->yy_buf_size * 2;
+
+				if ( new_size <= 0 )
+					b->yy_buf_size += b->yy_buf_size / 8;
+				else
+					b->yy_buf_size *= 2;
+
+				b->yy_ch_buf = (char *)
+					/* Include room in for 2 EOB chars. */
+					lexdprealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2  );
+				}
+			else
+				/* Can't grow it, we don't own it. */
+				b->yy_ch_buf = 0;
+
+			if ( ! b->yy_ch_buf )
+				YY_FATAL_ERROR(
+				"fatal error - scanner input buffer overflow" );
+
+			(yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+			num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
+						number_to_move - 1;
+
+			}
+
+		if ( num_to_read > YY_READ_BUF_SIZE )
+			num_to_read = YY_READ_BUF_SIZE;
+
+		/* Read in more data. */
+		YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+			(yy_n_chars), num_to_read );
+
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+		}
+
+	if ( (yy_n_chars) == 0 )
+		{
+		if ( number_to_move == YY_MORE_ADJ )
+			{
+			ret_val = EOB_ACT_END_OF_FILE;
+			lexdprestart(lexdpin  );
+			}
+
+		else
+			{
+			ret_val = EOB_ACT_LAST_MATCH;
+			YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+				YY_BUFFER_EOF_PENDING;
+			}
+		}
+
+	else
+		ret_val = EOB_ACT_CONTINUE_SCAN;
+
+	(yy_n_chars) += number_to_move;
+	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
+	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
+
+	(yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+
+	return ret_val;
+}
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+    static yy_state_type yy_get_previous_state (void)
+{
+	register yy_state_type yy_current_state;
+	register char *yy_cp;
+    
+	yy_current_state = (yy_start);
+
+	for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
+		{
+		register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+		if ( yy_accept[yy_current_state] )
+			{
+			(yy_last_accepting_state) = yy_current_state;
+			(yy_last_accepting_cpos) = yy_cp;
+			}
+		while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+			{
+			yy_current_state = (int) yy_def[yy_current_state];
+			if ( yy_current_state >= 29 )
+				yy_c = yy_meta[(unsigned int) yy_c];
+			}
+		yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+		}
+
+	return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ *	next_state = yy_try_NUL_trans( current_state );
+ */
+    static yy_state_type yy_try_NUL_trans  (yy_state_type yy_current_state )
+{
+	register int yy_is_jam;
+    	register char *yy_cp = (yy_c_buf_p);
+
+	register YY_CHAR yy_c = 1;
+	if ( yy_accept[yy_current_state] )
+		{
+		(yy_last_accepting_state) = yy_current_state;
+		(yy_last_accepting_cpos) = yy_cp;
+		}
+	while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+		{
+		yy_current_state = (int) yy_def[yy_current_state];
+		if ( yy_current_state >= 29 )
+			yy_c = yy_meta[(unsigned int) yy_c];
+		}
+	yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+	yy_is_jam = (yy_current_state == 28);
+
+	return yy_is_jam ? 0 : yy_current_state;
+}
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+    static int yyinput (void)
+#else
+    static int input  (void)
+#endif
+
+{
+	int c;
+    
+	*(yy_c_buf_p) = (yy_hold_char);
+
+	if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
+		{
+		/* yy_c_buf_p now points to the character we want to return.
+		 * If this occurs *before* the EOB characters, then it's a
+		 * valid NUL; if not, then we've hit the end of the buffer.
+		 */
+		if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+			/* This was really a NUL. */
+			*(yy_c_buf_p) = '\0';
+
+		else
+			{ /* need more input */
+			int offset = (yy_c_buf_p) - (yytext_ptr);
+			++(yy_c_buf_p);
+
+			switch ( yy_get_next_buffer(  ) )
+				{
+				case EOB_ACT_LAST_MATCH:
+					/* This happens because yy_g_n_b()
+					 * sees that we've accumulated a
+					 * token and flags that we need to
+					 * try matching the token before
+					 * proceeding.  But for input(),
+					 * there's no matching to consider.
+					 * So convert the EOB_ACT_LAST_MATCH
+					 * to EOB_ACT_END_OF_FILE.
+					 */
+
+					/* Reset buffer status. */
+					lexdprestart(lexdpin );
+
+					/*FALLTHROUGH*/
+
+				case EOB_ACT_END_OF_FILE:
+					{
+					if ( lexdpwrap( ) )
+						return EOF;
+
+					if ( ! (yy_did_buffer_switch_on_eof) )
+						YY_NEW_FILE;
+#ifdef __cplusplus
+					return yyinput();
+#else
+					return input();
+#endif
+					}
+
+				case EOB_ACT_CONTINUE_SCAN:
+					(yy_c_buf_p) = (yytext_ptr) + offset;
+					break;
+				}
+			}
+		}
+
+	c = *(unsigned char *) (yy_c_buf_p);	/* cast for 8-bit char's */
+	*(yy_c_buf_p) = '\0';	/* preserve lexdptext */
+	(yy_hold_char) = *++(yy_c_buf_p);
+
+	return c;
+}
+#endif	/* ifndef YY_NO_INPUT */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ * 
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+    void lexdprestart  (FILE * input_file )
+{
+    
+	if ( ! YY_CURRENT_BUFFER ){
+        lexdpensure_buffer_stack ();
+		YY_CURRENT_BUFFER_LVALUE =
+            lexdp_create_buffer(lexdpin,YY_BUF_SIZE );
+	}
+
+	lexdp_init_buffer(YY_CURRENT_BUFFER,input_file );
+	lexdp_load_buffer_state( );
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ * 
+ */
+    void lexdp_switch_to_buffer  (YY_BUFFER_STATE  new_buffer )
+{
+    
+	/* TODO. We should be able to replace this entire function body
+	 * with
+	 *		lexdppop_buffer_state();
+	 *		lexdppush_buffer_state(new_buffer);
+     */
+	lexdpensure_buffer_stack ();
+	if ( YY_CURRENT_BUFFER == new_buffer )
+		return;
+
+	if ( YY_CURRENT_BUFFER )
+		{
+		/* Flush out information for old buffer. */
+		*(yy_c_buf_p) = (yy_hold_char);
+		YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+		}
+
+	YY_CURRENT_BUFFER_LVALUE = new_buffer;
+	lexdp_load_buffer_state( );
+
+	/* We don't actually know whether we did this switch during
+	 * EOF (lexdpwrap()) processing, but the only time this flag
+	 * is looked at is after lexdpwrap() is called, so it's safe
+	 * to go ahead and always set it.
+	 */
+	(yy_did_buffer_switch_on_eof) = 1;
+}
+
+static void lexdp_load_buffer_state  (void)
+{
+    	(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+	(yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+	lexdpin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+	(yy_hold_char) = *(yy_c_buf_p);
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ * 
+ * @return the allocated buffer state.
+ */
+    YY_BUFFER_STATE lexdp_create_buffer  (FILE * file, int  size )
+{
+	YY_BUFFER_STATE b;
+    
+	b = (YY_BUFFER_STATE) lexdpalloc(sizeof( struct yy_buffer_state )  );
+	if ( ! b )
+		YY_FATAL_ERROR( "out of dynamic memory in lexdp_create_buffer()" );
+
+	b->yy_buf_size = size;
+
+	/* yy_ch_buf has to be 2 characters longer than the size given because
+	 * we need to put in 2 end-of-buffer characters.
+	 */
+	b->yy_ch_buf = (char *) lexdpalloc(b->yy_buf_size + 2  );
+	if ( ! b->yy_ch_buf )
+		YY_FATAL_ERROR( "out of dynamic memory in lexdp_create_buffer()" );
+
+	b->yy_is_our_buffer = 1;
+
+	lexdp_init_buffer(b,file );
+
+	return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with lexdp_create_buffer()
+ * 
+ */
+    void lexdp_delete_buffer (YY_BUFFER_STATE  b )
+{
+    
+	if ( ! b )
+		return;
+
+	if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+		YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+
+	if ( b->yy_is_our_buffer )
+		lexdpfree((void *) b->yy_ch_buf  );
+
+	lexdpfree((void *) b  );
+}
+
+#ifndef __cplusplus
+extern int isatty (int );
+#endif /* __cplusplus */
+    
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a lexdprestart() or at EOF.
+ */
+    static void lexdp_init_buffer  (YY_BUFFER_STATE  b, FILE * file )
+
+{
+	int oerrno = errno;
+    
+	lexdp_flush_buffer(b );
+
+	b->yy_input_file = file;
+	b->yy_fill_buffer = 1;
+
+    /* If b is the current buffer, then lexdp_init_buffer was _probably_
+     * called from lexdprestart() or through yy_get_next_buffer.
+     * In that case, we don't want to reset the lineno or column.
+     */
+    if (b != YY_CURRENT_BUFFER){
+        b->yy_bs_lineno = 1;
+        b->yy_bs_column = 0;
+    }
+
+        b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+    
+	errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ * 
+ */
+    void lexdp_flush_buffer (YY_BUFFER_STATE  b )
+{
+    	if ( ! b )
+		return;
+
+	b->yy_n_chars = 0;
+
+	/* We always need two end-of-buffer characters.  The first causes
+	 * a transition to the end-of-buffer state.  The second causes
+	 * a jam in that state.
+	 */
+	b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+	b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+	b->yy_buf_pos = &b->yy_ch_buf[0];
+
+	b->yy_at_bol = 1;
+	b->yy_buffer_status = YY_BUFFER_NEW;
+
+	if ( b == YY_CURRENT_BUFFER )
+		lexdp_load_buffer_state( );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ *  the current state. This function will allocate the stack
+ *  if necessary.
+ *  @param new_buffer The new state.
+ *  
+ */
+void lexdppush_buffer_state (YY_BUFFER_STATE new_buffer )
+{
+    	if (new_buffer == NULL)
+		return;
+
+	lexdpensure_buffer_stack();
+
+	/* This block is copied from lexdp_switch_to_buffer. */
+	if ( YY_CURRENT_BUFFER )
+		{
+		/* Flush out information for old buffer. */
+		*(yy_c_buf_p) = (yy_hold_char);
+		YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+		}
+
+	/* Only push if top exists. Otherwise, replace top. */
+	if (YY_CURRENT_BUFFER)
+		(yy_buffer_stack_top)++;
+	YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+	/* copied from lexdp_switch_to_buffer. */
+	lexdp_load_buffer_state( );
+	(yy_did_buffer_switch_on_eof) = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ *  The next element becomes the new top.
+ *  
+ */
+void lexdppop_buffer_state (void)
+{
+    	if (!YY_CURRENT_BUFFER)
+		return;
+
+	lexdp_delete_buffer(YY_CURRENT_BUFFER );
+	YY_CURRENT_BUFFER_LVALUE = NULL;
+	if ((yy_buffer_stack_top) > 0)
+		--(yy_buffer_stack_top);
+
+	if (YY_CURRENT_BUFFER) {
+		lexdp_load_buffer_state( );
+		(yy_did_buffer_switch_on_eof) = 1;
+	}
+}
+
+/* Allocates the stack if it does not exist.
+ *  Guarantees space for at least one push.
+ */
+static void lexdpensure_buffer_stack (void)
+{
+	int num_to_alloc;
+    
+	if (!(yy_buffer_stack)) {
+
+		/* First allocation is just for 2 elements, since we don't know if this
+		 * scanner will even need a stack. We use 2 instead of 1 to avoid an
+		 * immediate realloc on the next call.
+         */
+		num_to_alloc = 1;
+		(yy_buffer_stack) = (struct yy_buffer_state**)lexdpalloc
+								(num_to_alloc * sizeof(struct yy_buffer_state*)
+								);
+		
+		memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+				
+		(yy_buffer_stack_max) = num_to_alloc;
+		(yy_buffer_stack_top) = 0;
+		return;
+	}
+
+	if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
+
+		/* Increase the buffer to prepare for a possible push. */
+		int grow_size = 8 /* arbitrary grow size */;
+
+		num_to_alloc = (yy_buffer_stack_max) + grow_size;
+		(yy_buffer_stack) = (struct yy_buffer_state**)lexdprealloc
+								((yy_buffer_stack),
+								num_to_alloc * sizeof(struct yy_buffer_state*)
+								);
+
+		/* zero only the new slots.*/
+		memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
+		(yy_buffer_stack_max) = num_to_alloc;
+	}
+}
+
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ * 
+ * @return the newly allocated buffer state object. 
+ */
+YY_BUFFER_STATE lexdp_scan_buffer  (char * base, yy_size_t  size )
+{
+	YY_BUFFER_STATE b;
+    
+	if ( size < 2 ||
+	     base[size-2] != YY_END_OF_BUFFER_CHAR ||
+	     base[size-1] != YY_END_OF_BUFFER_CHAR )
+		/* They forgot to leave room for the EOB's. */
+		return 0;
+
+	b = (YY_BUFFER_STATE) lexdpalloc(sizeof( struct yy_buffer_state )  );
+	if ( ! b )
+		YY_FATAL_ERROR( "out of dynamic memory in lexdp_scan_buffer()" );
+
+	b->yy_buf_size = size - 2;	/* "- 2" to take care of EOB's */
+	b->yy_buf_pos = b->yy_ch_buf = base;
+	b->yy_is_our_buffer = 0;
+	b->yy_input_file = 0;
+	b->yy_n_chars = b->yy_buf_size;
+	b->yy_is_interactive = 0;
+	b->yy_at_bol = 1;
+	b->yy_fill_buffer = 0;
+	b->yy_buffer_status = YY_BUFFER_NEW;
+
+	lexdp_switch_to_buffer(b  );
+
+	return b;
+}
+
+/** Setup the input buffer state to scan a string. The next call to lexdplex() will
+ * scan from a @e copy of @a str.
+ * @param str a NUL-terminated string to scan
+ * 
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ *       lexdp_scan_bytes() instead.
+ */
+YY_BUFFER_STATE lexdp_scan_string (yyconst char * yystr )
+{
+    
+	return lexdp_scan_bytes(yystr,strlen(yystr) );
+}
+
+/** Setup the input buffer state to scan the given bytes. The next call to lexdplex() will
+ * scan from a @e copy of @a bytes.
+ * @param bytes the byte buffer to scan
+ * @param len the number of bytes in the buffer pointed to by @a bytes.
+ * 
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE lexdp_scan_bytes  (yyconst char * yybytes, int  _yybytes_len )
+{
+	YY_BUFFER_STATE b;
+	char *buf;
+	yy_size_t n;
+	int i;
+    
+	/* Get memory for full buffer, including space for trailing EOB's. */
+	n = _yybytes_len + 2;
+	buf = (char *) lexdpalloc(n  );
+	if ( ! buf )
+		YY_FATAL_ERROR( "out of dynamic memory in lexdp_scan_bytes()" );
+
+	for ( i = 0; i < _yybytes_len; ++i )
+		buf[i] = yybytes[i];
+
+	buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
+
+	b = lexdp_scan_buffer(buf,n );
+	if ( ! b )
+		YY_FATAL_ERROR( "bad buffer in lexdp_scan_bytes()" );
+
+	/* It's okay to grow etc. this buffer, and we should throw it
+	 * away when we're done.
+	 */
+	b->yy_is_our_buffer = 1;
+
+	return b;
+}
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+static void yy_fatal_error (yyconst char* msg )
+{
+    	(void) fprintf( stderr, "%s\n", msg );
+	exit( YY_EXIT_FAILURE );
+}
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+	do \
+		{ \
+		/* Undo effects of setting up lexdptext. */ \
+        int yyless_macro_arg = (n); \
+        YY_LESS_LINENO(yyless_macro_arg);\
+		lexdptext[lexdpleng] = (yy_hold_char); \
+		(yy_c_buf_p) = lexdptext + yyless_macro_arg; \
+		(yy_hold_char) = *(yy_c_buf_p); \
+		*(yy_c_buf_p) = '\0'; \
+		lexdpleng = yyless_macro_arg; \
+		} \
+	while ( 0 )
+
+/* Accessor  methods (get/set functions) to struct members. */
+
+/** Get the current line number.
+ * 
+ */
+int lexdpget_lineno  (void)
+{
+        
+    return lexdplineno;
+}
+
+/** Get the input stream.
+ * 
+ */
+FILE *lexdpget_in  (void)
+{
+        return lexdpin;
+}
+
+/** Get the output stream.
+ * 
+ */
+FILE *lexdpget_out  (void)
+{
+        return lexdpout;
+}
+
+/** Get the length of the current token.
+ * 
+ */
+int lexdpget_leng  (void)
+{
+        return lexdpleng;
+}
+
+/** Get the current token.
+ * 
+ */
+
+char *lexdpget_text  (void)
+{
+        return lexdptext;
+}
+
+/** Set the current line number.
+ * @param line_number
+ * 
+ */
+void lexdpset_lineno (int  line_number )
+{
+    
+    lexdplineno = line_number;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param in_str A readable stream.
+ * 
+ * @see lexdp_switch_to_buffer
+ */
+void lexdpset_in (FILE *  in_str )
+{
+        lexdpin = in_str ;
+}
+
+void lexdpset_out (FILE *  out_str )
+{
+        lexdpout = out_str ;
+}
+
+int lexdpget_debug  (void)
+{
+        return lexdp_flex_debug;
+}
+
+void lexdpset_debug (int  bdebug )
+{
+        lexdp_flex_debug = bdebug ;
+}
+
+static int yy_init_globals (void)
+{
+        /* Initialization is the same as for the non-reentrant scanner.
+     * This function is called from lexdplex_destroy(), so don't allocate here.
+     */
+
+    (yy_buffer_stack) = 0;
+    (yy_buffer_stack_top) = 0;
+    (yy_buffer_stack_max) = 0;
+    (yy_c_buf_p) = (char *) 0;
+    (yy_init) = 0;
+    (yy_start) = 0;
+
+/* Defined in main.c */
+#ifdef YY_STDINIT
+    lexdpin = stdin;
+    lexdpout = stdout;
+#else
+    lexdpin = (FILE *) 0;
+    lexdpout = (FILE *) 0;
+#endif
+
+    /* For future reference: Set errno on error, since we are called by
+     * lexdplex_init()
+     */
+    return 0;
+}
+
+/* lexdplex_destroy is for both reentrant and non-reentrant scanners. */
+int lexdplex_destroy  (void)
+{
+    
+    /* Pop the buffer stack, destroying each element. */
+	while(YY_CURRENT_BUFFER){
+		lexdp_delete_buffer(YY_CURRENT_BUFFER  );
+		YY_CURRENT_BUFFER_LVALUE = NULL;
+		lexdppop_buffer_state();
+	}
+
+	/* Destroy the stack itself. */
+	lexdpfree((yy_buffer_stack) );
+	(yy_buffer_stack) = NULL;
+
+    /* Reset the globals. This is important in a non-reentrant scanner so the next time
+     * lexdplex() is called, initialization will occur. */
+    yy_init_globals( );
+
+    return 0;
+}
+
+/*
+ * Internal utility routines.
+ */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
+{
+	register int i;
+	for ( i = 0; i < n; ++i )
+		s1[i] = s2[i];
+}
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * s )
+{
+	register int n;
+	for ( n = 0; s[n]; ++n )
+		;
+
+	return n;
+}
+#endif
+
+void *lexdpalloc (yy_size_t  size )
+{
+	return (void *) malloc( size );
+}
+
+void *lexdprealloc  (void * ptr, yy_size_t  size )
+{
+	/* The cast to (char *) in the following accommodates both
+	 * implementations that use char* generic pointers, and those
+	 * that use void* generic pointers.  It works with the latter
+	 * because both ANSI C and C++ allow castless assignment from
+	 * any pointer type to void*, and deal with argument conversions
+	 * as though doing an assignment.
+	 */
+	return (void *) realloc( (char *) ptr, size );
+}
+
+void lexdpfree (void * ptr )
+{
+	free( (char *) ptr );	/* see lexdprealloc() for (char *) cast */
+}
+
+#define YYTABLES_NAME "yytables"
+
+#line 273 "date_parser.l"
+
+
+
+/* handle ({NUM}[smhdwMy])+, assuming @sign */
+static void dp_reltime (gchar *str, gint32 sign)
+{
+    gchar *ptr1 = str;
+    gint32 arg;
+    time_t secs = 0;
+
+    while (*ptr1)
+    {
+	arg = strtol (ptr1, &ptr1, 10);
+	switch (*ptr1)
+	{
+	case 's':
+	    secs += arg;
+	    reltime = DP_SEC;
+	    break;
+	case 'm':
+	    secs += 60*arg;
+	    if (DP_MIN < reltime)   reltime = DP_MIN;
+	    break;
+	case 'h':
+	    secs += 3600*arg;
+	    if (DP_HOUR < reltime)   reltime = DP_HOUR;
+	    break;
+	case 'd':
+	    secs += 24*3600*arg;
+	    if (DP_DAY < reltime)   reltime = DP_DAY;
+	    break;
+	case 'w':
+	    secs += 7*24*3600*arg;
+	    if (DP_WEEK < reltime)   reltime = DP_WEEK;
+	    break;
+	case 'M':
+	    secs += 30*7*24*3600*arg;
+	    if (DP_MONTH < reltime)   reltime = DP_MONTH;
+	    break;
+	case 'y':
+	    secs += 365*7*24*3600*arg;
+	    if (DP_YEAR < reltime)   reltime = DP_YEAR;
+	    break;
+	}
+	++ptr1;
+    }
+    tstamp += sign*secs;
+#if DP_DEBUG
+    printf ("secs: %d, tstamp: %d: %s", (int)secs, (int)tstamp, ctime (&tstamp));
+#endif
+}
+
+
+/* after reading the date string check if we should round down the
+   interval (round if reltime is not supposed to be strict and no
+   absolute time string has been parsed */
+static void round_reltime (void)
+{
+    if (!rel_strict && !parsed_time)
+    {   /* Round this datestamp to make a lower/upper margin */
+	struct tm *lt = localtime (&tstamp);
+	switch (reltime)
+	{
+	case DP_INF:
+	    break;
+	case DP_YEAR:
+	    if (lower) lt->tm_mon = 0;
+	    else       lt->tm_mon = 11;
+	case DP_MONTH:
+	    if (lower) lt->tm_mday = 1;
+	    else
+	    {
+		switch (lt->tm_mon)
+		{
+		case 1:
+		case 3:
+		case 5:
+		case 7:
+		case 8:
+		case 10:
+		case 12:
+		    lt->tm_mday = 31;
+		    break;
+		case 2:
+		    if ((lt->tm_year % 4) != 0)   lt->tm_mday = 28;
+		    else
+		    {
+			if ((lt->tm_year % 100) != 0) lt->tm_mday = 29;
+			else
+			{   /* centuries are only leap years if they
+			     * are a multiple of 400 */
+			    if (((lt->tm_year+300) % 400) == 0)
+				 lt->tm_mday = 29;
+			    else lt->tm_mday = 28;
+			}
+		    }
+		    break;
+		case 4:
+		case 6:
+		case 9:
+		case 11:
+		    lt->tm_mday = 30;
+		    break;
+		}
+	    }
+	case DP_WEEK:
+	    if (reltime == DP_WEEK)
+	    {   /* only do this if week was set manually */
+		/* tm_wday gives us the number of days since Sunday (0
+		   to 6). Let's declare Monday to be the start of the
+		   week and Sunday the end. */
+		if (lower)
+		{   /* Round down to Monday */
+		    if (lt->tm_wday == 0)  lt->tm_mday -= 6;
+		    else                   lt->tm_mday -= (lt->tm_wday-1);
+		}
+		else
+		{   /* Round up to Sunday */
+		    if (lt->tm_wday != 0)  lt->tm_mday += (7-lt->tm_wday);
+		}
+	    }
+	case DP_DAY:
+	    if (lower) lt->tm_hour = 0;
+	    else       lt->tm_hour = 23;
+	case DP_HOUR:
+	    if (lower) lt->tm_min = 0;
+	    else       lt->tm_min = 59;
+	case DP_MIN:
+	    if (lower) lt->tm_sec = 0;
+	    else       lt->tm_sec = 59;
+	case DP_SEC:
+	    break;
+	}
+	tstamp = mktime (lt);
+#if DP_DEBUG
+	printf ("tstamp: %d: %s", (int)tstamp, ctime (&tstamp));
+#endif
+    }
+}
+
+/* dp_parse() will take one date specification (like 9/6/03, or -5d,
+ * for details have a look at the definitions above) and convert it
+ * into a timestamp.
+ *
+ * @dp_str: the string to parse 
+ *
+ * @result: the parsed timestamp is written into here
+ *
+ * @lower_margin: if TRUE, absolute time or date values are "rounded
+ * down" (e.g. "9/6/03" would compute to "June 6 2003, 0:00:00"),
+ * otherwise the are rounded up (e.g. "9/6/03" would compute to "June
+ * 6 2003, 23:59:59"). Similarily, "8:05" would either compute to
+ * "8:05:00" or "8:05:59" depending on whether the lower or upper
+ * boundary is to be determined.
+ *
+ * @strict: should relative dates be read strictly (TRUE: no changing
+ * of seconds to 0 or 59 when minutes are set, etc.) or not. Actually,
+ * it's only set to FALSE * for the "=..." format.
+ *
+ * Return value:
+ *
+ * TRUE:  no error occurred
+ * FALSE: error occurred
+ */
+gboolean dp_parse (gchar *dp_str, time_t *result,
+		   gboolean lower_margin, gboolean strict)
+{
+    dp_strp = dp_str;
+    /* set timestamp to current time */
+    tstamp = time (NULL);
+    /* did not yet parse any absolute time string */
+    parsed_time = FALSE;
+    /* did not yet parse any relative time string */
+    reltime = DP_INF;
+    /* no error occurred (yet) */
+    dp_error = FALSE;
+    /* set parameters */
+    lower = lower_margin;
+    rel_strict = strict;
+    /* call lexer */
+    lexdplex ();
+    /* round relative time up or down, if necessary */
+    round_reltime ();
+    /* set the result */
+    if (result)  *result = tstamp;
+    /* return the (inverted) error variable */
+    return !dp_error;
+}
+

Added: trunk/src/date_parser.h
===================================================================
--- trunk/src/date_parser.h	                        (rev 0)
+++ trunk/src/date_parser.h	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,46 @@
+/* Time-stamp: <2003-06-12 23:57:56 jcs>
+|
+|  Copyright (C) 2002-2003 Jorg Schuler <jcsjcs at users.sourceforge.net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://gtkpod.sourceforge.net/
+| 
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+| 
+|  iTunes and iPod are trademarks of Apple
+| 
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: date_parser.h 270 2003-09-23 19:57:15Z samc $
+*/
+
+#ifndef __DATE_PARSER_H__
+#define __DATE_PARSER_H__
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <gtk/gtk.h>
+#include <time.h>
+#include <display.h>
+
+/* Set to "1" if debugging output is desired */
+#define DP_DEBUG 0
+
+gboolean dp_parse (gchar *dp_str, time_t *result,
+		   gboolean lower_margin, gboolean strict);
+void dp2_parse (TimeInfo *ti);
+#endif 

Added: trunk/src/date_parser.l
===================================================================
--- trunk/src/date_parser.l	                        (rev 0)
+++ trunk/src/date_parser.l	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,459 @@
+/* -*- mode: c -*-
+| Time-stamp: <2007-01-19 01:52:29 jcs>
+|
+|  Copyright (C) 2002-2003 Jorg Schuler <jcsjcs at users.sourceforge.net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://gtkpod.sourceforge.net/
+| 
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+| 
+|  iTunes and iPod are trademarks of Apple
+| 
+|  This product is not supported/written/published by Apple!
+*/
+
+/* This parser (dp_parse()) will take one date specification (like
+ * 9/6/03, or -5d) and convert it into a timestamp. More details
+ * below. */
+
+%{
+#include <stdlib.h>
+#include "date_parser.h"
+#include "misc.h"
+    static gchar *dp_strp = NULL;
+    /* time stamp (result!) */
+    static time_t tstamp;
+    /* already parsed time? */
+    static gboolean parsed_time;
+    /* are we reading a lower bound (TRUE) or upper bound (FALSE) */
+    static gboolean lower;
+    /* did an error occur? */
+    static gboolean dp_error;
+    /* should relative dates be read strictly (TRUE: no changing of seconds
+     * to 0 or 59 when minutes are set) or not. It's only set to FALSE
+     * for the "=..." format. */
+    static gboolean rel_strict;
+    typedef enum {
+	DP_SEC,
+	DP_MIN,
+	DP_HOUR,
+	DP_DAY,
+	DP_WEEK,
+	DP_MONTH,
+	DP_YEAR,
+	DP_INF
+    } RelTime;
+    /* Which is the lowest relative time specifier already parsed? */
+    RelTime reltime;
+    static void dp_reltime (gchar *str, gint32 sign);
+/* We don't read from a stream but from a string buffer. This macro
+   will copy a maximum of @max_size chars from dp_strp to @buf,
+   writing the number of chars copied into @result. If no characters
+   are copied, YY_NULL is written into @result. */
+#define YY_INPUT(buf,result,max_size) \
+    { \
+    if (!dp_strp || !dp_strp[0]) result = YY_NULL; \
+    else \
+      { \
+        gint i; \
+        for (i=0; (i<max_size && *dp_strp); ++i)  buf[i] = *dp_strp++; \
+        result = i; \
+      } \
+    }
+%}
+
+/* stop parsing after end of string is reached */
+%option noyywrap
+/* avoid compiler warning: `yyunput' defined but not used */
+%option nounput
+/* We have several parsers in one executable, so we must use the
+   prefix option to avoid name space clashes. Note that this only
+   works with flex, but not with lex. */
+%option prefix="lexdp"
+/* Unfortunately, the prefix option also changes the output filename
+   and thereby breaks the automake script. Therefore I define the
+   output filename here. However, this is not portable -- on other
+   systems the default output filename expected by the automake
+   scripts may be lexyy.c or similar. To make the code portable again
+   (hopefully), I also define "LEX_OUTPUT_ROOT = lex.yy" in
+   Makefile.am */
+%option outfile="lex.yy.c"
+
+
+DIGIT     [0-9]
+NUM       {DIGIT}+
+/* definitions for time formats */
+/* e.g. 8:54               */
+TIMESHORT {NUM}":"{NUM}
+/* e.g. 8:54:23            */
+TIMEFULL  {NUM}":"{NUM}":"{NUM}
+/* e.g. 9/6 (for June 9th) */
+DATESHORT {NUM}"/"{NUM}
+/* e.g. 9/6/3  or 9/6/2003 */
+DATEFULL  {NUM}"/"{NUM}"/"{NUM}
+/* e.g. -8:54              */
+RELTIME_S [+-]{TIMESHORT}
+/* e.g. +8:54.23           */
+RELTIME_F [+-]{TIMEFULL}
+/* e.g. 5d6m3s             */
+RELTIME   ({NUM}[smhdwMy])+
+/* e.g. -3M5d              */
+SRELTIME  [+-]{RELTIME}
+
+%%
+
+{TIMESHORT}    {
+    gchar *ptr1 = yytext;
+    struct tm *lt = localtime (&tstamp);
+    lt->tm_hour = strtol (ptr1, &ptr1, 10);
+    ++ptr1;
+    lt->tm_min = strtol (ptr1, &ptr1, 10);
+    if (lower)    lt->tm_sec = 0;
+    else          lt->tm_sec = 59;
+    tstamp = mktime (lt);
+    parsed_time = TRUE;
+#if DP_DEBUG
+    printf ("Time with minutes: '%s'\n", yytext);
+    printf ("tstamp: %d: %s", (int)tstamp, asctime (lt));
+#endif
+}
+	
+{TIMEFULL}	{
+    gchar *ptr1 = yytext;
+    struct tm *lt = localtime (&tstamp);
+    lt->tm_hour = strtol (ptr1, &ptr1, 10);
+    ++ptr1;
+    lt->tm_min = strtol (ptr1, &ptr1, 10);
+    ++ptr1;
+    lt->tm_sec = strtol (ptr1, &ptr1, 10);
+    tstamp = mktime (lt);
+    parsed_time = TRUE;
+#if DP_DEBUG
+    printf ("Time with seconds: '%s'\n", yytext);
+    printf ("tstamp: %d: %s", (int)tstamp, asctime (lt));
+#endif
+}
+
+{DATESHORT}	{
+    gchar *ptr1 = yytext;
+    struct tm *lt = localtime (&tstamp);
+    if (!parsed_time)
+    {
+	if (lower)
+	{
+	    lt->tm_hour = 0;
+	    lt->tm_min = 0;
+	    lt->tm_sec = 0;
+	}
+	else
+	{
+	    lt->tm_hour = 23;
+	    lt->tm_min = 59;
+	    lt->tm_sec = 59;
+	}
+    }
+    lt->tm_mday = strtol (ptr1, &ptr1, 10);
+    ++ptr1;
+    lt->tm_mon = strtol (ptr1, &ptr1, 10) - 1;
+    tstamp = mktime (lt);
+#if DP_DEBUG
+    printf ("Date without year: '%s'\n", yytext);
+    printf ("tstamp: %d: %s", (int)tstamp, asctime (lt));
+#endif
+}
+
+{DATEFULL}	{
+    gchar *ptr1 = yytext;
+    struct tm *lt = localtime (&tstamp);
+    if (!parsed_time)
+    {
+	if (lower)
+	{
+	    lt->tm_hour = 0;
+	    lt->tm_min = 0;
+	    lt->tm_sec = 0;
+	}
+	else
+	{
+	    lt->tm_hour = 23;
+	    lt->tm_min = 59;
+	    lt->tm_sec = 59;
+	}
+    }
+    lt->tm_mday = strtol (ptr1, &ptr1, 10);
+    ++ptr1;
+    lt->tm_mon = strtol (ptr1, &ptr1, 10) - 1;
+    ++ptr1;
+    lt->tm_year = strtol (ptr1, &ptr1, 10);
+    if (lt->tm_year < 70)
+	lt->tm_year += 2000;
+    if ((lt->tm_year < 100) && (lt->tm_year >=70))
+	lt->tm_year += 1900;
+    /* tm_year is years since 1900 */
+    lt->tm_year -= 1900;
+    tstamp = mktime (lt);
+#if DP_DEBUG
+    printf ("Date with year: '%s'\n", yytext);
+    printf ("tstamp: %d: %s", (int)tstamp, asctime (lt));
+#endif
+}
+
+{RELTIME_S}     { /* [+-]{TIMESHORT} */
+    gchar *ptr1 = yytext;
+    gint32 hours, mins, sign;
+    if (*ptr1 == '+')  sign = 1;
+    else               sign = -1;
+    ++ptr1;
+    hours = strtol (ptr1, &ptr1, 10);
+    ++ptr1;
+    mins = strtol (ptr1, &ptr1, 10);
+    tstamp += sign * (hours*3600 + mins*60);
+    if (DP_MIN < reltime)   reltime = DP_MIN;
+#if DP_DEBUG
+    printf ("[+-]{TIMESHORT} '%s'\n", yytext);
+    printf ("tstamp: %d: %s", (int)tstamp, ctime (&tstamp));
+#endif
+}
+
+{RELTIME_F}     { /* [+-]{TIMEFULL} */
+    gchar *ptr1 = yytext;
+    gint32 hours, mins, secs, sign;
+    if (*ptr1 == '+')  sign = 1;
+    else               sign = -1;
+    ++ptr1;
+    hours = strtol (ptr1, &ptr1, 10);
+    ++ptr1;
+    mins = strtol (ptr1, &ptr1, 10);
+    ++ptr1;
+    secs = strtol (ptr1, &ptr1, 10);
+    tstamp += sign * (hours*3600 + mins*60 + secs);
+    reltime = DP_SEC;
+#if DP_DEBUG
+    printf ("[+-]{TIMEFULL} '%s'\n", yytext);
+    printf ("tstamp: %d: %s", (int)tstamp, ctime (&tstamp));
+#endif
+}
+
+{RELTIME}	{ /* ({NUM}[smhdwMy])+ */
+#if DP_DEBUG
+    printf ("RELTIME: '%s'\n", yytext);
+#endif
+    /* call reltime with negative sign */
+    dp_reltime (yytext, -1);
+}
+
+{SRELTIME}	{ /* [+-]{RELTIME} */
+#if DP_DEBUG
+    printf ("SRELTIME: '%s'\n", yytext);
+#endif
+    if (*yytext == '+')  dp_reltime (yytext+1, +1);
+    else                 dp_reltime (yytext+1, -1);
+}
+
+[ \t]*      /* ignore */
+
+.           {
+    gtkpod_warning (_("Date format error: unrecognized character: '%s'\n"), yytext );
+    dp_error = TRUE;
+}
+
+%%
+
+/* handle ({NUM}[smhdwMy])+, assuming @sign */
+static void dp_reltime (gchar *str, gint32 sign)
+{
+    gchar *ptr1 = str;
+    gint32 arg;
+    time_t secs = 0;
+
+    while (*ptr1)
+    {
+	arg = strtol (ptr1, &ptr1, 10);
+	switch (*ptr1)
+	{
+	case 's':
+	    secs += arg;
+	    reltime = DP_SEC;
+	    break;
+	case 'm':
+	    secs += 60*arg;
+	    if (DP_MIN < reltime)   reltime = DP_MIN;
+	    break;
+	case 'h':
+	    secs += 3600*arg;
+	    if (DP_HOUR < reltime)   reltime = DP_HOUR;
+	    break;
+	case 'd':
+	    secs += 24*3600*arg;
+	    if (DP_DAY < reltime)   reltime = DP_DAY;
+	    break;
+	case 'w':
+	    secs += 7*24*3600*arg;
+	    if (DP_WEEK < reltime)   reltime = DP_WEEK;
+	    break;
+	case 'M':
+	    secs += 30*7*24*3600*arg;
+	    if (DP_MONTH < reltime)   reltime = DP_MONTH;
+	    break;
+	case 'y':
+	    secs += 365*7*24*3600*arg;
+	    if (DP_YEAR < reltime)   reltime = DP_YEAR;
+	    break;
+	}
+	++ptr1;
+    }
+    tstamp += sign*secs;
+#if DP_DEBUG
+    printf ("secs: %d, tstamp: %d: %s", (int)secs, (int)tstamp, ctime (&tstamp));
+#endif
+}
+
+
+/* after reading the date string check if we should round down the
+   interval (round if reltime is not supposed to be strict and no
+   absolute time string has been parsed */
+static void round_reltime (void)
+{
+    if (!rel_strict && !parsed_time)
+    {   /* Round this datestamp to make a lower/upper margin */
+	struct tm *lt = localtime (&tstamp);
+	switch (reltime)
+	{
+	case DP_INF:
+	    break;
+	case DP_YEAR:
+	    if (lower) lt->tm_mon = 0;
+	    else       lt->tm_mon = 11;
+	case DP_MONTH:
+	    if (lower) lt->tm_mday = 1;
+	    else
+	    {
+		switch (lt->tm_mon)
+		{
+		case 1:
+		case 3:
+		case 5:
+		case 7:
+		case 8:
+		case 10:
+		case 12:
+		    lt->tm_mday = 31;
+		    break;
+		case 2:
+		    if ((lt->tm_year % 4) != 0)   lt->tm_mday = 28;
+		    else
+		    {
+			if ((lt->tm_year % 100) != 0) lt->tm_mday = 29;
+			else
+			{   /* centuries are only leap years if they
+			     * are a multiple of 400 */
+			    if (((lt->tm_year+300) % 400) == 0)
+				 lt->tm_mday = 29;
+			    else lt->tm_mday = 28;
+			}
+		    }
+		    break;
+		case 4:
+		case 6:
+		case 9:
+		case 11:
+		    lt->tm_mday = 30;
+		    break;
+		}
+	    }
+	case DP_WEEK:
+	    if (reltime == DP_WEEK)
+	    {   /* only do this if week was set manually */
+		/* tm_wday gives us the number of days since Sunday (0
+		   to 6). Let's declare Monday to be the start of the
+		   week and Sunday the end. */
+		if (lower)
+		{   /* Round down to Monday */
+		    if (lt->tm_wday == 0)  lt->tm_mday -= 6;
+		    else                   lt->tm_mday -= (lt->tm_wday-1);
+		}
+		else
+		{   /* Round up to Sunday */
+		    if (lt->tm_wday != 0)  lt->tm_mday += (7-lt->tm_wday);
+		}
+	    }
+	case DP_DAY:
+	    if (lower) lt->tm_hour = 0;
+	    else       lt->tm_hour = 23;
+	case DP_HOUR:
+	    if (lower) lt->tm_min = 0;
+	    else       lt->tm_min = 59;
+	case DP_MIN:
+	    if (lower) lt->tm_sec = 0;
+	    else       lt->tm_sec = 59;
+	case DP_SEC:
+	    break;
+	}
+	tstamp = mktime (lt);
+#if DP_DEBUG
+	printf ("tstamp: %d: %s", (int)tstamp, ctime (&tstamp));
+#endif
+    }
+}
+
+/* dp_parse() will take one date specification (like 9/6/03, or -5d,
+ * for details have a look at the definitions above) and convert it
+ * into a timestamp.
+ *
+ * @dp_str: the string to parse 
+ *
+ * @result: the parsed timestamp is written into here
+ *
+ * @lower_margin: if TRUE, absolute time or date values are "rounded
+ * down" (e.g. "9/6/03" would compute to "June 6 2003, 0:00:00"),
+ * otherwise the are rounded up (e.g. "9/6/03" would compute to "June
+ * 6 2003, 23:59:59"). Similarily, "8:05" would either compute to
+ * "8:05:00" or "8:05:59" depending on whether the lower or upper
+ * boundary is to be determined.
+ *
+ * @strict: should relative dates be read strictly (TRUE: no changing
+ * of seconds to 0 or 59 when minutes are set, etc.) or not. Actually,
+ * it's only set to FALSE * for the "=..." format.
+ *
+ * Return value:
+ *
+ * TRUE:  no error occurred
+ * FALSE: error occurred
+ */
+gboolean dp_parse (gchar *dp_str, time_t *result,
+		   gboolean lower_margin, gboolean strict)
+{
+    dp_strp = dp_str;
+    /* set timestamp to current time */
+    tstamp = time (NULL);
+    /* did not yet parse any absolute time string */
+    parsed_time = FALSE;
+    /* did not yet parse any relative time string */
+    reltime = DP_INF;
+    /* no error occurred (yet) */
+    dp_error = FALSE;
+    /* set parameters */
+    lower = lower_margin;
+    rel_strict = strict;
+    /* call lexer */
+    yylex ();
+    /* round relative time up or down, if necessary */
+    round_reltime ();
+    /* set the result */
+    if (result)  *result = tstamp;
+    /* return the (inverted) error variable */
+    return !dp_error;
+}

Added: trunk/src/date_parser2.c
===================================================================
--- trunk/src/date_parser2.c	                        (rev 0)
+++ trunk/src/date_parser2.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,1972 @@
+#line 2 "date_parser2.c"
+
+#line 4 "date_parser2.c"
+
+#define  YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+#define yy_create_buffer lexdp2_create_buffer
+#define yy_delete_buffer lexdp2_delete_buffer
+#define yy_flex_debug lexdp2_flex_debug
+#define yy_init_buffer lexdp2_init_buffer
+#define yy_flush_buffer lexdp2_flush_buffer
+#define yy_load_buffer_state lexdp2_load_buffer_state
+#define yy_switch_to_buffer lexdp2_switch_to_buffer
+#define yyin lexdp2in
+#define yyleng lexdp2leng
+#define yylex lexdp2lex
+#define yylineno lexdp2lineno
+#define yyout lexdp2out
+#define yyrestart lexdp2restart
+#define yytext lexdp2text
+#define yywrap lexdp2wrap
+#define yyalloc lexdp2alloc
+#define yyrealloc lexdp2realloc
+#define yyfree lexdp2free
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+#define YY_FLEX_SUBMINOR_VERSION 33
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+/* First, we deal with  platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/* end standard C headers. */
+
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if __STDC_VERSION__ >= 199901L
+
+/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
+ * if you want the limit (max/min) macros for int types. 
+ */
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t; 
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+#endif /* ! C99 */
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN               (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN              (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN              (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX               (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX              (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX              (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX              (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX             (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX             (4294967295U)
+#endif
+
+#endif /* ! FLEXINT_H */
+
+#ifdef __cplusplus
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else	/* ! __cplusplus */
+
+#if __STDC__
+
+#define YY_USE_CONST
+
+#endif	/* __STDC__ */
+#endif	/* ! __cplusplus */
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index.  If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition.  This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN (yy_start) = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state.  The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START (((yy_start) - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE lexdp2restart(lexdp2in  )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#define YY_BUF_SIZE 16384
+#endif
+
+/* The state buf must be large enough to hold one state per character in the main buffer.
+ */
+#define YY_STATE_BUF_SIZE   ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+extern int lexdp2leng;
+
+extern FILE *lexdp2in, *lexdp2out;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+    #define YY_LESS_LINENO(n)
+    
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+	do \
+		{ \
+		/* Undo effects of setting up lexdp2text. */ \
+        int yyless_macro_arg = (n); \
+        YY_LESS_LINENO(yyless_macro_arg);\
+		*yy_cp = (yy_hold_char); \
+		YY_RESTORE_YY_MORE_OFFSET \
+		(yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+		YY_DO_BEFORE_ACTION; /* set up lexdp2text again */ \
+		} \
+	while ( 0 )
+
+#define unput(c) yyunput( c, (yytext_ptr)  )
+
+/* The following is because we cannot portably get our hands on size_t
+ * (without autoconf's help, which isn't available because we want
+ * flex-generated scanners to compile on their own).
+ */
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef unsigned int yy_size_t;
+#endif
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+	{
+	FILE *yy_input_file;
+
+	char *yy_ch_buf;		/* input buffer */
+	char *yy_buf_pos;		/* current position in input buffer */
+
+	/* Size of input buffer in bytes, not including room for EOB
+	 * characters.
+	 */
+	yy_size_t yy_buf_size;
+
+	/* Number of characters read into yy_ch_buf, not including EOB
+	 * characters.
+	 */
+	int yy_n_chars;
+
+	/* Whether we "own" the buffer - i.e., we know we created it,
+	 * and can realloc() it to grow it, and should free() it to
+	 * delete it.
+	 */
+	int yy_is_our_buffer;
+
+	/* Whether this is an "interactive" input source; if so, and
+	 * if we're using stdio for input, then we want to use getc()
+	 * instead of fread(), to make sure we stop fetching input after
+	 * each newline.
+	 */
+	int yy_is_interactive;
+
+	/* Whether we're considered to be at the beginning of a line.
+	 * If so, '^' rules will be active on the next match, otherwise
+	 * not.
+	 */
+	int yy_at_bol;
+
+    int yy_bs_lineno; /**< The line count. */
+    int yy_bs_column; /**< The column count. */
+    
+	/* Whether to try to fill the input buffer when we reach the
+	 * end of it.
+	 */
+	int yy_fill_buffer;
+
+	int yy_buffer_status;
+
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+	/* When an EOF's been seen but there's still some text to process
+	 * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+	 * shouldn't try reading from the input source any more.  We might
+	 * still have a bunch of tokens to match, though, because of
+	 * possible backing-up.
+	 *
+	 * When we actually see the EOF, we change the status to "new"
+	 * (via lexdp2restart()), so that the user can continue scanning by
+	 * just pointing lexdp2in at a new input file.
+	 */
+#define YY_BUFFER_EOF_PENDING 2
+
+	};
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* Stack of input buffers. */
+static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
+static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
+static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
+                          ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
+                          : NULL)
+
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
+
+/* yy_hold_char holds the character lost when lexdp2text is formed. */
+static char yy_hold_char;
+static int yy_n_chars;		/* number of characters read into yy_ch_buf */
+int lexdp2leng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 0;		/* whether we need to initialize */
+static int yy_start = 0;	/* start state number */
+
+/* Flag which is used to allow lexdp2wrap()'s to do buffer switches
+ * instead of setting up a fresh lexdp2in.  A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void lexdp2restart (FILE *input_file  );
+void lexdp2_switch_to_buffer (YY_BUFFER_STATE new_buffer  );
+YY_BUFFER_STATE lexdp2_create_buffer (FILE *file,int size  );
+void lexdp2_delete_buffer (YY_BUFFER_STATE b  );
+void lexdp2_flush_buffer (YY_BUFFER_STATE b  );
+void lexdp2push_buffer_state (YY_BUFFER_STATE new_buffer  );
+void lexdp2pop_buffer_state (void );
+
+static void lexdp2ensure_buffer_stack (void );
+static void lexdp2_load_buffer_state (void );
+static void lexdp2_init_buffer (YY_BUFFER_STATE b,FILE *file  );
+
+#define YY_FLUSH_BUFFER lexdp2_flush_buffer(YY_CURRENT_BUFFER )
+
+YY_BUFFER_STATE lexdp2_scan_buffer (char *base,yy_size_t size  );
+YY_BUFFER_STATE lexdp2_scan_string (yyconst char *yy_str  );
+YY_BUFFER_STATE lexdp2_scan_bytes (yyconst char *bytes,int len  );
+
+void *lexdp2alloc (yy_size_t  );
+void *lexdp2realloc (void *,yy_size_t  );
+void lexdp2free (void *  );
+
+#define yy_new_buffer lexdp2_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+	{ \
+	if ( ! YY_CURRENT_BUFFER ){ \
+        lexdp2ensure_buffer_stack (); \
+		YY_CURRENT_BUFFER_LVALUE =    \
+            lexdp2_create_buffer(lexdp2in,YY_BUF_SIZE ); \
+	} \
+	YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+	}
+
+#define yy_set_bol(at_bol) \
+	{ \
+	if ( ! YY_CURRENT_BUFFER ){\
+        lexdp2ensure_buffer_stack (); \
+		YY_CURRENT_BUFFER_LVALUE =    \
+            lexdp2_create_buffer(lexdp2in,YY_BUF_SIZE ); \
+	} \
+	YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+	}
+
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+/* Begin user sect3 */
+
+#define lexdp2wrap(n) 1
+#define YY_SKIP_YYWRAP
+
+typedef unsigned char YY_CHAR;
+
+FILE *lexdp2in = (FILE *) 0, *lexdp2out = (FILE *) 0;
+
+typedef int yy_state_type;
+
+extern int lexdp2lineno;
+
+int lexdp2lineno = 1;
+
+extern char *lexdp2text;
+#define yytext_ptr lexdp2text
+
+static yy_state_type yy_get_previous_state (void );
+static yy_state_type yy_try_NUL_trans (yy_state_type current_state  );
+static int yy_get_next_buffer (void );
+static void yy_fatal_error (yyconst char msg[]  );
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up lexdp2text.
+ */
+#define YY_DO_BEFORE_ACTION \
+	(yytext_ptr) = yy_bp; \
+	lexdp2leng = (size_t) (yy_cp - yy_bp); \
+	(yy_hold_char) = *yy_cp; \
+	*yy_cp = '\0'; \
+	(yy_c_buf_p) = yy_cp;
+
+#define YY_NUM_RULES 10
+#define YY_END_OF_BUFFER 11
+/* This struct is not used in this scanner,
+   but its presence is necessary. */
+struct yy_trans_info
+	{
+	flex_int32_t yy_verify;
+	flex_int32_t yy_nxt;
+	};
+static yyconst flex_int16_t yy_accept[39] =
+    {   0,
+        0,    0,   11,    9,    8,    9,    8,    9,    9,    9,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    1,    3,    2,    0,    0,    0,    0,    0,
+        0,    5,    0,    7,    0,    4,    6,    0
+    } ;
+
+static yyconst flex_int32_t yy_ec[256] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    2,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    4,
+        5,    6,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    7,
+
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1
+    } ;
+
+static yyconst flex_int32_t yy_meta[8] =
+    {   0,
+        1,    1,    1,    2,    3,    2,    1
+    } ;
+
+static yyconst flex_int16_t yy_base[48] =
+    {   0,
+       39,    0,   41,   43,   43,    4,    7,    0,    0,    0,
+        0,   12,   18,   37,   36,   29,    0,    0,   24,    0,
+        0,   27,    0,    0,    0,   28,    0,    0,   27,    0,
+        0,    0,   24,    0,   20,    0,    0,   43,   33,   36,
+       21,   20,   17,   16,   14,   11,    8
+    } ;
+
+static yyconst flex_int16_t yy_def[48] =
+    {   0,
+       39,   38,   38,   38,   38,   40,   40,   41,   42,   43,
+        7,   38,   38,   41,   42,   43,   12,   44,   38,   13,
+       45,   38,   14,   15,   16,   44,   19,   46,   45,   22,
+       47,   26,   46,   29,   47,   33,   35,    0,   38,   38,
+       38,   38,   38,   38,   38,   38,   38
+    } ;
+
+static yyconst flex_int16_t yy_nxt[51] =
+    {   0,
+        6,    6,    7,    8,    9,   10,    6,   12,   35,   13,
+       12,   33,   13,   17,   29,   18,   26,   16,   19,   20,
+       15,   14,   37,   21,   22,   27,   36,   28,   30,   34,
+       32,   25,   31,    4,    4,    4,   11,   11,   24,   23,
+       38,    5,    3,   38,   38,   38,   38,   38,   38,   38
+    } ;
+
+static yyconst flex_int16_t yy_chk[51] =
+    {   0,
+        2,    2,    2,    2,    2,    2,    2,    6,   47,    6,
+        7,   46,    7,   12,   45,   12,   44,   43,   12,   13,
+       42,   41,   35,   13,   13,   19,   33,   19,   22,   29,
+       26,   16,   22,   39,   39,   39,   40,   40,   15,   14,
+        3,    1,   38,   38,   38,   38,   38,   38,   38,   38
+    } ;
+
+static yy_state_type yy_last_accepting_state;
+static char *yy_last_accepting_cpos;
+
+extern int lexdp2_flex_debug;
+int lexdp2_flex_debug = 0;
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *lexdp2text;
+#line 1 "date_parser2.l"
+/* -*- mode: c -*-
+|
+|  Copyright (C) 2002-2007 Jorg Schuler <jcsjcs at users.sourceforge.net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://gtkpod.sourceforge.net/
+| 
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+| 
+|  iTunes and iPod are trademarks of Apple
+| 
+|  This product is not supported/written/published by Apple!
+*/
+#line 28 "date_parser2.l"
+#include <stdlib.h>
+#include <string.h>
+#include "date_parser.h"
+#include "misc.h"
+#include "itdb.h"
+/* Will be set to TRUE if error occurred */
+    static gboolean dp_error;
+/* Will be set to TRUE if construct (< date, = date...) was not
+   recognized */
+    static gboolean dp_construct_error;
+/* Variable to hold lower and upper limit */
+    static time_t lower_stamp, upper_stamp;
+/* Pointer to input string to be parsed */
+    static gchar *dp_strp = NULL;
+/* type of interval */
+    typedef enum {
+	INT_NORMAL=0,    /* normal interval */
+	INT_NO_LOWER=2,  /* interval with no lower limit */
+	INT_NO_UPPER=4,  /* interval with no upper limit */
+    } IntervalType;
+    static IntervalType dp_int_type;
+/* We don't read from a stream but from a string buffer. This macro
+   will copy a maximum of @max_size chars from dp_strp to @buf,
+   writing the number of chars copied into @result. If no characters
+   are copied, YY_NULL is written into @result. */
+#define YY_INPUT(buf,result,max_size) \
+    { \
+    if (!dp_strp || !dp_strp[0]) result = YY_NULL; \
+    else \
+      { \
+        gint i; \
+        for (i=0; (i<max_size && *dp_strp); ++i)  buf[i] = *dp_strp++; \
+        result = i; \
+      } \
+    }
+    static void dp_ll (gchar *str);
+    static void dp_LL (gchar *str);
+/* stop parsing after end of string is reached */
+/* avoid compiler warning: `yyunput' defined but not used */
+/* We have several parsers in one executable, so we must use the
+   prefix option to avoid name space clashes. Note that this only
+   works with flex, but not with lex. */
+/* Unfortunately, the prefix option also changes the output filename
+   and thereby breaks the automake script. Therefore I define the
+   output filename here. However, this is not portable -- on other
+   systems the default output filename expected by the automake
+   scripts may be lexyy.c or similar. To make the code portable again
+   (hopefully), I also define "LEX_OUTPUT_ROOT = lex.yy" in
+   Makefile.am */
+#line 570 "date_parser2.c"
+
+#define INITIAL 0
+
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#include <unistd.h>
+#endif
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
+
+static int yy_init_globals (void );
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int lexdp2wrap (void );
+#else
+extern int lexdp2wrap (void );
+#endif
+#endif
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char *,yyconst char *,int );
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * );
+#endif
+
+#ifndef YY_NO_INPUT
+
+#ifdef __cplusplus
+static int yyinput (void );
+#else
+static int input (void );
+#endif
+
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 8192
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO (void) fwrite( lexdp2text, lexdp2leng, 1, lexdp2out )
+#endif
+
+/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+	if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
+		{ \
+		int c = '*'; \
+		size_t n; \
+		for ( n = 0; n < max_size && \
+			     (c = getc( lexdp2in )) != EOF && c != '\n'; ++n ) \
+			buf[n] = (char) c; \
+		if ( c == '\n' ) \
+			buf[n++] = (char) c; \
+		if ( c == EOF && ferror( lexdp2in ) ) \
+			YY_FATAL_ERROR( "input in flex scanner failed" ); \
+		result = n; \
+		} \
+	else \
+		{ \
+		errno=0; \
+		while ( (result = fread(buf, 1, max_size, lexdp2in))==0 && ferror(lexdp2in)) \
+			{ \
+			if( errno != EINTR) \
+				{ \
+				YY_FATAL_ERROR( "input in flex scanner failed" ); \
+				break; \
+				} \
+			errno=0; \
+			clearerr(lexdp2in); \
+			} \
+		}\
+\
+
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* end tables serialization structures and prototypes */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL_IS_OURS 1
+
+extern int lexdp2lex (void);
+
+#define YY_DECL int lexdp2lex (void)
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after lexdp2text and lexdp2leng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+	if ( lexdp2leng > 0 ) \
+		YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \
+				(lexdp2text[lexdp2leng - 1] == '\n'); \
+	YY_USER_ACTION
+
+/** The main scanner function which does all the work.
+ */
+YY_DECL
+{
+	register yy_state_type yy_current_state;
+	register char *yy_cp, *yy_bp;
+	register int yy_act;
+    
+#line 87 "date_parser2.l"
+
+
+#line 727 "date_parser2.c"
+
+	if ( !(yy_init) )
+		{
+		(yy_init) = 1;
+
+#ifdef YY_USER_INIT
+		YY_USER_INIT;
+#endif
+
+		if ( ! (yy_start) )
+			(yy_start) = 1;	/* first start state */
+
+		if ( ! lexdp2in )
+			lexdp2in = stdin;
+
+		if ( ! lexdp2out )
+			lexdp2out = stdout;
+
+		if ( ! YY_CURRENT_BUFFER ) {
+			lexdp2ensure_buffer_stack ();
+			YY_CURRENT_BUFFER_LVALUE =
+				lexdp2_create_buffer(lexdp2in,YY_BUF_SIZE );
+		}
+
+		lexdp2_load_buffer_state( );
+		}
+
+	while ( 1 )		/* loops until end-of-file is reached */
+		{
+		yy_cp = (yy_c_buf_p);
+
+		/* Support of lexdp2text. */
+		*yy_cp = (yy_hold_char);
+
+		/* yy_bp points to the position in yy_ch_buf of the start of
+		 * the current run.
+		 */
+		yy_bp = yy_cp;
+
+		yy_current_state = (yy_start);
+		yy_current_state += YY_AT_BOL();
+yy_match:
+		do
+			{
+			register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+			if ( yy_accept[yy_current_state] )
+				{
+				(yy_last_accepting_state) = yy_current_state;
+				(yy_last_accepting_cpos) = yy_cp;
+				}
+			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+				{
+				yy_current_state = (int) yy_def[yy_current_state];
+				if ( yy_current_state >= 39 )
+					yy_c = yy_meta[(unsigned int) yy_c];
+				}
+			yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+			++yy_cp;
+			}
+		while ( yy_base[yy_current_state] != 43 );
+
+yy_find_action:
+		yy_act = yy_accept[yy_current_state];
+		if ( yy_act == 0 )
+			{ /* have to back up */
+			yy_cp = (yy_last_accepting_cpos);
+			yy_current_state = (yy_last_accepting_state);
+			yy_act = yy_accept[yy_current_state];
+			}
+
+		YY_DO_BEFORE_ACTION;
+
+do_action:	/* This label is used only to access EOF actions. */
+
+		switch ( yy_act )
+	{ /* beginning of action switch */
+			case 0: /* must back up */
+			/* undo the effects of YY_DO_BEFORE_ACTION */
+			*yy_cp = (yy_hold_char);
+			yy_cp = (yy_last_accepting_cpos);
+			yy_current_state = (yy_last_accepting_state);
+			goto yy_find_action;
+
+case 1:
+/* rule 1 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up lexdp2text */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up lexdp2text again */
+YY_RULE_SETUP
+#line 89 "date_parser2.l"
+{
+    gchar *strp;
+#if DP_DEBUG
+    printf ("<: '%s'\n", lexdp2text);
+#endif
+    dp_int_type |= INT_NO_LOWER;
+    strp = strchr (lexdp2text, '<');
+    if (strp)  dp_error = !dp_parse (strp+1, &upper_stamp, FALSE, TRUE);
+    else       dp_error = TRUE;
+}
+	YY_BREAK
+case 2:
+/* rule 2 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up lexdp2text */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up lexdp2text again */
+YY_RULE_SETUP
+#line 100 "date_parser2.l"
+{
+    gchar *strp;
+#if DP_DEBUG
+    printf (">: '%s'\n", lexdp2text);
+#endif
+    dp_int_type |= INT_NO_UPPER;
+    strp = strchr (lexdp2text, '>');
+    if (strp) dp_error = !dp_parse (strp+1, &lower_stamp, TRUE, TRUE);
+    else      dp_error = TRUE;
+}
+	YY_BREAK
+case 3:
+/* rule 3 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up lexdp2text */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up lexdp2text again */
+YY_RULE_SETUP
+#line 111 "date_parser2.l"
+{
+    gchar *strp;
+#if DP_DEBUG
+    printf ("=: '%s'\n", lexdp2text);
+#endif
+    strp = strchr (lexdp2text, '=');
+    if (strp)
+    {
+	dp_error = !dp_parse (strp+1, &lower_stamp, TRUE, FALSE);
+	if (!dp_error)
+	    dp_error = !dp_parse (strp+1, &upper_stamp, FALSE, FALSE);
+    }
+    else      dp_error = TRUE;
+    
+}
+	YY_BREAK
+case 4:
+/* rule 4 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up lexdp2text */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up lexdp2text again */
+YY_RULE_SETUP
+#line 127 "date_parser2.l"
+{
+    dp_ll (lexdp2text);
+}
+	YY_BREAK
+case 5:
+/* rule 5 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up lexdp2text */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up lexdp2text again */
+YY_RULE_SETUP
+#line 131 "date_parser2.l"
+{
+    dp_ll (lexdp2text);
+}
+	YY_BREAK
+case 6:
+/* rule 6 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up lexdp2text */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up lexdp2text again */
+YY_RULE_SETUP
+#line 135 "date_parser2.l"
+{
+    dp_LL (lexdp2text);
+}
+	YY_BREAK
+case 7:
+/* rule 7 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up lexdp2text */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up lexdp2text again */
+YY_RULE_SETUP
+#line 139 "date_parser2.l"
+{
+    dp_LL (lexdp2text);
+}
+	YY_BREAK
+case 8:
+/* rule 8 can match eol */
+YY_RULE_SETUP
+#line 143 "date_parser2.l"
+/* ignore */
+	YY_BREAK
+case 9:
+YY_RULE_SETUP
+#line 145 "date_parser2.l"
+{
+    dp_error = TRUE;
+    dp_construct_error = TRUE;
+}
+	YY_BREAK
+case 10:
+YY_RULE_SETUP
+#line 150 "date_parser2.l"
+ECHO;
+	YY_BREAK
+#line 933 "date_parser2.c"
+case YY_STATE_EOF(INITIAL):
+	yyterminate();
+
+	case YY_END_OF_BUFFER:
+		{
+		/* Amount of text matched not including the EOB char. */
+		int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
+
+		/* Undo the effects of YY_DO_BEFORE_ACTION. */
+		*yy_cp = (yy_hold_char);
+		YY_RESTORE_YY_MORE_OFFSET
+
+		if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+			{
+			/* We're scanning a new file or input source.  It's
+			 * possible that this happened because the user
+			 * just pointed lexdp2in at a new source and called
+			 * lexdp2lex().  If so, then we have to assure
+			 * consistency between YY_CURRENT_BUFFER and our
+			 * globals.  Here is the right place to do so, because
+			 * this is the first action (other than possibly a
+			 * back-up) that will match for the new input source.
+			 */
+			(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+			YY_CURRENT_BUFFER_LVALUE->yy_input_file = lexdp2in;
+			YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+			}
+
+		/* Note that here we test for yy_c_buf_p "<=" to the position
+		 * of the first EOB in the buffer, since yy_c_buf_p will
+		 * already have been incremented past the NUL character
+		 * (since all states make transitions on EOB to the
+		 * end-of-buffer state).  Contrast this with the test
+		 * in input().
+		 */
+		if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+			{ /* This was really a NUL. */
+			yy_state_type yy_next_state;
+
+			(yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
+
+			yy_current_state = yy_get_previous_state(  );
+
+			/* Okay, we're now positioned to make the NUL
+			 * transition.  We couldn't have
+			 * yy_get_previous_state() go ahead and do it
+			 * for us because it doesn't know how to deal
+			 * with the possibility of jamming (and we don't
+			 * want to build jamming into it because then it
+			 * will run more slowly).
+			 */
+
+			yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+			yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+
+			if ( yy_next_state )
+				{
+				/* Consume the NUL. */
+				yy_cp = ++(yy_c_buf_p);
+				yy_current_state = yy_next_state;
+				goto yy_match;
+				}
+
+			else
+				{
+				yy_cp = (yy_c_buf_p);
+				goto yy_find_action;
+				}
+			}
+
+		else switch ( yy_get_next_buffer(  ) )
+			{
+			case EOB_ACT_END_OF_FILE:
+				{
+				(yy_did_buffer_switch_on_eof) = 0;
+
+				if ( lexdp2wrap( ) )
+					{
+					/* Note: because we've taken care in
+					 * yy_get_next_buffer() to have set up
+					 * lexdp2text, we can now set up
+					 * yy_c_buf_p so that if some total
+					 * hoser (like flex itself) wants to
+					 * call the scanner after we return the
+					 * YY_NULL, it'll still work - another
+					 * YY_NULL will get returned.
+					 */
+					(yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
+
+					yy_act = YY_STATE_EOF(YY_START);
+					goto do_action;
+					}
+
+				else
+					{
+					if ( ! (yy_did_buffer_switch_on_eof) )
+						YY_NEW_FILE;
+					}
+				break;
+				}
+
+			case EOB_ACT_CONTINUE_SCAN:
+				(yy_c_buf_p) =
+					(yytext_ptr) + yy_amount_of_matched_text;
+
+				yy_current_state = yy_get_previous_state(  );
+
+				yy_cp = (yy_c_buf_p);
+				yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+				goto yy_match;
+
+			case EOB_ACT_LAST_MATCH:
+				(yy_c_buf_p) =
+				&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
+
+				yy_current_state = yy_get_previous_state(  );
+
+				yy_cp = (yy_c_buf_p);
+				yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+				goto yy_find_action;
+			}
+		break;
+		}
+
+	default:
+		YY_FATAL_ERROR(
+			"fatal flex scanner internal error--no action found" );
+	} /* end of action switch */
+		} /* end of scanning one token */
+} /* end of lexdp2lex */
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ *	EOB_ACT_LAST_MATCH -
+ *	EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ *	EOB_ACT_END_OF_FILE - end of file
+ */
+static int yy_get_next_buffer (void)
+{
+    	register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+	register char *source = (yytext_ptr);
+	register int number_to_move, i;
+	int ret_val;
+
+	if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
+		YY_FATAL_ERROR(
+		"fatal flex scanner internal error--end of buffer missed" );
+
+	if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+		{ /* Don't try to fill the buffer, so this is an EOF. */
+		if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
+			{
+			/* We matched a single character, the EOB, so
+			 * treat this as a final EOF.
+			 */
+			return EOB_ACT_END_OF_FILE;
+			}
+
+		else
+			{
+			/* We matched some text prior to the EOB, first
+			 * process it.
+			 */
+			return EOB_ACT_LAST_MATCH;
+			}
+		}
+
+	/* Try to read more data. */
+
+	/* First move last chars to start of buffer. */
+	number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
+
+	for ( i = 0; i < number_to_move; ++i )
+		*(dest++) = *(source++);
+
+	if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+		/* don't do the read, it's not guaranteed to return an EOF,
+		 * just force an EOF
+		 */
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
+
+	else
+		{
+			int num_to_read =
+			YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+		while ( num_to_read <= 0 )
+			{ /* Not enough room in the buffer - grow it. */
+
+			/* just a shorter name for the current buffer */
+			YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
+
+			int yy_c_buf_p_offset =
+				(int) ((yy_c_buf_p) - b->yy_ch_buf);
+
+			if ( b->yy_is_our_buffer )
+				{
+				int new_size = b->yy_buf_size * 2;
+
+				if ( new_size <= 0 )
+					b->yy_buf_size += b->yy_buf_size / 8;
+				else
+					b->yy_buf_size *= 2;
+
+				b->yy_ch_buf = (char *)
+					/* Include room in for 2 EOB chars. */
+					lexdp2realloc((void *) b->yy_ch_buf,b->yy_buf_size + 2  );
+				}
+			else
+				/* Can't grow it, we don't own it. */
+				b->yy_ch_buf = 0;
+
+			if ( ! b->yy_ch_buf )
+				YY_FATAL_ERROR(
+				"fatal error - scanner input buffer overflow" );
+
+			(yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+			num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
+						number_to_move - 1;
+
+			}
+
+		if ( num_to_read > YY_READ_BUF_SIZE )
+			num_to_read = YY_READ_BUF_SIZE;
+
+		/* Read in more data. */
+		YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+			(yy_n_chars), num_to_read );
+
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+		}
+
+	if ( (yy_n_chars) == 0 )
+		{
+		if ( number_to_move == YY_MORE_ADJ )
+			{
+			ret_val = EOB_ACT_END_OF_FILE;
+			lexdp2restart(lexdp2in  );
+			}
+
+		else
+			{
+			ret_val = EOB_ACT_LAST_MATCH;
+			YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+				YY_BUFFER_EOF_PENDING;
+			}
+		}
+
+	else
+		ret_val = EOB_ACT_CONTINUE_SCAN;
+
+	(yy_n_chars) += number_to_move;
+	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
+	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
+
+	(yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+
+	return ret_val;
+}
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+    static yy_state_type yy_get_previous_state (void)
+{
+	register yy_state_type yy_current_state;
+	register char *yy_cp;
+    
+	yy_current_state = (yy_start);
+	yy_current_state += YY_AT_BOL();
+
+	for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
+		{
+		register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+		if ( yy_accept[yy_current_state] )
+			{
+			(yy_last_accepting_state) = yy_current_state;
+			(yy_last_accepting_cpos) = yy_cp;
+			}
+		while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+			{
+			yy_current_state = (int) yy_def[yy_current_state];
+			if ( yy_current_state >= 39 )
+				yy_c = yy_meta[(unsigned int) yy_c];
+			}
+		yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+		}
+
+	return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ *	next_state = yy_try_NUL_trans( current_state );
+ */
+    static yy_state_type yy_try_NUL_trans  (yy_state_type yy_current_state )
+{
+	register int yy_is_jam;
+    	register char *yy_cp = (yy_c_buf_p);
+
+	register YY_CHAR yy_c = 1;
+	if ( yy_accept[yy_current_state] )
+		{
+		(yy_last_accepting_state) = yy_current_state;
+		(yy_last_accepting_cpos) = yy_cp;
+		}
+	while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+		{
+		yy_current_state = (int) yy_def[yy_current_state];
+		if ( yy_current_state >= 39 )
+			yy_c = yy_meta[(unsigned int) yy_c];
+		}
+	yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+	yy_is_jam = (yy_current_state == 38);
+
+	return yy_is_jam ? 0 : yy_current_state;
+}
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+    static int yyinput (void)
+#else
+    static int input  (void)
+#endif
+
+{
+	int c;
+    
+	*(yy_c_buf_p) = (yy_hold_char);
+
+	if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
+		{
+		/* yy_c_buf_p now points to the character we want to return.
+		 * If this occurs *before* the EOB characters, then it's a
+		 * valid NUL; if not, then we've hit the end of the buffer.
+		 */
+		if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+			/* This was really a NUL. */
+			*(yy_c_buf_p) = '\0';
+
+		else
+			{ /* need more input */
+			int offset = (yy_c_buf_p) - (yytext_ptr);
+			++(yy_c_buf_p);
+
+			switch ( yy_get_next_buffer(  ) )
+				{
+				case EOB_ACT_LAST_MATCH:
+					/* This happens because yy_g_n_b()
+					 * sees that we've accumulated a
+					 * token and flags that we need to
+					 * try matching the token before
+					 * proceeding.  But for input(),
+					 * there's no matching to consider.
+					 * So convert the EOB_ACT_LAST_MATCH
+					 * to EOB_ACT_END_OF_FILE.
+					 */
+
+					/* Reset buffer status. */
+					lexdp2restart(lexdp2in );
+
+					/*FALLTHROUGH*/
+
+				case EOB_ACT_END_OF_FILE:
+					{
+					if ( lexdp2wrap( ) )
+						return EOF;
+
+					if ( ! (yy_did_buffer_switch_on_eof) )
+						YY_NEW_FILE;
+#ifdef __cplusplus
+					return yyinput();
+#else
+					return input();
+#endif
+					}
+
+				case EOB_ACT_CONTINUE_SCAN:
+					(yy_c_buf_p) = (yytext_ptr) + offset;
+					break;
+				}
+			}
+		}
+
+	c = *(unsigned char *) (yy_c_buf_p);	/* cast for 8-bit char's */
+	*(yy_c_buf_p) = '\0';	/* preserve lexdp2text */
+	(yy_hold_char) = *++(yy_c_buf_p);
+
+	YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n');
+
+	return c;
+}
+#endif	/* ifndef YY_NO_INPUT */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ * 
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+    void lexdp2restart  (FILE * input_file )
+{
+    
+	if ( ! YY_CURRENT_BUFFER ){
+        lexdp2ensure_buffer_stack ();
+		YY_CURRENT_BUFFER_LVALUE =
+            lexdp2_create_buffer(lexdp2in,YY_BUF_SIZE );
+	}
+
+	lexdp2_init_buffer(YY_CURRENT_BUFFER,input_file );
+	lexdp2_load_buffer_state( );
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ * 
+ */
+    void lexdp2_switch_to_buffer  (YY_BUFFER_STATE  new_buffer )
+{
+    
+	/* TODO. We should be able to replace this entire function body
+	 * with
+	 *		lexdp2pop_buffer_state();
+	 *		lexdp2push_buffer_state(new_buffer);
+     */
+	lexdp2ensure_buffer_stack ();
+	if ( YY_CURRENT_BUFFER == new_buffer )
+		return;
+
+	if ( YY_CURRENT_BUFFER )
+		{
+		/* Flush out information for old buffer. */
+		*(yy_c_buf_p) = (yy_hold_char);
+		YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+		}
+
+	YY_CURRENT_BUFFER_LVALUE = new_buffer;
+	lexdp2_load_buffer_state( );
+
+	/* We don't actually know whether we did this switch during
+	 * EOF (lexdp2wrap()) processing, but the only time this flag
+	 * is looked at is after lexdp2wrap() is called, so it's safe
+	 * to go ahead and always set it.
+	 */
+	(yy_did_buffer_switch_on_eof) = 1;
+}
+
+static void lexdp2_load_buffer_state  (void)
+{
+    	(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+	(yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+	lexdp2in = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+	(yy_hold_char) = *(yy_c_buf_p);
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ * 
+ * @return the allocated buffer state.
+ */
+    YY_BUFFER_STATE lexdp2_create_buffer  (FILE * file, int  size )
+{
+	YY_BUFFER_STATE b;
+    
+	b = (YY_BUFFER_STATE) lexdp2alloc(sizeof( struct yy_buffer_state )  );
+	if ( ! b )
+		YY_FATAL_ERROR( "out of dynamic memory in lexdp2_create_buffer()" );
+
+	b->yy_buf_size = size;
+
+	/* yy_ch_buf has to be 2 characters longer than the size given because
+	 * we need to put in 2 end-of-buffer characters.
+	 */
+	b->yy_ch_buf = (char *) lexdp2alloc(b->yy_buf_size + 2  );
+	if ( ! b->yy_ch_buf )
+		YY_FATAL_ERROR( "out of dynamic memory in lexdp2_create_buffer()" );
+
+	b->yy_is_our_buffer = 1;
+
+	lexdp2_init_buffer(b,file );
+
+	return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with lexdp2_create_buffer()
+ * 
+ */
+    void lexdp2_delete_buffer (YY_BUFFER_STATE  b )
+{
+    
+	if ( ! b )
+		return;
+
+	if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+		YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+
+	if ( b->yy_is_our_buffer )
+		lexdp2free((void *) b->yy_ch_buf  );
+
+	lexdp2free((void *) b  );
+}
+
+#ifndef __cplusplus
+extern int isatty (int );
+#endif /* __cplusplus */
+    
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a lexdp2restart() or at EOF.
+ */
+    static void lexdp2_init_buffer  (YY_BUFFER_STATE  b, FILE * file )
+
+{
+	int oerrno = errno;
+    
+	lexdp2_flush_buffer(b );
+
+	b->yy_input_file = file;
+	b->yy_fill_buffer = 1;
+
+    /* If b is the current buffer, then lexdp2_init_buffer was _probably_
+     * called from lexdp2restart() or through yy_get_next_buffer.
+     * In that case, we don't want to reset the lineno or column.
+     */
+    if (b != YY_CURRENT_BUFFER){
+        b->yy_bs_lineno = 1;
+        b->yy_bs_column = 0;
+    }
+
+        b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+    
+	errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ * 
+ */
+    void lexdp2_flush_buffer (YY_BUFFER_STATE  b )
+{
+    	if ( ! b )
+		return;
+
+	b->yy_n_chars = 0;
+
+	/* We always need two end-of-buffer characters.  The first causes
+	 * a transition to the end-of-buffer state.  The second causes
+	 * a jam in that state.
+	 */
+	b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+	b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+	b->yy_buf_pos = &b->yy_ch_buf[0];
+
+	b->yy_at_bol = 1;
+	b->yy_buffer_status = YY_BUFFER_NEW;
+
+	if ( b == YY_CURRENT_BUFFER )
+		lexdp2_load_buffer_state( );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ *  the current state. This function will allocate the stack
+ *  if necessary.
+ *  @param new_buffer The new state.
+ *  
+ */
+void lexdp2push_buffer_state (YY_BUFFER_STATE new_buffer )
+{
+    	if (new_buffer == NULL)
+		return;
+
+	lexdp2ensure_buffer_stack();
+
+	/* This block is copied from lexdp2_switch_to_buffer. */
+	if ( YY_CURRENT_BUFFER )
+		{
+		/* Flush out information for old buffer. */
+		*(yy_c_buf_p) = (yy_hold_char);
+		YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+		}
+
+	/* Only push if top exists. Otherwise, replace top. */
+	if (YY_CURRENT_BUFFER)
+		(yy_buffer_stack_top)++;
+	YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+	/* copied from lexdp2_switch_to_buffer. */
+	lexdp2_load_buffer_state( );
+	(yy_did_buffer_switch_on_eof) = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ *  The next element becomes the new top.
+ *  
+ */
+void lexdp2pop_buffer_state (void)
+{
+    	if (!YY_CURRENT_BUFFER)
+		return;
+
+	lexdp2_delete_buffer(YY_CURRENT_BUFFER );
+	YY_CURRENT_BUFFER_LVALUE = NULL;
+	if ((yy_buffer_stack_top) > 0)
+		--(yy_buffer_stack_top);
+
+	if (YY_CURRENT_BUFFER) {
+		lexdp2_load_buffer_state( );
+		(yy_did_buffer_switch_on_eof) = 1;
+	}
+}
+
+/* Allocates the stack if it does not exist.
+ *  Guarantees space for at least one push.
+ */
+static void lexdp2ensure_buffer_stack (void)
+{
+	int num_to_alloc;
+    
+	if (!(yy_buffer_stack)) {
+
+		/* First allocation is just for 2 elements, since we don't know if this
+		 * scanner will even need a stack. We use 2 instead of 1 to avoid an
+		 * immediate realloc on the next call.
+         */
+		num_to_alloc = 1;
+		(yy_buffer_stack) = (struct yy_buffer_state**)lexdp2alloc
+								(num_to_alloc * sizeof(struct yy_buffer_state*)
+								);
+		
+		memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+				
+		(yy_buffer_stack_max) = num_to_alloc;
+		(yy_buffer_stack_top) = 0;
+		return;
+	}
+
+	if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
+
+		/* Increase the buffer to prepare for a possible push. */
+		int grow_size = 8 /* arbitrary grow size */;
+
+		num_to_alloc = (yy_buffer_stack_max) + grow_size;
+		(yy_buffer_stack) = (struct yy_buffer_state**)lexdp2realloc
+								((yy_buffer_stack),
+								num_to_alloc * sizeof(struct yy_buffer_state*)
+								);
+
+		/* zero only the new slots.*/
+		memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
+		(yy_buffer_stack_max) = num_to_alloc;
+	}
+}
+
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ * 
+ * @return the newly allocated buffer state object. 
+ */
+YY_BUFFER_STATE lexdp2_scan_buffer  (char * base, yy_size_t  size )
+{
+	YY_BUFFER_STATE b;
+    
+	if ( size < 2 ||
+	     base[size-2] != YY_END_OF_BUFFER_CHAR ||
+	     base[size-1] != YY_END_OF_BUFFER_CHAR )
+		/* They forgot to leave room for the EOB's. */
+		return 0;
+
+	b = (YY_BUFFER_STATE) lexdp2alloc(sizeof( struct yy_buffer_state )  );
+	if ( ! b )
+		YY_FATAL_ERROR( "out of dynamic memory in lexdp2_scan_buffer()" );
+
+	b->yy_buf_size = size - 2;	/* "- 2" to take care of EOB's */
+	b->yy_buf_pos = b->yy_ch_buf = base;
+	b->yy_is_our_buffer = 0;
+	b->yy_input_file = 0;
+	b->yy_n_chars = b->yy_buf_size;
+	b->yy_is_interactive = 0;
+	b->yy_at_bol = 1;
+	b->yy_fill_buffer = 0;
+	b->yy_buffer_status = YY_BUFFER_NEW;
+
+	lexdp2_switch_to_buffer(b  );
+
+	return b;
+}
+
+/** Setup the input buffer state to scan a string. The next call to lexdp2lex() will
+ * scan from a @e copy of @a str.
+ * @param str a NUL-terminated string to scan
+ * 
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ *       lexdp2_scan_bytes() instead.
+ */
+YY_BUFFER_STATE lexdp2_scan_string (yyconst char * yystr )
+{
+    
+	return lexdp2_scan_bytes(yystr,strlen(yystr) );
+}
+
+/** Setup the input buffer state to scan the given bytes. The next call to lexdp2lex() will
+ * scan from a @e copy of @a bytes.
+ * @param bytes the byte buffer to scan
+ * @param len the number of bytes in the buffer pointed to by @a bytes.
+ * 
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE lexdp2_scan_bytes  (yyconst char * yybytes, int  _yybytes_len )
+{
+	YY_BUFFER_STATE b;
+	char *buf;
+	yy_size_t n;
+	int i;
+    
+	/* Get memory for full buffer, including space for trailing EOB's. */
+	n = _yybytes_len + 2;
+	buf = (char *) lexdp2alloc(n  );
+	if ( ! buf )
+		YY_FATAL_ERROR( "out of dynamic memory in lexdp2_scan_bytes()" );
+
+	for ( i = 0; i < _yybytes_len; ++i )
+		buf[i] = yybytes[i];
+
+	buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
+
+	b = lexdp2_scan_buffer(buf,n );
+	if ( ! b )
+		YY_FATAL_ERROR( "bad buffer in lexdp2_scan_bytes()" );
+
+	/* It's okay to grow etc. this buffer, and we should throw it
+	 * away when we're done.
+	 */
+	b->yy_is_our_buffer = 1;
+
+	return b;
+}
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+static void yy_fatal_error (yyconst char* msg )
+{
+    	(void) fprintf( stderr, "%s\n", msg );
+	exit( YY_EXIT_FAILURE );
+}
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+	do \
+		{ \
+		/* Undo effects of setting up lexdp2text. */ \
+        int yyless_macro_arg = (n); \
+        YY_LESS_LINENO(yyless_macro_arg);\
+		lexdp2text[lexdp2leng] = (yy_hold_char); \
+		(yy_c_buf_p) = lexdp2text + yyless_macro_arg; \
+		(yy_hold_char) = *(yy_c_buf_p); \
+		*(yy_c_buf_p) = '\0'; \
+		lexdp2leng = yyless_macro_arg; \
+		} \
+	while ( 0 )
+
+/* Accessor  methods (get/set functions) to struct members. */
+
+/** Get the current line number.
+ * 
+ */
+int lexdp2get_lineno  (void)
+{
+        
+    return lexdp2lineno;
+}
+
+/** Get the input stream.
+ * 
+ */
+FILE *lexdp2get_in  (void)
+{
+        return lexdp2in;
+}
+
+/** Get the output stream.
+ * 
+ */
+FILE *lexdp2get_out  (void)
+{
+        return lexdp2out;
+}
+
+/** Get the length of the current token.
+ * 
+ */
+int lexdp2get_leng  (void)
+{
+        return lexdp2leng;
+}
+
+/** Get the current token.
+ * 
+ */
+
+char *lexdp2get_text  (void)
+{
+        return lexdp2text;
+}
+
+/** Set the current line number.
+ * @param line_number
+ * 
+ */
+void lexdp2set_lineno (int  line_number )
+{
+    
+    lexdp2lineno = line_number;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param in_str A readable stream.
+ * 
+ * @see lexdp2_switch_to_buffer
+ */
+void lexdp2set_in (FILE *  in_str )
+{
+        lexdp2in = in_str ;
+}
+
+void lexdp2set_out (FILE *  out_str )
+{
+        lexdp2out = out_str ;
+}
+
+int lexdp2get_debug  (void)
+{
+        return lexdp2_flex_debug;
+}
+
+void lexdp2set_debug (int  bdebug )
+{
+        lexdp2_flex_debug = bdebug ;
+}
+
+static int yy_init_globals (void)
+{
+        /* Initialization is the same as for the non-reentrant scanner.
+     * This function is called from lexdp2lex_destroy(), so don't allocate here.
+     */
+
+    (yy_buffer_stack) = 0;
+    (yy_buffer_stack_top) = 0;
+    (yy_buffer_stack_max) = 0;
+    (yy_c_buf_p) = (char *) 0;
+    (yy_init) = 0;
+    (yy_start) = 0;
+
+/* Defined in main.c */
+#ifdef YY_STDINIT
+    lexdp2in = stdin;
+    lexdp2out = stdout;
+#else
+    lexdp2in = (FILE *) 0;
+    lexdp2out = (FILE *) 0;
+#endif
+
+    /* For future reference: Set errno on error, since we are called by
+     * lexdp2lex_init()
+     */
+    return 0;
+}
+
+/* lexdp2lex_destroy is for both reentrant and non-reentrant scanners. */
+int lexdp2lex_destroy  (void)
+{
+    
+    /* Pop the buffer stack, destroying each element. */
+	while(YY_CURRENT_BUFFER){
+		lexdp2_delete_buffer(YY_CURRENT_BUFFER  );
+		YY_CURRENT_BUFFER_LVALUE = NULL;
+		lexdp2pop_buffer_state();
+	}
+
+	/* Destroy the stack itself. */
+	lexdp2free((yy_buffer_stack) );
+	(yy_buffer_stack) = NULL;
+
+    /* Reset the globals. This is important in a non-reentrant scanner so the next time
+     * lexdp2lex() is called, initialization will occur. */
+    yy_init_globals( );
+
+    return 0;
+}
+
+/*
+ * Internal utility routines.
+ */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
+{
+	register int i;
+	for ( i = 0; i < n; ++i )
+		s1[i] = s2[i];
+}
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * s )
+{
+	register int n;
+	for ( n = 0; s[n]; ++n )
+		;
+
+	return n;
+}
+#endif
+
+void *lexdp2alloc (yy_size_t  size )
+{
+	return (void *) malloc( size );
+}
+
+void *lexdp2realloc  (void * ptr, yy_size_t  size )
+{
+	/* The cast to (char *) in the following accommodates both
+	 * implementations that use char* generic pointers, and those
+	 * that use void* generic pointers.  It works with the latter
+	 * because both ANSI C and C++ allow castless assignment from
+	 * any pointer type to void*, and deal with argument conversions
+	 * as though doing an assignment.
+	 */
+	return (void *) realloc( (char *) ptr, size );
+}
+
+void lexdp2free (void * ptr )
+{
+	free( (char *) ptr );	/* see lexdp2realloc() for (char *) cast */
+}
+
+#define YYTABLES_NAME "yytables"
+
+#line 150 "date_parser2.l"
+
+
+
+
+/* pattern " < < " */
+static void dp_ll (gchar *str)
+{
+    gchar *strp;
+#if DP_DEBUG
+    printf ("<<: '%s'\n", lexdp2text);
+#endif
+    strp = strchr (str, '<');
+    if (strp)
+    {
+	*strp = 0;
+	dp_error = !dp_parse (str, &lower_stamp, TRUE, TRUE);
+	strp = strchr (strp+1, '<');
+	if (!dp_error && strp)
+	      dp_error = !dp_parse (strp+1, &upper_stamp, FALSE, TRUE);
+	else  dp_error = TRUE;
+    }
+    else  dp_error = TRUE;
+}
+
+
+/* pattern " > > " */
+static void dp_LL (gchar *str)
+{
+    gchar *strp;
+#if DP_DEBUG
+    printf (">>: '%s'\n", lexdp2text);
+#endif
+    strp = strchr (str, '>');
+    if (strp)
+    {
+	*strp = 0;
+	dp_error = !dp_parse (str, &upper_stamp, FALSE, TRUE);
+	strp = strchr (strp+1, '>');
+	if (!dp_error && strp)
+	      dp_error = !dp_parse (strp+1, &lower_stamp, TRUE, TRUE);
+	else  dp_error = TRUE;
+    }
+    else  dp_error = TRUE;
+}
+
+
+
+void dp2_parse (TimeInfo *ti)
+{
+    /* for the 'end of line ("$") rule to work, we need a "\n" at the
+       end of the string... */
+    gchar *str = g_strdup_printf ("%s\n", ti->int_str);
+    /* set string to parse */
+    dp_strp = str;
+    /* no error occurred (yet) */
+    dp_error = FALSE;
+    dp_construct_error = FALSE;
+    /* set interval type to normal */
+    dp_int_type = INT_NORMAL;
+    /* parse the string */
+    lexdp2lex ();
+    /* free memory */
+    g_free (str);
+    str = NULL;
+    /* print error message */
+    if (dp_construct_error)
+	gtkpod_warning ("Date parser: did not recognize construct:\n   '%s'\n",
+			ti->int_str);
+    if (dp_error)
+    {   /* error occurred -> invalidate TimeInfo */
+	ti->valid = FALSE;
+	ti->lower = 0;
+	ti->upper = 0;
+    }
+    else
+    {   /* no error occurred -> set the information accordingly */
+	ti->valid = TRUE;
+	if (dp_int_type & INT_NO_LOWER) ti->lower = 0;
+	else   	ti->lower = lower_stamp;
+	if (dp_int_type & INT_NO_UPPER) ti->upper = -1; /* -1 = 2^32-1 */
+	else    ti->upper = upper_stamp;
+    }
+#if DP_DEBUG
+    printf ("valid: %d, int_type: %d, lower: %u, upper: %u\n",
+	    ti->valid, dp_int_type, ti->lower, ti->upper);
+#endif
+}
+

Added: trunk/src/date_parser2.l
===================================================================
--- trunk/src/date_parser2.l	                        (rev 0)
+++ trunk/src/date_parser2.l	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,235 @@
+/* -*- mode: c -*-
+|
+|  Copyright (C) 2002-2007 Jorg Schuler <jcsjcs at users.sourceforge.net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://gtkpod.sourceforge.net/
+| 
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+| 
+|  iTunes and iPod are trademarks of Apple
+| 
+|  This product is not supported/written/published by Apple!
+*/
+
+%{
+#include <stdlib.h>
+#include <string.h>
+#include "date_parser.h"
+#include "misc.h"
+#include "itdb.h"
+/* Will be set to TRUE if error occurred */
+    static gboolean dp_error;
+/* Will be set to TRUE if construct (< date, = date...) was not
+   recognized */
+    static gboolean dp_construct_error;
+/* Variable to hold lower and upper limit */
+    static time_t lower_stamp, upper_stamp;
+/* Pointer to input string to be parsed */
+    static gchar *dp_strp = NULL;
+/* type of interval */
+    typedef enum {
+	INT_NORMAL=0,    /* normal interval */
+	INT_NO_LOWER=2,  /* interval with no lower limit */
+	INT_NO_UPPER=4,  /* interval with no upper limit */
+    } IntervalType;
+    static IntervalType dp_int_type;
+/* We don't read from a stream but from a string buffer. This macro
+   will copy a maximum of @max_size chars from dp_strp to @buf,
+   writing the number of chars copied into @result. If no characters
+   are copied, YY_NULL is written into @result. */
+#define YY_INPUT(buf,result,max_size) \
+    { \
+    if (!dp_strp || !dp_strp[0]) result = YY_NULL; \
+    else \
+      { \
+        gint i; \
+        for (i=0; (i<max_size && *dp_strp); ++i)  buf[i] = *dp_strp++; \
+        result = i; \
+      } \
+    }
+    static void dp_ll (gchar *str);
+    static void dp_LL (gchar *str);
+%}
+
+/* stop parsing after end of string is reached */
+%option noyywrap
+/* avoid compiler warning: `yyunput' defined but not used */
+%option nounput
+/* We have several parsers in one executable, so we must use the
+   prefix option to avoid name space clashes. Note that this only
+   works with flex, but not with lex. */
+%option prefix="lexdp2"
+/* Unfortunately, the prefix option also changes the output filename
+   and thereby breaks the automake script. Therefore I define the
+   output filename here. However, this is not portable -- on other
+   systems the default output filename expected by the automake
+   scripts may be lexyy.c or similar. To make the code portable again
+   (hopefully), I also define "LEX_OUTPUT_ROOT = lex.yy" in
+   Makefile.am */
+%option outfile="lex.yy.c"
+
+DATECHARS [^<>=]+
+
+
+%%
+
+^"<"{DATECHARS}$ {
+    gchar *strp;
+#if DP_DEBUG
+    printf ("<: '%s'\n", yytext);
+#endif
+    dp_int_type |= INT_NO_LOWER;
+    strp = strchr (yytext, '<');
+    if (strp)  dp_error = !dp_parse (strp+1, &upper_stamp, FALSE, TRUE);
+    else       dp_error = TRUE;
+}
+
+^">"{DATECHARS}$ {
+    gchar *strp;
+#if DP_DEBUG
+    printf (">: '%s'\n", yytext);
+#endif
+    dp_int_type |= INT_NO_UPPER;
+    strp = strchr (yytext, '>');
+    if (strp) dp_error = !dp_parse (strp+1, &lower_stamp, TRUE, TRUE);
+    else      dp_error = TRUE;
+}
+
+^"="{DATECHARS}$ {
+    gchar *strp;
+#if DP_DEBUG
+    printf ("=: '%s'\n", yytext);
+#endif
+    strp = strchr (yytext, '=');
+    if (strp)
+    {
+	dp_error = !dp_parse (strp+1, &lower_stamp, TRUE, FALSE);
+	if (!dp_error)
+	    dp_error = !dp_parse (strp+1, &upper_stamp, FALSE, FALSE);
+    }
+    else      dp_error = TRUE;
+    
+}
+
+^{DATECHARS}"<"[ \t]*"d"[ \t]*"<"{DATECHARS}$ {
+    dp_ll (yytext);
+}
+
+^{DATECHARS}"<"[ \t]*"<"{DATECHARS}$ {
+    dp_ll (yytext);
+}
+
+^{DATECHARS}">"[ \t]*"d"[ \t]*">"{DATECHARS}$ {
+    dp_LL (yytext);
+}
+
+^{DATECHARS}">"[ \t]*">"{DATECHARS}$ {
+    dp_LL (yytext);
+}
+
+[\n]        /* ignore */
+
+.           {
+    dp_error = TRUE;
+    dp_construct_error = TRUE;
+}
+
+%%
+
+
+/* pattern " < < " */
+static void dp_ll (gchar *str)
+{
+    gchar *strp;
+#if DP_DEBUG
+    printf ("<<: '%s'\n", yytext);
+#endif
+    strp = strchr (str, '<');
+    if (strp)
+    {
+	*strp = 0;
+	dp_error = !dp_parse (str, &lower_stamp, TRUE, TRUE);
+	strp = strchr (strp+1, '<');
+	if (!dp_error && strp)
+	      dp_error = !dp_parse (strp+1, &upper_stamp, FALSE, TRUE);
+	else  dp_error = TRUE;
+    }
+    else  dp_error = TRUE;
+}
+
+
+/* pattern " > > " */
+static void dp_LL (gchar *str)
+{
+    gchar *strp;
+#if DP_DEBUG
+    printf (">>: '%s'\n", yytext);
+#endif
+    strp = strchr (str, '>');
+    if (strp)
+    {
+	*strp = 0;
+	dp_error = !dp_parse (str, &upper_stamp, FALSE, TRUE);
+	strp = strchr (strp+1, '>');
+	if (!dp_error && strp)
+	      dp_error = !dp_parse (strp+1, &lower_stamp, TRUE, TRUE);
+	else  dp_error = TRUE;
+    }
+    else  dp_error = TRUE;
+}
+
+
+
+void dp2_parse (TimeInfo *ti)
+{
+    /* for the 'end of line ("$") rule to work, we need a "\n" at the
+       end of the string... */
+    gchar *str = g_strdup_printf ("%s\n", ti->int_str);
+    /* set string to parse */
+    dp_strp = str;
+    /* no error occurred (yet) */
+    dp_error = FALSE;
+    dp_construct_error = FALSE;
+    /* set interval type to normal */
+    dp_int_type = INT_NORMAL;
+    /* parse the string */
+    yylex ();
+    /* free memory */
+    g_free (str);
+    str = NULL;
+    /* print error message */
+    if (dp_construct_error)
+	gtkpod_warning ("Date parser: did not recognize construct:\n   '%s'\n",
+			ti->int_str);
+    if (dp_error)
+    {   /* error occurred -> invalidate TimeInfo */
+	ti->valid = FALSE;
+	ti->lower = 0;
+	ti->upper = 0;
+    }
+    else
+    {   /* no error occurred -> set the information accordingly */
+	ti->valid = TRUE;
+	if (dp_int_type & INT_NO_LOWER) ti->lower = 0;
+	else   	ti->lower = lower_stamp;
+	if (dp_int_type & INT_NO_UPPER) ti->upper = -1; /* -1 = 2^32-1 */
+	else    ti->upper = upper_stamp;
+    }
+#if DP_DEBUG
+    printf ("valid: %d, int_type: %d, lower: %u, upper: %u\n",
+	    ti->valid, dp_int_type, ti->lower, ti->upper);
+#endif
+}

Added: trunk/src/details.c
===================================================================
--- trunk/src/details.c	                        (rev 0)
+++ trunk/src/details.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,1955 @@
+/*
+|  Copyright (C) 2002-2007 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+| 
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+| 
+|  iTunes and iPod are trademarks of Apple
+| 
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: details.c 1755 2007-11-05 01:16:19Z phantom_sf $
+*/
+
+/* This file provides functions for the details window */
+
+#include <stdlib.h>
+#include <gtk/gtk.h>
+#include "details.h"
+#include "fileselection.h"
+#include "misc.h"
+#include "fetchcover.h"
+#include "display_coverart.h"
+#include "misc_track.h"
+#include "prefs.h"
+#include "info.h"
+#include <string.h>
+#include <glib/gstdio.h>
+
+/*
+void details_close (void);
+void details_update_default_sizes (void);
+void details_update_track (Track *track);
+void details_remove_track (Track *track);
+*/
+
+/* List with all detail windows */
+static GList *details = NULL;
+
+/* string constants for preferences */
+static const gchar *DETAILS_WINDOW_DEFX="details_window_defx";
+static const gchar *DETAILS_WINDOW_DEFY="details_window_defy";
+static const gchar *DETAILS_WINDOW_NOTEBOOK_PAGE="details_window_notebook_page";
+
+/* enum types */
+typedef enum
+{
+    DETAILS_MEDIATYPE_AUDIO_VIDEO = 0,
+    DETAILS_MEDIATYPE_AUDIO,
+    DETAILS_MEDIATYPE_MOVIE,
+    DETAILS_MEDIATYPE_PODCAST,
+    DETAILS_MEDIATYPE_VIDEO_PODCAST,
+    DETAILS_MEDIATYPE_AUDIOBOOK,
+    DETAILS_MEDIATYPE_MUSICVIDEO,
+    DETAILS_MEDIATYPE_TVSHOW,
+    DETAILS_MEDIATYPE_MUSICVIDEO_TVSHOW
+} DETAILS_MEDIATYPE;
+
+typedef struct
+{
+    guint32 id;
+    const gchar *str;
+} ComboEntry;
+
+/* strings for mediatype combobox */
+static const ComboEntry mediatype_comboentries[] =
+{
+    { 0,                                               N_("Audio/Video") },
+    { ITDB_MEDIATYPE_AUDIO,                            N_("Audio") },
+    { ITDB_MEDIATYPE_MOVIE,                            N_("Video") },
+    { ITDB_MEDIATYPE_PODCAST,                          N_("Podcast") },
+    { ITDB_MEDIATYPE_PODCAST|ITDB_MEDIATYPE_MOVIE,     N_("Video Podcast") },
+    { ITDB_MEDIATYPE_AUDIOBOOK,                        N_("Audiobook") },
+    { ITDB_MEDIATYPE_MUSICVIDEO,                       N_("Music Video") },
+    { ITDB_MEDIATYPE_TVSHOW,                           N_("TV Show") },
+    { ITDB_MEDIATYPE_TVSHOW|ITDB_MEDIATYPE_MUSICVIDEO, N_("TV Show & Music Video") },
+    { 0,                                               NULL }
+};
+
+/* Detail image drag types for dnd */
+GtkTargetEntry cover_image_drag_types [] = {
+		{ "image/jpeg", 0, DND_IMAGE_JPEG },
+		{ "text/uri-list", 0, DND_TEXT_URI_LIST },
+		{ "text/plain", 0, DND_TEXT_PLAIN },
+		{ "STRING", 0, DND_TEXT_PLAIN }
+};
+
+/* Declarations */
+static void details_set_track (Detail *detail, Track *track);
+static void details_free (Detail *detail);
+static void details_get_item (Detail *detail, T_item item,
+			      gboolean assumechanged);
+static void details_get_changes (Detail *detail);
+static gboolean details_copy_artwork (Track *frtrack, Track *totrack);
+static void details_undo_track (Detail *detail, Track *track);
+static void details_update_headline (Detail *detail);
+static gboolean dnd_details_art_drag_drop(GtkWidget *widget, GdkDragContext *drag_context, gint x, gint y, guint time, gpointer user_data);
+static void dnd_details_art_drag_data_received(GtkWidget *widget, GdkDragContext *dc, gint x, gint y, GtkSelectionData *data, guint info, guint time, gpointer user_data);
+static gboolean dnd_details_art_drag_motion (GtkWidget *widget, GdkDragContext *dc, gint x, gint y, guint time, gpointer user_data);
+
+/* Store the window size */
+static void details_store_window_state (Detail *detail)
+{
+    GtkWidget *w;
+    gint defx, defy;
+
+    g_return_if_fail (detail);
+
+    gtk_window_get_size (GTK_WINDOW (detail->window), &defx, &defy);
+    prefs_set_int (DETAILS_WINDOW_DEFX, defx);
+    prefs_set_int (DETAILS_WINDOW_DEFY, defy);
+
+    if ((w = gtkpod_xml_get_widget (detail->xml, "details_notebook")))
+    {
+	gint page = gtk_notebook_get_current_page (GTK_NOTEBOOK (w));
+	prefs_set_int (DETAILS_WINDOW_NOTEBOOK_PAGE, page);
+    }
+}
+
+
+/* Query the state of the writethrough checkbox */
+gboolean details_writethrough (Detail *detail)
+{
+    GtkWidget *w;
+
+    g_return_val_if_fail (detail, FALSE);
+
+    w = gtkpod_xml_get_widget (detail->xml,
+			       "details_checkbutton_writethrough");
+    return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w));
+}
+
+/* ------------------------------------------------------------
+ *
+ *        Callback functions
+ *
+ * ------------------------------------------------------------ */
+
+static void details_text_changed (GtkWidget *widget,
+				  Detail *detail)
+{
+    ExtraTrackData *etr;
+
+    g_return_if_fail (detail);
+    g_return_if_fail (detail->track);
+    etr = detail->track->userdata;
+    g_return_if_fail (etr);
+
+    detail->changed = TRUE;
+    etr->tchanged = TRUE;
+    details_update_buttons (detail);
+}
+
+
+static void details_entry_activate (GtkEntry *entry,
+				    Detail *detail)
+{
+    T_item item;
+
+    g_return_if_fail (entry);
+
+    item = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (entry),
+					       "details_item"));
+
+    g_return_if_fail ((item > 0) && (item < T_ITEM_NUM));
+
+    details_get_item (detail, item, TRUE);
+
+    details_update_headline (detail);
+}
+
+
+static void details_checkbutton_toggled (GtkCheckButton *button,
+					 Detail *detail)
+{
+    T_item item;
+
+    g_return_if_fail (button);
+
+    item = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (button),
+					       "details_item"));
+    
+    g_return_if_fail ((item > 0) && (item < T_ITEM_NUM));
+
+    details_get_item (detail, item, FALSE);
+}
+
+
+static void details_combobox_changed (GtkComboBox *combobox,
+					 Detail *detail)
+{
+    T_item item;
+
+    g_return_if_fail (combobox);
+
+    item = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (combobox),
+					       "details_item"));
+    
+    g_return_if_fail ((item > 0) && (item < T_ITEM_NUM));
+
+    details_get_item (detail, item, FALSE);
+}
+
+
+static void details_writethrough_toggled (GtkCheckButton *button,
+					  Detail *detail)
+{
+    details_update_buttons (detail);
+}
+
+
+/****** Navigation *****/
+void details_button_first_clicked (GtkCheckButton *button,
+				   Detail *detail)
+{
+    GList *first;
+    g_return_if_fail (detail);
+
+    first = g_list_first (detail->tracks);
+
+    details_get_changes (detail);
+
+    if (first)
+	details_set_track (detail, first->data);
+}
+
+void details_button_previous_clicked (GtkCheckButton *button,
+				      Detail *detail)
+{
+    gint i;
+
+    g_return_if_fail (detail);
+
+    details_get_changes (detail);
+
+    i = g_list_index (detail->tracks, detail->track);
+
+    if (i > 0)
+    {
+	details_set_track (detail, g_list_nth_data (detail->tracks, i-1));
+    }
+}
+
+void details_button_next_clicked (GtkCheckButton *button,
+				  Detail *detail)
+{
+    GList *gl;
+    g_return_if_fail (detail);
+
+    details_get_changes (detail);
+
+    gl = g_list_find (detail->tracks, detail->track);
+
+    g_return_if_fail (gl);
+
+    if (gl->next)
+	details_set_track (detail, gl->next->data);
+}
+
+void details_button_last_clicked (GtkCheckButton *button,
+				  Detail *detail)
+{
+    GList *last;
+    g_return_if_fail (detail);
+
+    last = g_list_last (detail->tracks);
+
+    details_get_changes (detail);
+
+    if (last)
+	details_set_track (detail, last->data);
+}
+
+
+/****** Thumbnail Control *****/
+static void details_button_set_artwork_clicked (GtkButton *button,
+						Detail *detail)
+{
+    gchar *filename;
+
+    g_return_if_fail (detail);
+    g_return_if_fail (detail->track);
+
+    filename = fileselection_get_cover_filename ();
+
+    if (filename)
+    {
+	if (details_writethrough (detail))
+	{   /* Set thumbnail for all tracks */
+	    GList *gl;
+	    for (gl=detail->tracks; gl; gl=gl->next)
+	    {
+		ExtraTrackData *etr;
+		Track *tr = gl->data;
+		g_return_if_fail (tr);
+		etr = tr->userdata;
+		g_return_if_fail (etr);
+		gp_track_set_thumbnails (tr, filename);
+		etr->tchanged = TRUE;
+		etr->tartwork_changed = TRUE;
+	    }
+	}
+	else
+	{   /* Only change current track */
+	    ExtraTrackData *etr = detail->track->userdata;
+	    g_return_if_fail (etr);
+	    gp_track_set_thumbnails (detail->track, filename);
+	    etr->tchanged = TRUE;
+	    etr->tartwork_changed = TRUE;
+	}
+	detail->changed = TRUE;
+	details_update_thumbnail (detail);
+    }
+    g_free (filename);
+
+    details_update_buttons (detail);
+}
+
+static void details_button_remove_artwork_clicked (GtkButton *button,
+						   Detail *detail)
+{
+    g_return_if_fail (detail);
+    g_return_if_fail (detail->track);
+
+    if (details_writethrough (detail))
+    {   /* Remove thumbnail on all tracks */
+	GList *gl;
+	for (gl=detail->tracks; gl; gl=gl->next)
+	{
+	    ExtraTrackData *etr;
+	    Track *tr = gl->data;
+	    g_return_if_fail (tr);
+	    etr = tr->userdata;
+	    g_return_if_fail (etr);
+
+	    etr->tchanged |= gp_track_remove_thumbnails (tr);
+	    detail->changed |= etr->tchanged;
+	}
+    }
+    else
+    {   /* Only change current track */
+	ExtraTrackData *etr = detail->track->userdata;
+	g_return_if_fail (etr);
+	etr->tchanged |= gp_track_remove_thumbnails (detail->track);
+	detail->changed |= etr->tchanged;
+    }
+
+    details_update_thumbnail (detail);
+
+    details_update_buttons (detail);
+}
+
+
+/****** Window Control *****/
+static void details_button_apply_clicked (GtkButton *button,
+					  Detail *detail)
+{
+    GList *gl, *gl_orig;
+    gboolean changed = FALSE;
+    GList *changed_tracks = NULL;
+
+    g_return_if_fail (detail);
+
+    details_get_changes (detail);
+
+    for (gl=detail->tracks, gl_orig=detail->orig_tracks;
+	 gl && gl_orig;
+	 gl=gl->next, gl_orig=gl_orig->next)
+    {
+	Track *tr = gl->data;
+	Track *tr_orig = gl_orig->data;
+	ExtraTrackData *etr;
+	g_return_if_fail (tr);
+	g_return_if_fail (tr_orig);
+
+	etr = tr->userdata;
+	g_return_if_fail (etr);
+
+	if (etr->tchanged)
+	{
+	    T_item item;
+	    gboolean tr_changed = FALSE;
+
+	    for (item=1; item<T_ITEM_NUM; ++item)
+	    {
+		tr_changed |= track_copy_item (tr, tr_orig, item);
+	    }
+
+	    tr_changed |= details_copy_artwork (tr, tr_orig);
+
+	    if (tr_changed)
+	    {
+		tr_orig->time_modified = time (NULL);
+		pm_track_changed (tr_orig);
+	    }
+
+	    if (prefs_get_int("id3_write"))
+	    {
+		/* add tracks to a list because write_tags_to_file()
+		   can remove newly created duplicates which is not a
+		   good idea from within a for() loop over tracks */
+		changed_tracks = g_list_prepend (changed_tracks, tr_orig);
+	    }
+
+	    changed |= tr_changed;
+	    etr->tchanged = FALSE;
+	}
+    }
+
+    detail->changed = FALSE;
+
+    if (changed)
+    {
+	data_changed (detail->itdb);
+    }
+    
+    if (prefs_get_int("id3_write"))
+    {
+	if (changed_tracks)
+	{
+	    for (gl=changed_tracks; gl; gl=gl->next)
+	    {
+		Track *tr = gl->data;
+		write_tags_to_file (tr);
+		/* display possible duplicates that have been removed */
+	    }
+	    gp_duplicate_remove (NULL, NULL);
+	}
+    }
+    g_list_free (changed_tracks);
+
+    details_update_headline (detail);
+
+    details_update_buttons (detail);
+}
+
+static void details_button_cancel_clicked (GtkButton *button,
+					   Detail *detail)
+{
+    g_return_if_fail (detail);
+
+    details_store_window_state (detail);
+
+    details = g_list_remove (details, detail);
+
+    details_free (detail);
+}
+
+
+static void details_button_ok_clicked (GtkButton *button,
+				       Detail *detail)
+{
+    g_return_if_fail (detail);
+
+    details_button_apply_clicked (NULL, detail);
+    details_button_cancel_clicked (NULL, detail);
+}
+
+
+/* Check if any tracks are still modified and set detail->changed
+   accordingly */
+static void details_update_changed_state (Detail *detail)
+{
+    gboolean changed = FALSE;
+    GList *gl;
+
+    g_return_if_fail (detail);
+
+    for (gl=detail->tracks; gl; gl=gl->next)
+    {
+	ExtraTrackData *etr;
+	Track *track = gl->data;
+	g_return_if_fail (track);
+	etr = track->userdata;
+	g_return_if_fail (etr);
+	changed |= etr->tchanged;
+    }
+
+    detail->changed = changed;
+}
+
+
+static void details_button_undo_track_clicked (GtkButton *button,
+					       Detail *detail)
+{
+    g_return_if_fail (detail);
+
+    details_undo_track (detail, detail->track);
+
+    details_update_changed_state (detail);
+
+    details_set_track (detail, detail->track);
+}
+
+
+static void details_button_undo_all_clicked (GtkButton *button,
+					     Detail *detail)
+{
+    GList *gl;
+
+    g_return_if_fail (detail);
+
+    for (gl=detail->tracks; gl; gl=gl->next)
+    {
+	Track *track = gl->data;
+	g_return_if_fail (track);
+
+	details_undo_track (detail, track);
+    }
+
+    detail->changed = FALSE;
+
+    details_set_track (detail, detail->track);
+}
+
+
+static void details_delete_event (GtkWidget *widget,
+				  GdkEvent *event,
+				  Detail *detail)
+{
+    details_button_cancel_clicked (NULL, detail);
+}
+
+
+/****** Copy artwork data if filename has changed ****** */
+static gboolean details_copy_artwork (Track *frtrack, Track *totrack)
+{
+		gboolean changed = FALSE;
+  	ExtraTrackData *fretr, *toetr;
+
+  	g_return_val_if_fail (frtrack, FALSE);
+  	g_return_val_if_fail (totrack, FALSE);
+
+    fretr = frtrack->userdata;
+    toetr = totrack->userdata;
+
+    g_return_val_if_fail (fretr, FALSE);
+    g_return_val_if_fail (toetr, FALSE);
+
+    g_return_val_if_fail (fretr->thumb_path_locale, FALSE);
+    g_return_val_if_fail (toetr->thumb_path_locale, FALSE);
+	
+	if (strcmp (fretr->thumb_path_locale, toetr->thumb_path_locale) != 0
+			|| fretr->tartwork_changed == TRUE)
+  {
+		itdb_artwork_free (totrack->artwork);
+		totrack->artwork = itdb_artwork_duplicate (frtrack->artwork);
+		totrack->artwork_size = frtrack->artwork_size;
+		totrack->artwork_count = frtrack->artwork_count;
+		totrack->has_artwork = frtrack->has_artwork;
+		g_free (toetr->thumb_path_locale);
+		g_free (toetr->thumb_path_utf8);
+		toetr->thumb_path_locale = g_strdup (fretr->thumb_path_locale);
+		toetr->thumb_path_utf8 = g_strdup (fretr->thumb_path_utf8);
+		toetr->tartwork_changed = TRUE;
+		changed = TRUE;
+	}
+    /* make sure artwork gets removed, even if both thumb_paths were
+       unset ("") */
+    if (!frtrack->artwork->thumbnails)
+    {
+	changed |= gp_track_remove_thumbnails (totrack);
+    }
+        
+    return changed;
+}
+
+
+
+/****** Undo one track (no display action) ****** */
+static void details_undo_track (Detail *detail, Track *track)
+{
+    gint i;
+    T_item item;
+    Track *tr_orig;
+    ExtraTrackData *etr;
+
+    g_return_if_fail (detail);
+    g_return_if_fail (track);
+
+    etr = track->userdata;
+    g_return_if_fail (etr);
+
+    i = g_list_index (detail->tracks, track);
+    g_return_if_fail (i != -1);
+
+    tr_orig = g_list_nth_data (detail->orig_tracks, i);
+    g_return_if_fail (tr_orig);
+
+    for (item=1; item<T_ITEM_NUM; ++item)
+    {
+	track_copy_item (tr_orig, track, item);
+    }
+
+    details_copy_artwork (tr_orig, track);
+
+    etr->tchanged = FALSE;
+}
+
+
+/****** Read out widgets of current track ******/
+static void details_get_changes (Detail *detail)
+{
+    T_item item;
+
+    g_return_if_fail (detail);
+    g_return_if_fail (detail->track);
+
+    for (item=1; item<T_ITEM_NUM; ++item)
+    {
+	details_get_item (detail, item, FALSE);
+    }
+}
+
+
+/****** comboentries helper functions ******/
+
+/* Get index from ID (returns -1 if ID could not be found) */
+static gint comboentry_index_from_id (const ComboEntry centries[],
+				      guint32 id)
+{
+    gint i;
+
+    g_return_val_if_fail (centries, -1);
+
+    for (i=0; centries[i].str; ++i)
+    {
+	if (centries[i].id == id)  return i;
+    }
+    return -1;
+}
+
+
+/* initialize a combobox with the corresponding entry strings */
+static void details_setup_combobox (GtkWidget *cb,
+				    const ComboEntry centries[])
+{
+    const ComboEntry *ce = centries;
+    GtkCellRenderer *cell;
+    GtkListStore *store;
+
+    g_return_if_fail (cb);
+    g_return_if_fail (centries);
+
+    /* clear any renderers that may have been set */
+    gtk_cell_layout_clear (GTK_CELL_LAYOUT (cb));
+    /* set new model */
+    store = gtk_list_store_new (1, G_TYPE_STRING);
+    gtk_combo_box_set_model (GTK_COMBO_BOX (cb), GTK_TREE_MODEL (store));
+    g_object_unref (store);
+
+    cell = gtk_cell_renderer_text_new ();
+    gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (cb), cell, TRUE);
+    gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (cb), cell,
+				    "text", 0,
+				    NULL);
+
+    while (ce->str != NULL)
+    {
+	gtk_combo_box_append_text (GTK_COMBO_BOX (cb), _(ce->str));
+	++ce;
+    }
+}
+
+
+/****** Setup of widgets ******/
+static void details_setup_widget (Detail *detail, T_item item)
+{
+    GtkTextBuffer *tb;
+    GtkWidget *w;
+    gchar *buf;
+
+    g_return_if_fail (detail);
+    g_return_if_fail ((item > 0) && (item < T_ITEM_NUM));
+
+    /* Setup label */
+    switch (item)
+    {
+    case T_COMPILATION:
+    case T_CHECKED:
+    case T_REMEMBER_PLAYBACK_POSITION:
+    case T_SKIP_WHEN_SHUFFLING:
+	buf = g_strdup_printf ("details_checkbutton_%d", item);
+	w = gtkpod_xml_get_widget (detail->xml, buf);
+	gtk_button_set_label (GTK_BUTTON (w),
+			      gettext (get_t_string (item)));
+	g_free (buf);
+	break;
+    default:
+	buf = g_strdup_printf ("details_label_%d", item);
+	w = gtkpod_xml_get_widget (detail->xml, buf);
+	gtk_label_set_text (GTK_LABEL (w), gettext (get_t_string (item)));
+	g_free (buf);
+    }
+
+    buf = NULL;
+    w = NULL;
+
+    switch (item)
+    {
+    case T_ALBUM:
+    case T_ARTIST:
+    case T_TITLE:
+    case T_GENRE:
+    case T_COMPOSER:
+    case T_FILETYPE:
+    case T_GROUPING:
+    case T_CATEGORY:
+    case T_PODCASTURL:
+    case T_PODCASTRSS:
+    case T_PC_PATH:
+    case T_IPOD_PATH:
+    case T_THUMB_PATH:
+    case T_IPOD_ID:
+    case T_SIZE:
+    case T_TRACKLEN:
+    case T_STARTTIME:
+    case T_STOPTIME:
+    case T_BITRATE:
+    case T_SAMPLERATE:
+    case T_PLAYCOUNT:
+    case T_BPM:
+    case T_RATING:
+    case T_VOLUME:
+    case T_SOUNDCHECK:
+    case T_CD_NR:
+    case T_TRACK_NR:
+    case T_YEAR:
+    case T_TIME_ADDED:
+    case T_TIME_PLAYED:
+    case T_TIME_MODIFIED:
+    case T_TIME_RELEASED:
+    case T_TV_SHOW:
+    case T_TV_EPISODE:
+    case T_TV_NETWORK:
+    case T_SEASON_NR:
+    case T_EPISODE_NR:
+    case T_ALBUMARTIST:
+    case T_SORT_ARTIST:
+    case T_SORT_TITLE:
+    case T_SORT_ALBUM:
+    case T_SORT_ALBUMARTIST:
+    case T_SORT_COMPOSER:
+    case T_SORT_TVSHOW:
+	buf = g_strdup_printf ("details_entry_%d", item);
+	w = gtkpod_xml_get_widget (detail->xml, buf);
+	g_signal_connect (w, "activate",
+			  G_CALLBACK (details_entry_activate),
+			  detail);
+	g_signal_connect (w, "changed",
+			  G_CALLBACK (details_text_changed),
+			  detail);
+	break;
+    case T_COMPILATION:
+    case T_TRANSFERRED:
+    case T_CHECKED:
+    case T_REMEMBER_PLAYBACK_POSITION:
+    case T_SKIP_WHEN_SHUFFLING:
+    case T_GAPLESS_TRACK_FLAG:
+	buf = g_strdup_printf ("details_checkbutton_%d", item);
+	w = gtkpod_xml_get_widget (detail->xml, buf);
+	g_signal_connect (w, "toggled",
+			  G_CALLBACK (details_checkbutton_toggled),
+			  detail);
+	break;
+    case T_DESCRIPTION:
+    case T_SUBTITLE:
+    case T_COMMENT:
+	buf = g_strdup_printf ("details_textview_%d", item);
+	w = gtkpod_xml_get_widget (detail->xml, buf);
+	tb = gtk_text_view_get_buffer (GTK_TEXT_VIEW (w));
+	g_signal_connect (tb, "changed",
+			  G_CALLBACK (details_text_changed),
+			  detail);
+	break;
+    case T_MEDIA_TYPE:
+	buf = g_strdup_printf ("details_combobox_%d", item);
+	w = gtkpod_xml_get_widget (detail->xml, buf);
+	details_setup_combobox (w, mediatype_comboentries);
+	g_signal_connect (w, "changed",
+			  G_CALLBACK (details_combobox_changed),
+			  detail);
+	break;
+    case T_ALL:
+    case T_ITEM_NUM:
+	/* cannot happen because of assertion above */
+	g_return_if_reached ();
+    }
+
+    if (w)
+    {
+	g_object_set_data (G_OBJECT (w),
+			   "details_item", GINT_TO_POINTER (item));
+    }
+
+    g_free (buf);
+}
+
+
+static void details_set_item (Detail *detail, Track *track, T_item item)
+{
+    GtkTextBuffer *tb;
+    GtkWidget *w = NULL;
+    gchar *text;
+    gchar *entry, *checkbutton, *textview, *combobox;
+
+    g_return_if_fail (detail);
+    g_return_if_fail ((item > 0) && (item < T_ITEM_NUM));
+
+    entry = g_strdup_printf ("details_entry_%d", item);
+    checkbutton = g_strdup_printf ("details_checkbutton_%d", item);
+    textview = g_strdup_printf ("details_textview_%d", item);
+    combobox = g_strdup_printf ("details_combobox_%d", item);
+
+    if (track != NULL)
+    {
+	track->itdb = detail->itdb;
+	text = track_get_text (track, item);
+	track->itdb = NULL;
+	if ((item == T_THUMB_PATH) && (!detail->artwork_ok))
+	{
+	    gchar *new_text = g_strdup_printf (_("%s (image data corrupted or unreadable)"), text);
+	    g_free (text);
+	    text = new_text;
+	}
+    }
+    else
+    {
+	text = g_strdup ("");
+    }
+
+    switch (item)
+    {
+    case T_ALBUM:
+    case T_ARTIST:
+    case T_TITLE:
+    case T_GENRE:
+    case T_COMPOSER:
+    case T_FILETYPE:
+    case T_GROUPING:
+    case T_CATEGORY:
+    case T_PODCASTURL:
+    case T_PODCASTRSS:
+    case T_PC_PATH:
+    case T_IPOD_PATH:
+    case T_THUMB_PATH:
+    case T_IPOD_ID:
+    case T_SIZE:
+    case T_TRACKLEN:
+    case T_STARTTIME:
+    case T_STOPTIME:
+    case T_BITRATE:
+    case T_SAMPLERATE:
+    case T_PLAYCOUNT:
+    case T_BPM:
+    case T_RATING:
+    case T_VOLUME:
+    case T_SOUNDCHECK:
+    case T_CD_NR:
+    case T_TRACK_NR:
+    case T_YEAR:
+    case T_TIME_ADDED:
+    case T_TIME_PLAYED:
+    case T_TIME_MODIFIED:
+    case T_TIME_RELEASED:
+    case T_TV_SHOW:
+    case T_TV_EPISODE:
+    case T_TV_NETWORK:
+    case T_SEASON_NR:
+    case T_EPISODE_NR:
+    case T_ALBUMARTIST:
+    case T_SORT_ARTIST:
+    case T_SORT_TITLE:
+    case T_SORT_ALBUM:
+    case T_SORT_ALBUMARTIST:
+    case T_SORT_COMPOSER:
+    case T_SORT_TVSHOW:
+	w = gtkpod_xml_get_widget (detail->xml, entry);
+	g_signal_handlers_block_by_func (w, details_text_changed, detail);
+	gtk_entry_set_text (GTK_ENTRY (w), text);
+	g_signal_handlers_unblock_by_func(w, details_text_changed,detail);
+	break;
+    case T_COMMENT:
+    case T_DESCRIPTION:
+    case T_SUBTITLE:
+	w = gtkpod_xml_get_widget (detail->xml, textview);
+	tb= gtk_text_view_get_buffer (GTK_TEXT_VIEW (w));
+	g_signal_handlers_block_by_func (tb,
+					 details_text_changed, detail);
+	gtk_text_buffer_set_text (tb, text, -1);
+	g_signal_handlers_unblock_by_func (tb,
+					   details_text_changed, detail);
+	break;
+    case T_COMPILATION:
+	if ((w = gtkpod_xml_get_widget (detail->xml, checkbutton)))
+	{
+	    if (track)
+		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w),
+					      track->compilation);
+	    else
+		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w),
+					      FALSE);
+	}
+	break;
+    case T_TRANSFERRED:
+	if ((w = gtkpod_xml_get_widget (detail->xml, checkbutton)))
+	{
+	    if (track)
+		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w),
+					      track->transferred);
+	    else
+		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w),
+					      FALSE);
+	}
+	break;
+    case T_REMEMBER_PLAYBACK_POSITION:
+	if ((w = gtkpod_xml_get_widget (detail->xml, checkbutton)))
+	{
+	    if (track)
+		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w),
+					      track->remember_playback_position);
+	    else
+		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w),
+					      FALSE);
+	}
+	break;
+    case T_SKIP_WHEN_SHUFFLING:
+	if ((w = gtkpod_xml_get_widget (detail->xml, checkbutton)))
+	{
+	    if (track)
+		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w),
+					      track->skip_when_shuffling);
+	    else
+		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w),
+					      FALSE);
+	}
+	break;
+    case T_CHECKED:
+	if ((w = gtkpod_xml_get_widget (detail->xml, checkbutton)))
+	{
+	    if (track)
+		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w),
+					      !track->checked);
+	    else
+		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w),
+					      FALSE);
+	}
+	break;
+    case T_MEDIA_TYPE:
+	if ((w = gtkpod_xml_get_widget (detail->xml, combobox)))
+	{
+	    gint index = -1;
+	    if (track)
+	    {
+		index = comboentry_index_from_id (mediatype_comboentries,
+						  track->mediatype);
+		if (index == -1)
+		{
+		    gtkpod_warning (_("Please report unknown mediatype %x\n"),
+				    track->mediatype);
+		}
+	    }
+	    gtk_combo_box_set_active (GTK_COMBO_BOX (w), index);
+	}
+	break;
+    case T_GAPLESS_TRACK_FLAG:
+	if ((w = gtkpod_xml_get_widget (detail->xml, checkbutton)))
+	{
+	    if (track)
+		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w),
+					      track->gapless_track_flag);
+	    else
+		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w),
+					      FALSE);
+	}
+	break;
+    case T_ALL:
+    case T_ITEM_NUM:
+	/* cannot happen because of assertion above */
+	g_return_if_reached ();
+    }
+
+    g_free (entry);
+    g_free (checkbutton);
+    g_free (textview);
+    g_free (combobox);
+    g_free (text);
+}
+
+
+
+/* assumechanged: normally the other tracks are only changed if a
+ * change has been done. assumechanged==TRUE will write the
+ * the value to all other tracks even if no change has taken place
+ * (e.g. when ENTER is pressed in a text field) */
+static void details_get_item (Detail *detail, T_item item,
+			      gboolean assumechanged)
+{
+    GtkWidget *w = NULL;
+    gchar *entry, *checkbutton, *textview, *combobox;
+    gboolean changed = FALSE;
+    ExtraTrackData *etr;
+    Track *track;
+
+    g_return_if_fail (detail);
+    track = detail->track;
+    g_return_if_fail (track);
+    g_return_if_fail ((item > 0) && (item < T_ITEM_NUM));
+
+    etr = track->userdata;
+    g_return_if_fail (etr);
+
+    entry = g_strdup_printf ("details_entry_%d", item);
+    checkbutton = g_strdup_printf ("details_checkbutton_%d", item);
+    textview = g_strdup_printf ("details_textview_%d", item);
+    combobox = g_strdup_printf ("details_combobox_%d", item);
+
+    switch (item)
+    {
+    case T_ALBUM:
+    case T_ARTIST:
+    case T_TITLE:
+    case T_GENRE:
+    case T_COMPOSER:
+    case T_FILETYPE:
+    case T_GROUPING:
+    case T_CATEGORY:
+    case T_PODCASTURL:
+    case T_PODCASTRSS:
+    case T_SIZE:
+    case T_BITRATE:
+    case T_SAMPLERATE:
+    case T_PLAYCOUNT:
+    case T_BPM:
+    case T_RATING:
+    case T_VOLUME:
+    case T_CD_NR:
+    case T_TRACK_NR:
+    case T_YEAR:
+    case T_TIME_ADDED:
+    case T_TIME_PLAYED:
+    case T_TIME_MODIFIED:
+    case T_TIME_RELEASED:
+    case T_TRACKLEN:
+    case T_STARTTIME:
+    case T_STOPTIME:
+    case T_SOUNDCHECK:
+    case T_TV_SHOW:
+    case T_TV_EPISODE:
+    case T_TV_NETWORK:
+    case T_SEASON_NR:
+    case T_EPISODE_NR:
+    case T_ALBUMARTIST:
+    case T_SORT_ARTIST:
+    case T_SORT_TITLE:
+    case T_SORT_ALBUM:
+    case T_SORT_ALBUMARTIST:
+    case T_SORT_COMPOSER:
+    case T_SORT_TVSHOW:
+	if ((w = gtkpod_xml_get_widget (detail->xml, entry)))
+	{
+	    const gchar *text;
+
+	    text = gtk_entry_get_text (GTK_ENTRY (w));
+
+	    /* for soundcheck the displayed value is only a rounded
+	       figure -> unless 'assumechanged' is set, compare the
+	       string to the original one before assuming a change
+	       took place */
+	    if (!assumechanged &&
+		(item == T_SOUNDCHECK))
+	    {
+		gchar *buf;
+		track->itdb = detail->itdb;
+		buf = track_get_text (track, item);
+		track->itdb = NULL;
+		g_return_if_fail (buf);
+		if (strcmp (text, buf) != 0)
+		    changed = track_set_text (track, text, item);
+		g_free (buf);
+	    }
+	    else
+	    {
+		changed = track_set_text (track, text, item);
+	    }
+	    /* redisplay some items to be on the safe side */
+	    switch (item)
+	    {
+	    case T_TRACK_NR:
+	    case T_CD_NR:
+	    case T_TRACKLEN:
+	    case T_STARTTIME:
+	    case T_STOPTIME:
+	    case T_TIME_ADDED:
+	    case T_TIME_PLAYED:
+	    case T_TIME_MODIFIED:
+	    case T_TIME_RELEASED:
+		details_set_item (detail, track, item);
+		break;
+	    default:
+		break;
+	    }
+	}
+	break;
+    case T_COMMENT:
+    case T_DESCRIPTION:
+    case T_SUBTITLE:
+	if ((w = gtkpod_xml_get_widget (detail->xml, textview)))
+	{
+	    gchar *text;
+	    GtkTextIter start, end;
+	    GtkTextBuffer *tb = gtk_text_view_get_buffer (
+		GTK_TEXT_VIEW (w));
+	    gtk_text_buffer_get_start_iter  (tb, &start);
+	    gtk_text_buffer_get_end_iter  (tb, &end);
+
+	    text = gtk_text_buffer_get_text (tb, &start, &end, TRUE);
+
+	    changed = track_set_text (track, text, item);
+	}
+	break;
+    case T_COMPILATION:
+	if ((w = gtkpod_xml_get_widget (detail->xml, checkbutton)))
+	{
+	    gboolean state;
+	    state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w));
+
+	    if (track->compilation != state)
+	    {
+		track->compilation = state;
+		changed = TRUE;
+	    }
+	}
+	break;
+    case T_REMEMBER_PLAYBACK_POSITION:
+	if ((w = gtkpod_xml_get_widget (detail->xml, checkbutton)))
+	{
+	    gboolean state;
+	    state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w));
+
+	    if (track->remember_playback_position != state)
+	    {
+		track->remember_playback_position = state;
+		changed = TRUE;
+	    }
+	}
+	break;
+    case T_SKIP_WHEN_SHUFFLING:
+	if ((w = gtkpod_xml_get_widget (detail->xml, checkbutton)))
+	{
+	    gboolean state;
+	    state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w));
+
+	    if (track->skip_when_shuffling != state)
+	    {
+		track->skip_when_shuffling = state;
+		changed = TRUE;
+	    }
+	}
+	break;
+    case T_CHECKED:
+	if ((w = gtkpod_xml_get_widget (detail->xml, checkbutton)))
+	{
+	    gboolean state;
+	    state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w));
+	    if ((state && (track->checked == 1)) ||
+		(!state && (track->checked == 0)))
+	    {
+		changed = TRUE;
+		if (state)  track->checked = 0;
+		else        track->checked = 1;
+	    }
+	}
+	break;
+    case T_MEDIA_TYPE:
+	if ((w = gtkpod_xml_get_widget (detail->xml, combobox)))
+	{
+	    gint active;
+	    active = gtk_combo_box_get_active (GTK_COMBO_BOX (w));
+	    if (active != -1)
+	    {
+		guint32 new_mediatype = mediatype_comboentries[active].id;
+
+		if (track->mediatype != new_mediatype)
+		{
+		    track->mediatype = new_mediatype;
+		    changed = TRUE;
+		}
+	    }
+	}
+	break;
+    case T_TRANSFERRED:
+    case T_PC_PATH:
+    case T_IPOD_PATH:
+    case T_IPOD_ID:
+    case T_THUMB_PATH:
+    case T_GAPLESS_TRACK_FLAG:
+	/* These are read-only only */
+	break;
+	break;
+    case T_ALL:
+    case T_ITEM_NUM:
+	/* cannot happen because of assertion above */
+	g_return_if_reached ();
+    }
+
+    etr->tchanged |= changed;
+    detail->changed |= changed;
+
+/*     if (changed)  printf ("changed (%d)\n", item); */
+
+    /* Check if this has to be copied to the other tracks as well
+       (writethrough) */
+    if ((changed || assumechanged) &&
+	details_writethrough (detail))
+    {   /* change for all tracks */
+	GList *gl;
+	for (gl=detail->tracks; gl; gl=gl->next)
+	{
+	    Track *gltr = gl->data;
+	    g_return_if_fail (gltr);
+
+	    if (gltr != track)
+	    {
+		ExtraTrackData *gletr= gltr->userdata;
+		g_return_if_fail (gletr);
+
+		gletr->tchanged |= track_copy_item (track, gltr, item);
+		detail->changed |= gletr->tchanged;
+	    }
+	}
+    }
+
+    g_free (entry);
+    g_free (checkbutton);
+    g_free (textview);
+    g_free (combobox);
+
+    details_update_buttons (detail);
+}
+
+
+/* Render the Apply button insensitive as long as no changes were done */
+void details_update_buttons (Detail *detail)
+{
+    GtkWidget *w;
+    gchar *buf;
+    ExtraTrackData *etr;
+    gboolean apply, undo_track, undo_all, remove_artwork, viewport;
+    gboolean prev, next, ok;
+
+    g_return_if_fail (detail);
+
+    if (detail->track)
+    {
+	gint i;
+	etr = detail->track->userdata;
+	g_return_if_fail (etr);
+
+	details_update_changed_state (detail);
+
+	apply = detail->changed;
+	undo_track = etr->tchanged;
+	undo_all = detail->changed;
+	ok = TRUE;
+	viewport = TRUE;
+	if (details_writethrough (detail))
+	{
+	    GList *gl;
+	    remove_artwork = FALSE;
+	    for (gl=detail->tracks; gl && !remove_artwork; gl=gl->next)
+	    {
+		Track *tr = gl->data;
+		g_return_if_fail (tr);
+		remove_artwork |= (tr->artwork->thumbnails != NULL);
+	    }
+	}
+	else
+	{
+	    remove_artwork = (detail->track->artwork->thumbnails != NULL);
+	}
+	i = g_list_index (detail->tracks, detail->track);
+	g_return_if_fail (i != -1);
+	if (i == 0)  prev = FALSE;
+	else         prev = TRUE;
+	if (i == (g_list_length (detail->tracks)-1))  next = FALSE;
+	else         next = TRUE;
+
+    }
+    else
+    {
+	apply = FALSE;
+	undo_track = FALSE;
+	undo_all = FALSE;
+	ok = FALSE;
+	viewport = FALSE;
+	remove_artwork = FALSE;
+	prev = FALSE;
+	next = FALSE;
+    }
+
+    w = gtkpod_xml_get_widget (detail->xml, "details_button_apply");
+    gtk_widget_set_sensitive (w, apply);
+    w = gtkpod_xml_get_widget (detail->xml, "details_button_undo_track");
+    gtk_widget_set_sensitive (w, undo_track);
+    w = gtkpod_xml_get_widget (detail->xml, "details_button_undo_all");
+    gtk_widget_set_sensitive (w, undo_all);
+    w = gtkpod_xml_get_widget (detail->xml, "details_button_ok");
+    gtk_widget_set_sensitive (w, ok);
+    w = gtkpod_xml_get_widget (detail->xml,
+			       "details_button_remove_artwork");
+    gtk_widget_set_sensitive (w, remove_artwork);
+    w = gtkpod_xml_get_widget (detail->xml, "details_viewport");
+    gtk_widget_set_sensitive (w, viewport);
+    w = gtkpod_xml_get_widget (detail->xml, "details_button_first");
+    gtk_widget_set_sensitive (w, prev);
+    w = gtkpod_xml_get_widget (detail->xml, "details_button_previous");
+    gtk_widget_set_sensitive (w, prev);
+    w = gtkpod_xml_get_widget (detail->xml, "details_button_next");
+    gtk_widget_set_sensitive (w, next);
+    w = gtkpod_xml_get_widget (detail->xml, "details_button_last");
+    gtk_widget_set_sensitive (w, next);
+
+    if (detail->track)
+    {
+	buf = g_strdup_printf (
+	    "%d / %d",
+	    g_list_index (detail->tracks, detail->track) + 1,
+	    g_list_length (detail->tracks));
+    }
+    else
+    {
+	buf = g_strdup (_("n/a"));
+    }
+    w = gtkpod_xml_get_widget (detail->xml, "details_label_index");
+    gtk_label_set_text (GTK_LABEL (w), buf);
+    g_free (buf);
+}
+
+/* Update the displayed thumbnail */
+void details_update_thumbnail (Detail *detail)
+{
+    Thumb *thumb;
+    GtkImage *img;
+
+    g_return_if_fail (detail);
+
+    img = GTK_IMAGE (gtkpod_xml_get_widget (detail->xml,
+					    "details_image_thumbnail"));
+
+    gtk_image_set_from_pixbuf (img, NULL);
+
+    if (detail->track)
+    {
+	detail->artwork_ok = TRUE;
+	/* Get large cover */
+	thumb = itdb_artwork_get_thumb_by_type (detail->track->artwork,
+						ITDB_THUMB_COVER_LARGE);
+	if (thumb)
+	{
+	    GdkPixbuf *pixbuf;
+	    pixbuf = itdb_thumb_get_gdk_pixbuf (detail->itdb->device,
+						thumb);
+	    if (pixbuf)
+	    {
+		gtk_image_set_from_pixbuf (img, pixbuf);
+		gdk_pixbuf_unref (pixbuf);
+	    }
+	    else
+	    {
+		gtk_image_set_from_stock (img, GTK_STOCK_DIALOG_WARNING,
+					  GTK_ICON_SIZE_DIALOG);
+		detail->artwork_ok = FALSE;
+	    }
+	}
+	details_set_item (detail,  detail->track, T_THUMB_PATH);
+    }
+
+    if (gtk_image_get_storage_type (img) == GTK_IMAGE_EMPTY)
+    {
+	gtk_image_set_from_stock (img, GTK_STOCK_MISSING_IMAGE,
+				  GTK_ICON_SIZE_DIALOG);
+    }
+}
+
+static void details_update_headline (Detail *detail)
+{
+    GtkWidget *w;
+    gchar *buf;
+
+    g_return_if_fail (detail);
+
+    /* Set Artist/Title label */
+    w = gtkpod_xml_get_widget (detail->xml, "details_label_artist_title");
+
+    if (detail->track)
+    {
+	buf = g_markup_printf_escaped ("<b>%s / %s</b>",
+				       detail->track->artist,
+				       detail->track->title);
+    }
+    else
+    {
+	buf = g_strdup (_("<b>n/a</b>"));
+    }
+    gtk_label_set_markup (GTK_LABEL (w), buf);
+    g_free (buf);
+}
+
+/* Set the display to @track */
+static void details_set_track (Detail *detail, Track *track)
+{
+    T_item item;
+
+    g_return_if_fail (detail);
+
+    detail->track = track;
+
+    /* Set thumbnail */
+    details_update_thumbnail (detail);
+
+    for (item=1; item<T_ITEM_NUM; ++item)
+    {
+	details_set_item (detail, track, item);
+    }
+
+    details_update_headline (detail);
+
+    details_update_buttons (detail);
+}
+
+
+/* Set the first track of @tracks. If detail->tracks is already set,
+ * replace. */
+static void details_set_tracks (Detail *detail, GList *tracks)
+{
+    GList *gl;
+    g_return_if_fail (detail);
+    g_return_if_fail (tracks);
+
+    if (detail->orig_tracks)
+    {
+	g_list_free (detail->orig_tracks);
+	detail->orig_tracks = NULL;
+    }
+    if (detail->tracks)
+    {
+	for (gl=detail->tracks; gl; gl=gl->next)
+	{
+	    Track *tr = gl->data;
+	    g_return_if_fail (tr);
+	    itdb_track_free (tr);
+	}
+	g_list_free (detail->tracks);
+	detail->tracks = NULL;
+    }
+
+    detail->itdb = ((Track *)tracks->data)->itdb;
+
+    detail->orig_tracks = glist_duplicate (tracks);
+
+    /* Create duplicated list to work on until "Apply" is pressed */
+    for (gl=g_list_last (tracks); gl; gl=gl->prev)
+    {
+	Track *tr_dup;
+	ExtraTrackData *etr_dup;
+	Track *tr = gl->data;
+	g_return_if_fail (tr);
+	
+	tr_dup = itdb_track_duplicate (tr);
+	etr_dup = tr_dup->userdata;
+	g_return_if_fail (etr_dup);
+	etr_dup->tchanged = FALSE;
+	etr_dup->tartwork_changed = FALSE;
+	detail->tracks = g_list_prepend (detail->tracks, tr_dup);
+    }
+
+    detail->track = NULL;
+    detail->changed = FALSE;
+
+    details_set_track (detail, g_list_nth_data (detail->tracks, 0));
+}
+
+
+void details_remove_track_intern (Detail *detail, Track *track)
+{
+    gint i;
+    Track *dis_track;
+
+    g_return_if_fail (detail);
+    g_return_if_fail (track);
+
+    i = g_list_index (detail->orig_tracks, track);
+    if (i == -1)
+	return;  /* track not displayed */
+
+    /* get the copied track */
+    dis_track = g_list_nth_data (detail->tracks, i);
+    g_return_if_fail (dis_track);
+
+    /* remove tracks */
+    detail->orig_tracks = g_list_remove (detail->orig_tracks, track);
+    detail->tracks = g_list_remove (detail->tracks, dis_track);
+
+    if (detail->track == dis_track)
+    {   /* find new track to display */
+	dis_track = g_list_nth_data (detail->tracks, i);
+	if ((dis_track == NULL) && (i > 0))
+	{
+	    dis_track = g_list_nth_data (detail->tracks, i-1);
+	}
+	/* set new track */
+	details_set_track (detail, dis_track);
+    }
+
+    details_update_buttons (detail);
+}
+
+
+/* Free memory taken by @detail */
+static void details_free (Detail *detail)
+{
+    g_return_if_fail (detail);
+
+    g_object_unref (detail->xml);
+
+    if (detail->window)
+    {
+	gtk_widget_destroy (detail->window);
+    }
+
+    if (detail->orig_tracks)
+    {
+	g_list_free (detail->orig_tracks);
+    }
+
+    if (detail->tracks)
+    {
+	GList *gl;
+	for (gl=detail->tracks; gl; gl=gl->next)
+	{
+	    Track *tr = gl->data;
+	    g_return_if_fail (tr);
+	    itdb_track_free (tr);
+	}
+	g_list_free (detail->tracks);
+    }
+
+    g_free (detail);
+}
+
+
+/* Open the details window and display the selected tracks, starting
+ * with the first track */
+void details_edit (GList *selected_tracks)
+{
+    Detail *detail;
+    GtkWidget *w;
+    gint defx, defy, page;
+    T_item i;
+
+    g_return_if_fail (selected_tracks);
+
+    detail = g_malloc0 (sizeof (Detail));
+
+    detail->xml = glade_xml_new (xml_file, "details_window", NULL);
+/*  no signals to connect -> comment out */
+/*     glade_xml_signal_autoconnect (detail->xml); */
+    detail->window = gtkpod_xml_get_widget (detail->xml, "details_window");
+    g_return_if_fail (detail->window);
+
+    details = g_list_append (details, detail);
+
+    for (i=1; i<T_ITEM_NUM; ++i)
+    {
+	details_setup_widget (detail, i);
+    }
+
+    /* Navigation */
+    w = gtkpod_xml_get_widget (detail->xml, "details_button_first");
+    g_signal_connect (w, "clicked",
+		      G_CALLBACK (details_button_first_clicked),
+		      detail);
+
+    w = gtkpod_xml_get_widget (detail->xml, "details_button_previous");
+    g_signal_connect (w, "clicked",
+		      G_CALLBACK (details_button_previous_clicked),
+		      detail);
+
+    w = gtkpod_xml_get_widget (detail->xml, "details_button_next");
+    g_signal_connect (w, "clicked",
+		      G_CALLBACK (details_button_next_clicked),
+		      detail);
+
+    w = gtkpod_xml_get_widget (detail->xml, "details_button_last");
+    g_signal_connect (w, "clicked",
+		      G_CALLBACK (details_button_last_clicked),
+		      detail);
+
+    /* Thumbnail control */
+    w = gtkpod_xml_get_widget (detail->xml, "details_button_set_artwork");
+    g_signal_connect (w, "clicked",
+		      G_CALLBACK (details_button_set_artwork_clicked),
+		      detail);
+
+    w = gtkpod_xml_get_widget (detail->xml, "details_button_remove_artwork");
+    g_signal_connect (w, "clicked",
+		      G_CALLBACK (details_button_remove_artwork_clicked),
+		      detail);
+
+    /* Window control */
+    w = gtkpod_xml_get_widget (detail->xml, "details_button_apply");
+    g_signal_connect (w, "clicked",
+		      G_CALLBACK (details_button_apply_clicked),
+		      detail);
+
+    w = gtkpod_xml_get_widget (detail->xml, "details_button_cancel");
+    g_signal_connect (w, "clicked",
+		      G_CALLBACK (details_button_cancel_clicked),
+		      detail);
+
+    w = gtkpod_xml_get_widget (detail->xml, "details_button_ok");
+    g_signal_connect (w, "clicked",
+		      G_CALLBACK (details_button_ok_clicked),
+		      detail);
+
+    w = gtkpod_xml_get_widget (detail->xml, "details_button_undo_all");
+    g_signal_connect (w, "clicked",
+		      G_CALLBACK (details_button_undo_all_clicked),
+		      detail);
+
+    w = gtkpod_xml_get_widget (detail->xml, "details_button_undo_track");
+    g_signal_connect (w, "clicked",
+		      G_CALLBACK (details_button_undo_track_clicked),
+		      detail);
+
+    w = gtkpod_xml_get_widget (detail->xml,
+			       "details_checkbutton_writethrough");
+    g_signal_connect (w, "toggled",
+		      G_CALLBACK (details_writethrough_toggled),
+		      detail);
+
+    g_signal_connect (detail->window, "delete_event",
+		      G_CALLBACK (details_delete_event), detail);
+
+    /* enable drag and drop for coverart window */
+    GtkImage *img;
+    img = GTK_IMAGE (gtkpod_xml_get_widget (detail->xml,
+    					    "details_image_thumbnail"));
+    
+    gtk_drag_dest_set (
+    		GTK_WIDGET(img), 
+    		0, 
+    		cover_image_drag_types, 
+    		TGNR (cover_image_drag_types), 
+    		GDK_ACTION_COPY|GDK_ACTION_MOVE);
+
+    g_signal_connect ((gpointer) img, "drag-drop",
+    		G_CALLBACK (dnd_details_art_drag_drop), 
+    		NULL);
+        
+    g_signal_connect ((gpointer) img, "drag-data-received",
+    		G_CALLBACK (dnd_details_art_drag_data_received), 
+    		NULL);
+
+    g_signal_connect ((gpointer) img, "drag-motion",
+    		G_CALLBACK (dnd_details_art_drag_motion), 
+    		NULL);
+    
+    details_set_tracks (detail, selected_tracks);
+
+    /* set notebook page */
+    w = gtkpod_xml_get_widget (detail->xml, "details_notebook");
+    page = prefs_get_int (DETAILS_WINDOW_NOTEBOOK_PAGE);
+    if ((page >= 0) && (page <= 4))
+	gtk_notebook_set_current_page (GTK_NOTEBOOK (w), page);
+
+    /* set default size */
+    defx = prefs_get_int (DETAILS_WINDOW_DEFX);
+    defy = prefs_get_int (DETAILS_WINDOW_DEFY);
+
+    if ((defx != 0) && (defy != 0))
+/* 	gtk_window_set_default_size (GTK_WINDOW (detail->window), */
+/* 				     defx, defy); */
+	gtk_window_resize (GTK_WINDOW (detail->window),
+			   defx, defy);
+
+    gtk_widget_show (detail->window);
+}
+
+
+/* Use the dimension of the first open window */
+void details_update_default_sizes (void)
+{
+    if (details)
+	details_store_window_state (details->data);
+}
+
+
+/* Remove @track from the details window (assuming it was removed
+   from the database altogether */
+void details_remove_track (Track *track)
+{
+    GList *gl;
+
+    g_return_if_fail (track);
+    for (gl=details; gl; gl=gl->next)
+    {
+	Detail *detail = gl->data;
+	g_return_if_fail (detail);
+	details_remove_track_intern (detail, track);
+    }
+}
+
+/* Returns the detail struct currently selected in details */
+Detail *details_get_selected_detail ()
+{
+        return details->data;
+}
+
+static gboolean dnd_details_art_drag_drop(GtkWidget *widget, GdkDragContext *drag_context, gint x, gint y, guint time, gpointer user_data)
+{
+	GdkAtom target;
+	target = gtk_drag_dest_find_target (widget, drag_context, NULL);
+	
+	if (target != GDK_NONE)
+	{
+		gtk_drag_get_data (widget, drag_context, target, time);
+		return TRUE;	
+	}
+	
+	return FALSE;
+}
+
+static gboolean dnd_details_art_drag_motion (GtkWidget *widget,
+				GdkDragContext *dc,
+				gint x,
+				gint y,
+				guint time,
+				gpointer user_data)
+{
+	GdkAtom target;
+	iTunesDB *itdb;
+	ExtraiTunesDBData *eitdb;
+	
+	itdb = gp_get_selected_itdb ();
+	/* no drop is possible if no playlist/repository is selected */
+	if (itdb == NULL)
+	{
+		gdk_drag_status (dc, 0, time);
+		return FALSE;
+	}
+	
+	eitdb = itdb->userdata;
+	g_return_val_if_fail (eitdb, FALSE);
+	/* no drop is possible if no repository is loaded */
+	if (!eitdb->itdb_imported)
+	{
+		gdk_drag_status (dc, 0, time);
+		return FALSE;
+	}
+	    
+	target = gtk_drag_dest_find_target (widget, dc, NULL);
+	/* no drop possible if no valid target can be found */
+	if (target == GDK_NONE)
+	{
+		gdk_drag_status (dc, 0, time);
+		return FALSE;
+	}
+	    
+	gdk_drag_status (dc, dc->suggested_action, time);
+
+  return TRUE;
+}
+
+static void dnd_details_art_drag_data_received(GtkWidget *widget, GdkDragContext *dc, gint x, gint y, GtkSelectionData *data, guint info, guint time, gpointer user_data)
+{
+	g_return_if_fail (widget);
+	g_return_if_fail (dc);
+	g_return_if_fail (data);
+	g_return_if_fail (data->data);
+	g_return_if_fail (data->length > 0);
+
+#if DEBUG
+		printf ("data length = %d\n", data->length);
+		printf ("data->data = %s\n", data->data);
+#endif
+			
+	Detail *detail;
+	GList *tracks;
+	gchar *url = NULL;
+	Fetch_Cover *fcover;
+	gchar *filename = NULL;
+	gboolean image_status = FALSE;
+	gchar *image_error = NULL;
+	/* For use with DND_IMAGE_JPEG */
+	GdkPixbuf *pixbuf;
+	GError *error = NULL;
+	
+	/* Find the selected detail item for the coverart image */
+	detail = details_get_selected_detail ();
+	tracks = detail->tracks;
+	
+	switch (info)
+	{
+		case DND_IMAGE_JPEG:			
+#if DEBUG
+			printf ("Using DND_IMAGE_JPEG\n");
+#endif
+			pixbuf = gtk_selection_data_get_pixbuf (data);
+			if (pixbuf != NULL)
+			{
+				/* initialise the url string with a safe value as not used if already have image */
+				url = "local image";
+				/* Initialise a fetchcover object */
+				fcover = fetchcover_new (url, tracks);
+				fcover->parent_window =  GTK_WINDOW(detail->window);
+				coverart_block_change (TRUE);
+								
+				/* find the filename with which to save the pixbuf to */
+				if (fetchcover_select_filename (fcover))
+				{
+					filename = g_build_filename(fcover->dir, fcover->filename, NULL);
+					if (! gdk_pixbuf_save (pixbuf, filename, "jpeg", &error, NULL))
+					{
+						/* Save failed for some reason */
+						fcover->err_msg = g_strdup (error->message);
+						g_error_free (error);
+					}
+					else
+					{
+						/* Image successfully saved */
+						image_status = TRUE;
+					}
+				}
+				/* record any errors and free the fetchcover */
+				if (fcover->err_msg != NULL)
+					image_error = g_strdup(fcover->err_msg);
+								
+				free_fetchcover (fcover);
+				gdk_pixbuf_unref (pixbuf);
+				coverart_block_change (FALSE);
+			}
+			else
+			{
+				/* despite the data being of type image/jpeg, the pixbuf is NULL */
+				image_error = "jpeg data flavour was used but the data did not contain a GdkPixbuf object";
+			}
+			break;
+		case DND_TEXT_PLAIN:
+#if DEBUG
+				printf ("Defaulting to using DND_TEXT_PLAIN\n");
+#endif
+							
+#ifdef HAVE_CURL
+				/* initialise the url string with the data from the dnd */
+				url = g_strdup ((gchar *) data->data);
+				/* Initialise a fetchcover object */
+				fcover = fetchcover_new (url, tracks);
+				/* assign details window as the parent window so the file exists dialog is
+				 * properly centred and visible if a file has to be overwritten
+				 */
+				fcover->parent_window =  GTK_WINDOW(detail->window);
+				coverart_block_change (TRUE);
+						
+				if (fetchcover_net_retrieve_image (fcover))
+				{
+#if DEBUG
+					printf ("Successfully retrieved\n");
+					printf ("Url of fetch cover: %s\n", fcover->url->str);
+					printf ("filename of fetch cover: %s\n", fcover->filename);
+#endif
+							
+					filename = g_build_filename(fcover->dir, fcover->filename, NULL);
+					image_status = TRUE;
+				}
+								
+				/* record any errors and free the fetchcover */
+				if (fcover->err_msg != NULL)
+					image_error = g_strdup(fcover->err_msg);
+												
+				free_fetchcover (fcover);
+				coverart_block_change (FALSE);
+#else
+			image_error = "Item had to be downloaded but gtkpod was not compiled with curl.";
+			image_status = FALSE;
+#endif
+	}
+				
+	if (!image_status || filename == NULL)
+	{
+		gtkpod_warning (_("Error occurred dropping an image onto the details window: %s\n"), image_error);
+		
+		if (image_error)
+			g_free (image_error);
+		if (filename)
+			g_free (filename);
+				
+		gtk_drag_finish (dc, FALSE, FALSE, time);
+		return;
+	}
+	
+	if (details_writethrough(detail))
+	{
+		GList *list;
+		for (list = detail->tracks; list; list = list->next)
+		{
+			ExtraTrackData *etd;
+			Track *track = list->data;
+					    
+			if (!track)
+				break;
+
+			etd = track->userdata;
+			gp_track_set_thumbnails(track, filename);
+			etd->tchanged = TRUE;
+			etd->tartwork_changed = TRUE;
+		}
+	}
+	else
+	{
+		ExtraTrackData *etd = detail->track->userdata;
+		if (etd)
+		{
+			gp_track_set_thumbnails(detail->track, filename);
+			etd->tchanged = TRUE;
+			etd->tartwork_changed = TRUE;
+		}
+	}
+	detail->changed = TRUE;
+	details_update_thumbnail(detail);
+	details_update_buttons(detail);
+
+	if (image_error)
+		g_free (image_error);
+		
+	g_free (filename);	
+	gtkpod_statusbar_message (_("Successfully set new coverart for selected tracks"));
+	gtk_drag_finish (dc, FALSE, FALSE, time);
+	return;
+}

Added: trunk/src/details.h
===================================================================
--- trunk/src/details.h	                        (rev 0)
+++ trunk/src/details.h	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,64 @@
+/* Time-stamp: <2005-12-10 00:46:23 jcs>
+|
+|  Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+| 
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+| 
+|  iTunes and iPod are trademarks of Apple
+| 
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: details.h 1596 2007-06-26 14:33:01Z dforsi $
+*/
+
+#ifndef __DETAILS_H__
+#define __DETAILS_H__
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+ 
+#include <gtk/gtk.h>
+#include "itdb.h"
+#include <glade/glade.h>
+
+struct _Detail
+{
+    GladeXML *xml;      /* XML info                           */
+    GtkWidget *window;  /* pointer to details window          */
+    iTunesDB *itdb;     /* pointer to the original itdb       */
+    GList *orig_tracks; /* tracks displayed in details window */
+    GList *tracks;      /* tracks displayed in details window */
+    Track *track;       /* currently displayed track          */
+    gboolean artwork_ok;/* artwork can be displayed or not    */
+    gboolean changed;   /* at least one track was changed     */
+
+};
+
+typedef struct _Detail Detail;
+
+/* details window */
+void details_edit (GList *selected_tracks);
+void details_update_default_sizes (void);
+void details_remove_track (Track *track);
+gboolean details_writethrough (Detail *detail);
+void details_update_thumbnail (Detail *detail);
+void details_update_buttons (Detail *detail);
+Detail *details_get_selected_detail ();
+#endif

Added: trunk/src/display.c
===================================================================
--- trunk/src/display.c	                        (rev 0)
+++ trunk/src/display.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,1868 @@
+/* Time-stamp: <2007-12-13 01:02:57 jcs>
+|
+|  Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+|
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: display.c 1825 2007-12-13 13:28:20Z dforsi $
+*/
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "details.h"
+#include "display_private.h"
+#include "info.h"
+#include "ipod_init.h"
+#include "file_convert.h"
+#include "misc.h"
+#include "misc_track.h"
+#include "prefs.h"
+#include "prefs_window.h"
+#include "repository.h"
+#include "syncdir.h"
+#include "tools.h"
+#include <stdlib.h>
+#include <string.h>
+#include <glib/gprintf.h>
+
+
+GtkWidget *gtkpod_window = NULL;
+
+/* Create the listviews etc */
+void display_create (void)
+{
+    gint defx, defy;
+    GtkTooltips *main_tooltips;
+
+    g_return_if_fail (gtkpod_window);
+
+    /* x,y-size */
+    defx = prefs_get_int("size_gtkpod.x");
+		defy = prefs_get_int("size_gtkpod.y");
+    gtk_window_set_default_size (GTK_WINDOW (gtkpod_window), defx, defy);
+/* we need to use the following line if the main window is already
+   displayed */
+/*    gtk_window_resize (GTK_WINDOW (gtkpod_window), defx, defy);*/
+
+    /* Create tooltips */
+    main_tooltips = gtk_tooltips_new ();
+    g_object_set_data (G_OBJECT (gtkpod_window),
+		       "main_tooltips", main_tooltips);
+    /* indicate that main_tooltips was set up */
+    g_object_set_data (G_OBJECT (gtkpod_window),
+		       "main_tooltips_initialised", "set");
+
+    tm_create_treeview ();
+    st_create_tabs ();
+    pm_create_treeview ();
+
+    /* initialize sorting */
+    tm_sort (prefs_get_int("tm_sortcol"), prefs_get_int("tm_sort"));
+
+    st_set_default_sizes ();
+
+    /* Hide/Show the toolbar */
+    display_show_hide_toolbar ();
+    /* Hide/Show tooltips */
+    display_show_hide_tooltips ();
+    /* change standard g_print () handler */
+    g_set_print_handler ((GPrintFunc)gtkpod_warning);
+
+    /* activate the delete menus correctly */
+    display_adjust_menus ();
+    /* activate status bars */
+    gtkpod_statusbar_init ();
+    gtkpod_tracks_statusbar_init ();
+    gtkpod_space_statusbar_init ();
+
+    /* Initialize the coverart display */
+    coverart_init_display ();
+
+    /* set the menu item for the info window correctly */
+    /* CAREFUL: must be done after calling ..._space_statusbar_init() */
+    display_set_info_window_menu ();
+    /* check if info window should be opened */
+    if (prefs_get_int("info_window"))  info_open_window ();
+}
+
+/* redisplay the entire display (playlists, sort tabs, track view) and
+ * reset the sorted treeviews to normal (according to @inst) */
+/* @inst: which treeviews should be reset to normal?
+   -2: all treeviews
+   -1: only playlist
+    0...SORT_TAB_MAX-1: sort tab of instance @inst
+    SORT_TAB_MAX: track treeview
+    SORT_TAB_MAX+1: all sort tabs */
+void display_reset (gint inst)
+{
+    gint i;
+    Playlist *cur_pl;
+
+    /* remember */
+    cur_pl = pm_get_selected_playlist ();
+
+    /* remove all playlists from model (and reset "sortable") */
+    if ((inst == -2) || (inst == -1))	pm_remove_all_playlists (TRUE);
+    else                                pm_remove_all_playlists (FALSE);
+
+    /* reset the sort tabs and track view */
+    st_init (-1, 0);
+
+    /* reset "sortable" */
+    for (i=0; i<SORT_TAB_MAX; ++i)
+    {
+	if ((inst == -2) || (inst == i) || (inst == SORT_TAB_MAX+1))
+	    st_remove_all_entries_from_model (i);
+    }
+
+    pm_set_selected_playlist (cur_pl);
+    /* add playlists back to model (without selecting) */
+    pm_add_all_itdbs ();
+}
+
+
+/* Clean up used memory (when quitting the program) */
+void display_cleanup (void)
+{
+    st_cleanup ();
+}
+
+
+/* make sure only suitable delete menu items are available */
+void display_adjust_menus (void)
+{
+    GtkWidget *delete;
+    GtkWidget *edit1, *edit2, *edit3, *edit4, *edit5;
+    GtkWidget *dtfpl, *dtfip, *dtfdb, *dtfhd;
+    GtkWidget *defpl, *defip, *defdb, *defhd;
+    GtkWidget *dpl, *dpltfip, *dpltfdb, *dpltfhd;
+    GtkWidget *dsep1, *dsep2;
+    GtkWidget *espl;
+    Playlist *pl;
+
+    delete = gtkpod_xml_get_widget (main_window_xml, "delete_menu");
+    edit1 = gtkpod_xml_get_widget (main_window_xml, "edit_details_menu");
+    edit2 = gtkpod_xml_get_widget (main_window_xml, "delete_menu");
+    edit3 = gtkpod_xml_get_widget (main_window_xml, "create_playlists_menu");
+    edit4 = gtkpod_xml_get_widget (main_window_xml, "randomize_current_playlist_menu");
+    edit5 = gtkpod_xml_get_widget (main_window_xml, "save_track_order_menu");
+    dtfpl = gtkpod_xml_get_widget (main_window_xml,
+				   "delete_selected_tracks_from_playlist");
+    dtfip = gtkpod_xml_get_widget (main_window_xml,
+				   "delete_selected_tracks_from_ipod");
+    dtfdb = gtkpod_xml_get_widget (main_window_xml,
+				   "delete_selected_tracks_from_database");
+    dtfhd = gtkpod_xml_get_widget (main_window_xml,
+				   "delete_selected_tracks_from_harddisk");
+    defpl = gtkpod_xml_get_widget (main_window_xml,
+				   "delete_selected_entry_from_playlist");
+    defip = gtkpod_xml_get_widget (main_window_xml,
+				   "delete_selected_entry_from_ipod");
+    defdb = gtkpod_xml_get_widget (main_window_xml,
+				   "delete_selected_entry_from_database");
+    defhd = gtkpod_xml_get_widget (main_window_xml,
+				   "delete_selected_entry_from_harddisk");
+    dpl = gtkpod_xml_get_widget (main_window_xml,
+				 "delete_selected_playlist");
+    dpltfip = gtkpod_xml_get_widget (main_window_xml,
+				     "delete_selected_playlist_including_tracks_from_ipod");
+    dpltfdb = gtkpod_xml_get_widget (main_window_xml,
+				     "delete_selected_playlist_including_tracks_from_database");
+    dpltfhd = gtkpod_xml_get_widget (main_window_xml,
+				     "delete_selected_playlist_including_tracks_from_harddisk");
+    dsep1 = gtkpod_xml_get_widget (main_window_xml, "delete_separator1");
+    dsep2 = gtkpod_xml_get_widget (main_window_xml, "delete_separator2");
+    espl = gtkpod_xml_get_widget (main_window_xml,
+				  "edit_smart_playlist");
+
+    pl = pm_get_selected_playlist ();
+
+    if (pl == NULL)
+    {
+	gtk_widget_set_sensitive (delete, FALSE);
+	gtk_widget_set_sensitive (edit1, FALSE);
+	gtk_widget_set_sensitive (edit2, FALSE);
+	gtk_widget_set_sensitive (edit3, FALSE);
+	gtk_widget_set_sensitive (edit4, FALSE);
+	gtk_widget_set_sensitive (edit5, FALSE);
+	gtk_widget_set_sensitive (espl, FALSE);
+    }
+    else
+    {
+	iTunesDB *itdb = pl->itdb;
+	g_return_if_fail (itdb);
+
+	gtk_widget_set_sensitive (delete, TRUE);
+	gtk_widget_set_sensitive (edit1, TRUE);
+	gtk_widget_set_sensitive (edit2, TRUE);
+	gtk_widget_set_sensitive (edit3, TRUE);
+	gtk_widget_set_sensitive (edit4, TRUE);
+	gtk_widget_set_sensitive (edit5, TRUE);
+
+	gtk_widget_hide (dtfpl);
+	gtk_widget_hide (dtfip);
+	gtk_widget_hide (dtfdb);
+	gtk_widget_hide (dtfhd);
+
+	gtk_widget_hide (defpl);
+	gtk_widget_hide (defip);
+	gtk_widget_hide (defdb);
+	gtk_widget_hide (defhd);
+
+	gtk_widget_hide (dpl);
+	gtk_widget_hide (dpltfip);
+	gtk_widget_hide (dpltfdb);
+	gtk_widget_hide (dpltfhd);
+
+	gtk_widget_hide (dsep1);
+	gtk_widget_hide (dsep2);
+
+	gtk_widget_set_sensitive (espl, FALSE);
+
+	if (pl->is_spl)
+	{
+	    gtk_widget_set_sensitive (espl, TRUE);
+	}
+
+	if (itdb->usertype & GP_ITDB_TYPE_IPOD)
+	{
+	    if (itdb_playlist_is_mpl (pl))
+	    {
+		gtk_widget_show (dtfip);
+		gtk_widget_show (defip);
+	    }
+	    else
+	    {
+		if (itdb_playlist_is_podcasts (pl))
+		{
+		    gtk_widget_show (dtfip);
+		    gtk_widget_show (defip);
+		}
+		else
+		{
+		    gtk_widget_show (dpl);
+		    gtk_widget_show (dpltfip);
+
+		    gtk_widget_show (dsep1);
+
+		    gtk_widget_show (defpl);
+		    gtk_widget_show (defip);
+
+		    gtk_widget_show (dsep2);
+
+		    gtk_widget_show (dtfpl);
+		    gtk_widget_show (dtfip);
+		}
+	    }
+	}
+	if (itdb->usertype & GP_ITDB_TYPE_LOCAL)
+	{
+	    if (itdb_playlist_is_mpl (pl))
+	    {
+		gtk_widget_show (dtfdb);
+		gtk_widget_show (dtfhd);
+
+		gtk_widget_show (dsep2);
+
+		gtk_widget_show (defdb);
+		gtk_widget_show (defhd);
+	    }
+	    else
+	    {
+		gtk_widget_show (dtfpl);
+		gtk_widget_show (dtfdb);
+		gtk_widget_show (dtfhd);
+
+		gtk_widget_show (dsep1);
+
+		gtk_widget_show (defpl);
+		gtk_widget_show (defdb);
+		gtk_widget_show (defhd);
+
+		gtk_widget_show (dsep2);
+
+		gtk_widget_show (dpl);
+		gtk_widget_show (dpltfdb);
+		gtk_widget_show (dpltfhd);
+	    }
+	}
+	if (itdb->usertype & GP_ITDB_TYPE_PODCASTS)
+	{
+	    if (itdb_playlist_is_mpl (pl))
+	    {
+		gtk_widget_show (dtfdb);
+		gtk_widget_show (dtfhd);
+
+		gtk_widget_show (dsep2);
+
+		gtk_widget_show (defdb);
+		gtk_widget_show (defhd);
+	    }
+	    else
+	    {
+		gtk_widget_show (dtfpl);
+		gtk_widget_show (dtfdb);
+		gtk_widget_show (dtfhd);
+
+		gtk_widget_show (dsep1);
+
+		gtk_widget_show (defpl);
+		gtk_widget_show (defdb);
+		gtk_widget_show (defhd);
+
+		gtk_widget_show (dsep2);
+
+		gtk_widget_show (dpl);
+		gtk_widget_show (dpltfdb);
+		gtk_widget_show (dpltfhd);
+	    }
+	}
+    }
+}
+
+/* make the toolbar visible or hide it depending on the value set in
+   the prefs */
+void display_show_hide_toolbar (void)
+{
+    GtkWidget *tb = gtkpod_xml_get_widget (main_window_xml, "toolbar");
+    GtkWidget *mi = gtkpod_xml_get_widget (main_window_xml, "toolbar_menu");
+
+    if (prefs_get_int("display_toolbar"))
+    {
+	gtk_toolbar_set_style (GTK_TOOLBAR (tb), prefs_get_int("toolbar_style"));
+	gtk_widget_show (tb);
+	gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (mi), TRUE);
+    }
+    else
+    {
+	gtk_widget_hide (tb);
+	gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (mi), FALSE);
+    }
+}
+
+/* Adjust the menu item status according on the value set in the
+   prefs. */
+void display_set_info_window_menu (void)
+{
+    GtkWidget *mi = gtkpod_xml_get_widget (main_window_xml, "info_window_menu");
+
+    if (prefs_get_int("info_window"))
+    {
+	gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (mi), TRUE);
+    }
+    else
+    {
+	gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (mi), FALSE);
+    }
+}
+
+/* make the tooltips visible or hide it depending on the value set in
+ * the prefs (tooltips_main) */
+void display_show_hide_tooltips (void)
+{
+    GtkCheckMenuItem *mi;
+    GtkToolbar *tb;
+    GtkTooltips *mt;
+
+    g_return_if_fail (main_window_xml);
+    g_return_if_fail (gtkpod_window);
+
+    /* ignore calls before window was set up properly (called by
+       prefs) */
+    if (!g_object_get_data (G_OBJECT (gtkpod_window),
+			    "main_tooltips_initialised")) return;
+
+    mi = GTK_CHECK_MENU_ITEM (
+	gtkpod_xml_get_widget (main_window_xml, "tooltips_menu"));
+    tb = GTK_TOOLBAR (gtkpod_xml_get_widget (main_window_xml, "toolbar"));
+    mt = g_object_get_data (G_OBJECT (gtkpod_window), "main_tooltips");
+
+    g_return_if_fail (mi);
+    g_return_if_fail (tb);
+    g_return_if_fail (mt);
+
+
+    if (prefs_get_int("display_tooltips_main"))
+    {
+	gtk_tooltips_enable (mt);
+	gtk_check_menu_item_set_active (mi, TRUE);
+	gtk_toolbar_set_tooltips (tb, TRUE);
+    }
+    else
+    {
+	gtk_tooltips_disable (mt);
+	gtk_check_menu_item_set_active (mi, FALSE);
+	gtk_toolbar_set_tooltips (tb, FALSE);
+    }
+    /* Show/Hide tooltips of the special sorttabs */
+    st_show_hide_tooltips ();
+    /* Show/Hide tooltips of the prefs window */
+    prefs_window_show_hide_tooltips ();
+    /* Show/Hide tooltips of the prefs window */
+    sort_window_show_hide_tooltips ();
+}
+
+
+/* update the cfg structure (preferences) with the current sizes /
+   positions:
+   x,y size of main window
+   column widths of track model
+   position of GtkPaned elements */
+void display_update_default_sizes (void)
+{
+    gint x,y;
+
+    /* x,y size of main window */
+    if (gtkpod_window)
+    {
+	gtk_window_get_size (GTK_WINDOW (gtkpod_window), &x, &y);
+	prefs_set_int("size_gtkpod.x", x);
+	prefs_set_int("size_gtkpod.y", y);
+    }
+    tm_update_default_sizes ();
+    st_update_default_sizes ();
+    prefs_window_update_default_sizes ();
+    info_update_default_sizes ();
+    details_update_default_sizes ();
+    file_convert_update_default_sizes ();
+}
+
+/**
+ * display_image_dialog
+ * 
+ * @GdkPixbuf: image
+ * 
+ * function to load a transient dialog displaying the provided image at either
+ * it maximum size or the size of the screen (whichever is smallest).
+ * 
+ */
+void display_image_dialog (GdkPixbuf *image)
+{
+	g_return_if_fail (image);
+	
+	GladeXML *preview_xml;
+	GtkWidget *dialog;
+	GtkWidget *canvasbox;
+	GtkWidget *res_label;
+	GdkPixbuf *scaled = NULL;
+	gchar *text;
+		
+	preview_xml = glade_xml_new (xml_file, "coverart_preview_dialog", NULL);
+		
+	dialog = gtkpod_xml_get_widget (preview_xml, "coverart_preview_dialog");
+	canvasbox = gtkpod_xml_get_widget (preview_xml, "coverart_preview_dialog_vbox");
+	res_label = gtkpod_xml_get_widget (preview_xml, "coverart_preview_dialog_res_lbl");
+	g_return_if_fail (dialog);
+	g_return_if_fail (canvasbox);
+	g_return_if_fail (res_label);
+		
+	/* Set the dialog parent */
+	gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (gtkpod_window));
+			
+	gint pixheight = gdk_pixbuf_get_height (image);
+	gint pixwidth = gdk_pixbuf_get_width (image);
+		
+	/* Set the resolution in the label */
+	gchar *resvalues = (gchar *) g_malloc (sizeof(gint) + (sizeof(gchar) * 3) + sizeof(gint));
+	g_sprintf (resvalues, "%d x %d", pixwidth, pixheight);
+	text = g_markup_printf_escaped (_("<b>Image Dimensions: %s</b>"), resvalues);
+	gtk_label_set_markup (GTK_LABEL (res_label), text);
+	g_free (text);
+	
+	gint scrheight = gdk_screen_height() - 100;
+	gint scrwidth = gdk_screen_width() - 100;
+		
+	gdouble ratio = (gdouble) pixwidth / (gdouble) pixheight;
+	if (pixwidth > scrwidth)
+	{
+		pixwidth = scrwidth;
+		pixheight = pixwidth / ratio;
+	}
+		
+	if (pixheight > scrheight)
+	{
+		pixheight = scrheight;
+		pixwidth = pixheight * ratio;
+	}
+		
+	GnomeCanvas *canvas;
+	canvas = GNOME_CANVAS (gnome_canvas_new());
+	gtk_widget_set_size_request ( GTK_WIDGET(canvas),
+			pixwidth,
+			pixheight);
+	
+	gnome_canvas_set_scroll_region (	canvas,
+																														0.0, 0.0, 
+																														pixwidth,
+																														pixheight);
+	GnomeCanvasItem *canvasitem;											
+	canvasitem = gnome_canvas_item_new(	gnome_canvas_root(canvas),
+																																			GNOME_TYPE_CANVAS_PIXBUF, NULL);
+		
+	scaled = gdk_pixbuf_scale_simple (image, pixwidth, pixheight, GDK_INTERP_NEAREST);
+		
+	/* Apply the image to the canvas */
+	gnome_canvas_item_set (	canvasitem,
+																							"pixbuf", scaled);
+
+	gtk_box_pack_start_defaults (GTK_BOX(canvasbox), GTK_WIDGET (canvas));
+		
+	/* Display the dialog and block everything else until the
+	 * dialog is closed.
+	 */
+	gtk_widget_show_all (dialog);
+	gtk_dialog_run (GTK_DIALOG(dialog));
+			
+	/* Destroy the dialog as no longer required */
+	gdk_pixbuf_unref (scaled);
+	gtk_widget_destroy (GTK_WIDGET (dialog));
+}
+
+
+/* Utility function: returns a copy of the tracks currently
+   selected. This means:
+
+   @inst == -1:
+      return list of tracks in selected playlist
+
+   @inst == 0 ... prefs_get_sort_tab_num () - 1:
+      return list of tracks in passed on to the next instance: selected
+      tab entry (normal sort tab) or tracks matching specified
+      conditions in a special sort tab
+
+   @inst >= prefs_get_sort_tab_num ():
+      return list of tracks selected in the track view
+
+   You must g_list_free() the list after use.
+*/
+GList *display_get_selection (guint32 inst)
+{
+    if (inst == -1)
+    {
+	Playlist *pl = pm_get_selected_playlist ();
+	if (pl)  return g_list_copy (pl->members);
+	else     return NULL;
+    }
+    if ((inst >= 0) && (inst < prefs_get_int("sort_tab_num")))
+	return g_list_copy (st_get_selected_members (inst));
+    if (inst >= prefs_get_int("sort_tab_num"))
+	return tm_get_selected_tracks ();
+    return NULL;
+}
+
+
+/* Get the members that are passed on to the next instance.
+   @inst: -1: playlist view
+          0...prefs_get_sort_tab_num()-1: sort tabs
+          >= prefs_get_sort_tab_num(): return NULL
+   You must not g_list_free the list or otherwise modify it */
+GList *display_get_selected_members (gint inst)
+{
+    GList *tracks=NULL;
+    if (inst == -1)
+    {
+	Playlist *pl = pm_get_selected_playlist ();
+	if (pl)  tracks = pl->members;
+    }
+    else
+    {
+	tracks = st_get_selected_members (inst);
+    }
+    return tracks;
+}
+
+
+/* ------------------------------------------------------------
+
+           Functions for treeview autoscroll (during DND)
+
+   ------------------------------------------------------------ */
+
+static void _remove_scroll_row_timeout (GtkWidget *widget)
+{
+    g_return_if_fail (widget);
+
+    g_object_set_data (G_OBJECT (widget),
+		       "scroll_row_timeout", NULL);
+    g_object_set_data (G_OBJECT (widget),
+		       "scroll_row_times", NULL);
+}
+
+void display_remove_autoscroll_row_timeout (GtkWidget *widget)
+{
+    guint timeout;
+
+    g_return_if_fail (widget);
+
+    timeout = GPOINTER_TO_UINT(g_object_get_data (G_OBJECT (widget),
+					"scroll_row_timeout"));
+
+    if (timeout != 0)
+    {
+	g_source_remove (timeout);
+	_remove_scroll_row_timeout (widget);
+    }
+}
+
+static gint display_autoscroll_row_timeout (gpointer data)
+{
+    GtkTreeView *treeview = data;
+    gint px, py;
+    GdkModifierType mask;
+    GdkRectangle vis_rect;
+    guint times;
+    gboolean resp = TRUE;
+    const gint SCROLL_EDGE_SIZE = 12;
+
+    g_return_val_if_fail (data, FALSE);
+
+    gdk_threads_enter ();
+
+    times = GPOINTER_TO_UINT(g_object_get_data (G_OBJECT (data), "scroll_row_times"));
+    
+    gdk_window_get_pointer (gtk_tree_view_get_bin_window (treeview),
+			    &px, &py, &mask);
+    gtk_tree_view_get_visible_rect (treeview, &vis_rect);
+/*     printf ("px/py, w/h, mask: %d/%d, %d/%d, %d\n", px, py, */
+/* 	    vis_rect.width, vis_rect.height, mask); */
+    if ((vis_rect.height > 2.2 * SCROLL_EDGE_SIZE) &&
+	((py < SCROLL_EDGE_SIZE) ||
+	 (py > vis_rect.height-SCROLL_EDGE_SIZE)))
+    {
+	GtkTreePath *path = NULL;
+
+	if (py < SCROLL_EDGE_SIZE/3)
+	    ++times;
+	if (py > vis_rect.height-SCROLL_EDGE_SIZE/3)
+	    ++times;
+
+	if (times > 0)
+	{
+	    if (gtk_tree_view_get_path_at_pos (treeview, px, py, 
+					       &path, NULL, NULL, NULL))
+	    {
+		if (py < SCROLL_EDGE_SIZE)
+		    gtk_tree_path_prev (path);
+		if (py > vis_rect.height-SCROLL_EDGE_SIZE)
+		    gtk_tree_path_next (path);
+		gtk_tree_view_scroll_to_cell (treeview, path, NULL,
+					      FALSE, 0, 0);
+	    }
+	    times = 0;
+	}
+	else
+	{
+	    ++times;
+	}
+    }
+    else
+    {
+	times = 0;
+    }
+    g_object_set_data (G_OBJECT (data), "scroll_row_times",
+		       GUINT_TO_POINTER(times));
+    if (mask == 0)
+    {
+	_remove_scroll_row_timeout (data);
+	resp = FALSE;
+    }
+    gdk_threads_leave ();
+    return resp;
+}
+
+void display_install_autoscroll_row_timeout (GtkWidget *widget)
+{
+    if (!g_object_get_data (G_OBJECT (widget), "scroll_row_timeout"))
+    {   /* install timeout function for autoscroll */
+	guint timeout = g_timeout_add (75, display_autoscroll_row_timeout,
+				       widget);
+	g_object_set_data (G_OBJECT (widget), "scroll_row_timeout",
+			   GUINT_TO_POINTER(timeout));
+    }
+}
+
+
+
+/* ------------------------------------------------------------
+
+      Callbacks for toolbar buttons and menu.
+
+   ------------------------------------------------------------ */
+
+/* The following functions are called directly without using callbacks
+   in this section: 
+
+   void handle_export (void)
+   void create_add_files_dialog (void)
+   void create_add_playlists_dialog(void)
+   void dirbrowser_create (void)
+   void open_about_window (void)
+*/
+
+
+void on_edit_details_selected_playlist (GtkMenuItem     *menuitem,
+					gpointer         user_data)
+{
+    Playlist *pl = pm_get_selected_playlist ();
+
+    if (pl)
+    {
+	details_edit (pl->members);
+    }
+    else
+    {
+	message_sb_no_playlist_selected ();
+    }
+}
+
+void on_edit_details_selected_tab_entry (GtkMenuItem     *menuitem,
+					 gpointer         user_data)
+{
+    gint inst = get_sort_tab_number (
+	_("Edit selected entry of which sort tab?"));
+
+    if (inst != -1)
+    {
+	TabEntry *entry = st_get_selected_entry (inst);
+	if (entry == NULL)
+	{  /* no entry selected */
+	    gtkpod_statusbar_message (_("No entry selected."));
+	    return;
+	}
+	details_edit (entry->members);
+    }
+}
+
+void on_edit_details_selected_tracks (GtkMenuItem     *menuitem,
+				      gpointer         user_data)
+{
+    GList *tracks = tm_get_selected_tracks ();
+
+    if (tracks)
+    {
+	details_edit (tracks);
+	g_list_free (tracks);
+    }
+    else
+    {
+	message_sb_no_tracks_selected ();
+    }
+}
+
+
+/* callback for "add new playlist" button */
+void
+on_new_playlist_button                 (GtkButton       *button,
+					gpointer         user_data)
+{
+    iTunesDB *itdb = gp_get_selected_itdb();
+
+    if (itdb)
+    {
+	add_new_pl_or_spl_user_name (itdb, NULL, -1);
+    }
+    else
+    {
+	message_sb_no_itdb_selected ();
+    }
+}
+
+
+/* callback for "add new playlist" menu */
+void
+on_new_playlist1_activate              (GtkMenuItem     *menuitem,
+					gpointer         user_data)
+{
+    iTunesDB *itdb = gp_get_selected_itdb();
+
+    if (itdb)
+    {
+	add_new_pl_or_spl_user_name (itdb, NULL, -1);
+    }
+    else
+    {
+	message_sb_no_itdb_selected ();
+    }
+}
+
+void
+on_edit_preferences_activate          (GtkMenuItem     *menuitem,
+					gpointer         user_data)
+{
+    if(!widgets_blocked)  prefs_window_create (-1);
+}
+
+void
+on_edit_repository_options_activate          (GtkMenuItem     *menuitem,
+					      gpointer         user_data)
+{
+    Playlist *pl = pm_get_selected_playlist ();
+
+    if (pl)
+    {
+	repository_edit (pl->itdb, pl);
+    }
+    else
+    {
+	repository_edit (NULL, NULL);
+    }
+}
+
+void
+on_load_ipods_mi           (GtkMenuItem     *menuitem,
+			    gpointer         user_data)
+{
+    gp_load_ipods ();
+}
+
+
+void
+on_load_ipods_clicked               (GtkButton       *button,
+				     gpointer         user_data)
+{
+    gp_load_ipods ();
+}
+
+
+void
+on_save_changes_mi           (GtkMenuItem     *menuitem,
+			      gpointer         user_data)
+{
+    handle_export ();
+}
+
+
+
+void
+on_save_changes_clicked               (GtkButton       *button,
+				     gpointer         user_data)
+{
+    handle_export ();
+}
+
+
+
+void on_edit_smart_playlist (GtkMenuItem *mi,
+			     gpointer data)
+{
+    Playlist *pl = pm_get_selected_playlist ();
+
+    if (pl)
+    {
+	spl_edit (pl);
+    }
+    else
+    {
+	message_sb_no_playlist_selected ();
+    }
+}
+
+
+static void delete_selected_tracks (DeleteAction deleteaction)
+{
+    GList *tracks = tm_get_selected_tracks ();
+
+    if (tracks)
+    {
+	delete_track_head (deleteaction);
+	g_list_free (tracks);
+    }
+    else
+    {
+	message_sb_no_tracks_selected ();
+    }
+}    
+
+static void delete_selected_entry (DeleteAction deleteaction,
+				   gchar *text)
+{
+    TabEntry *entry;
+    gint inst;
+
+    inst = get_sort_tab_number (text);
+    if (inst == -1) return;
+
+    entry = st_get_selected_entry (inst);
+    if (!entry)
+    {
+	gtkpod_statusbar_message (_("No entry selected in Sort Tab %d"),
+				  inst+1);
+	return;
+    }
+    delete_entry_head (inst, deleteaction);
+}
+
+static void delete_selected_playlist (DeleteAction deleteaction)
+{
+    Playlist *pl = pm_get_selected_playlist ();
+
+    if (pl)
+    {
+	delete_playlist_head (deleteaction);
+    }
+    else
+    {
+	message_sb_no_playlist_selected ();
+    }
+}
+
+void on_delete_selected_tracks_from_database (GtkMenuItem *mi,
+					      gpointer data)
+{
+    delete_selected_tracks (DELETE_ACTION_DATABASE);
+}
+
+void
+on_delete_selected_playlist_including_tracks_from_harddisk (GtkMenuItem *mi,
+							    gpointer data)
+{
+    delete_selected_playlist (DELETE_ACTION_LOCAL);
+}
+
+
+void on_delete_selected_entry_from_database (GtkMenuItem *mi,
+					     gpointer data)
+{
+    delete_selected_entry (DELETE_ACTION_DATABASE, 
+			   _("Remove entry of which sort tab from database?"));
+}
+
+
+void on_delete_selected_entry_from_ipod (GtkMenuItem *mi,
+					 gpointer data)
+{
+    delete_selected_entry (DELETE_ACTION_IPOD,
+			   _("Remove tracks in selected entry of which filter tab from the iPod?"));
+}
+
+
+void on_delete_selected_tracks_from_playlist (GtkMenuItem *mi,
+					      gpointer data)
+{
+    delete_selected_tracks (DELETE_ACTION_PLAYLIST);
+}
+
+
+void on_delete_selected_tracks_from_harddisk (GtkMenuItem *mi,
+					      gpointer data)
+{
+    delete_selected_tracks (DELETE_ACTION_LOCAL);
+}
+
+
+void on_delete_selected_entry_from_harddisk (GtkMenuItem *mi,
+					     gpointer data)
+{
+    delete_selected_entry (DELETE_ACTION_LOCAL,
+			   _("Remove tracks in selected entry of which filter tab from the harddisk?"));
+}
+
+
+void on_delete_selected_tracks_from_ipod (GtkMenuItem *mi,
+					  gpointer data)
+{
+    delete_selected_tracks (DELETE_ACTION_IPOD);
+}
+
+
+void on_delete_selected_playlist (GtkMenuItem *mi,
+				  gpointer data)
+{
+    delete_selected_playlist (DELETE_ACTION_PLAYLIST);
+}
+
+
+void
+on_delete_selected_playlist_including_tracks_from_database (GtkMenuItem *mi,
+							    gpointer data)
+{
+    delete_selected_playlist (DELETE_ACTION_DATABASE);
+}
+
+
+void on_delete_selected_entry_from_playlist (GtkMenuItem *mi,
+					     gpointer data)
+{
+    delete_selected_entry (DELETE_ACTION_PLAYLIST,
+			   _("Remove tracks in selected entry of which filter tab from playlist?"));
+}
+
+
+void
+on_delete_selected_playlist_including_tracks_from_ipod (GtkMenuItem *mi,
+							gpointer data)
+{
+    delete_selected_playlist (DELETE_ACTION_IPOD);
+}
+
+
+void
+on_ipod_directories_menu               (GtkMenuItem     *menuitem,
+					gpointer         user_data)
+{
+    iTunesDB *itdb = gp_get_ipod_itdb ();
+    if (itdb)
+    {
+	ExtraiTunesDBData *eitdb = itdb->userdata;
+
+	g_return_if_fail (eitdb);
+
+
+	if (!eitdb->itdb_imported)
+	{
+	    gchar *mountpoint = get_itdb_prefs_string (itdb, KEY_MOUNTPOINT);
+	    gchar *str = g_strdup_printf (_("iPod at '%s' is not loaded.\nPlease load it first."), mountpoint);
+	    GtkWidget *dialog = gtk_message_dialog_new (
+		GTK_WINDOW (gtkpod_window),
+		GTK_DIALOG_DESTROY_WITH_PARENT,
+		GTK_MESSAGE_WARNING,
+		GTK_BUTTONS_OK,
+		str);
+	    gtk_dialog_run (GTK_DIALOG (dialog));
+	    gtk_widget_destroy (dialog);
+	    g_free (str);
+	    g_free (mountpoint);
+	}
+	else
+	{
+	     gp_ipod_init (itdb);
+	}
+    }
+    else
+    {
+	message_sb_no_ipod_itdb_selected ();
+    }
+}
+
+void
+on_check_ipod_files_activate           (GtkMenuItem     *menuitem,
+					gpointer         user_data)
+{
+    iTunesDB *itdb = gp_get_ipod_itdb ();
+    if (itdb)
+    {
+	ExtraiTunesDBData *eitdb = itdb->userdata;
+
+	g_return_if_fail (eitdb);
+
+
+	if (!eitdb->itdb_imported)
+	{
+	    gchar *mountpoint = get_itdb_prefs_string (itdb, KEY_MOUNTPOINT);
+	    gchar *str = g_strdup_printf (_("iPod at '%s' is not loaded.\nPlease load it first."), mountpoint);
+	    GtkWidget *dialog = gtk_message_dialog_new (
+		GTK_WINDOW (gtkpod_window),
+		GTK_DIALOG_DESTROY_WITH_PARENT,
+		GTK_MESSAGE_WARNING,
+		GTK_BUTTONS_OK,
+		str);
+	    gtk_dialog_run (GTK_DIALOG (dialog));
+	    gtk_widget_destroy (dialog);
+	    g_free (str);
+	    g_free (mountpoint);
+	}
+	else
+	{
+	    check_db (itdb);
+	}
+    }
+    else
+    {
+	message_sb_no_ipod_itdb_selected ();
+    }
+}
+
+
+void
+on_update_playlist_activate (GtkMenuItem     *menuitem,
+			     gpointer         user_data)
+{
+    gp_do_selected_playlist (update_tracks);
+}
+
+/* update tracks in tab entry */
+void
+on_update_tab_entry_activate        (GtkMenuItem     *menuitem,
+				     gpointer         user_data)
+{
+    gint inst = get_sort_tab_number (
+	_("Update selected entry of which sort tab?"));
+
+    if (inst != -1) gp_do_selected_entry (update_tracks, inst);
+}
+
+void
+on_update_tracks_activate            (GtkMenuItem     *menuitem,
+				     gpointer         user_data)
+{
+    gp_do_selected_tracks (update_tracks);
+}
+
+
+void
+on_mserv_from_file_tracks_menu_activate
+                                        (GtkMenuItem     *menuitem,
+                                        gpointer         user_data)
+{
+    gp_do_selected_tracks (mserv_from_file_tracks);
+}
+
+
+void
+on_mserv_from_file_entry_menu_activate (GtkMenuItem     *menuitem,
+                                        gpointer         user_data)
+{
+    gint inst = get_sort_tab_number (
+	_("Update selected entry of which sort tab?"));
+
+    if (inst != -1) gp_do_selected_entry (mserv_from_file_tracks, inst);
+}
+
+
+void
+on_sync_playlist_activate (GtkMenuItem     *menuitem,
+			     gpointer         user_data)
+{
+    Playlist *pl;
+
+    pl = pm_get_selected_playlist();
+    if (pl)
+    {
+	sync_playlist (pl, NULL,
+		       KEY_SYNC_CONFIRM_DIRS, 0,
+		       KEY_SYNC_DELETE_TRACKS, 0,
+		       KEY_SYNC_CONFIRM_DELETE, 0,
+		       KEY_SYNC_SHOW_SUMMARY, 0);
+    }
+    else
+    {
+	message_sb_no_playlist_selected ();
+    }
+}
+
+void
+on_save_track_order1_activate           (GtkMenuItem     *menuitem,
+					gpointer         user_data)
+{
+    tm_rows_reordered ();
+}
+
+
+void
+on_toolbar_menu_activate               (GtkMenuItem     *menuitem,
+					gpointer         user_data)
+{
+    prefs_set_int("display_toolbar",
+	gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (menuitem)));
+    display_show_hide_toolbar();
+}
+
+
+void
+on_more_sort_tabs_activate             (GtkMenuItem     *menuitem,
+					gpointer         user_data)
+{
+    prefs_set_int("sort_tab_num", prefs_get_int("sort_tab_num")+1);
+    st_show_visible();
+}
+
+
+void
+on_less_sort_tabs_activate             (GtkMenuItem     *menuitem,
+					gpointer         user_data)
+{
+    prefs_set_int("sort_tab_num", prefs_get_int("sort_tab_num")-1);
+    st_show_visible();
+}
+
+void
+on_export_playlist_activate  (GtkMenuItem     *menuitem,
+			      gpointer         user_data)
+{
+    Playlist *pl = pm_get_selected_playlist ();
+
+    if (!pl)
+    {
+	export_files_init (pl->members, NULL, FALSE, NULL);
+    }
+    else
+    {
+	message_sb_no_playlist_selected ();
+    }
+}
+
+
+void
+on_export_tab_entry_activate (GtkMenuItem     *menuitem,
+			      gpointer         user_data)
+{
+    TabEntry *entry;
+    gint inst;
+
+    inst = get_sort_tab_number (_("Export selected entry of which sort tab?"));
+    if (inst == -1) return;
+
+    entry = st_get_selected_entry (inst);
+    if (!entry)
+    {
+	gtkpod_statusbar_message (_("No entry selected in Sort Tab %d"),
+				  inst+1);
+	return;
+    }
+    export_files_init (entry->members, NULL, FALSE, NULL);
+}
+
+
+void
+on_export_tracks_activate     (GtkMenuItem     *menuitem,
+			      gpointer         user_data)
+{
+    GList *tracks = tm_get_selected_tracks ();
+
+    if (tracks)
+    {
+	export_files_init (tracks, NULL, FALSE, NULL);
+	g_list_free (tracks);
+    }
+    else
+    {
+	message_sb_no_tracks_selected ();
+    }
+}
+
+
+void
+on_playlist_file_playlist_activate     (GtkMenuItem     *menuitem,
+                                        gpointer         user_data)
+{
+    Playlist *pl = pm_get_selected_playlist ();
+
+    if (pl)
+    {
+	export_playlist_file_init (pl->members);
+    }
+    else
+    {
+	message_sb_no_playlist_selected ();
+    }
+}
+
+
+void
+on_playlist_file_tab_entry_activate    (GtkMenuItem     *menuitem,
+                                        gpointer         user_data)
+{
+    TabEntry *entry;
+    gint inst;
+
+    inst = get_sort_tab_number (_("Create playlist file from selected entry of which sort tab?"));
+    if (inst == -1) return;
+
+    entry = st_get_selected_entry (inst);
+    if (!entry)
+    {
+	gtkpod_statusbar_message (_("No entry selected in Sort Tab %d"),
+				  inst+1);
+	return;
+    }
+    export_playlist_file_init (entry->members);
+}
+
+
+void
+on_playlist_file_tracks_activate       (GtkMenuItem     *menuitem,
+                                        gpointer         user_data)
+{
+    GList *tracks = tm_get_selected_tracks ();
+
+    if (tracks)
+    {
+	export_playlist_file_init(tracks);
+	g_list_free (tracks);
+    }
+    else
+    {
+	message_sb_no_tracks_selected ();
+    }
+}
+
+void
+on_play_playlist_activate              (GtkMenuItem     *menuitem,
+					gpointer         user_data)
+{
+    Playlist *pl = pm_get_selected_playlist ();
+    if (pl)
+    {
+	tools_play_tracks (pl->members);
+    }
+    else
+    {
+	message_sb_no_playlist_selected ();
+    }
+}
+
+
+void
+on_play_tab_entry_activate             (GtkMenuItem     *menuitem,
+					gpointer         user_data)
+{
+    TabEntry *entry;
+    gint inst;
+
+    inst = get_sort_tab_number (_("Play tracks in selected entry of which sort tab?"));
+    if (inst == -1) return;
+
+    entry = st_get_selected_entry (inst);
+    if (!entry)
+    {
+	gtkpod_statusbar_message (_("No entry selected in Sort Tab %d"),
+				  inst+1);
+	return;
+    }
+    tools_play_tracks (entry->members);
+}
+
+
+void
+on_play_tracks_activate                 (GtkMenuItem     *menuitem,
+					gpointer         user_data)
+{
+    GList *tracks = tm_get_selected_tracks ();
+    if (tracks)
+    {
+	tools_play_tracks (tracks);
+	g_list_free (tracks);
+	tracks = NULL;
+    }
+    else
+    {
+	message_sb_no_tracks_selected ();
+    }
+}
+
+
+void
+on_enqueue_playlist_activate           (GtkMenuItem     *menuitem,
+					gpointer         user_data)
+{
+    Playlist *pl = pm_get_selected_playlist ();
+    if (pl)
+    {
+	tools_enqueue_tracks (pl->members);
+    }
+    else
+    {
+	message_sb_no_playlist_selected ();
+    }
+}
+
+
+void
+on_enqueue_tab_entry_activate          (GtkMenuItem     *menuitem,
+					gpointer         user_data)
+{
+    TabEntry *entry;
+    gint inst;
+
+    inst = get_sort_tab_number (_("Enqueue tracks in selected entry of which sort tab?"));
+    if (inst == -1) return;
+
+    entry = st_get_selected_entry (inst);
+    if (!entry)
+    {
+	gtkpod_statusbar_message (_("No entry selected in Sort Tab %d"),
+				  inst+1);
+	return;
+    }
+    tools_enqueue_tracks (entry->members);
+}
+
+
+void
+on_enqueue_tracks_activate              (GtkMenuItem     *menuitem,
+					gpointer         user_data)
+{
+    GList *tracks = tm_get_selected_tracks ();
+    if (tracks)
+    {
+	tools_enqueue_tracks (tracks);
+	g_list_free (tracks);
+	tracks = NULL;
+    }
+    else
+    {
+	message_sb_no_tracks_selected ();
+    }    
+}
+
+
+void
+on_arrange_sort_tabs_activate          (GtkMenuItem     *menuitem,
+					gpointer         user_data)
+{
+    st_arrange_visible_sort_tabs ();
+}
+
+void
+on_tooltips_menu_activate              (GtkMenuItem     *menuitem,
+					gpointer         user_data)
+{
+    prefs_set_int("display_tooltips_main",
+	gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (menuitem)));
+    display_show_hide_tooltips();
+    
+}
+
+void
+on_pl_containing_displayed_tracks_activate (GtkMenuItem     *menuitem,
+					    gpointer         user_data)
+{
+    generate_displayed_playlist ();
+}
+
+void
+on_pl_containing_selected_tracks_activate (GtkMenuItem     *menuitem,
+					    gpointer         user_data)
+{
+    generate_selected_playlist ();
+}
+
+void
+on_pl_for_each_artist_activate         (GtkMenuItem     *menuitem,
+					gpointer         user_data)
+{
+    iTunesDB *itdb = gp_get_selected_itdb();
+
+    if (itdb)
+    {
+	generate_category_playlists (itdb, T_ARTIST);
+    }
+    else
+    {
+	message_sb_no_itdb_selected ();
+    }
+}
+
+void
+on_pl_for_each_album_activate         (GtkMenuItem     *menuitem,
+				       gpointer         user_data)
+{
+    iTunesDB *itdb = gp_get_selected_itdb();
+
+    if (itdb)
+    {
+	generate_category_playlists (itdb, T_ALBUM);
+    }
+    else
+    {
+	message_sb_no_itdb_selected ();
+    }
+}
+
+void
+on_pl_for_each_genre_activate         (GtkMenuItem     *menuitem,
+				       gpointer         user_data)
+{
+    iTunesDB *itdb = gp_get_selected_itdb();
+
+    if (itdb)
+    {
+	generate_category_playlists (itdb, T_GENRE);
+    }
+    else
+    {
+	message_sb_no_itdb_selected ();
+    }
+}
+
+void
+on_pl_for_each_composer_activate         (GtkMenuItem     *menuitem,
+					  gpointer         user_data)
+{
+    iTunesDB *itdb = gp_get_selected_itdb();
+
+    if (itdb)
+    {
+	generate_category_playlists (itdb, T_COMPOSER);
+    }
+    else
+    {
+	message_sb_no_itdb_selected ();
+    }
+}
+
+
+void
+on_pl_for_each_year_activate           (GtkMenuItem     *menuitem,
+                                        gpointer         user_data)
+{
+    iTunesDB *itdb = gp_get_selected_itdb();
+
+    if (itdb)
+    {
+	generate_category_playlists (itdb, T_YEAR);
+    }
+    else
+    {
+	message_sb_no_itdb_selected ();
+    }
+}
+
+
+void
+on_most_listened_tracks1_activate       (GtkMenuItem     *menuitem,
+					gpointer         user_data)
+{
+    iTunesDB *itdb = gp_get_selected_itdb();
+
+    if (itdb)
+    {
+	most_listened_pl (itdb);
+    }
+    else
+    {
+	message_sb_no_itdb_selected ();
+    }
+}
+
+
+void
+on_all_tracks_never_listened_to1_activate
+					(GtkMenuItem     *menuitem,
+					gpointer         user_data)
+{
+    iTunesDB *itdb = gp_get_selected_itdb();
+
+    if (itdb)
+    {
+	never_listened_pl (itdb);
+    }
+    else
+    {
+	message_sb_no_itdb_selected ();
+    }
+}
+
+void
+on_most_rated_tracks_playlist_s1_activate
+					(GtkMenuItem     *menuitem,
+					gpointer         user_data)
+{
+    iTunesDB *itdb = gp_get_selected_itdb();
+
+    if (itdb)
+    {
+	most_rated_pl (itdb);
+    }
+    else
+    {
+	message_sb_no_itdb_selected ();
+    }
+}
+
+
+void
+on_most_recent_played_tracks_activate   (GtkMenuItem     *menuitem,
+					gpointer         user_data)
+{
+    iTunesDB *itdb = gp_get_selected_itdb();
+
+    if (itdb)
+    {
+	last_listened_pl (itdb);
+    }
+    else
+    {
+	message_sb_no_itdb_selected ();
+    }
+}
+
+void
+on_played_since_last_time1_activate    (GtkMenuItem     *menuitem,
+					gpointer         user_data)
+{
+    iTunesDB *itdb = gp_get_selected_itdb();
+
+    if (itdb)
+    {
+	since_last_pl (itdb);
+    }
+    else
+    {
+	message_sb_no_itdb_selected ();
+    }
+}
+
+void
+on_sorting_activate                    (GtkMenuItem     *menuitem,
+					gpointer         user_data)
+{
+    sort_window_create ();
+}
+
+void
+on_normalize_selected_playlist_activate
+					(GtkMenuItem     *menuitem,
+					gpointer         user_data)
+{
+    Playlist *pl = pm_get_selected_playlist ();
+    if (pl)
+	nm_tracks_list (pl->members);
+    else
+	message_sb_no_playlist_selected ();
+}
+
+
+void
+on_normalize_selected_tab_entry_activate
+					(GtkMenuItem     *menuitem,
+					gpointer         user_data)
+{
+    TabEntry *entry;
+    gint inst;
+
+    inst = get_sort_tab_number (_("Normalize tracks in selected entry of which sort tab?"));
+    if (inst == -1) return;
+
+    entry = st_get_selected_entry (inst);
+    if (entry)
+    {
+	nm_tracks_list (entry->members);
+    }
+    else
+    {
+	gtkpod_statusbar_message (_("No entry selected in Sort Tab %d"),
+				  inst+1);
+	return;
+    }
+}
+
+
+void
+on_normalize_selected_tracks_activate   (GtkMenuItem     *menuitem,
+					gpointer         user_data)
+{
+   GList *tracks = tm_get_selected_tracks ();
+   nm_tracks_list (tracks);
+   g_list_free (tracks);
+}
+
+
+void
+on_normalize_displayed_tracks_activate  (GtkMenuItem     *menuitem,
+					gpointer         user_data)
+{
+    GList *tracks = tm_get_all_tracks ();
+    nm_tracks_list (tracks);
+    g_list_free (tracks);
+}
+
+
+void
+on_normalize_all_tracks                (GtkMenuItem     *menuitem,
+					gpointer         user_data)
+{
+    iTunesDB *itdb = gp_get_selected_itdb ();
+
+    if (itdb)
+    {
+	Playlist *mpl = itdb_playlist_mpl (itdb);
+	g_return_if_fail (mpl);
+	nm_tracks_list (mpl->members);
+    }
+    else
+    {
+	message_sb_no_itdb_selected ();
+    }
+}
+
+
+void
+on_normalize_newly_added_tracks        (GtkMenuItem     *menuitem,
+					gpointer         user_data)
+{
+    iTunesDB *itdb = gp_get_selected_itdb();
+
+    if (itdb)
+    {
+	nm_new_tracks (itdb);
+    }
+    else
+    {
+	message_sb_no_itdb_selected ();
+    }
+}
+
+
+void
+on_info_window1_activate               (GtkMenuItem     *menuitem,
+					gpointer         user_data)
+{
+    if (gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (menuitem)))
+	 info_open_window ();
+    else info_close_window ();
+}
+
+void
+on_conversion_log1_activate               (GtkMenuItem     *menuitem,
+					   gpointer         user_data)
+{
+    gboolean state;
+
+    state = gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (menuitem));
+
+    if (state != prefs_get_int (FILE_CONVERT_DISPLAY_LOG))
+    {
+	prefs_set_int (FILE_CONVERT_DISPLAY_LOG, state);
+	file_convert_prefs_changed ();
+    }
+}
+
+
+void
+on_sync_all_activate                   (GtkMenuItem     *menuitem,
+                                        gpointer         user_data)
+{
+    struct itdbs_head *itdbs_head = gp_get_itdbs_head (gtkpod_window);
+    GList *gl;
+
+    g_return_if_fail (itdbs_head);
+
+    for (gl=itdbs_head->itdbs; gl; gl=gl->next)
+    {
+	iTunesDB *itdb = gl->data;
+	g_return_if_fail (gl);
+	if (itdb->usertype & GP_ITDB_TYPE_IPOD)
+	{
+	    tools_sync_all (itdb);
+	}
+    }
+}
+
+
+void
+on_sync_calendar_activate              (GtkMenuItem     *menuitem,
+					gpointer         user_data)
+{
+    iTunesDB *itdb = gp_get_ipod_itdb ();
+    if (itdb)
+    {
+	tools_sync_calendar (itdb);
+    }
+    else
+    {
+	message_sb_no_ipod_itdb_selected ();
+    }
+}
+
+
+void
+on_sync_contacts_activate              (GtkMenuItem     *menuitem,
+					gpointer         user_data)
+{
+    iTunesDB *itdb = gp_get_ipod_itdb ();
+    if (itdb)
+    {
+	tools_sync_contacts (itdb);
+    }
+    else
+    {
+	message_sb_no_ipod_itdb_selected ();
+    }
+}
+
+
+void
+on_sync_notes_activate                 (GtkMenuItem     *menuitem,
+                                        gpointer         user_data)
+{
+    iTunesDB *itdb = gp_get_ipod_itdb ();
+    if (itdb)
+    {
+	tools_sync_notes (itdb);
+    }
+    else
+    {
+	message_sb_no_ipod_itdb_selected ();
+    }
+}
+
+void
+on_all_tracks_not_listed_in_any_playlist1_activate
+                                        (GtkMenuItem     *menuitem,
+                                        gpointer         user_data)
+{
+    iTunesDB *itdb = gp_get_selected_itdb();
+
+    if (itdb)
+    {
+	generate_not_listed_playlist (itdb);
+    }
+    else
+    {
+	message_sb_no_itdb_selected ();
+    }
+}
+
+
+void
+on_random_playlist_activate            (GtkMenuItem     *menuitem,
+                                        gpointer         user_data)
+{
+    iTunesDB *itdb = gp_get_selected_itdb();
+
+    if (itdb)
+    {
+	generate_random_playlist(itdb);
+    }
+    else
+    {
+	message_sb_no_itdb_selected ();
+    }
+}
+
+
+void
+on_randomize_current_playlist_activate (GtkMenuItem     *menuitem,
+                                        gpointer         user_data)
+{
+    randomize_current_playlist();
+}
+
+void
+on_pl_for_each_rating_activate         (GtkMenuItem     *menuitem,
+                                        gpointer         user_data)
+{
+    iTunesDB *itdb = gp_get_selected_itdb();
+
+    if (itdb)
+    {
+	each_rating_pl (itdb);
+    }
+    else
+    {
+	message_sb_no_itdb_selected ();
+    }
+}

Added: trunk/src/display.h
===================================================================
--- trunk/src/display.h	                        (rev 0)
+++ trunk/src/display.h	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,357 @@
+/*
+|  Copyright (C) 2002-2007 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+| 
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+| 
+|  iTunes and iPod are trademarks of Apple
+| 
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: display.h 1765 2007-11-08 20:02:42Z phantom_sf $
+*/
+
+#ifndef __DISPLAY_H__
+#define __DISPLAY_H__
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <gtk/gtk.h>
+#include <glade/glade.h>
+#include "itdb.h"
+#include "display_itdb.h"
+#include "display_coverart.h"
+
+/* Main XML glade file */
+GladeXML *main_window_xml;
+
+/* pointer to main window */
+extern GtkWidget *gtkpod_window;
+
+/* types for sort */
+enum
+{
+    SORT_ASCENDING = GTK_SORT_ASCENDING,
+    SORT_DESCENDING = GTK_SORT_DESCENDING,
+    SORT_NONE = 10*(GTK_SORT_ASCENDING+GTK_SORT_DESCENDING),
+};
+
+/* Categories in each sort tab (page numbers) */
+typedef enum {
+  ST_CAT_ARTIST = 0,
+  ST_CAT_ALBUM,
+  ST_CAT_GENRE,
+  ST_CAT_COMPOSER,
+  ST_CAT_TITLE,
+  ST_CAT_YEAR,
+  ST_CAT_SPECIAL,
+  ST_CAT_NUM
+} ST_CAT_item;
+
+/* Number of search tabs to be supported. */
+#define SORT_TAB_MAX (ST_CAT_NUM-1)
+
+/* Number of GtkPaned elements in the main window. The positions of
+ * these elements will be stored in the prefs file and be set to the
+ * last value when starting gtkpod again */
+/* Number defined with glade ("paned%d") */
+enum {
+    PANED_PLAYLIST = 0,
+    PANED_TRACKLIST,
+    PANED_STATUS1,
+    PANED_STATUS2,
+    PANED_NUM_GLADE
+};
+/* Number created in display.c (for sort tabs, stored in st_paned[]) */
+#define PANED_NUM_ST (SORT_TAB_MAX-1)
+/* Total number */
+#define PANED_NUM (PANED_NUM_GLADE+PANED_NUM_ST)
+
+/* max. number of stars */
+#define RATING_MAX 5
+
+/* struct for each entry in sort tab */
+typedef struct {
+  gchar *name;
+  gboolean master; /* set if this is the "All" entry */
+  gboolean compilation; /* set if this is the "Compilation" entry */
+  GList *members;  /* GList with member tracks (pointer to "Track") */
+} TabEntry;
+
+/* struct for time info (added, played, modified) */
+typedef struct {
+    gchar *int_str;   /* copy of string specified in the sort tab */
+    gboolean valid;   /* is current string valid? */
+    time_t lower;     /* timestamp for lower limit */
+    time_t upper;     /* timestamp for upper limit ("-1": no limit) */
+    GtkWidget *entry; /* pointer to GtkEntry in sort tab */
+    GtkWidget *active;/* pointer to toggle button */
+} TimeInfo;
+
+/* struct with data corresponding to each sort tab */
+typedef struct {
+  guint current_category;            /* current page (category) selected) */
+  gboolean final;                    /* have all tracks been added? */
+  GtkWidget *window[ST_CAT_NUM];     /* pointer to scrolled window */
+  /* The following are used for "normal" categories (not ST_CAT_SPECIAL) */
+  GtkTreeModel *model;               /* pointer to model used */
+  GtkNotebook *notebook;             /* pointer to notebook used */
+  GtkTreeView *treeview[ST_CAT_NUM]; /* pointer to treeviews used */
+  GList *entries;                    /* list with entries */
+  TabEntry *current_entry;           /* pointer to currently selected entry */
+  gchar *lastselection[ST_CAT_NUM];  /* name of entry last selected */
+  GHashTable *entry_hash;            /* table for quick find of tab entries */
+  gboolean unselected;               /* unselected item since last st_init? */
+  /* The following are used for "special" categories (ST_CAT_SPECIAL) */
+  GList *sp_members;                 /* list of tracks in sorttab */
+  GList *sp_selected;                /* list of tracks selected */
+  gboolean is_go;                    /* pass new members on automatically */
+  TimeInfo ti_added;                 /* TimeInfo "added" (sp)         */
+  TimeInfo ti_modified;              /* TimeInfo "modified" (sp)      */
+  TimeInfo ti_played;                /* TimeInfo "played" (sp)        */
+  GtkTooltipsData *sp_tooltips_data; /* ptr to tooltips in special st */
+  /* function used for string comparisons, set in on_st_switch_page   */
+  gint (*string_compare_func) (const gchar *str1, const gchar *str2);
+} SortTab;
+
+/* "Column numbers" in sort tab model */
+typedef enum  {
+  ST_COLUMN_ENTRY = 0,
+  ST_NUM_COLUMNS
+} ST_item;
+
+/* Column numbers in track model */
+/* Note: add corresponding entries to T_item and TM_to_T() as well 
+ * (below and in misc_conversion.c). 
+ * IMPORTANT: Do not change the order -- always add new entries at the
+ * end */
+typedef enum  {
+  TM_COLUMN_TITLE = 0,
+  TM_COLUMN_ARTIST,
+  TM_COLUMN_ALBUM,
+  TM_COLUMN_GENRE,
+  TM_COLUMN_COMPOSER,
+  TM_COLUMN_TRACK_NR,         /*  5 */
+  TM_COLUMN_IPOD_ID,
+  TM_COLUMN_PC_PATH,
+  TM_COLUMN_TRANSFERRED,
+  TM_COLUMN_SIZE,
+  TM_COLUMN_TRACKLEN,         /* 10 */
+  TM_COLUMN_BITRATE,
+  TM_COLUMN_PLAYCOUNT,
+  TM_COLUMN_RATING,
+  TM_COLUMN_TIME_PLAYED,
+  TM_COLUMN_TIME_MODIFIED,    /* 15 */
+  TM_COLUMN_VOLUME,
+  TM_COLUMN_YEAR,
+  TM_COLUMN_CD_NR,
+  TM_COLUMN_TIME_ADDED,
+  TM_COLUMN_IPOD_PATH,        /* 20 */
+  TM_COLUMN_SOUNDCHECK,
+  TM_COLUMN_SAMPLERATE,
+  TM_COLUMN_BPM,
+  TM_COLUMN_FILETYPE,
+  TM_COLUMN_GROUPING,         /* 25 */
+  TM_COLUMN_COMPILATION,
+  TM_COLUMN_COMMENT,
+  TM_COLUMN_CATEGORY,
+  TM_COLUMN_DESCRIPTION,
+  TM_COLUMN_PODCASTURL,       /* 30 */
+  TM_COLUMN_PODCASTRSS,
+  TM_COLUMN_SUBTITLE,
+  TM_COLUMN_TIME_RELEASED,
+  TM_COLUMN_THUMB_PATH,
+  TM_COLUMN_MEDIA_TYPE,       /* 35 */
+  TM_COLUMN_TV_SHOW,
+  TM_COLUMN_TV_EPISODE,
+  TM_COLUMN_TV_NETWORK,
+  TM_COLUMN_SEASON_NR,
+  TM_COLUMN_EPISODE_NR,       /* 40 */
+  TM_COLUMN_ALBUMARTIST,
+  TM_COLUMN_SORT_ARTIST,
+  TM_COLUMN_SORT_TITLE,
+  TM_COLUMN_SORT_ALBUM,
+  TM_COLUMN_SORT_ALBUMARTIST, /* 45 */
+  TM_COLUMN_SORT_COMPOSER,
+  TM_COLUMN_SORT_TVSHOW,
+  TM_NUM_COLUMNS
+} TM_item;
+
+/* A means to address the fields by uniform IDs. May be extended as
+ * needed. You should extend "track_get_item_pointer()" defined in
+ * track.c as well for string fields. */
+/* Add corresponding entries to t_strings[] and t_tooltips[] in
+   misc_conversion.c! */
+/* Used in prefs_window.c to label the sort_ign_field<num> buttons */
+/* Used in details.c to label the detail_label_<num> labels */
+typedef enum {
+    T_ALL = 0,      /* all fields */
+    T_ALBUM,
+    T_ARTIST,
+    T_TITLE,
+    T_GENRE,
+    T_COMMENT,      /*  5 */
+    T_COMPOSER,
+    T_FILETYPE,
+    T_PC_PATH,
+    T_IPOD_PATH,
+    T_IPOD_ID,      /* 10 */
+    T_TRACK_NR,
+    T_TRANSFERRED,
+    T_SIZE,
+    T_TRACKLEN,
+    T_BITRATE,      /* 15 */
+    T_SAMPLERATE,
+    T_BPM,
+    T_PLAYCOUNT,
+    T_RATING,
+    T_TIME_ADDED,   /* 20 */
+    T_TIME_PLAYED,
+    T_TIME_MODIFIED,
+    T_VOLUME,
+    T_SOUNDCHECK,
+    T_YEAR,         /* 25 */
+    T_CD_NR,
+    T_GROUPING,
+    T_COMPILATION,
+    T_CATEGORY,
+    T_DESCRIPTION,  /* 30 */
+    T_PODCASTURL,
+    T_PODCASTRSS,
+    T_SUBTITLE,
+    T_TIME_RELEASED,
+    T_CHECKED,      /* 35 */
+    T_STARTTIME,
+    T_STOPTIME,
+    T_REMEMBER_PLAYBACK_POSITION,
+    T_SKIP_WHEN_SHUFFLING,
+    T_THUMB_PATH,   /* 40 */
+    T_MEDIA_TYPE,
+    T_TV_SHOW,
+    T_TV_EPISODE,
+    T_TV_NETWORK,
+    T_SEASON_NR,    /* 45 */
+    T_EPISODE_NR,
+    T_ALBUMARTIST,
+    T_SORT_ARTIST,
+    T_SORT_TITLE,
+    T_SORT_ALBUM,   /* 50 */
+    T_SORT_ALBUMARTIST,
+    T_SORT_COMPOSER,
+    T_SORT_TVSHOW,
+    T_GAPLESS_TRACK_FLAG,
+    T_ITEM_NUM,
+} T_item;
+
+
+/* number of entries with "autoset empty tag to filename " feature */
+#define TM_NUM_TAGS_PREFS (5)
+
+/* "Column numbers" in playlist model */
+enum  {
+  PM_COLUMN_ITDB = 0,
+  PM_COLUMN_PLAYLIST,
+  PM_NUM_COLUMNS
+};
+
+/* Drag and drop types */
+enum {
+    DND_GTKPOD_TRACKLIST = 1000,
+    DND_GTKPOD_TM_PATHLIST,
+    DND_GTKPOD_PLAYLISTLIST,
+    DND_TEXT_URI_LIST,
+    DND_TEXT_PLAIN,
+    DND_IMAGE_JPEG
+};
+
+/* used for the ST_CAT_SPECIAL user_data (see st_create_special and
+ * the corresponding signal functions) */
+#define SP_SHIFT 9
+#define SP_MASK ((1<<SP_SHIFT)-1)
+
+void display_create (void);
+void display_cleanup (void);
+void display_adjust_menus (void);
+void display_show_hide_toolbar (void);
+void display_reset (gint inst);
+GList *display_get_selection (guint32 inst);
+GList *display_get_selected_members (gint inst);
+void display_remove_autoscroll_row_timeout (GtkWidget *widget);
+void display_install_autoscroll_row_timeout (GtkWidget *widget);
+void display_image_dialog (GdkPixbuf *image);
+
+Playlist* pm_get_selected_playlist (void);
+gint pm_get_position_for_itdb (iTunesDB *itdb);
+void pm_remove_playlist (Playlist *playlist, gboolean select);
+void pm_add_playlist (Playlist *playlist, gint position);
+void pm_add_itdb (iTunesDB *itdb, gint pos);
+void pm_select_playlist (Playlist *playlist);
+void pm_unselect_playlist (Playlist *playlist);
+void pm_remove_track (Playlist *playlist, Track *track);
+void pm_add_track (Playlist *playlist, Track *track, gboolean display);
+void pm_itdb_name_changed (iTunesDB *itdb);
+void pm_track_changed (Track *track);
+void pm_sort (GtkSortType order);
+void pm_stop_editing (gboolean cancel);
+void pm_set_renderer_pix (GtkCellRenderer *renderer,
+			  Playlist *playlist);
+void pm_set_renderer_text (GtkCellRenderer *renderer,
+			   Playlist *playlist);
+
+void st_stop_editing (gint inst, gboolean cancel);
+gboolean st_set_selection (Itdb_Track *track);
+void st_redisplay (guint32 inst);
+void st_sort (GtkSortType order);
+void st_remove_entry (TabEntry *entry, guint32 inst);
+gint st_get_instance_from_treeview (GtkTreeView *tv);
+void st_show_visible (void);
+void st_arrange_visible_sort_tabs (void);
+void st_adopt_order_in_playlist (void);
+TabEntry *st_get_selected_entry (gint inst);
+
+void cal_open_calendar (gint inst, T_item item);
+void sp_go (guint32 inst);
+void sp_conditions_changed (guint32 inst);
+
+void tm_add_track_to_track_model (Track *track, GtkTreeIter *into_iter);
+gint tm_get_nr_of_tracks(void);
+void tm_rows_reordered(void);
+gboolean tm_add_filelist (gchar *data, GtkTreePath *path,
+			  GtkTreeViewDropPosition pos);
+void tm_stop_editing (gboolean cancel);
+void tm_show_preferred_columns(void);
+void tm_store_col_order (void);
+void tm_adopt_order_in_sorttab (void);
+
+void tm_sort (TM_item col, GtkSortType order);
+gint tm_sort_counter (gint inc);
+GList* tm_get_selected_trackids(void);
+GList* tm_get_selected_tracks(void);
+GList* tm_get_all_trackids(void);
+GList* tm_get_all_tracks(void);
+
+void display_update_default_sizes (void);
+void display_set_default_sizes (void);
+void display_show_hide_tooltips (void);
+void display_set_info_window_menu (void);
+
+void spl_edit (Playlist *spl);
+void spl_edit_new (iTunesDB *itdb, gchar *name, gint32 pos);
+#endif 

Added: trunk/src/display_coverart.c
===================================================================
--- trunk/src/display_coverart.c	                        (rev 0)
+++ trunk/src/display_coverart.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,2133 @@
+/*
+|  Copyright (C) 2007 P.G. Richardson <phantom_sf at users.sourceforge.net>
+|  Part of the gtkpod project.
+|
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: display_coverart.c 1776 2007-11-12 22:38:00Z phantom_sf $
+*/
+
+#ifdef HAVE_CONFIG_H
+	#include <config.h>
+#endif
+
+#include "display_private.h"
+#include "display.h"
+#include "itdb.h"
+#include "prefs.h"
+#include "display_coverart.h"
+#include "context_menus.h"
+#include "details.h"
+#include "fileselection.h"
+#include "fetchcover.h"
+#include "info.h"
+
+#define DEBUG 0
+
+/* Declarations */
+static void free_album (Album_Item *album);
+static void free_CDWidget ();
+static gint compare_album_keys (gchar *a, gchar *b);
+static void set_display_dimensions ();
+static void set_highlight (Cover_Item *cover, gint index);
+static void raise_cdimages (GPtrArray *cdcovers);
+static void remove_track_from_album (Album_Item *album, Track *track, gchar *key, gint index, GList *keylistitem);
+static void on_cover_display_button_clicked (GtkWidget *widget, gpointer data);
+static gint on_main_cover_image_clicked (GnomeCanvasItem *canvasitem, GdkEvent *event, gpointer data);
+static void on_cover_display_slider_value_changed (GtkRange *range, gpointer user_data);
+static void set_cover_dimensions (Cover_Item *cover, int cover_index, gdouble img_width, gdouble img_height);
+static void coverart_sort_images (GtkSortType order);
+static void prepare_canvas ();
+static void set_slider_range (gint index);
+static void set_covers (gboolean force_imgupdate);
+static void set_cover_item (gint ndex, Cover_Item *cover, gchar *key, gboolean force_imgupdate);
+static gboolean dnd_coverart_drag_drop(GtkWidget *widget, GdkDragContext *drag_context, gint x, gint y, guint time, gpointer user_data);
+static void dnd_coverart_drag_data_received(GtkWidget *widget, GdkDragContext *dc, gint x, gint y, GtkSelectionData *data, guint info, guint time, gpointer user_data);
+static gboolean dnd_coverart_drag_motion (GtkWidget *widget, GdkDragContext *dc, gint x, gint y, guint time, gpointer user_data);
+
+/* Prefs keys */
+const gchar *KEY_DISPLAY_COVERART="display_coverart";
+
+/* The structure that holds values used throughout all the functions */
+static CD_Widget *cdwidget = NULL;
+/* The backing hash for the albums and its associated key list */
+static GHashTable *album_hash;
+static GList *album_key_list;
+/* Dimensions used for the canvas */
+static gint WIDTH;
+static gint HEIGHT;
+static gint DEFAULT_WIDTH;
+static gint DEFAULT_HEIGHT;
+/* Path of the png file used for albums without cd covers */
+static gchar *DEFAULT_FILE;
+/* Path of the png file used for the highlighting of cd covers */
+static gchar *HIGHLIGHT_FILE;
+/* Path of the png file used for the display of the main cd cover */
+static gchar *HIGHLIGHT_FILE_MAIN;
+/* signal handler id for the components */
+static gulong slide_signal_id;
+static gulong rbutton_signal_id;
+static gulong lbutton_signal_id;
+static gulong window_signal_id;
+static gulong contentpanel_signal_id;
+
+static GtkTargetEntry coverart_drop_types [] = {
+		/* Konqueror supported flavours */
+		{ "image/jpeg", 0, DND_IMAGE_JPEG },
+		
+		/* Fallback flavours */
+		{ "text/plain", 0, DND_TEXT_PLAIN },
+		{ "STRING", 0, DND_TEXT_PLAIN }
+};
+
+#if 0
+static void debug_albums ()
+{
+	gint i;
+	Cover_Item *cover;
+	Album_Item *album;
+	gchar *key;
+	
+	printf("Album list\n");
+	for(i = 0; i < g_list_length(album_key_list); ++i)
+	{
+		key = g_list_nth_data(album_key_list, i);
+		if (key == NULL)
+			printf("Album key is null\n");
+		else
+		{
+			album  = g_hash_table_lookup (album_hash, key);
+			printf("Index = %d -> Album Details: Artist = %s, Album = %s, No. Tracks = %d\n", i, album->artist, album->albumname, g_list_length (album->tracks));
+		}
+	}
+	
+	printf("Cover List\n");
+	for(i = 0; i < IMG_TOTAL; ++i)
+  {
+  	cover = g_ptr_array_index(cdwidget->cdcovers, i);
+  	if (cover->album == NULL)
+  		printf("Cover album is null\n");
+  	else
+  		printf("Cover Details: Artist = %s, Album = %s\n", cover->album->artist, cover->album->albumname);
+  }
+}
+#endif
+
+/**
+ * 
+ * free_CDWidget
+ * 
+ * destroy the CD Widget and free everything currently
+ * in memory.
+ */
+ static void free_CDWidget ()
+ {
+ 	gint i;
+ 	g_signal_handler_disconnect (cdwidget->leftbutton, lbutton_signal_id);
+ 	g_signal_handler_disconnect (cdwidget->rightbutton, rbutton_signal_id);
+ 	g_signal_handler_disconnect (cdwidget->cdslider, slide_signal_id);
+ 	g_signal_handler_disconnect (cdwidget->contentpanel, contentpanel_signal_id);
+ 	g_signal_handler_disconnect (gtkpod_window, window_signal_id);
+
+ 	/* Components not freed as they are part of the glade xml file */
+ 	cdwidget->leftbutton = NULL;
+ 	cdwidget->rightbutton = NULL;
+ 	cdwidget->cdslider = NULL;
+ 	cdwidget->contentpanel = NULL;
+ 	cdwidget->canvasbox = NULL;
+	cdwidget->controlbox = NULL;
+		
+	/* native variables rather than references so should be destroyed when freed */
+ 	cdwidget->first_imgindex = 0;
+ 	cdwidget->block_display_change = FALSE;
+
+	Cover_Item *cover;
+	for(i = 0; i < IMG_TOTAL; ++i)
+  {
+  	cover = g_ptr_array_index(cdwidget->cdcovers, i);
+  	/* Nullify pointer to album reference. Will be freed below */
+  	cover->album = NULL;
+  }
+  	
+ 	g_ptr_array_free (cdwidget->cdcovers, TRUE);
+ 		
+ 	/* Destroying canvas should destroy the background and cvrtext */
+ 	cdwidget->bground = NULL;
+ 	cdwidget->cvrtext = NULL;
+ 	gtk_widget_destroy (GTK_WIDGET(cdwidget->canvas));
+	
+	/* Remove all null tracks before any sorting should take place */	
+ 	album_key_list = g_list_remove_all (album_key_list, NULL);
+ 		
+ 	g_hash_table_foreach_remove(album_hash, (GHRFunc) gtk_true, NULL);
+	g_hash_table_destroy (album_hash);
+	g_list_free (album_key_list);
+		
+	g_free (cdwidget);
+	cdwidget = NULL;
+}
+ 
+/**
+ * set_highlight:
+ *
+ * Sets the highlighted image to the cover to give shine 
+ * and a reflection.
+ * 
+ * @cover: A Cover_Item object which the higlighted is added to.
+ *  
+ */
+static void set_highlight (Cover_Item *cover, gint index)
+{
+  GdkPixbuf *image;
+  GError *error = NULL;
+  GdkPixbuf *scaled;
+	    	   																		
+	if(index == IMG_MAIN)
+		image = gdk_pixbuf_new_from_file(HIGHLIGHT_FILE_MAIN, &error);
+	else
+  	image = gdk_pixbuf_new_from_file(HIGHLIGHT_FILE, &error);
+    
+  if(error != NULL)
+  {	
+		printf("Error occurred loading file - \nCode: %d\nMessage: %s\n", error->code, error->message);
+		g_error_free (error);
+		g_return_if_fail (image);
+	}
+
+  scaled = gdk_pixbuf_scale_simple(image, cover->img_width, ((cover->img_height * 2) + 6), GDK_INTERP_NEAREST);
+  gdk_pixbuf_unref (image);
+		
+  gnome_canvas_item_set (cover->highlight,
+			   "pixbuf", scaled,
+			   NULL);
+  gdk_pixbuf_unref (scaled);				
+}
+
+/**
+ * raise_cdimages:
+ *
+ * Ensures that once all the canvas items have been created on the
+ * main canvas, they are have the correct Z-order, ie. main cd image
+ * is at the top and fully visible.
+ * 
+ * @cdcovers: array of pointers to the cd cover objects
+ *  
+ */
+static void raise_cdimages (GPtrArray *cdcovers)
+{
+	Cover_Item *cover;
+	gint i, maxindex;
+	
+	maxindex = IMG_TOTAL - 1;
+	
+	for(i = 0; i < maxindex / 2; ++i)
+	{
+		cover = g_ptr_array_index(cdcovers, i);
+		gnome_canvas_item_raise_to_top(cover->cdcvrgrp);
+		
+		cover = g_ptr_array_index(cdcovers, maxindex - i);
+		gnome_canvas_item_raise_to_top(cover->cdcvrgrp);
+	}	
+	cover = g_ptr_array_index(cdcovers, IMG_MAIN);
+	gnome_canvas_item_raise_to_top(cover->cdcvrgrp);
+	
+	gnome_canvas_item_raise_to_top(GNOME_CANVAS_ITEM(cdwidget->cvrtext));
+}
+
+/**
+ * 
+ * force_update_covers:
+ * 
+ * Call the resetting of the covers and override the cached images so that they
+ * are loaded with the latest files existing on the filesystem.
+ * 
+ */
+void force_update_covers ()
+{
+	set_covers (TRUE);
+}
+
+/**
+ * set_covers:
+ *
+ * Internal function responsible for the resetting of the artwork
+ * covers in response to some kind of change in selection, eg. new
+ * selection in sort tab, button click etc...
+ * 
+ * @force_imgupdate: forces the resetting of the cached images so that the
+ * values are reread from the tracks and updated. Used sparingly.
+ */
+static void set_covers (gboolean force_imgupdate)
+{ 
+  gint i, dataindex;
+  gchar *key;
+  Cover_Item *cover;
+
+  if (cdwidget && cdwidget->cdcovers)
+  {
+    for(i = 0; i < IMG_TOTAL; ++i)
+    {
+		cover = g_ptr_array_index(cdwidget->cdcovers, i);
+		dataindex = cdwidget->first_imgindex + i;
+
+		/* Get the key from the key list appropriate to the index
+		 * provided by the first image index property
+		 */
+		key = g_list_nth_data (album_key_list, dataindex);
+		
+		set_cover_item (i, cover, key, force_imgupdate);	
+    }
+  }
+}
+
+/**
+ * set_cover_item:
+ *
+ * Internal function called  by set_covers to reset an artwork cover.
+ * 
+ */
+static void set_cover_item (gint index, Cover_Item *cover, gchar *key, gboolean force_imgupdate)
+{
+	GdkPixbuf *reflection;
+	GdkPixbuf *scaled;
+	Album_Item *album;
+  
+	if (key == NULL)
+	{
+		/* Clear everything */
+	  gnome_canvas_item_hide (cover->cdimage);
+	  /* Set the reflection to blank too */
+	  gnome_canvas_item_hide (cover->cdreflection);
+		/* Set the highlight to black too */
+		if (cover->highlight != NULL)
+			gnome_canvas_item_hide (cover->highlight);
+		 
+	 	if (index == IMG_MAIN)
+		{
+	 		/* Hide the artist/album text*/
+	 		gnome_canvas_item_hide (GNOME_CANVAS_ITEM (cdwidget->cvrtext));
+		}		
+		return;
+	}
+	
+	/* Key is not null */
+	
+	/* Find the Album Item appropriate to the key */
+	album  = g_hash_table_lookup (album_hash, key);
+	cover->album = album;
+	
+	if (force_imgupdate)
+	{
+		gdk_pixbuf_unref (album->albumart);
+		album->albumart = NULL;
+	}
+	
+	Track *track;
+	if (album->albumart == NULL)
+	{
+		track = g_list_nth_data (album->tracks, 0);
+		album->albumart = coverart_get_track_thumb (track, track->itdb->device, DEFAULT_IMG_SIZE);				
+	}
+	
+	/* Set the x, y, height and width of the CD cover */
+	set_cover_dimensions (
+				cover,
+				index,
+				gdk_pixbuf_get_width (album->albumart),
+				gdk_pixbuf_get_height (album->albumart));
+	
+	/* Display the highlight */
+	set_highlight (cover, index);
+	
+	gnome_canvas_item_show (cover->highlight);	
+	
+	/* Set the Cover */
+	scaled = gdk_pixbuf_scale_simple (album->albumart, cover->img_width, cover->img_height, GDK_INTERP_NEAREST);
+	gnome_canvas_item_set (cover->cdimage,
+	 		"pixbuf", scaled,
+	 		NULL);
+	 		
+	gnome_canvas_item_show (cover->cdimage);
+	    
+	 gnome_canvas_item_set (cover->cdcvrgrp,
+			"x", (gdouble) cover->img_x,
+			"y", (gdouble) cover->img_y,	       
+			NULL);
+		
+	 /* flip image vertically to create reflection */
+	reflection = gdk_pixbuf_flip (scaled, FALSE);
+	gnome_canvas_item_set (cover->cdreflection,
+		  "pixbuf", reflection,
+		  "y", (gdouble) (cover->img_height + 4),
+		  NULL);
+	gnome_canvas_item_show (cover->cdreflection);
+	    	
+	gdk_pixbuf_unref (reflection);
+	gdk_pixbuf_unref (scaled);
+	
+	/* Set the text if the index is the central image cover */
+	if (index == IMG_MAIN)
+	{
+		gchar *text;
+		text = g_strconcat (album->artist, "\n", album->albumname, NULL);
+		gnome_canvas_item_set (GNOME_CANVAS_ITEM (cdwidget->cvrtext),
+				 "text", text,
+				 "fill_color", "white",
+				 "y", (gdouble) cover->img_y + cover->img_height + 10,
+				 "justification", GTK_JUSTIFY_CENTER,
+				 NULL);
+				 
+		gnome_canvas_item_show (GNOME_CANVAS_ITEM (cdwidget->cvrtext));
+		g_free (text);
+	}
+}
+
+/**
+ * on_cover_display_slider_value_changed:
+ *
+ * Call handler used for cycling the cover images with the slider.
+ * 
+ * @range: GTKHScale object used as the slider
+ * @user_data: any data needed by the function (not required) 
+ *  
+ */
+static void on_cover_display_slider_value_changed (GtkRange *range, gpointer user_data)
+{
+  gint index, displaytotal;
+	
+	if (cdwidget->block_display_change)
+		return;
+		
+	index = gtk_range_get_value (range);
+	displaytotal = g_list_length(album_key_list);
+  
+  if (displaytotal <= 0)
+  	return;
+    
+  /* Use the index value from the slider for the main image index */
+  cdwidget->first_imgindex = index;
+  
+  if (cdwidget->first_imgindex > (displaytotal - IMG_MAIN))
+  	cdwidget->first_imgindex = displaytotal - IMG_MAIN;
+	
+  set_covers (FALSE);
+}
+
+/**
+ * on_cover_display_button_clicked:
+ *
+ * Call handler for the left and right buttons. Cause the images to
+ * be cycled in the direction indicated by the button.
+ * 
+ * @widget: button which emitted the signal
+ * @data: any data needed by the function (not required) 
+ *  
+ */ 
+static void on_cover_display_button_clicked (GtkWidget *widget, gpointer data)
+{
+	GtkButton *button;
+	const gchar *label;
+	gint displaytotal;
+  
+  button = GTK_BUTTON(widget);
+  label = gtk_button_get_label(button);
+    
+  if(g_str_equal(label, (gchar *) ">"))
+  	cdwidget->first_imgindex++;
+  else
+   	cdwidget->first_imgindex--;
+   	
+  displaytotal = g_list_length(album_key_list) - 8;
+  
+  if (displaytotal <= 0)
+  	return;
+  
+  /* Use the index value from the slider for the main image index */
+  if (cdwidget->first_imgindex < 0)
+  	cdwidget->first_imgindex = 0;
+  else if (cdwidget->first_imgindex > (displaytotal - 1))
+  	cdwidget->first_imgindex = displaytotal - 1;
+      	
+	/* Change the value of the slider to do the work of scrolling the covers */
+	gtk_range_set_value (GTK_RANGE (cdwidget->cdslider), cdwidget->first_imgindex);
+
+	/* debug_albums(); */
+}
+
+/**
+ * on_main_cover_image_clicked:
+ *
+ * Call handler used for displaying the tracks associated with
+ * the main displayed album cover.
+ * 
+ * @GnomeCanvas: main cd cover image canvas
+ * @event: event object used to determine the event type
+ * @data: any data needed by the function (not required) 
+ *  
+ */
+static gint on_main_cover_image_clicked (GnomeCanvasItem *canvasitem, GdkEvent *event, gpointer data)
+{
+	Cover_Item *cover;
+	guint mbutton;
+	
+	if(event->type != GDK_BUTTON_PRESS)
+		return FALSE;
+		
+	mbutton = event->button.button;
+	
+	if (mbutton == 1)
+	{
+		Track *track;
+		Album_Item *album;
+		/* Left mouse button clicked so find all tracks with displayed cover */
+		cover = g_ptr_array_index(cdwidget->cdcovers, IMG_MAIN);
+		/* Stop redisplay of the artwork as its already
+		 * in the correct location
+		 */
+		coverart_block_change (TRUE);
+	
+		/* Select the correct track in the sorttabs */
+		album = cover->album;
+		g_return_val_if_fail (album, FALSE);
+		
+		/* Clear the tracks listed in the display */
+		tm_remove_all_tracks ();
+		
+		GList *tracks = album->tracks;
+		while (tracks)
+		{
+			track = (Track *) tracks->data;
+			tm_add_track_to_track_model (track, NULL);
+			tracks = tracks->next;
+		}
+		
+		/* Turn the display change back on */
+		coverart_block_change (FALSE);
+	}
+	else if ((mbutton == 3) && (event->button.state & GDK_SHIFT_MASK))
+	{
+		/* Right mouse button clicked and shift pressed.
+		 * Go straight to edit details window
+		 */
+		 GList *tracks = coverart_get_displayed_tracks();
+		details_edit (tracks);
+	}
+	else if (mbutton == 3)
+	{
+		/* Right mouse button clicked on its own so display
+		 * popup menu
+		 */
+		 /*int i;
+		 GList *tracks = coverart_get_displayed_tracks();
+		 for (i = 0; i < g_list_length(tracks); ++i)
+    {
+    	Track *track;
+    	track = g_list_nth_data (tracks, i);
+    	printf ("display_coverart-main_image_clicked - Artist:%s  Album:%s  Title:%s\n", track->artist, track->album, track->title);
+    }*/
+		cad_context_menu_init ();
+	}
+	
+	return FALSE;
+}
+
+/**
+ * coverart_clear_images:
+ *
+ * reset the cd cover images to default blank pixbufs and
+ * nullify the covers' pointers to any tracks.
+ * 
+ */
+void coverart_clear_images ()
+{
+	gint i;
+	Cover_Item *cover = NULL;
+	
+	for (i = 0; i < IMG_TOTAL; i++)
+	{
+		/* Reset the pixbuf */
+		cover = g_ptr_array_index(cdwidget->cdcovers, i);
+		cover->album = NULL;
+		gnome_canvas_item_hide (cover->cdimage);
+		gnome_canvas_item_hide (cover->cdreflection);
+		
+		if (cover->highlight != NULL)
+			gnome_canvas_item_hide (cover->highlight);
+		
+		if (i == IMG_MAIN)
+		{
+			/* Set the text to display details of the main image */
+			gnome_canvas_item_hide (GNOME_CANVAS_ITEM (cdwidget->cvrtext));
+		}
+	}
+}
+
+/**
+ * coverart_get_track_thumb:
+ *
+ * Retrieve the artwork pixbuf from the given track.
+ * 
+ * @track: Track from where the pixbuf is obtained.
+ * @device: Reference to the device upon which the track is located
+ * @default_img_size: If the default image must be used then this may contain a default value
+ * 		for its size.
+ * 
+ * Returns:
+ * pixbuf referenced by the provided track or the pixbuf of the
+ * default file if track has no cover art.
+ */
+GdkPixbuf *coverart_get_track_thumb (Track *track, Itdb_Device *device, gint default_size)
+{
+	GdkPixbuf *pixbuf = NULL;
+	GdkPixbuf *image = NULL;	
+	Thumb *thumb;
+	ExtraTrackData *etd;
+	gint w, h;
+	float ratio;
+	
+	etd = track->userdata;
+	g_return_val_if_fail (etd, NULL);
+
+	thumb = itdb_artwork_get_thumb_by_type (track->artwork,
+						ITDB_THUMB_COVER_LARGE);
+	if (thumb)
+	{
+		image = itdb_thumb_get_gdk_pixbuf (device, thumb);
+	  w = gdk_pixbuf_get_width (image);
+	  h = gdk_pixbuf_get_height (image);
+	  
+	  if (default_size > 0)
+		{
+	  	if (w > default_size || h > default_size)
+	  	{
+	  		/* need to scale the image back down to size */
+	  		if (w == h)
+	  		{
+	  			w = default_size;
+	  			h = default_size;
+	  		}
+	  		else if (h > w)
+	  		{
+	  			ratio = h / w;
+	  			h = default_size;
+	  			w = (gint) (default_size / ratio);
+	  		}
+	  		else
+	  		{
+	  			ratio = w / h;
+	  			w = default_size;
+	  			h = (gint) (default_size / ratio);
+	  		}
+	  		pixbuf = gdk_pixbuf_scale_simple(image, w, h, GDK_INTERP_NEAREST);
+	  	}
+	  	else
+	  		pixbuf = gdk_pixbuf_copy (image);
+			
+			gdk_pixbuf_unref (image);
+		}
+		else
+		{
+			pixbuf = gdk_pixbuf_scale_simple(image, DEFAULT_IMG_SIZE, DEFAULT_IMG_SIZE, GDK_INTERP_NEAREST);
+  		gdk_pixbuf_unref (image);
+		}
+	}
+	
+	if (pixbuf ==  NULL)
+	{
+	 	/* Could not get a viable thumbnail so get default pixbuf */
+	 	pixbuf = coverart_get_default_track_thumb (default_size);
+	}
+	
+	return pixbuf;
+}
+
+/**
+ * coverart_get_displayed_tracks:
+ *
+ * Get all tracks suggested by the displayed album cover.
+ * 
+ * Returns:
+ * GList containing references to all the displayed covered tracks
+ */
+GList *coverart_get_displayed_tracks (void)
+{
+	Cover_Item *cover;
+
+	cover = g_ptr_array_index(cdwidget->cdcovers, IMG_MAIN);
+	g_return_val_if_fail (cover->album, NULL);
+	return cover->album->tracks;
+}
+
+/**
+ * coverart_display_big_artwork:
+ * 
+ * Display a big version of the artwork in a dialog
+ * 
+ */
+void coverart_display_big_artwork ()
+{
+	Cover_Item *cover;
+	ExtraTrackData *etd;
+	GdkPixbuf *imgbuf = NULL;
+	
+	cover = g_ptr_array_index(cdwidget->cdcovers, IMG_MAIN);
+	g_return_if_fail (cover);
+	
+	if (cover->album == NULL)
+		return;
+				
+	Track *track;
+	track = g_list_nth_data (cover->album->tracks, 0);
+	etd = track->userdata;
+	if (etd && etd->thumb_path_locale)
+	{
+		GError *error = NULL;
+		imgbuf = gdk_pixbuf_new_from_file (etd->thumb_path_locale, &error);
+		if (error != NULL)
+		{
+			g_error_free (error);
+		}
+	}
+	
+	/* Either thumb was null or the attempt at getting a pixbuf failed
+	 * due to invalid file. For example, some nut (like me) decided to
+	 * apply an mp3 file to the track as its cover file
+	 */
+	if (imgbuf ==  NULL)
+	{
+		/* Could not get a viable thumbnail so get default pixbuf */
+		imgbuf = coverart_get_default_track_thumb (256);
+	}
+	
+	display_image_dialog (imgbuf);
+		
+	/* Unreference pixbuf if it is not pointing to
+	 * the album's artwork
+	 */
+	if (cover->album->albumart == NULL)
+		gdk_pixbuf_unref (imgbuf);
+}
+
+/**
+ * coverart_get_default_track_thumb:
+ *
+ * Retrieve the artwork pixbuf from the default image file.
+ * 
+ * Returns:
+ * pixbuf of the default file for tracks with no cover art.
+ */
+GdkPixbuf *coverart_get_default_track_thumb (gint default_img_size)
+{
+	GdkPixbuf *pixbuf = NULL;
+	GdkPixbuf *scaled = NULL;
+	gdouble default_size = 140;
+	GError *error = NULL;
+	
+	if (default_img_size != 0)
+		default_size = (gdouble) default_img_size;
+	
+	pixbuf = gdk_pixbuf_new_from_file(DEFAULT_FILE, &error);
+	if (error != NULL)
+	{
+			printf("Error occurred loading the default file - \nCode: %d\nMessage: %s\n", error->code, error->message);
+			g_return_val_if_fail(pixbuf, NULL);
+	}
+	
+	scaled = gdk_pixbuf_scale_simple(pixbuf, default_size, default_size, GDK_INTERP_NEAREST);
+  gdk_pixbuf_unref (pixbuf);
+	
+
+	return scaled;
+}
+
+/**
+ * coverart_init:
+ *
+ * Initialises the image file used if an album has no cover. This
+ * needs to be loaded early as it uses the path of the binary
+ * to determine where to load the file from, in the same way as
+ * main() determines where to load the glade file from.
+ *
+ * @progpath: path of the gtkpod binary being loaded.
+ *  
+ */
+void coverart_init (gchar *progpath)
+{
+	gchar *progname;
+	
+	progname = g_find_program_in_path (progpath);
+
+  if (progname)
+  {
+  	static const gchar *SEPsrcSEPgtkpod = G_DIR_SEPARATOR_S "src" G_DIR_SEPARATOR_S "gtkpod";
+
+    if (!g_path_is_absolute (progname))
+    {
+	  	gchar *cur_dir = g_get_current_dir ();
+	  	gchar *prog_absolute;
+
+	  	if (g_str_has_prefix (progname, "." G_DIR_SEPARATOR_S))
+	     	prog_absolute = g_build_filename (cur_dir, progname+2, NULL);
+	  	else
+	     	prog_absolute = g_build_filename (cur_dir, progname, NULL);
+	  		
+	  	g_free (progname);
+	  	g_free (cur_dir);
+	  	progname = prog_absolute;
+  	}
+
+    if (g_str_has_suffix (progname, SEPsrcSEPgtkpod))
+    {
+	  	gchar *suffix = g_strrstr (progname, SEPsrcSEPgtkpod);
+
+	  	if (suffix)
+	  	{
+	     	*suffix = 0;
+	     	DEFAULT_FILE = g_build_filename (progname, "data", "default-cover.png", NULL);
+	     	HIGHLIGHT_FILE = g_build_filename (progname, "data", "cdshine.png", NULL);
+	     	HIGHLIGHT_FILE_MAIN = g_build_filename (progname, "data", "cdshine_main.png", NULL);
+	  	}
+  	}
+    
+    g_free (progname);
+    if (DEFAULT_FILE && !g_file_test (DEFAULT_FILE, G_FILE_TEST_EXISTS))
+    {
+	  	g_free (DEFAULT_FILE);
+	  	DEFAULT_FILE = NULL;
+    }
+    
+    if (HIGHLIGHT_FILE && !g_file_test (HIGHLIGHT_FILE, G_FILE_TEST_EXISTS))
+    {
+	  	g_free (HIGHLIGHT_FILE);
+	  	HIGHLIGHT_FILE = NULL;
+    }
+    
+    if (HIGHLIGHT_FILE_MAIN && !g_file_test (HIGHLIGHT_FILE_MAIN, G_FILE_TEST_EXISTS))
+    {
+	  	g_free (HIGHLIGHT_FILE_MAIN);
+	  	HIGHLIGHT_FILE_MAIN = NULL;
+    }
+  }
+  
+  if (!DEFAULT_FILE)
+  {
+		DEFAULT_FILE = g_build_filename (PACKAGE_DATA_DIR, PACKAGE, "data", "default-cover.png", NULL);
+  }
+  if (!HIGHLIGHT_FILE)
+  {
+		HIGHLIGHT_FILE = g_build_filename (PACKAGE_DATA_DIR, PACKAGE, "data", "cdshine.png", NULL);
+  }
+  if (!HIGHLIGHT_FILE_MAIN)
+  {
+		HIGHLIGHT_FILE_MAIN = g_build_filename (PACKAGE_DATA_DIR, PACKAGE, "data", "cdshine_main.png", NULL);
+	}
+}
+
+/**
+ * on_cover_up_button_clicked:
+ *
+ * callback for the cover_up_button. Shows all the cover_art widgets
+ * when clicked.
+ *
+ * @widget, data unused standard parameters
+ *  
+ */
+void on_cover_up_button_clicked (GtkWidget *widget, gpointer data)
+{
+	prefs_set_int (KEY_DISPLAY_COVERART, TRUE);
+	
+	if (cdwidget == NULL)
+		coverart_set_images (TRUE);
+		
+	gtk_widget_show_all (cdwidget->contentpanel);
+	gtk_widget_show (GTK_WIDGET(cdwidget->cdslider));
+	gtk_widget_show (GTK_WIDGET(cdwidget->leftbutton));
+	gtk_widget_show (GTK_WIDGET(cdwidget->rightbutton));
+	
+	gtk_widget_hide (widget);
+	
+	GtkWidget *downbutton = gtkpod_xml_get_widget (main_window_xml, "cover_down_button");
+	gtk_widget_show (downbutton);
+}
+
+/**
+ * on_cover_down_button_clicked:
+ *
+ * callback for the cover_down_button. Hides all the cover_art widgets
+ * when clicked.
+ *
+ * @widget, data unused standard parameters
+ *  
+ */
+void on_cover_down_button_clicked (GtkWidget *widget, gpointer data)
+{
+	prefs_set_int (KEY_DISPLAY_COVERART, FALSE);
+	
+	gtk_widget_hide_all (cdwidget->contentpanel);
+	gtk_widget_hide (GTK_WIDGET(cdwidget->cdslider));
+	gtk_widget_hide (GTK_WIDGET(cdwidget->leftbutton));
+	gtk_widget_hide (GTK_WIDGET(cdwidget->rightbutton));
+	
+	if (cdwidget != NULL)
+	{
+		/* dispose of existing CD Widget */
+		free_CDWidget();
+	}
+	gtk_widget_hide (widget);
+	
+	GtkWidget *upbutton = gtkpod_xml_get_widget (main_window_xml, "cover_up_button");
+	gtk_widget_show (upbutton);
+}
+
+/**
+ * on_paned0_button_release_event:
+ *
+ * Callback fired when a button release event occurs on
+ * paned0. Only worthwhile things are carried out when
+ * the position of paned0 has changed, ie. the bar was moved.
+ * Moving the bar will scale the cover images appropriately.
+ * 
+ * @widget: gtkpod app window
+ * @event: gdk event button
+ * @data: any user data passed to the function
+ * 
+ * Returns:
+ * boolean indicating whether other handlers should be run.
+ */
+gboolean on_paned0_button_release_event (GtkWidget *widget, GdkEventButton *event, gpointer data)
+{
+		if ( ! prefs_get_int (KEY_DISPLAY_COVERART))
+		return FALSE;
+		
+	gint width;
+	
+	width = gtk_paned_get_position (GTK_PANED(widget));
+	if ((width >= DEFAULT_WIDTH) && (width != WIDTH))
+	{
+		WIDTH = width;
+		gnome_canvas_item_set (GNOME_CANVAS_ITEM(cdwidget->cvrtext), 
+				       "x", (gdouble) WIDTH / 2,
+				       NULL);
+		
+		set_covers (FALSE);		
+	}
+		
+	return FALSE;
+}
+
+static gboolean on_contentpanel_scroll_wheel_turned (GtkWidget *widget, GdkEventScroll *event, gpointer user_data)
+{
+	gint displaytotal;
+	
+	if (event->direction == GDK_SCROLL_DOWN)
+		cdwidget->first_imgindex++;
+  else
+   	cdwidget->first_imgindex--;
+   	
+  displaytotal = g_list_length(album_key_list) - 8;
+  
+  if (displaytotal <= 0)
+  	return TRUE;
+  
+  /* Use the index value from the slider for the main image index */
+  if (cdwidget->first_imgindex < 0)
+  	cdwidget->first_imgindex = 0;
+  else if (cdwidget->first_imgindex > (displaytotal - 1))
+  	cdwidget->first_imgindex = displaytotal - 1;
+      	
+	/* Change the value of the slider to do the work of scrolling the covers */
+	gtk_range_set_value (GTK_RANGE (cdwidget->cdslider), cdwidget->first_imgindex);
+	
+	return TRUE;	
+}
+      
+/**
+ * gtkpod_window_configure_callback:
+ *
+ * Callback for the gtkpod app window. When the window
+ * is resized the background of the cdwidget is given a size
+ * of the same size. Ensure the background is always black
+ * and no overlapping internal components occur.
+ * 
+ * @widget: gtkpod app window
+ * @event: gdk configure event
+ * @data: any user data passed to the function
+ * 
+ * Returns:
+ * boolean indicating whether other handlers should be run.
+ */
+static gboolean gtkpod_window_configure_callback (GtkWidget *widget, GdkEventConfigure *event, gpointer data)
+{
+	if (cdwidget == NULL)
+		return FALSE;
+		
+	gnome_canvas_item_set (cdwidget->bground, 
+			       "x1",(double) 0, 
+			       "y1",(double) 0,
+			       "x2",(double) event->width,
+			       "y2",(double) event->height,
+			       NULL);
+	gnome_canvas_item_request_update (cdwidget->bground);
+				
+	return FALSE;
+}
+
+/**
+ * set_display_dimensions:
+ *
+ * Initialises the display component width and height.
+ * Sets the podpane's paned position value too.
+ */
+static void set_display_dimensions ()
+{
+	GtkWidget *podpane;
+		  		
+	g_object_get (gtkpod_window,
+								"default_height", &HEIGHT,
+								NULL);
+		
+	HEIGHT = HEIGHT / 2.5;
+	DEFAULT_HEIGHT = HEIGHT;
+	
+	podpane = gtkpod_xml_get_widget (main_window_xml, "paned0");	
+	g_return_if_fail (podpane);
+
+	WIDTH = HEIGHT;	
+	gtk_paned_set_position (GTK_PANED(podpane), WIDTH);
+	DEFAULT_WIDTH = WIDTH;
+}
+
+/**
+ * set_cover_dimensions:
+ *
+ * Utility function for set all the x, y, width and height
+ * dimensions applicable to a single cover widget
+ * 
+ * @cover: cover widget for which dimensions are to be set
+ * @cover_index: index of the widget. Used to determine whether
+ * 												cover is the main cover or not
+ */
+static void set_cover_dimensions (Cover_Item *cover, int cover_index, gdouble img_width, gdouble img_height)
+{
+	gdouble x = 0, y = 0;
+	gdouble small_img_width, small_img_height;
+	gdouble display_width = 0, display_height = 0;
+	gdouble display_diff = 0, display_ratio = 0;
+	gint temp_index = 0;
+	
+	small_img_width = img_width * 0.75;
+	small_img_height = img_height * 0.75;
+	
+	/* WIDTH is the width of the display_coverart window
+	 * BORDER is the 10 pixel frame around the images
+	 */
+	display_width = (WIDTH / 2) - (BORDER * 2);
+	
+	display_diff = display_width - small_img_width;	
+	
+	/* Set the x location of the cover image */
+	switch(cover_index) {
+		case 0:
+		case 1:
+		case 2:
+		case 3:
+			display_ratio = ((gdouble) cover_index) / 4;
+			x = BORDER + (display_ratio * display_diff);
+			break;
+		case IMG_MAIN:
+			/* The Main Image CD Cover Image */
+			x = (WIDTH - img_width) / 2;
+			break;
+		case 5:
+		case 6:
+		case 7:
+		case 8:			
+			temp_index = cover_index - 8;
+			if (temp_index < 0)
+				temp_index = temp_index * -1; 
+	
+			display_ratio = ((gdouble) temp_index) / 4;
+			x = WIDTH - (BORDER + small_img_width + (display_ratio * display_diff)); 
+			break;
+	}
+		
+	/* Set the y location of the cover image. The y location must be determined by
+	 * height of the cover image so that the hightlight and shadow fit in correctly.
+	 */
+	display_height = HEIGHT - (BORDER * 2);
+	
+	switch(cover_index) {
+		case 0:
+		case 8:
+			y = display_height - (small_img_height + (BORDER * 15));
+			break;
+		case 1:
+		case 7:
+			y = display_height - (small_img_height + (BORDER * 12));
+			break;
+		case 2:
+		case 6:
+			y = display_height - (small_img_height + (BORDER * 9));
+			break;
+		case 3:
+		case 5:
+			y = display_height - (small_img_height + (BORDER * 6)); 
+			break;
+		case IMG_MAIN:
+			/* The Main Image CD Cover Image */
+			y = HEIGHT - (img_height + (BORDER * 4));	
+	}
+			
+	cover->img_x = x;
+	cover->img_y = y;
+		
+	if (cover_index == IMG_MAIN)
+	{
+		cover->img_height = img_height;
+		cover->img_width = img_width;
+	}
+	else
+	{
+		cover->img_height = small_img_height;
+		cover->img_width = small_img_width;
+	}
+}
+
+/**
+ * 
+ * set_scale_range:
+ * 
+ * Set the scale range - maximum value should be display
+ * track list length - (8 NULL images + 1 as index value), 
+ * ie. the ones either end of the list.
+ * 
+ */
+static void set_slider_range (gint index)
+{
+	gint slider_ubound = g_list_length (album_key_list) - IMG_TOTAL;
+	if(slider_ubound < 1)
+	{
+		/* If only one album cover is displayed then slider_ubbound returns
+		 * 0 and causes a slider assertion error. Avoid this by disabling the
+		 * slider, which makes sense because only one cover is displayed.
+		 */
+		slider_ubound = 1;
+		gtk_widget_set_sensitive (GTK_WIDGET(cdwidget->cdslider), FALSE); 
+		gtk_widget_set_sensitive (GTK_WIDGET(cdwidget->leftbutton), FALSE); 
+		gtk_widget_set_sensitive (GTK_WIDGET(cdwidget->rightbutton), FALSE); 
+	}
+	else
+	{
+	 	gtk_widget_set_sensitive (GTK_WIDGET(cdwidget->cdslider), TRUE);
+	 	gtk_widget_set_sensitive (GTK_WIDGET(cdwidget->leftbutton), TRUE); 
+		gtk_widget_set_sensitive (GTK_WIDGET(cdwidget->rightbutton), TRUE);
+	}
+	
+	gtk_range_set_range (GTK_RANGE (cdwidget->cdslider), 0, slider_ubound);
+	if (index >= 0 && index <= slider_ubound)
+		gtk_range_set_value (GTK_RANGE (cdwidget->cdslider), index);
+	else
+		gtk_range_set_value (GTK_RANGE (cdwidget->cdslider), 0);
+}
+
+/**
+ * prepare_canvas:
+ *
+ * Initialise the canvas and prepare the 9 cover items, along
+ * with shadow and correct positions/dimensions.
+ */
+static void prepare_canvas ()
+{
+	gint i;
+	Cover_Item *cover;
+	
+	gtk_widget_set_size_request(GTK_WIDGET(cdwidget->canvasbox), WIDTH, HEIGHT);
+	/* create a new canvas */
+	cdwidget->canvas = GNOME_CANVAS(gnome_canvas_new_aa());
+	g_return_if_fail (cdwidget->canvas);
+	
+	/* set the size and scroll region of the canvas */
+	gtk_widget_set_size_request(GTK_WIDGET(cdwidget->canvas), WIDTH, HEIGHT);
+	gnome_canvas_set_center_scroll_region (cdwidget->canvas, FALSE);
+	
+	cdwidget->bground = gnome_canvas_item_new(gnome_canvas_root(cdwidget->canvas),
+			    gnome_canvas_rect_get_type(),
+			    "x1",(double) 0, 
+			    "y1",(double) 0,
+			    "x2",(double) WIDTH,
+			    "y2",(double) HEIGHT,
+			    "fill_color", "black",
+			    NULL);
+			    
+	gnome_canvas_item_lower_to_bottom(cdwidget->bground);
+	
+	cdwidget->cdcovers = g_ptr_array_sized_new (IMG_TOTAL);
+	for(i = 0; i < IMG_TOTAL; ++i)
+	{
+		cover = g_new0(Cover_Item, 1);
+		
+		cover->cdcvrgrp = gnome_canvas_item_new(gnome_canvas_root(cdwidget->canvas),
+												gnome_canvas_group_get_type(),
+												NULL);
+												
+		cover->cdimage = gnome_canvas_item_new((GnomeCanvasGroup *) cover->cdcvrgrp,
+										GNOME_TYPE_CANVAS_PIXBUF,
+										NULL);
+		
+		cover->cdreflection = gnome_canvas_item_new((GnomeCanvasGroup *) cover->cdcvrgrp,
+										GNOME_TYPE_CANVAS_PIXBUF,
+										NULL);
+		
+		cover->highlight = gnome_canvas_item_new((GnomeCanvasGroup *) cover->cdcvrgrp,
+																						GNOME_TYPE_CANVAS_PIXBUF,
+	    	   																	NULL);	
+			
+		if(i == IMG_MAIN)
+		{	
+			/* set up some callback events on the main scaled image */
+			g_signal_connect(GTK_OBJECT(cover->cdimage), "event", GTK_SIGNAL_FUNC(on_main_cover_image_clicked), NULL);
+		
+			cdwidget->cvrtext = GNOME_CANVAS_TEXT(gnome_canvas_item_new(gnome_canvas_root(cdwidget->canvas),
+										GNOME_TYPE_CANVAS_TEXT,
+										"text", " ",
+										"x", (gdouble) WIDTH / 2,
+										"y", (gdouble) 0,
+										"justification", GTK_JUSTIFY_CENTER,
+  									"anchor", GTK_ANCHOR_NORTH,
+  									"fill_color", "white",
+  									"font", "-*-clean-medium-r-normal-*-12-*-*-*-*-*-*",
+										NULL));
+		}
+
+		g_ptr_array_add(cdwidget->cdcovers, cover);
+		cover = NULL;
+	}
+	
+	raise_cdimages (cdwidget->cdcovers);
+}
+
+/**
+ * 
+ * free_album:
+ * 
+ * Destroy an album struct once no longer needed.
+ * 
+ */ 
+static void free_album (Album_Item *album)
+{
+	if (album != NULL)
+	{
+		if (album->tracks)
+		{
+			g_list_free (album->tracks);
+		}
+		
+		g_free (album->albumname);
+		g_free (album->artist);
+		
+		if (album->albumart)
+			gdk_pixbuf_unref (album->albumart);
+	}
+}
+
+/**
+ * coverart_init_display:
+ *
+ * Initialise the boxes and canvases of the coverart_display.
+ *  
+ */
+void coverart_init_display ()
+{
+	/* Alway initialise these buttons whether the coverart is displayed or not as these are the
+	 * up/down buttons on the display window and should be properly initialised
+	 */
+	GtkWidget *upbutton = gtkpod_xml_get_widget (main_window_xml, "cover_up_button");
+	GtkWidget *downbutton = gtkpod_xml_get_widget (main_window_xml, "cover_down_button");
+	GtkWidget *lbutton = gtkpod_xml_get_widget (main_window_xml, "cover_display_leftbutton");
+	GtkWidget *rbutton = gtkpod_xml_get_widget (main_window_xml, "cover_display_rightbutton");
+	GtkWidget *slider = gtkpod_xml_get_widget (main_window_xml, "cover_display_scaler");
+		
+	/* show/hide coverart display -- default to show */
+	if (prefs_get_int (KEY_DISPLAY_COVERART))
+	{
+		gtk_widget_hide (upbutton);
+		gtk_widget_show (downbutton);
+		gtk_widget_show (lbutton);
+		gtk_widget_show (rbutton);
+		gtk_widget_show (slider);
+		if (cdwidget != NULL)
+			gtk_widget_show_all (cdwidget->contentpanel);
+	}
+	else
+	{
+		gtk_widget_show (upbutton);
+		gtk_widget_hide (downbutton);
+		gtk_widget_hide (lbutton);
+		gtk_widget_hide (rbutton);
+		gtk_widget_hide (slider);
+		if (cdwidget != NULL)
+			gtk_widget_hide_all (cdwidget->contentpanel);
+		return;
+	}
+			
+	cdwidget = g_new0(CD_Widget, 1);
+	
+	cdwidget->canvasbox = gtkpod_xml_get_widget (main_window_xml, "cover_display_canvasbox"); 
+	cdwidget->contentpanel = gtkpod_xml_get_widget (main_window_xml, "cover_display_window");
+	cdwidget->controlbox = gtkpod_xml_get_widget (main_window_xml, "cover_display_controlbox");
+	cdwidget->leftbutton = GTK_BUTTON (gtkpod_xml_get_widget (main_window_xml, "cover_display_leftbutton"));
+	cdwidget->rightbutton = GTK_BUTTON (gtkpod_xml_get_widget (main_window_xml, "cover_display_rightbutton"));
+	cdwidget->cdslider = GTK_HSCALE (gtkpod_xml_get_widget (main_window_xml, "cover_display_scaler"));
+  
+	g_return_if_fail (cdwidget->contentpanel);
+	g_return_if_fail (cdwidget->canvasbox);
+	g_return_if_fail (cdwidget->controlbox);
+	g_return_if_fail (cdwidget->leftbutton);
+	g_return_if_fail (cdwidget->rightbutton);
+	g_return_if_fail (cdwidget->cdslider);
+  
+  /* Initialise the album has backing store */
+  album_hash = g_hash_table_new_full ( g_str_hash,
+  																																			g_str_equal,
+  																																			(GDestroyNotify) g_free,
+  																																			(GDestroyNotify) free_album);
+	album_key_list = NULL;
+  
+	set_display_dimensions ();
+	
+	prepare_canvas ();
+	
+	gtk_box_pack_start_defaults (GTK_BOX(cdwidget->canvasbox), GTK_WIDGET(cdwidget->canvas));
+				
+/* Dnd destinaton for foreign image files */
+	gtk_drag_dest_set (
+			cdwidget->canvasbox, 
+			0, 
+			coverart_drop_types, 
+			TGNR (coverart_drop_types), 
+			GDK_ACTION_COPY|GDK_ACTION_MOVE);
+
+	g_signal_connect ((gpointer) cdwidget->canvasbox, "drag-drop",
+			G_CALLBACK (dnd_coverart_drag_drop), 
+			NULL);
+	
+	g_signal_connect ((gpointer) cdwidget->canvasbox, "drag-data-received",
+			G_CALLBACK (dnd_coverart_drag_data_received), 
+			NULL);
+	
+	g_signal_connect ((gpointer) cdwidget->canvasbox, "drag-motion",
+			G_CALLBACK (dnd_coverart_drag_motion),
+			NULL);
+	
+	contentpanel_signal_id = g_signal_connect (G_OBJECT(cdwidget->contentpanel), "scroll-event",
+					G_CALLBACK(on_contentpanel_scroll_wheel_turned), NULL);
+					
+	lbutton_signal_id = g_signal_connect (G_OBJECT(cdwidget->leftbutton), "clicked",
+		      G_CALLBACK(on_cover_display_button_clicked), NULL);
+		      
+	rbutton_signal_id = g_signal_connect (G_OBJECT(cdwidget->rightbutton), "clicked",
+		      G_CALLBACK(on_cover_display_button_clicked), NULL);	
+	
+	slide_signal_id = g_signal_connect (G_OBJECT(cdwidget->cdslider), "value-changed",
+		      G_CALLBACK(on_cover_display_slider_value_changed), NULL);
+	
+	window_signal_id = g_signal_connect (gtkpod_window, "configure_event", 
+  		G_CALLBACK (gtkpod_window_configure_callback), NULL);
+  
+  gtk_widget_show_all (cdwidget->contentpanel);
+  		
+	coverart_block_change (FALSE);
+}
+
+/**
+ * coverart_select_cover
+ * 
+ * When a track / album is selected, the artwork cover
+ * is selected in the display
+ * 
+ * @track: chosen track
+ * 
+ */
+void coverart_select_cover (Track *track)
+{
+  gint displaytotal, index;
+	
+	/* Only select covers if the display is visible */
+	if (! prefs_get_int (KEY_DISPLAY_COVERART) || cdwidget == NULL)
+		return;
+		
+	/* Only select covers if fire display change is enabled */
+	if (cdwidget->block_display_change)
+		return;
+			
+	displaytotal = g_list_length(album_key_list);
+  if (displaytotal <= 0)
+  	return;
+  	
+  gchar *trk_key;
+  trk_key = g_strconcat (track->artist, "_", track->album, NULL);
+ 	
+ 	/* Determine the index of the found track */
+ 	GList *key = g_list_find_custom (album_key_list, trk_key, (GCompareFunc) compare_album_keys);
+ 	g_return_if_fail (key);
+ 	index = g_list_position (album_key_list, key);
+ 	g_free (trk_key);
+ 	 
+ 	/* Use the index value for the main image index */
+  cdwidget->first_imgindex = index - IMG_MAIN;
+  if (cdwidget->first_imgindex < 0)
+  	cdwidget->first_imgindex = 0;
+  else if((cdwidget->first_imgindex + IMG_TOTAL) >= displaytotal)
+  	cdwidget->first_imgindex = displaytotal - IMG_TOTAL;
+      
+  set_covers (FALSE);
+  
+  /* Set the index value of the slider but avoid causing an infinite
+   * cover selection by blocking the event
+   */
+  g_signal_handler_block (cdwidget->cdslider, slide_signal_id);
+	gtk_range_set_value (GTK_RANGE (cdwidget->cdslider), index);
+	g_signal_handler_unblock (cdwidget->cdslider, slide_signal_id);
+ }
+
+/**
+ * compare_album_keys:
+ * 
+ * Comparison function for comparing keys in
+ * the key list to sort them into alphabetical order.
+ * Could use g_ascii_strcasecmp directly but the NULL
+ * strings cause assertion errors.
+ * 
+ * @a: first album key to compare
+ * @b: second album key to compare
+ * 
+ */
+ static gint compare_album_keys (gchar *a, gchar *b)
+ {
+ 	if (a == NULL) return -1;
+ 	if (b == NULL) return -1;
+ 	
+ 	return g_ascii_strcasecmp (a, b);	
+ 	
+ }
+ 
+/**
+ * coverart_sort_images:
+ * 
+ * When the alphabetize function is initiated this will
+ * sort the covers in the same way. Used at any point to
+ * sort the covers BUT must be called after an initial coverart_set_images
+ * as the latter initialises the album_key_list list 
+ * 
+ * @order: order type
+ * 
+ */
+static void coverart_sort_images (GtkSortType order)
+{
+ 	if (order == SORT_NONE)
+ 	{
+ 		/* No sorting means original order so this should have been called after a coverart_set_images (TRUE)
+ 		 * when the TRUE means the tracks were freshly established from the playlist and the hash and key_list
+ 		 * recreated.
+ 		 */
+ 		return;
+ 	}
+ 	else
+ 	{
+ 		album_key_list = g_list_sort (album_key_list, (GCompareFunc) compare_album_keys);
+ 	}
+ 	
+ 	if (order == GTK_SORT_DESCENDING)
+ 	{
+ 		album_key_list = g_list_reverse (album_key_list);		
+ 	}
+ }
+
+/**
+ * 
+ * Convenience function that will only allow set images to be
+ * called if the track that was affected was in the list of displaytracks
+ * used by the coverart display. So if a whole album is deleted then this
+ * will only reset the display if the first track in the album is deleted.
+ * 
+ * @track: affected track
+ */
+void coverart_track_changed (Track *track, gint signal)
+{
+	GList *keypos;
+	gchar *trk_key;
+	Album_Item *album;
+	gint index;
+	gboolean findremove;
+	/*
+	 * Scenarios:
+	 * a) A track is being deleted that is not in the display
+	 * b) A track is being deleted that is in the display
+	 * c) A track has changed is some way so maybe the coverart
+	 * d) A track has been created and its artist and album are already in the displaylist
+	 * e) A track has been created and its artist and album are not in the displaylist
+	 */
+
+	/* If coverart not displayed then ignore */
+	if (! prefs_get_int (KEY_DISPLAY_COVERART))
+  	return;
+  		
+	trk_key = g_strconcat (track->artist, "_", track->album, NULL); 	
+ 	/* Determine the index of the found album */
+ 	keypos = g_list_find_custom (album_key_list, trk_key, (GCompareFunc) compare_album_keys);
+	
+	switch (signal)
+	{
+		case COVERART_REMOVE_SIGNAL:				
+			g_return_if_fail (keypos);
+			g_free (trk_key);
+			
+			/* Reassign trk_key to the key from the list */
+ 			trk_key = keypos->data;
+ 			index = g_list_position (album_key_list, keypos);
+ 	
+			album = g_hash_table_lookup (album_hash, trk_key);
+			
+ 			/* Remove the track from the album item */
+ 			remove_track_from_album (album, track, trk_key, index, keypos);
+ 			 
+ 			/* Check if album is being displayed by checking the index */
+			if (index >= cdwidget->first_imgindex && index <= (cdwidget->first_imgindex + IMG_TOTAL))
+ 			{	
+				/* reset the covers and should reset to original position but without the index */
+				set_covers (FALSE);
+ 			}
+ 			
+ 			/* Size of key list may have changed so reset the slider 
+ 			 * to appropriate range and index.
+ 			 */
+ 			set_slider_range (index - IMG_MAIN);
+			break;
+		case COVERART_CREATE_SIGNAL:
+			/* Check whether an album item has already been created in connection
+			 * with the track's artist and album
+			 */
+			album = g_hash_table_lookup (album_hash, trk_key);
+			if (album == NULL)
+			{
+				/* Album item not found so create a new one and populate */
+				album = g_new0 (Album_Item, 1);
+				album->albumart = NULL;
+				album->albumname = g_strdup (track->album);
+				album->artist = g_strdup (track->artist);
+				album->tracks = NULL;
+				album->tracks = g_list_append (album->tracks, track);
+				
+				/* Insert the new Album Item into the hash */
+				g_hash_table_insert (album_hash, trk_key, album);
+				
+				/* Add the key to the list for sorting and other functions */
+				/* But first ... */
+				/* Remove all null tracks before any sorting should take place */	
+ 				album_key_list = g_list_remove_all (album_key_list, NULL);
+ 			
+				if (prefs_get_int("st_sort") == SORT_ASCENDING)
+				{
+					album_key_list = g_list_insert_sorted (album_key_list, trk_key, (GCompareFunc) compare_album_keys);
+				}
+				else if (prefs_get_int("st_sort") == SORT_DESCENDING)
+				{
+					/* Already in descending order so reverse into ascending order */
+					album_key_list = g_list_reverse (album_key_list);
+					/* Insert the track */
+					album_key_list = g_list_insert_sorted (album_key_list, trk_key, (GCompareFunc) compare_album_keys);
+					/* Reverse again */
+					album_key_list = g_list_reverse (album_key_list);
+				}
+				else
+				{
+					/* NO SORT */
+					album_key_list = g_list_append (album_key_list, trk_key);
+				}
+			
+				/* Readd in the null tracks */
+				/* Add 4 null tracks to the end of the track list for padding */
+				gint i;
+				for (i = 0; i < IMG_MAIN; ++i)
+					album_key_list = g_list_append (album_key_list, NULL);
+	
+				/* Add 4 null tracks to the start of the track list for padding */
+				for (i = 0; i < IMG_MAIN; ++i)
+					album_key_list = g_list_prepend (album_key_list, NULL);
+		
+				set_covers (FALSE);
+			}
+			else
+			{
+				/* Album Item found in the album hash so append the track to
+				 * the end of the track list
+				 */
+				 album->tracks = g_list_append (album->tracks, track);
+			}
+			
+			/* Set the slider to the newly inserted track.
+			 * In fact sets image_index to 4 albums previous
+			 * to newly inserted album to ensure this album is
+			 * the main middle one.
+			 */
+			keypos = g_list_find_custom (album_key_list, trk_key, (GCompareFunc) compare_album_keys);
+			index = g_list_position (album_key_list, keypos);
+ 			set_slider_range (index - IMG_MAIN);
+ 				
+			break;
+		case COVERART_CHANGE_SIGNAL:
+			/* A track is declaring itself as changed so what to do? */
+			findremove = FALSE;
+			if (keypos == NULL)
+			{
+				/* The track could not be found according to the key!
+				 * The ONLY way this could happen is if the user changed the
+				 * artist or album of the track. Well it should be rare but the only
+				 * way to remove it from its "old" album item is to search each one
+				 */
+				 findremove = TRUE;
+			}
+			else
+			{
+			/* Track has a valid key so can get the album back.
+			 * Either has happened:
+			 * a) Artist/Album key has been changed so the track is being moved to another existing album
+			 * b) Some other change has occurred that is irrelevant to this code.
+			 */
+			 
+			 /* To determine if a) is the case need to determine whether track exists in the 
+			  * album items track list. If it does then b) is true and nothing more is required.
+			  */
+			  album = g_hash_table_lookup (album_hash, trk_key);
+			  g_return_if_fail (album);
+			  
+			  index = g_list_index (album->tracks, track);
+			  if (index != -1)
+			  {
+			  	/* Track exists in the album list so ignore the change and return */
+			  	ExtraTrackData *etd;
+			  	etd = track->userdata;
+			  	if (etd->tartwork_changed == TRUE)
+			  	{
+			  		etd->tartwork_changed = FALSE;
+			  		set_covers(TRUE);
+			  	}
+			  	
+			  	return;
+			  }
+			  else
+			  {
+			  	/* Track does not exist in the album list so the artist/album key has definitely changed */
+			  	findremove = TRUE;
+			  }
+			}
+			
+			if (findremove)
+			{
+				/* It has been determined that the track has had its key changed
+				 * and thus a search must be performed to find the "original" album
+				 * that the track belonged to, remove it then add the track to the new
+				 * album.
+				 */
+			  GList *klist;
+				gchar *key;
+				klist = g_list_first (album_key_list);
+				while (klist != NULL)
+				{
+					key = (gchar *) klist->data;
+					index = g_list_index (album_key_list, key); 
+					if (key != NULL)
+					{
+						album = g_hash_table_lookup (album_hash, key);
+						
+						gint album_trk_index;
+						album_trk_index = g_list_index (album->tracks, track);
+						if (album_trk_index != -1)
+						{
+							/* The track is in this album so remove it in preparation for readding
+						 	* under the new album key
+						 	*/
+					 		remove_track_from_album (album, track, key, index, klist);
+ 							set_covers(FALSE);
+					 		/* Found the album and removed so no need to continue the loop */
+					 		break;
+						}
+					}
+					klist = klist->next;
+				}
+				
+				/* Create a new album item or find existing album to house the "brand new" track */
+				coverart_track_changed (track, COVERART_CREATE_SIGNAL);
+			}
+			
+	}
+}
+
+/**
+ * 
+ * remove_track_from_album:
+ * 
+ * Removes track from an album item and removes the latter
+ * if it no longer has any tracks in it.
+ * 
+ * @album: album to be checked for removal.
+ * @track: track to be removed from the Album_Item
+ * @key: string concatentation of the artist_album of track. Key for hash
+ * @index: position of the key in the album key list
+ * @keylistitem: the actual GList item in the album key list
+ */
+ static void remove_track_from_album (Album_Item *album, Track *track, gchar *key, gint index, GList *keylistitem)
+ {
+	/* Use the index value to determine if the cover is being displayed */
+ 	if (index >= cdwidget->first_imgindex && index <= (cdwidget->first_imgindex + IMG_TOTAL))
+ 	{
+ 		/* Cover is being displayed so need to do some clearing up */
+		coverart_clear_images ();
+ 	}
+ 			
+ 	album->tracks = g_list_remove (album->tracks, track);
+ 	if (g_list_length (album->tracks) == 0)
+ 	{
+ 		/* No more tracks related to this album item so delete it */
+ 		gboolean delstatus = g_hash_table_remove (album_hash, key);
+ 		if (! delstatus)
+ 			gtkpod_warning (_("Failed to remove the album from the album hash store."));
+ 		/*else
+ 			printf("Successfully removed album\n");
+ 		*/
+ 		album_key_list = g_list_remove_link (album_key_list, keylistitem);
+ 	
+ 		if (index < (cdwidget->first_imgindex + IMG_MAIN) && index > IMG_MAIN)
+ 		{
+ 			/* index of track is less than visible cover's indexes so subtract 1 from
+ 			 * first img index. Will mean that when deleteing album item then
+ 		 	 * set covers will be called at the correct position.
+ 		 	 * 
+ 		 	 * However, index must be greater than IMG_MAIN else a NULL track will
+ 		 	 * become the IMG_MAIN tracks displayed.
+ 		 	 */
+ 			cdwidget->first_imgindex--;
+ 		}
+ 	}
+ }
+
+/**
+ * coverart_set_images:
+ *
+ * Takes a list of tracks and sets the 9 image cover display.
+ *
+ * @clear_track_list: flag indicating whether to clear the displaytracks list or not
+ *  
+ */
+void coverart_set_images (gboolean clear_track_list)
+{
+	gint i;
+	GList *tracks;
+	Track *track;
+	Album_Item *album;
+	Playlist *playlist;
+
+	if ( ! prefs_get_int (KEY_DISPLAY_COVERART))
+		return;
+		
+	/* initialize display if not already done */
+	if (!cdwidget)  coverart_init_display ();
+
+	/* Ensure that the setting of images hasnt been turned off
+	 * due to being in the middle of a selection operation
+	 */
+	if (cdwidget->block_display_change)
+		return;
+
+	/* Reset the display back to black, black and more black */
+	coverart_clear_images ();
+	
+	if (clear_track_list)
+	{
+		/* Find the selected playlist */
+		playlist = pm_get_selected_playlist ();
+		if (playlist == NULL)
+			return;
+		
+		tracks = playlist->members;
+		/* Free up the hash table and the key list */
+		g_hash_table_foreach_remove(album_hash, (GHRFunc) gtk_true, NULL);
+				
+		g_list_free (album_key_list);
+    
+    album_key_list = NULL;;
+    
+		if (tracks == NULL)
+			return;
+		
+		while (tracks)
+		{
+		    gchar *album_key;
+			track = tracks->data;
+			
+			album_key = g_strconcat (track->artist, "_", track->album, NULL);
+			/* Check whether an album item has already been created in connection
+			 * with the track's artist and album
+			 */
+			album = g_hash_table_lookup (album_hash, album_key);
+			if (album == NULL)
+			{
+				/* Album item not found so create a new one and populate */
+				album = g_new0 (Album_Item, 1);
+				album->albumart = NULL;
+				album->albumname = g_strdup (track->album);
+				album->artist = g_strdup (track->artist);
+				album->tracks = NULL;
+				album->tracks = g_list_append (album->tracks, track);
+				
+				/* Insert the new Album Item into the hash */
+				g_hash_table_insert (album_hash, album_key, album);
+				/* Add the key to the list for sorting and other functions */
+				album_key_list = g_list_append (album_key_list, album_key);
+			}
+			else
+			{
+			    /* Album Item found in the album hash so
+			     * append the track to the end of the
+			     * track list */
+			    g_free (album_key);
+			    album->tracks = g_list_append (album->tracks, track);
+			}
+			
+			tracks = tracks->next;
+		}
+		
+		cdwidget->first_imgindex = 0;
+	}
+		
+	/* Remove all null tracks before any sorting should take place */	
+ 	album_key_list = g_list_remove_all (album_key_list, NULL);
+ 		
+	/* Sort the tracks to the order set in the preference */
+	coverart_sort_images (prefs_get_int("st_sort"));
+	
+	/* Add 4 null tracks to the end of the track list for padding */
+	for (i = 0; i < IMG_MAIN; ++i)
+		album_key_list = g_list_append (album_key_list, NULL);
+	
+	/* Add 4 null tracks to the start of the track list for padding */
+	for (i = 0; i < IMG_MAIN; ++i)
+		album_key_list = g_list_prepend (album_key_list, NULL);
+		
+	set_covers (FALSE);
+	
+	set_slider_range (cdwidget->first_imgindex);
+	
+	/*
+	printf("######### ORIGINAL LINE UP ########\n");
+	debug_albums ();
+	printf("######### END OF ORIGINAL LINE UP #######\n");
+	*/
+}
+
+/**
+ * coverart_block_change:
+ *
+ * Select covers events can be switched off when automatic
+ * selections of tracks are taking place.
+ *
+ * @val: indicating whether to block or unblock select cover events
+ *  
+ */
+void coverart_block_change (gboolean val)
+{
+  if (GTK_WIDGET_REALIZED(gtkpod_window))
+  {
+      if (val)
+      {
+	  GdkCursor *cursor = gdk_cursor_new (GDK_WATCH);
+	  gdk_window_set_cursor (gtkpod_window->window, cursor);
+	  gdk_cursor_unref (cursor);
+      }
+      else
+	  gdk_window_set_cursor (gtkpod_window->window, NULL);
+  }
+
+  if (cdwidget != NULL)
+      cdwidget->block_display_change = val;
+}
+
+/**
+ * coverart_set_cover_from_file:
+ *
+ * Add a cover to the displayed track by setting it from a
+ * picture file.
+ *
+ */
+void coverart_set_cover_from_file ()
+{
+	gchar *filename;
+	Track *track;
+	Cover_Item *cover;
+	GList *tracks;
+	
+  filename = fileselection_get_cover_filename ();
+
+	if (filename)
+  {
+  	cover = g_ptr_array_index(cdwidget->cdcovers, IMG_MAIN);
+		tracks = cover->album->tracks;
+		
+		while (tracks)
+		{
+			track = tracks->data;
+		
+ 			if (gp_track_set_thumbnails (track, filename))
+ 				data_changed (track->itdb);
+ 				
+ 			tracks = tracks->next;
+		}
+		/* Nullify so that the album art is picked up from the tracks again */
+		gdk_pixbuf_unref (cover->album->albumart);
+		cover->album->albumart = NULL;
+  }
+    
+  g_free (filename);
+  
+  set_covers (FALSE);
+}
+
+static gboolean dnd_coverart_drag_drop(GtkWidget *widget, GdkDragContext *drag_context, gint x, gint y, guint time, gpointer user_data)
+{
+	GdkAtom target;
+	target = gtk_drag_dest_find_target (widget, drag_context, NULL);
+
+	if (target != GDK_NONE)
+	{
+		gtk_drag_get_data (widget, drag_context, target, time);
+		return TRUE;	
+	}
+	/*
+	printf ("drop item\n");
+	gint i = 0;
+	for (i = 0; i < g_list_length(drag_context->targets); ++i)
+	{
+		target = g_list_nth_data (drag_context->targets, i);
+		printf ("Atom: %s\n", gdk_atom_name(target));
+		gtk_drag_get_data (widget, drag_context, target, time);
+		return TRUE;
+	}
+	*/
+	return FALSE;
+}
+
+static gboolean dnd_coverart_drag_motion (GtkWidget *widget,
+				GdkDragContext *dc,
+				gint x,
+				gint y,
+				guint time,
+				gpointer user_data)
+{
+	GdkAtom target;
+	iTunesDB *itdb;
+	ExtraiTunesDBData *eitdb;
+
+	itdb = gp_get_selected_itdb ();
+	/* no drop is possible if no playlist/repository is selected */
+	if (itdb == NULL)
+	{
+		gdk_drag_status (dc, 0, time);
+		return FALSE;
+	}
+	
+	eitdb = itdb->userdata;
+	g_return_val_if_fail (eitdb, FALSE);
+	/* no drop is possible if no repository is loaded */
+	if (!eitdb->itdb_imported)
+	{
+		gdk_drag_status (dc, 0, time);
+		return FALSE;
+	}
+	    
+	target = gtk_drag_dest_find_target (widget, dc, NULL);
+	/* no drop possible if no valid target can be found */
+	if (target == GDK_NONE)
+	{
+		gdk_drag_status (dc, 0, time);
+		return FALSE;
+	}
+	    
+	gdk_drag_status (dc, dc->suggested_action, time);
+
+  return TRUE;
+}
+
+static void dnd_coverart_drag_data_received(GtkWidget *widget, GdkDragContext *dc, gint x, gint y, GtkSelectionData *data, guint info,
+		guint time, gpointer user_data)
+{
+	g_return_if_fail (widget);
+	g_return_if_fail (dc);
+	g_return_if_fail (data);
+	g_return_if_fail (data->data);
+	g_return_if_fail (data->length > 0);
+	
+	/* mozilla bug 402394 */
+
+#if DEBUG
+		printf ("data length = %d\n", data->length);
+		printf ("data->data = %s\n", data->data);
+#endif
+		
+	Cover_Item *cover;
+	GList *tracks;
+	gchar *url = NULL;
+	Fetch_Cover *fcover;
+	Track *track;
+	gchar *filename = NULL;
+	gboolean image_status = FALSE;
+	gchar *image_error = NULL;
+	/* For use with DND_IMAGE_JPEG */
+	GdkPixbuf *pixbuf;
+	GError *error = NULL;
+		
+	/* Find the display cover item in the cover display */
+	cover = g_ptr_array_index(cdwidget->cdcovers, IMG_MAIN);
+	tracks = cover->album->tracks;
+			
+	switch (info)
+	{
+		case DND_IMAGE_JPEG:
+#if DEBUG
+			printf ("Using DND_IMAGE_JPEG\n");
+#endif
+			pixbuf = gtk_selection_data_get_pixbuf (data);
+			if (pixbuf != NULL)
+			{
+				/* initialise the url string with a safe value as not used if already have image */
+				url = "local image";
+				/* Initialise a fetchcover object */
+				fcover = fetchcover_new (url, tracks);
+				coverart_block_change (TRUE);
+				
+				/* find the filename with which to save the pixbuf to */
+				if (fetchcover_select_filename (fcover))
+				{
+					filename = g_build_filename(fcover->dir, fcover->filename, NULL);
+					if (! gdk_pixbuf_save (pixbuf, filename, "jpeg", &error, NULL))
+					{
+						/* Save failed for some reason */
+						if (error->message)
+							fcover->err_msg = g_strdup (error->message);
+						else
+							fcover->err_msg = "Saving image to file failed. No internal error message was returned.";
+						
+						g_error_free (error);
+					}
+					else
+					{
+						/* Image successfully saved */
+						image_status = TRUE;
+					}
+				}
+				/* record any errors and free the fetchcover */
+				if (fcover->err_msg != NULL)
+					image_error = g_strdup(fcover->err_msg);
+				
+				free_fetchcover (fcover);
+				gdk_pixbuf_unref (pixbuf);
+				coverart_block_change (FALSE);
+			}
+			else
+			{
+				/* despite the data being of type image/jpeg, the pixbuf is NULL */
+				image_error = "jpeg data flavour was used but the data did not contain a GdkPixbuf object";
+			}
+			break;
+		case DND_TEXT_PLAIN:
+#if DEBUG
+			printf ("Defaulting to using DND_TEXT_PLAIN\n");
+#endif
+			
+#ifdef HAVE_CURL
+			/* initialise the url string with the data from the dnd */
+			url = g_strdup ((gchar *) data->data);
+			/* Initialise a fetchcover object */
+			fcover = fetchcover_new (url, tracks);
+			coverart_block_change (TRUE);
+		
+			if (fetchcover_net_retrieve_image (fcover))
+			{
+			#if DEBUG
+				printf ("Successfully retrieved\n");
+				printf ("Url of fetch cover: %s\n", fcover->url->str);
+				printf ("filename of fetch cover: %s\n", fcover->filename);
+			#endif
+			
+				filename = g_build_filename(fcover->dir, fcover->filename, NULL);
+				image_status = TRUE;
+			}
+				
+			/* record any errors and free the fetchcover */
+			if (fcover->err_msg != NULL)
+				image_error = g_strdup(fcover->err_msg);
+								
+			free_fetchcover (fcover);
+			coverart_block_change (FALSE);			
+#else
+			image_error = g_strdup ("Item had to be downloaded but gtkpod was not compiled with curl.");
+			image_status = FALSE;
+#endif
+	}
+	
+	if (!image_status || filename == NULL)
+	{
+		gtkpod_warning (_("Error occurred dropping an image onto the coverart display: %s\n"), image_error);
+		
+		if (image_error)
+			g_free (image_error);
+		if (filename)
+			g_free (filename);
+		
+		gtk_drag_finish (dc, FALSE, FALSE, time);
+		return;
+	}
+	
+	while (tracks)
+	{
+		track = tracks->data;
+					
+		if (gp_track_set_thumbnails (track, filename))
+			data_changed (track->itdb);
+			 				
+		tracks = tracks->next;
+	}
+	/* Nullify so that the album art is picked up from the tracks again */
+	cover->album->albumart = NULL;
+			    
+	set_covers (FALSE);
+
+	if (image_error)
+		g_free (image_error);
+	
+	g_free (filename);
+	
+	gtkpod_statusbar_message (_("Successfully set new coverart for selected tracks"));
+	gtk_drag_finish (dc, FALSE, FALSE, time);
+	return;
+}
+	
+	

Added: trunk/src/display_coverart.h
===================================================================
--- trunk/src/display_coverart.h	                        (rev 0)
+++ trunk/src/display_coverart.h	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,95 @@
+/*
+|  Copyright (C) 2007 P.G. Richardson <phantom_sf at users.sourceforge.net>
+|  Part of the gtkpod project.
+|
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  Gtkpod 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.
+|
+|  Gtkpod 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 gtkpod; if not, write to the Free Software
+|  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: display_coverart.h 1731 2007-10-21 15:07:42Z phantom_sf $
+*/
+
+#ifndef __DISPLAY_COVERART_H__
+#define __DISPLAY_COVERART_H__
+
+#include <gtk/gtk.h>
+#include <libgnomecanvas/libgnomecanvas.h>
+
+#define IMG_MAIN 4
+#define IMG_NEXT 1
+#define IMG_PREV 2
+#define IMG_TOTAL 9
+#define BORDER 10
+#define DEFAULT_IMG_SIZE 140
+
+#define COVERART_REMOVE_SIGNAL 1
+#define COVERART_CREATE_SIGNAL 2
+#define COVERART_CHANGE_SIGNAL 3
+
+typedef struct {
+	GList *tracks;
+	gchar *albumname;
+	gchar *artist;
+	GdkPixbuf *albumart;
+} Album_Item;
+
+typedef struct {
+	Album_Item *album;
+	gdouble img_x;
+	gdouble img_y;
+	gdouble img_width;
+	gdouble img_height;
+	GnomeCanvasItem *cdcvrgrp;
+	GnomeCanvasItem *cdimage;
+	GnomeCanvasItem *cdreflection;
+	GnomeCanvasItem *highlight;
+} Cover_Item;
+
+typedef struct {
+	GtkWidget *contentpanel;
+	GtkWidget *canvasbox;
+	GtkWidget *controlbox;
+	GnomeCanvas *canvas;
+	GnomeCanvasItem *bground;
+	GnomeCanvasText *cvrtext;
+	GtkButton *leftbutton;
+	GtkHScale *cdslider;
+	GtkButton *rightbutton;
+	GPtrArray *cdcovers;
+	gint first_imgindex;
+	gboolean block_display_change;
+} CD_Widget;
+
+extern const gchar *DISPLAY_COVER_SHOW;
+
+void coverart_display_big_artwork ();
+GList *coverart_get_displayed_tracks (void);
+GdkPixbuf *coverart_get_default_track_thumb (gint default_img_size);
+void coverart_init (gchar *progpath);
+void force_update_covers ();
+void coverart_select_cover (Itdb_Track *track);
+void coverart_set_images (gboolean clear_track_list);
+void coverart_track_changed (Track *track, gint signal);
+void coverart_clear_images ();
+void coverart_block_change (gboolean val);
+void coverart_init_display ();
+GdkPixbuf *coverart_get_track_thumb (Track *track, Itdb_Device *device, gint default_img_size);
+void coverart_set_cover_from_file ();
+#endif

Added: trunk/src/display_itdb.c
===================================================================
--- trunk/src/display_itdb.c	                        (rev 0)
+++ trunk/src/display_itdb.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,1173 @@
+/*
+|  Copyright (C) 2002-2007 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: display_itdb.c 1723 2007-10-08 03:45:55Z tiffman $
+*/
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <math.h>
+#include <string.h>
+
+#include "charset.h"
+#include "details.h"
+#include "display_itdb.h"
+#include "display.h"
+#include "sha1.h"
+#include "file.h"
+#include "file_convert.h"
+#include "misc.h"
+#include "misc_track.h"
+#include "info.h"
+#include "prefs.h"
+#include "syncdir.h"
+
+
+/* A struct containing a list with available iTunesDBs. A pointer to
+   this struct is stored in gtkpod_window as itdbs_head */
+static struct itdbs_head *itdbs_head = NULL;
+
+/* for convenience */
+struct itdbs_head *gp_get_itdbs_head (GtkWidget *gtkpod_win)
+{
+    g_return_val_if_fail (gtkpod_win, NULL);
+    return g_object_get_data (G_OBJECT (gtkpod_win),
+			      "itdbs_head");
+}
+
+void gp_itdb_extra_destroy (ExtraiTunesDBData *eitdb)
+{
+    if (eitdb)
+    {
+	sha1_free_eitdb (eitdb);
+	gp_itdb_pc_path_hash_destroy (eitdb);
+	g_free (eitdb);
+    }
+}
+
+ExtraiTunesDBData *gp_itdb_extra_duplicate (ExtraiTunesDBData *eitdb)
+{
+    ExtraiTunesDBData *eitdb_dup = NULL;
+    if (eitdb)
+    {
+	/* FIXME: not yet implemented */
+	g_return_val_if_reached (NULL);
+    }
+    return eitdb_dup;
+}
+
+void gp_playlist_extra_destroy (ExtraPlaylistData *epl)
+{
+    if (epl)
+    {
+	g_free (epl);
+    }
+}
+
+ExtraPlaylistData *gp_playlist_extra_duplicate (ExtraPlaylistData *epl)
+{
+    ExtraPlaylistData *epl_dup = NULL;
+
+    if (epl)
+    {
+	epl_dup = g_new (ExtraPlaylistData, 1);
+	memcpy (epl_dup, epl, sizeof (ExtraPlaylistData));
+    }
+    return epl_dup;
+}
+
+void gp_track_extra_destroy (ExtraTrackData *etrack)
+{
+    if (etrack)
+    {
+	g_free (etrack->year_str);
+	g_free (etrack->pc_path_utf8);
+	g_free (etrack->hostname);
+	g_free (etrack->sha1_hash);
+	g_free (etrack->charset);
+	g_free (etrack);
+    }
+}
+
+ExtraTrackData *gp_track_extra_duplicate (ExtraTrackData *etr)
+{
+    ExtraTrackData *etr_dup = NULL;
+
+    if (etr)
+    {
+	etr_dup = g_new (ExtraTrackData, 1);
+	memcpy (etr_dup, etr, sizeof (ExtraTrackData));
+	/* copy strings */
+	etr_dup->year_str = g_strdup (etr->year_str);
+	etr_dup->pc_path_locale = g_strdup (etr->pc_path_locale);
+	etr_dup->pc_path_utf8 = g_strdup (etr->pc_path_utf8);
+	etr_dup->converted_file = g_strdup (etr->converted_file);
+	etr_dup->thumb_path_locale = g_strdup (etr->thumb_path_locale);
+	etr_dup->thumb_path_utf8 = g_strdup (etr->thumb_path_utf8);
+	etr_dup->hostname = g_strdup (etr->hostname);
+	etr_dup->sha1_hash = g_strdup (etr->sha1_hash);
+	etr_dup->charset = g_strdup (etr->charset);
+	/* clear the pc_path_hashed flag */
+	etr_dup->pc_path_hashed = FALSE;
+    }
+    return etr_dup;
+}
+
+
+/* Create a new itdb struct including ExtraiTunesDBData */
+iTunesDB *gp_itdb_new (void)
+{
+    iTunesDB *itdb = itdb_new ();
+    gp_itdb_add_extra (itdb);
+    return itdb;
+}
+
+
+/* Free itdb and take care of dependencies */
+void gp_itdb_free (iTunesDB *itdb)
+{
+    if (space_get_ipod_itdb () == itdb)
+    {
+	space_set_ipod_itdb (NULL);
+    }
+
+    /* cancel all pending conversions */
+    file_convert_cancel_itdb (itdb);
+
+    itdb_free (itdb);
+}
+
+
+    /* Add and initialize ExtraiTunesDBData if missing */
+void gp_itdb_add_extra (iTunesDB *itdb)
+{
+    g_return_if_fail (itdb);
+
+    if (!itdb->userdata)
+    {
+	ExtraiTunesDBData *eitdb = g_new0 (ExtraiTunesDBData, 1);
+	itdb->userdata = eitdb;
+	itdb->userdata_destroy =
+	    (ItdbUserDataDestroyFunc)gp_itdb_extra_destroy;
+	itdb->userdata_duplicate =
+	    (ItdbUserDataDuplicateFunc)gp_itdb_extra_duplicate;
+	eitdb->data_changed = FALSE;
+	eitdb->itdb_imported = FALSE;
+	gp_itdb_pc_path_hash_init (eitdb);
+    }
+}
+
+
+/* Validate a complete @itdb (including tracks and playlists),
+ * i.e. add the Extra*Data */
+void gp_itdb_add_extra_full (iTunesDB *itdb)
+{
+    GList *gl;
+
+    g_return_if_fail (itdb);
+
+    /* Add and initialize ExtraiTunesDBData if missing */
+    gp_itdb_add_extra (itdb);
+
+    /* validate tracks */
+    for (gl=itdb->tracks; gl; gl=gl->next)
+    {
+	Track *track = gl->data;
+	g_return_if_fail (track);
+	gp_track_add_extra (track);
+    }
+
+    /* validate playlists */
+    for (gl=itdb->playlists; gl; gl=gl->next)
+    {
+	Playlist *pl = gl->data;
+	g_return_if_fail (pl);
+	gp_playlist_add_extra (pl);
+    }
+}
+
+Playlist *gp_playlist_new (const gchar *title, gboolean spl)
+{
+    Playlist *pl = itdb_playlist_new (title, spl);
+    pl->userdata = g_new0 (ExtraPlaylistData, 1);
+    pl->userdata_destroy =
+	(ItdbUserDataDestroyFunc)gp_playlist_extra_destroy;
+    pl->userdata_duplicate =
+	(ItdbUserDataDuplicateFunc)gp_playlist_extra_duplicate;
+    return pl;
+}
+
+/* Add and initialize the ExtraPlaylistData if missing */
+void gp_playlist_add_extra (Playlist *pl)
+{
+    g_return_if_fail (pl);
+
+    if (!pl->userdata)
+    {
+	ExtraPlaylistData *epl = g_new0 (ExtraPlaylistData, 1);
+	pl->userdata = epl;
+	pl->userdata_destroy =
+	    (ItdbUserDataDestroyFunc)gp_playlist_extra_destroy;
+	pl->userdata_duplicate =
+	    (ItdbUserDataDuplicateFunc)gp_playlist_extra_duplicate;
+    }
+}
+
+Track *gp_track_new (void)
+{
+    Track *track = itdb_track_new ();
+    /* Add ExtraTrackData */
+    gp_track_add_extra (track);
+    gp_track_set_flags_default (track);
+    return track;
+}
+
+/* Add and initialize the ExtraTrackData if missing */
+void gp_track_add_extra (Track *track)
+{
+    g_return_if_fail (track);
+
+    if (!track->userdata);
+    {
+	ExtraTrackData *etr = g_new0 (ExtraTrackData, 1);
+	track->userdata = etr;
+	track->userdata_destroy =
+	    (ItdbUserDataDestroyFunc)gp_track_extra_destroy;
+	track->userdata_duplicate =
+	    (ItdbUserDataDuplicateFunc)gp_track_extra_duplicate;
+    }
+}
+
+
+/* Append track to the track list of @itdb */
+/* Note: the track will also have to be added to the playlists */
+/* Returns: pointer to the added track -- may be different in the case
+   of duplicates. In that case a pointer to the already existing track
+   is returned. */
+Track *gp_track_add (iTunesDB *itdb, Track *track)
+{
+    Track *result=NULL;
+    Track *oldtrack = sha1_track_exists_insert (itdb, track);
+
+    if(oldtrack)
+    {
+	gp_duplicate_remove (oldtrack, track);
+	itdb_track_free (track);
+	result = oldtrack;
+    }
+    else
+    {
+	/* Make sure all strings are initialised -- that way we don't
+	   have to worry about it when we are handling the strings */
+	/* exception: sha1_hash, hostname, charset: these may be NULL. */
+	gp_track_validate_entries (track);
+	itdb_track_add (itdb, track, -1);
+	/* add to filename hash */
+	gp_itdb_pc_path_hash_add_track (track);
+	/* add to background conversion if necessary */
+	file_convert_add_track (track);
+	result = track;
+	data_changed (itdb);
+    }
+    return result;
+}
+
+
+/* Remove track and notify all windows of the change
+   NOTE: you need to notify the main display via pm_remove_track()
+   before when you make sure @track is no longer referenced in any
+   playlist -- see gp_playlist_remove_track for details */
+void gp_track_remove (Track *track)
+{
+    /* call gp_track_unlink() and itdb_track_free() instead of
+       itdb_track_remove() so we don't have to maintain two remove
+       functions separately. If something needs to be done before
+       removing the track do it in gp_track_unlink */
+    gp_track_unlink (track);
+    itdb_track_free (track);
+}
+
+
+/* Unlink track and notify all windows of the change
+   NOTE: you need to notify the main display via pm_remove_track()
+   before when you make sure @track is no longer referenced in any
+   playlist -- see gp_playlist_remove_track for details */
+void gp_track_unlink (Track *track)
+{
+    /* the details window may be accessing the tracks */
+    details_remove_track (track);
+    /* cancel pending conversions */
+    file_convert_cancel_track (track);
+    /* remove from SHA1 hash */
+    sha1_track_remove (track);
+    /* remove from pc_path_hash */
+    gp_itdb_pc_path_hash_remove_track (track);
+    /* remove from database */
+    itdb_track_unlink (track);
+}
+
+
+/* Set a thumbnail and update ExtraTrackData (e.g. filename) */
+static gboolean gp_track_set_thumbnails_internal (Track *track,
+						  const gchar *filename,
+						  const guchar *image_data,
+						  gsize image_data_len)
+{
+    gboolean result = FALSE;
+    ExtraTrackData *etr;
+
+    g_return_val_if_fail (track, FALSE);
+
+    etr = track->userdata;
+    g_return_val_if_fail (etr, FALSE);
+
+    if (filename)
+    {
+	result = itdb_track_set_thumbnails (track, filename);
+    }
+    else if (image_data)
+    {
+	result = itdb_track_set_thumbnails_from_data (track,
+						      image_data,
+						      image_data_len);
+    }
+
+    g_free (etr->thumb_path_locale);
+    g_free (etr->thumb_path_utf8);
+
+    if (filename && (result == TRUE))
+    {
+	etr->thumb_path_locale = g_strdup (filename);
+	etr->thumb_path_utf8 = charset_to_utf8 (filename);
+    }
+    else
+    {
+	etr->thumb_path_locale = g_strdup ("");
+	etr->thumb_path_utf8 = g_strdup ("");
+    }
+
+    if (result == FALSE)
+    {
+	if (filename)
+	    gtkpod_warning (_("Failed to set cover art: '%s'\n"), filename);
+    }
+
+    return result;
+}
+
+/* Set a thumbnail and update data in ExtraTrackData */
+gboolean gp_track_set_thumbnails_from_data (Track *track,
+					    const guchar *image_data,
+					    gsize image_data_len)
+{
+    g_return_val_if_fail (track, FALSE);
+    g_return_val_if_fail (image_data, FALSE);
+
+    return gp_track_set_thumbnails_internal (track, NULL,
+					     image_data, image_data_len);
+}
+
+
+/* Set a thumbnail and store the filename in ExtraTrackData */
+gboolean gp_track_set_thumbnails (Track *track, const gchar *filename)
+{
+    g_return_val_if_fail (track, FALSE);
+    g_return_val_if_fail (filename, FALSE);
+
+    return gp_track_set_thumbnails_internal (track, filename,
+					     NULL, 0);
+}
+
+
+/* Remove a thumbnail and remove the filename in ExtraTrackData */
+/* Return value:
+   FALSE: track did not have any thumbnails, so no change was done
+   TRUE: track did have thumbnails which were removed */
+gboolean gp_track_remove_thumbnails (Track *track)
+{
+    gboolean changed=FALSE;
+
+    ExtraTrackData *etr;
+    g_return_val_if_fail (track, FALSE);
+    etr = track->userdata;
+    g_return_val_if_fail (etr, FALSE);
+
+    if (track->artwork->thumbnails)
+	changed = TRUE;
+
+    itdb_track_remove_thumbnails (track);
+    g_free (etr->thumb_path_locale);
+    g_free (etr->thumb_path_utf8);
+    etr->thumb_path_locale = g_strdup ("");
+    etr->thumb_path_utf8 = g_strdup ("");
+
+    return changed;
+}
+
+/* add itdb to itdbs (and add to display) */
+void gp_itdb_add (iTunesDB *itdb, gint pos)
+{
+    ExtraiTunesDBData *eitdb;
+
+    g_return_if_fail (itdbs_head);
+    g_return_if_fail (itdb);
+    eitdb = itdb->userdata;
+    g_return_if_fail (eitdb);
+
+    eitdb->itdbs_head = itdbs_head;
+    itdbs_head->itdbs = g_list_insert (itdbs_head->itdbs, itdb, pos);
+    pm_add_itdb (itdb, pos);
+}
+
+/* Remove itdb to itdbs (and remove from display). Call
+ * itdb_free() to free the memory of the itdb. */
+void gp_itdb_remove (iTunesDB *itdb)
+{
+    g_return_if_fail (itdbs_head);
+    g_return_if_fail (itdb);
+
+    pm_remove_playlist (itdb_playlist_mpl (itdb), FALSE);
+    itdbs_head->itdbs = g_list_remove (itdbs_head->itdbs, itdb);
+}
+
+/* Also replaces @old_itdb in the itdbs GList and take care that the
+ * displayed itdb gets replaced as well */
+void gp_replace_itdb (iTunesDB *old_itdb, iTunesDB *new_itdb)
+{
+    ExtraiTunesDBData *new_eitdb;
+    Playlist *old_pl, *mpl;
+    GList *old_link;
+    gchar *old_pl_name = NULL;
+    gint pos = -1; /* default: add to the end */
+
+    g_return_if_fail (old_itdb);
+    g_return_if_fail (new_itdb);
+    g_return_if_fail (itdbs_head);
+
+    new_eitdb = new_itdb->userdata;
+    g_return_if_fail (new_eitdb);
+
+    old_link = g_list_find (itdbs_head->itdbs, old_itdb);
+    g_return_if_fail (old_link);
+
+    /* remember old selection */
+    old_pl = pm_get_selected_playlist ();
+    if (old_pl)
+    {   /* remember name of formerly selected playlist if it's in the
+	   same itdb */
+	if (old_pl->itdb == old_itdb)
+	    old_pl_name = g_strdup (old_pl->name);
+    }
+
+    /* get position of @old_itdb */
+    pos = pm_get_position_for_itdb (old_itdb);
+
+    /* remove @old_itdb (all playlists are removed if the MPL is
+       removed and add @new_itdb at its place */
+    pm_remove_playlist (itdb_playlist_mpl (old_itdb), FALSE);
+
+    /* replace old_itdb with new_itdb */
+    new_eitdb->itdbs_head = itdbs_head;
+    old_link->data = new_itdb;
+    /* free old_itdb */
+    gp_itdb_free (old_itdb);
+
+    /* display replacement */
+    pm_add_itdb (new_itdb, pos);
+
+    /* reselect old playlist if still available */
+    if (old_pl_name)
+    {
+	Playlist *pl = itdb_playlist_by_name (new_itdb, old_pl_name);
+	if (pl) pm_select_playlist (pl);
+    }
+
+    /* Set prefs system with name of MPL */
+    mpl = itdb_playlist_mpl (new_itdb);
+    set_itdb_prefs_string (new_itdb, "name", mpl->name);
+}    
+
+
+/* add playlist to itdb and to display */
+void gp_playlist_add (iTunesDB *itdb, Playlist *pl, gint32 pos)
+{
+    g_return_if_fail (itdb);
+    g_return_if_fail (pl);
+
+    itdb_playlist_add (itdb, pl, pos);
+    pm_add_playlist (pl, pos);
+    data_changed (itdb);
+}
+
+/* create new playlist with title @name and add to @itdb and to
+ * display at position @pos */
+Playlist *gp_playlist_add_new (iTunesDB *itdb, gchar *name,
+			       gboolean spl, gint32 pos)
+{
+    Playlist *pl;
+
+    g_return_val_if_fail (itdb, NULL);
+    g_return_val_if_fail (name, NULL);
+
+    pl = gp_playlist_new (name, spl);
+    itdb_playlist_add (itdb, pl, pos);
+    pm_add_playlist (pl, pos);
+    data_changed (itdb);
+    return pl;
+}
+
+/** If playlist @pl_name doesn't exist, then it will be created
+ * and added to the tail of playlists, otherwise pointer to an existing
+ * playlist will be returned
+ */
+Playlist *gp_playlist_by_name_or_add (iTunesDB *itdb, gchar *pl_name,
+				      gboolean spl)
+{
+    Playlist *pl = NULL;
+
+    g_return_val_if_fail (itdb, pl);
+    g_return_val_if_fail (pl_name, pl);
+    pl = itdb_playlist_by_name (itdb, pl_name);
+    if (pl)
+    {   /* check if it's the same type (spl or normal) */
+	if (pl->is_spl == spl) return pl;
+    }
+    /* Create a new playlist */
+    pl = gp_playlist_add_new (itdb, pl_name, spl, -1);
+    return pl;
+}
+
+
+/* Remove a playlist from the itdb and from the display */
+void gp_playlist_remove (Playlist *pl)
+{
+    g_return_if_fail (pl);
+    g_return_if_fail (pl->itdb);
+    pm_remove_playlist (pl, TRUE);
+    data_changed (pl->itdb);
+    itdb_playlist_remove (pl);
+}
+
+
+
+/* FIXME: this is a bit dangerous. . . we delete all
+ * playlists with titles @pl_name and return how many
+ * pl have been removed.
+ ***/
+guint gp_playlist_remove_by_name (iTunesDB *itdb, gchar *pl_name)
+{
+    guint i;
+    guint pl_removed=0;
+
+    g_return_val_if_fail (itdb, pl_removed);
+
+    for(i=1; i < itdb_playlists_number(itdb); i++)
+    {
+	Playlist *pl = itdb_playlist_by_nr (itdb, i);
+	g_return_val_if_fail (pl, pl_removed);
+	g_return_val_if_fail (pl->name, pl_removed);
+        if(strcmp (pl->name, pl_name) == 0)
+        {
+            gp_playlist_remove (pl);
+	    /* we just deleted the ith element of playlists, so
+	     * we must examine the new ith element. */
+            pl_removed++;
+            i--;
+        }
+    }
+    return pl_removed;
+}
+
+
+/* This function removes the track "track" from the
+   playlist "plitem" and also adjusts the display.
+   No action is taken if "track" is not in the playlist.
+   If "plitem" == NULL, remove from master playlist.
+   If the track is removed from the MPL, it's also removed
+   from memory completely (i.e. from the tracklist and sha1 hash).
+   Depending on @deleteaction, the track is either marked for deletion
+   on the ipod/hard disk or just removed from the database
+ */
+void gp_playlist_remove_track (Playlist *plitem, Track *track,
+			       DeleteAction deleteaction)
+{
+    iTunesDB *itdb;
+    Playlist *mpl;
+    gboolean remove_track = FALSE;
+
+    g_return_if_fail (track);
+    itdb = track->itdb;
+    g_return_if_fail (itdb);
+
+    switch (deleteaction)
+    {
+    case DELETE_ACTION_IPOD:
+    case DELETE_ACTION_LOCAL:
+    case DELETE_ACTION_DATABASE:
+	/* remove from MPL in these cases */
+	plitem = NULL;
+	break;
+    case DELETE_ACTION_PLAYLIST:
+	/* cannot remove from MPL */
+	g_return_if_fail (plitem);
+	break;
+    }
+
+    mpl = itdb_playlist_mpl (track->itdb);
+
+    if (plitem == NULL)
+	plitem = mpl;
+    
+    g_return_if_fail (plitem);
+
+    /* remove track from display */
+    pm_remove_track (plitem, track);
+
+    /* remove track from playlist */
+    itdb_playlist_remove_track (plitem, track);
+
+#if 0
+    /* podcasts are no longer treated differently from other playlists */
+    /* if we removed a podcasts, remove it from memory as well, unless
+       it's present in the MPL (this happens if this podcast was on
+       the iPod as podcast as well as standard track) */
+    if (itdb_playlist_is_podcasts (plitem))
+    {
+	/* just for safety: remove possible duplicates of @track in
+	   the podcast playlist before removing it from memory */
+	while (g_list_find (plitem->members, track))
+	{
+	    pm_remove_track (plitem, track);
+	    itdb_playlist_remove_track (plitem, track);
+	}
+	if (!itdb_playlist_contains_track (mpl, track))
+	{
+	    remove_track = TRUE;
+	}
+	else
+	{   /* strip the podcast flags */
+	    gp_track_set_flags_default (track);
+	}
+    }
+#endif
+
+    if (itdb_playlist_is_mpl (plitem))
+    { /* if it's the MPL, we remove the track permanently */
+	GList *gl = g_list_nth (itdb->playlists, 1);
+	ExtraiTunesDBData *eitdb = itdb->userdata;
+	g_return_if_fail (eitdb);
+
+	while (gl)
+	{  /* first we remove the track from all other playlists (i=1) */
+	    Playlist *pl = gl->data;
+	    g_return_if_fail (pl);
+	    while (g_list_find (pl->members, track))
+	    {
+		pm_remove_track (pl, track);
+		itdb_playlist_remove_track (pl, track);
+	    }
+	    gl=gl->next;
+	}
+	remove_track = TRUE;
+    }
+
+    if (remove_track)
+    {
+	if (itdb->usertype & GP_ITDB_TYPE_IPOD)
+	{
+	    switch (deleteaction)
+	    {
+	    case DELETE_ACTION_DATABASE:
+		/* ATTENTION: this might create a dangling file on the
+		   iPod! */
+		gp_track_remove (track);
+		break;
+	    case DELETE_ACTION_IPOD:
+		if (track->transferred)
+		{
+		    gp_track_unlink (track);
+		    mark_track_for_deletion (itdb, track);
+		}
+		else
+		{
+		    gp_track_remove (track);
+		}
+		break;
+	    case DELETE_ACTION_PLAYLIST:
+	    case DELETE_ACTION_LOCAL:
+		break;
+		/* not allowed -- programming error */
+		g_return_if_reached ();
+		break;
+	    }
+	}
+	if (itdb->usertype & GP_ITDB_TYPE_LOCAL)
+	{
+	    switch (deleteaction)
+	    {
+	    case DELETE_ACTION_LOCAL:
+		gp_track_unlink (track);
+		mark_track_for_deletion (itdb, track);
+		break;
+	    case DELETE_ACTION_DATABASE:
+		gp_track_remove (track);
+		break;
+	    case DELETE_ACTION_PLAYLIST:
+	    case DELETE_ACTION_IPOD:
+		/* not allowed -- programming error */
+		g_return_if_reached ();
+		break;
+	    }
+	}
+    }
+
+    data_changed (itdb);
+}
+
+/* This function appends the track "track" to the
+   playlist @pl. It then lets the display model know.
+   @display: if TRUE, track is added the display.  Otherwise it's only
+   added to memory */
+/* All tracks added to the podcast playlist will get the mark_unplayed
+   flag get set */
+void gp_playlist_add_track (Playlist *pl, Track *track, gboolean display)
+{
+    iTunesDB *itdb;
+
+    g_return_if_fail (track);
+    g_return_if_fail (pl);
+    itdb = pl->itdb;
+    g_return_if_fail (itdb);
+
+    itdb_playlist_add_track (pl, track, -1);
+    if (itdb_playlist_is_podcasts (pl))
+    {   /* have the iPod display a bullet in front of the track as it
+	   has been newly added */
+	track->mark_unplayed = 0x02;
+    }
+    if (display)  pm_add_track (pl, track, TRUE);
+
+    data_changed (itdb);
+}
+
+
+/* Make sure all strings are initialised -- that way we don't
+   have to worry about it when we are handling the strings.
+   exception: sha1_hash, hostname and charset: these may be NULL. */
+void gp_track_validate_entries (Track *track)
+{
+    ExtraTrackData *etr;
+
+    g_return_if_fail (track);
+    etr = track->userdata;
+    g_return_if_fail (etr);
+
+    if (!track->title)           track->title = g_strdup ("");
+    if (!track->artist)          track->artist = g_strdup ("");
+    if (!track->album)           track->album = g_strdup ("");
+    if (!track->genre)           track->genre = g_strdup ("");
+    if (!track->composer)        track->composer = g_strdup ("");
+    if (!track->comment)         track->comment = g_strdup ("");
+    if (!track->filetype)        track->filetype = g_strdup ("");
+    if (!track->grouping)        track->grouping = g_strdup ("");
+    if (!track->category)        track->category = g_strdup ("");
+    if (!track->description)     track->description = g_strdup ("");
+    if (!track->podcasturl)      track->podcasturl = g_strdup ("");
+    if (!track->podcastrss)      track->podcastrss = g_strdup ("");
+    if (!track->subtitle)        track->subtitle = g_strdup ("");
+    if (!track->ipod_path)       track->ipod_path = g_strdup ("");
+    if (!track->tvshow)          track->tvshow = g_strdup("");
+    if (!track->tvepisode)       track->tvepisode = g_strdup("");
+    if (!track->tvnetwork)       track->tvnetwork = g_strdup("");
+    if (!track->albumartist)     track->albumartist = g_strdup ("");
+    if (!track->sort_artist)     track->sort_artist = g_strdup ("");
+    if (!track->sort_title)      track->sort_title = g_strdup ("");
+    if (!track->sort_album)      track->sort_album = g_strdup ("");
+    if (!track->sort_albumartist)track->sort_albumartist = g_strdup ("");
+    if (!track->sort_composer)   track->sort_composer = g_strdup ("");
+    if (!track->sort_tvshow)     track->sort_tvshow = g_strdup ("");
+    if (!etr->pc_path_utf8)      etr->pc_path_utf8 = g_strdup ("");
+    if (!etr->pc_path_locale)    etr->pc_path_locale = g_strdup ("");
+    if (!etr->thumb_path_utf8)   etr->thumb_path_utf8 = g_strdup ("");
+    if (!etr->thumb_path_locale) etr->thumb_path_locale = g_strdup ("");
+    /* Make sure year_str is identical to year */
+    g_free (etr->year_str);
+    etr->year_str = g_strdup_printf ("%d", track->year);
+}
+
+
+
+/* Initialize the itdb data
+ *
+ * If itdb_n_type/filename/mountpoint... exist in the prefs, that data
+ * is being used and local databases are read in directly if they
+ * exist. Otherwise a simple two-itdb list is constructed consisting
+ * of one local database and one ipod database.
+ *
+ */
+void init_data (GtkWidget *window)
+{
+    gchar *cfgdir;
+    gint i;
+
+    g_return_if_fail (window);
+    g_return_if_fail (itdbs_head == NULL);
+
+    cfgdir = prefs_get_cfgdir ();
+
+    itdbs_head = g_new0 (struct itdbs_head, 1);
+
+    g_object_set_data (G_OBJECT (window), "itdbs_head", itdbs_head);
+
+    if (!prefs_get_int_value ("itdb_0_type", NULL))
+    {
+	/* databases have not been set up previously -- take care of
+	   this */
+#ifndef HAVE_GNOME_VFS
+	gchar *mountpoint;
+#endif
+	gchar *filename;
+
+	/* Local database */
+	filename = g_build_filename (cfgdir, "local_0.itdb", NULL);
+	prefs_set_int ("itdb_0_type", GP_ITDB_TYPE_LOCAL);
+	prefs_set_string ("itdb_0_name", _("Local"));
+	prefs_set_string ("itdb_0_filename", filename);
+	g_free (filename);
+
+	/* Podcasts database */
+	filename = g_build_filename (cfgdir, "podcasts.itdb", NULL);
+	prefs_set_int ("itdb_1_type",
+		       GP_ITDB_TYPE_PODCASTS|GP_ITDB_TYPE_LOCAL);
+	prefs_set_string ("itdb_1_name", _("Podcasts"));
+	prefs_set_string ("itdb_1_filename", filename);
+	g_free (filename);
+
+#ifndef HAVE_GNOME_VFS
+	/* iPod database -- only set up if autodetection is not active */
+	mountpoint = prefs_get_string ("initial_mountpoint");
+	filename = g_build_filename (cfgdir, "iTunesDB", NULL);
+	prefs_set_int ("itdb_2_type", GP_ITDB_TYPE_IPOD);
+	prefs_set_string ("itdb_2_name", _("iPod"));
+	prefs_set_string ("itdb_2_filename", filename);
+	prefs_set_string ("itdb_2_mountpoint", mountpoint);
+	g_free (mountpoint);
+	g_free (filename);
+#endif
+    }
+
+
+    for (i=0;;++i)
+    {
+	ExtraiTunesDBData *eitdb;
+	iTunesDB *itdb = setup_itdb_n (i);
+
+	if (itdb == NULL)
+	    break;
+
+	/* add to the display */
+	gp_itdb_add (itdb, -1);
+
+	/* update/sync playlists according to options set */
+	eitdb = itdb->userdata;
+	g_return_if_fail (eitdb);
+	if (eitdb->itdb_imported)
+	{
+	    /* take care of autosync... */
+	    sync_all_playlists (itdb);
+
+	    /* update all live SPLs */
+	    itdb_spl_update_live (itdb);
+	}
+    }
+
+    g_free (cfgdir);
+}
+
+
+
+/* Create an repository according to the settings in the preferences
+   system. */
+iTunesDB *setup_itdb_n (gint i)
+{
+    iTunesDB *itdb = NULL;
+    gchar *property = get_itdb_prefs_key (i, "type");
+    gint type;
+    gboolean valid = prefs_get_int_value (property, &type);
+    g_free (property);
+    if (valid)
+    {
+	gchar *cfgdir = prefs_get_cfgdir ();
+	Playlist *pl = NULL;
+	ExtraiTunesDBData *eitdb;
+	gchar *filename = NULL;
+	gchar *mountpoint = NULL;
+	gchar *offline_filename = NULL;
+
+	if (type & GP_ITDB_TYPE_LOCAL)
+	{
+	    gchar *fn = get_itdb_prefs_key (i, "filename");
+
+	    filename = prefs_get_string (fn);
+
+	    if (!filename)
+	    {
+		gchar *local = g_strdup_printf ("local%d.itdb",i);
+		filename = g_build_filename (cfgdir, local, NULL);
+		g_free (local);
+	    }
+	    g_free (fn);
+	    if (g_file_test (filename, G_FILE_TEST_EXISTS))
+		itdb = gp_import_itdb (NULL, type,
+				       NULL, NULL, filename);
+	}
+	else if (type & GP_ITDB_TYPE_IPOD)
+	{
+	    gchar *key;
+
+	    key = get_itdb_prefs_key (i, KEY_MOUNTPOINT);
+	    mountpoint = prefs_get_string (key);
+	    g_free (key);
+
+	    key = get_itdb_prefs_key (i, "filename");
+	    offline_filename = prefs_get_string (key);
+	    g_free (key);
+
+	    if (!offline_filename)
+	    {
+		gchar *local = g_strdup_printf ("gtkpod_%d.itdb",i);
+		offline_filename = g_build_filename (
+		    cfgdir, local, NULL);
+		g_free (local);
+	    }
+	}
+	else
+	{
+	    g_return_val_if_reached (NULL);
+	}
+
+	if (!itdb)
+	{
+	    gchar *nm, *name;
+
+	    itdb = gp_itdb_new ();
+	    eitdb = itdb->userdata;
+	    g_return_val_if_fail (eitdb, NULL);
+	    itdb->usertype = type;
+	    itdb->filename = filename;
+	    itdb_set_mountpoint (itdb, mountpoint);
+	    eitdb->offline_filename = offline_filename;
+
+	    nm = g_strdup_printf ("itdb_%d_name", i);
+	    if (!prefs_get_string_value (nm, &name))
+	    {
+		if (type & GP_ITDB_TYPE_PODCASTS)
+		    name = g_strdup (_("Podcasts"));
+		else if (type & GP_ITDB_TYPE_LOCAL)
+		    name = g_strdup (_("Local"));
+		else
+		    name = g_strdup (_("iPod"));
+	    }
+	    pl = gp_playlist_new (name, FALSE);
+	    g_free (name);
+	    g_free (nm);
+	    itdb_playlist_set_mpl (pl);
+	    itdb_playlist_add (itdb, pl, -1);
+
+           if ((type & GP_ITDB_TYPE_PODCASTS) || (type & GP_ITDB_TYPE_LOCAL))
+             {
+               eitdb->data_changed = TRUE;
+               eitdb->itdb_imported = TRUE;
+             }
+           else
+             {
+               eitdb->data_changed = FALSE;
+               eitdb->itdb_imported = FALSE;
+             }
+	}
+	else
+	{
+	    g_free (filename);
+	    g_free (offline_filename);
+	}
+	g_free (mountpoint);
+
+	/* Check if Podcast Playlist is present on IPOD itdb
+	 * and add if not. If Podcast Playlist is present on
+	 * local itdb remove it. */
+	pl = itdb_playlist_podcasts (itdb);
+	if ((type & GP_ITDB_TYPE_IPOD) && !pl)
+	{   /* add podcast playlist */
+	    pl = gp_playlist_new (_("Podcasts"), FALSE);
+	    itdb_playlist_set_podcasts (pl);
+	    itdb_playlist_add (itdb, pl, -1);
+	    eitdb = itdb->userdata;
+	    g_return_val_if_fail (eitdb, NULL);
+	    eitdb->data_changed = FALSE;
+	}
+	if ((type & GP_ITDB_TYPE_LOCAL) && pl)
+	{   /* Remove podcast playlist. Normally no playlist
+	     * should be present, except for a few people who
+	     * used the CVS version between September and
+	     * October 2005. */
+	    if (itdb_playlist_tracks_number (pl) == 0)
+	    {
+		gp_playlist_remove (pl);
+	    }
+	    else
+	    {   /* OK, let's be nice and just drop the
+		   'podcast' flag instead of removing */
+		pl->podcastflag = 0;
+	    }
+	}
+	g_free (cfgdir);
+    }
+    return itdb;
+}
+
+
+/* Increase playcount of filename <file> by <num>. If sha1 is activated,
+   use sha1 to find the track. Otherwise use the filename. If @sha1 is
+   set, this value is used directly to look up the track in the
+   database (instead of calculating it from the file).
+
+   Return value:
+   TRUE: OK (playcount increased in GP_ITDB_TYPE_IPOD)
+   FALSE: file could not be found in the GP_ITDB_TYPE_IPOD */
+gboolean gp_increase_playcount (gchar *sha1, gchar *file, gint num)
+{
+    gboolean result = FALSE;
+    Track *track = NULL;
+    GList *gl;
+
+    g_return_val_if_fail (itdbs_head, FALSE);
+
+    for (gl=itdbs_head->itdbs; gl; gl=gl->next)
+    {
+	iTunesDB *itdb = gl->data;
+	g_return_val_if_fail (itdb, FALSE);
+
+	if (sha1) track = sha1_sha1_exists (itdb, sha1);
+	else     track = sha1_file_exists (itdb, file, TRUE);
+	if (!track)	  track = gp_track_by_filename (itdb, file);
+	if (track)
+	{
+	    gchar *buf1;
+	    track->playcount += num;
+	    data_changed (itdb);
+	    pm_track_changed (track);
+	    buf1 = get_track_info (track, TRUE);
+	    gtkpod_statusbar_message (_("Increased playcount for '%s'"),
+				      buf1);
+	    g_free (buf1);
+	    if (itdb->usertype & GP_ITDB_TYPE_IPOD)    result = TRUE;
+	}
+    }
+    return result;
+}
+
+
+/* get the currently selected itdb. NULL is
+ * returned if no itdb is active. */
+iTunesDB *gp_get_selected_itdb (void)
+{
+    Playlist *pl = pm_get_selected_playlist ();
+
+    /* If playlist is selected, use the itdb of the playlist as the
+       active itdb */
+    if (pl)
+    {
+	g_return_val_if_fail (pl->itdb, NULL);
+	return pl->itdb;
+    }
+
+    return NULL;
+}
+
+
+/* Get the "ipod" itdb. If only one iPod itdb exists, this itdb is
+ * returned. If more than one iPod itdb exists, the currently selected
+ * itdb is returned if it's an iPod itdb, otherwise NULL is returned.
+ */
+iTunesDB *gp_get_ipod_itdb (void)
+{
+    struct itdbs_head *itdbs_head;
+    iTunesDB *itdb;
+    GList *gl;
+    gint i;
+
+    /* if an iPod itdb is selected, return this */
+    itdb = gp_get_selected_itdb ();
+    if (itdb && (itdb->usertype & GP_ITDB_TYPE_IPOD))
+	return itdb;
+
+    itdb = NULL;
+
+    g_return_val_if_fail (gtkpod_window, NULL);
+    itdbs_head = g_object_get_data (G_OBJECT (gtkpod_window),
+				    "itdbs_head");
+
+    if (itdbs_head == NULL) return NULL;
+
+    i=0;
+    for (gl=itdbs_head->itdbs; gl; gl=gl->next)
+    {
+	iTunesDB *itdbgl = gl->data;
+	g_return_val_if_fail (itdbgl, NULL);
+	if (itdbgl->usertype & GP_ITDB_TYPE_IPOD)
+	{
+	    itdb = itdbgl;
+	    ++i;
+	}
+    }
+    /* return iPod itdb if only one was found */
+    if (i == 1)
+	return itdb;
+
+    return NULL;
+}
+
+
+/* return the podcast itdb */
+iTunesDB *gp_get_podcast_itdb ()
+{
+    GList *gl;
+
+    g_return_val_if_fail (itdbs_head, NULL);
+
+    for (gl=itdbs_head->itdbs; gl; gl=gl->next)
+    {
+	iTunesDB *itdb = gl->data;
+	g_return_val_if_fail (itdb, NULL);
+
+	if (itdb->usertype & GP_ITDB_TYPE_PODCASTS)
+	    return itdb;
+    }
+    return NULL;
+}
+
+

Added: trunk/src/display_itdb.h
===================================================================
--- trunk/src/display_itdb.h	                        (rev 0)
+++ trunk/src/display_itdb.h	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,166 @@
+/*
+|  Copyright (C) 2002-2007 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+| 
+|  iTunes and iPod are trademarks of Apple
+| 
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: display_itdb.h 1750 2007-11-01 21:57:01Z phantom_sf $
+*/
+
+#ifndef __DISPLAY_ITDB_H__
+#define __DISPLAY_ITDB_H__
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <gtk/gtk.h>
+#include "itdb.h"
+#include "file_convert.h"
+
+struct itdbs_head
+{
+    GList *itdbs;
+};
+
+typedef struct
+{
+    struct itdbs_head *itdbs_head; /* pointer to the master itdbs_head     */
+    GHashTable *sha1hash;          /* sha1 hash information                */
+    GHashTable *pc_path_hash;      /* hash with local filenames            */
+    GList *pending_deletion;       /* tracks marked for removal from
+				      media                                */
+    gchar *offline_filename;       /* filename for offline database
+				      (only for GP_ITDP_TYPE_IPOD)         */
+    gboolean offline;              /* offline mode?                        */
+    gboolean data_changed;         /* data changed since import?           */
+    gboolean photo_data_changed;	/* photo data changed since import?		*/
+    gboolean itdb_imported;        /* has in iTunesDB been imported?       */
+    gboolean ipod_ejected;         /* if iPod was ejected                  */
+    PhotoDB *photodb;            /* Photo DB reference used if the ipod supports photos */
+} ExtraiTunesDBData;
+
+typedef struct
+{
+    glong size;
+} ExtraPlaylistData;
+
+typedef struct
+{
+  gchar   *year_str;        /* year as string -- always identical to year  */
+  gchar   *pc_path_locale;  /* path on PC (local encoding)                 */
+  gchar   *pc_path_utf8;    /* PC filename in utf8 encoding                */
+  time_t  mtime;            /* modification date of PC file                */
+  gboolean pc_path_hashed;  /* for programming error detection (see
+			       gp_itdb_local_path_hash_add_track()         */
+  gchar   *converted_file;  /* if converted file exists: name in utf8      */
+  gint32  orig_filesize;    /* size of original file (if converted)        */
+  FileConvertStatus conversion_status; /* current status of conversion     */
+  gchar   *thumb_path_locale;/* same for thumbnail                         */
+  gchar   *thumb_path_utf8;  /* same for thumbnail                         */
+  gchar   *hostname;        /* name of host this file has been imported on */
+  gchar   *sha1_hash;       /* sha1 hash of file (or NULL)                 */
+  gchar   *charset;         /* charset used for ID3 tags                   */
+  gint32  sortindex;        /* used for stable sorting (current order)     */
+  gboolean tchanged;        /* temporary use, e.g. in detail.c             */
+  gboolean tartwork_changed;			/* temporary use for artwork, eg. in detail.c          */
+  guint64 local_itdb_id;    /* when using DND from local to iPod:
+			       original itdb                               */
+  guint64 local_track_dbid; /* when using DND from local to iPod:
+			       original track                              */
+} ExtraTrackData;
+
+/* types for iTunesDB */
+typedef enum
+{
+    GP_ITDB_TYPE_LOCAL = 1<<0,    /* local browsing, normal music */
+    GP_ITDB_TYPE_IPOD  = 1<<1,    /* iPod                         */
+    GP_ITDB_TYPE_PODCASTS = 1<<2, /* local browsing, podcasts     */
+    GP_ITDB_TYPE_AUTOMATIC = 1<<3,/* repository was automounted   */
+} GpItdbType;
+
+/* Delete actions */
+typedef enum
+{
+    /* remove from playlist only -- cannot be used on MPL */
+    DELETE_ACTION_PLAYLIST = 0,
+    /* remove from iPod (implicates removing from database) */
+    DELETE_ACTION_IPOD,
+    /* remove from local harddisk (implicates removing from database) */
+    DELETE_ACTION_LOCAL,
+    /* remove from database only */
+    DELETE_ACTION_DATABASE
+} DeleteAction;
+
+struct DeleteData
+{
+    iTunesDB *itdb;
+    Playlist *pl;
+    GList *tracks;
+    DeleteAction deleteaction;
+};
+
+void init_data (GtkWidget *window);
+iTunesDB *setup_itdb_n (gint i);
+
+struct itdbs_head *gp_get_itdbs_head (GtkWidget *gtkpod_win);
+
+iTunesDB *gp_itdb_new (void);
+void gp_itdb_add (iTunesDB *itdb, gint pos);
+void gp_itdb_remove (iTunesDB *itdb);
+void gp_itdb_free (iTunesDB *itdb);
+void gp_replace_itdb (iTunesDB *old_itdb, iTunesDB *new_itdb);
+void gp_itdb_add_extra (iTunesDB *itdb);
+void gp_itdb_add_extra_full (iTunesDB *itdb);
+
+Track *gp_track_new (void);
+#define gp_track_free itdb_track_free
+Track *gp_track_add (iTunesDB *itdb, Track *track);
+void gp_track_remove (Track *track);
+void gp_track_unlink (Track *track);
+void gp_track_add_extra (Track *track);
+void gp_track_validate_entries (Track *track);
+gboolean gp_track_set_thumbnails (Track *track, const gchar *filename);
+gboolean gp_track_set_thumbnails_from_data (Track *track,
+					    const guchar *image_data,
+					    gsize image_data_len);
+gboolean gp_track_remove_thumbnails (Track *track);
+
+Playlist *gp_playlist_new (const gchar *title, gboolean spl);
+void gp_playlist_add (iTunesDB *itdb, Playlist *pl, gint32 pos);
+void gp_playlist_remove (Playlist *pl);
+guint gp_playlist_remove_by_name (iTunesDB *itdb, gchar *pl_name);
+Playlist *gp_playlist_add_new (iTunesDB *itdb, gchar *name,
+			       gboolean spl, gint32 pos);
+Playlist *gp_playlist_by_name_or_add (iTunesDB *itdb, gchar *pl_name,
+				      gboolean spl);
+void gp_playlist_remove_track (Playlist *plitem, Track *track,
+			       DeleteAction deleteaction);
+void gp_playlist_add_track (Playlist *pl, Track *track, gboolean display);
+
+void gp_playlist_add_extra (Playlist *pl);
+
+gboolean gp_increase_playcount (gchar *sha1, gchar *file, gint num);
+iTunesDB *gp_get_selected_itdb (void);
+iTunesDB *gp_get_ipod_itdb (void);
+iTunesDB *gp_get_podcast_itdb (void);
+#endif

Added: trunk/src/display_photo.c
===================================================================
--- trunk/src/display_photo.c	                        (rev 0)
+++ trunk/src/display_photo.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,1704 @@
+/*
+ |Copyright (C) 2007 P.G. Richardson <phantom_sf at users.sourceforge.net>
+ |Part of the gtkpod project.
+ | 
+ |URL: http://www.gtkpod.org/
+ |URL: http://gtkpod.sourceforge.net/
+ |
+ |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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ |
+ |iTunes and iPod are trademarks of Apple
+ |
+ |This product is not supported/written/published by Apple!
+ |
+ */
+
+#include "display_photo.h"
+#include "display_private.h"
+#include "misc.h"
+#include "prefs.h"
+#include "fileselection.h"
+#include "context_menus.h"
+#include <glib/gprintf.h>
+#include <gdk-pixbuf/gdk-pixbuf.h>
+#include <string.h>
+#include "display.h"
+
+
+#define DEBUG 0
+
+#define PHOTO_YES_DONT_DISPLAY_RESPONSE 1
+
+/* Array recording the current pages of the sorttabs so they can be redisplayed
+ * if another playlist is selected.
+ */
+static gint sorttab_pages [SORT_TAB_MAX];
+
+/* ipod database */
+static iTunesDB *ipod_itdb;
+/* Photo Database of selected ipod */
+static PhotoDB *photodb;
+/* Itdb Device for use with getting pixbufs from the database */
+static Itdb_Device *device;
+/* Main viewport containing all of the photo related components */
+static GtkWidget *photo_viewport= NULL;
+/* Window displaying the list of albums */
+static GtkWidget *photo_album_window= NULL;
+/* Window displaying the thumbnails of the photos */
+static GtkWidget *photo_thumb_window= NULL;
+/* pointer to the treeview for the photo album display */
+static GtkTreeView *album_view= NULL;
+/* pointer to the treeview for the photo thumbnail display */
+static GtkIconView *thumbnail_view= NULL;
+/* pointer to the gtkimage that holds the preview image */
+static GtkImage *photo_preview_image= NULL;
+/* Menu Items */
+static GtkMenuItem *photo_add_album_menuItem = NULL;
+static GtkMenuItem *photo_add_image_menuItem = NULL;
+static GtkMenuItem *photo_add_image_dir_menuItem = NULL;
+static GtkMenuItem *photo_remove_album_menuItem = NULL;
+static GtkMenuItem *photo_remove_image_menuItem = NULL;
+static GtkMenuItem *photo_view_full_size_menuItem = NULL;
+static GtkMenuItem *photo_rename_album_menuItem = NULL;
+
+/* Drag n Drop Definitions */
+static GtkTargetEntry photo_drag_types [] = {
+		{ DND_GTKPOD_PHOTOIMAGELIST_TYPE, 0, DND_GTKPOD_PHOTOIMAGELIST },
+		{ "text/plain", 0, DND_TEXT_PLAIN },
+		{ "STRING", 0, DND_TEXT_PLAIN }
+};
+
+static GtkTargetEntry photo_drop_types [] = {
+		{ DND_GTKPOD_PHOTOIMAGELIST_TYPE, 0, DND_GTKPOD_PHOTOIMAGELIST },
+		{ "text/plain", 0, DND_TEXT_PLAIN },
+		{ "STRING", 0, DND_TEXT_PLAIN }
+};
+
+/* Photo types to try and use in displaying thumbnails */
+static gint photo_types[] = {
+				ITDB_THUMB_PHOTO_SMALL,
+		    ITDB_THUMB_PHOTO_LARGE,
+		    ITDB_THUMB_PHOTO_FULL_SCREEN,
+		    ITDB_THUMB_PHOTO_TV_SCREEN
+		    };
+static gint PHOTO_TYPES_SIZE = 4;
+
+/* Declarations */
+static void gphoto_create_albumview();
+static void gphoto_create_thumbnailview();
+static void gphoto_build_thumbnail_model(gchar *album_name);
+static void gphoto_album_selection_changed(GtkTreeSelection *selection, gpointer user_data);
+static void gphoto_thumb_selection_changed(GtkIconView *iconview, gpointer user_data);
+static void gphoto_display_photo_preview(Artwork *artwork);
+void on_photodb_add_album_menuItem_activate(GtkMenuItem *menuItem, gpointer user_data);
+void on_photodb_add_image_menuItem_activate(GtkMenuItem *menuItem, gpointer user_data);
+void on_photodb_add_image_dir_menuItem_activate(GtkMenuItem *menuItem, gpointer user_data);
+void on_photodb_remove_album_menuItem_activate(GtkMenuItem *menuItem, gpointer user_data);
+void on_photodb_remove_image_menuItem_activate(GtkMenuItem *menuItem, gpointer user_data);
+void on_photodb_view_full_size_menuItem_activate (GtkMenuItem *menuItem, gpointer user_data);
+void on_photodb_rename_album_menuItem_activate (GtkMenuItem *menuItem, gpointer user_data);
+static void signal_data_changed();
+static gchar *gphoto_get_selected_album_name();
+static void gphoto_add_image_to_database(gchar *photo_filename);
+static void gphoto_add_image_to_iconview(Artwork *photo, gint index);
+static gboolean gphoto_button_press(GtkWidget *w, GdkEventButton *e, gpointer data);
+/* DnD */
+static gboolean dnd_album_drag_drop(GtkWidget *widget, GdkDragContext *drag_context, gint x, gint y, guint time, gpointer user_data);
+static void dnd_album_drag_data_received(GtkWidget *widget, GdkDragContext *dc, gint x, gint y, GtkSelectionData *data, guint info, guint time, gpointer user_data);
+static void dnd_images_drag_data_get(GtkWidget *widget, GdkDragContext *dc, GtkSelectionData *data, guint info, guint time, gpointer user_data);
+
+enum
+{
+	COL_ALBUM_NAME = 0,
+	NUM_ALBUM_COLUMNS
+};
+
+enum
+{
+	COL_THUMB_NAIL = 0,
+	COL_THUMB_FILENAME,
+	COL_THUMB_ARTWORK,
+	NUM_THUMB_COLUMNS
+};
+
+/**
+ * gphoto_load_photodb:
+ *
+ * Using the info in the provided itunes db, load the photo db
+ * from the ipod if there is one present. Reference it in the
+ * extra itunes db data structure for later use.
+ * 
+ * @ itdb: itunes database
+ * 
+ */
+void gphoto_load_photodb(iTunesDB *itdb)
+{
+	ExtraiTunesDBData *eitdb;
+	PhotoDB *db;
+	const gchar *mp;
+	GError *error= NULL;
+
+	if (itdb == NULL)
+		return;
+
+	eitdb = itdb->userdata;
+	mp = itdb_get_mountpoint (itdb);
+	db = itdb_photodb_parse (mp, &error);
+	if (db == NULL)
+	{
+		if (error)
+		{
+			gtkpod_warning (_("Error reading iPod photo database (%s).\n"), error->message);
+			g_error_free (error);
+			error = NULL;
+		} else
+		{
+			gtkpod_warning (_("Error reading iPod photo database.\n"));
+		}
+		eitdb->photodb = NULL;
+		return;
+	}
+
+	/* Set the reference to the photo database */
+	eitdb->photodb = db;
+	/*printf ("Reference to photo db successfully set\n");*/
+	
+	/* A photo database is */
+}
+
+/**
+ * gphoto_ipod_supports_photos
+ *
+ * Convenience function that passes onto libgpod and requests
+ * whether the ipod has photo support
+ * 
+ * Returns:
+ * true/false whether the ipod has photo support
+ */
+gboolean gphoto_ipod_supports_photos(iTunesDB *itdb)
+{
+	gboolean status = itdb_device_supports_photo (itdb->device);
+	
+	return status;
+}
+
+/**
+ * gphoto_is_photo_playlist
+ *
+ * Convenience function that determines whether the
+ * playlist is the photo playlist.
+ * 
+ * @ pl: playlist
+ * 
+ * Returns:
+ * true/false whether the playlist is the photo playlist
+ */
+gboolean gphoto_is_photo_playlist(Playlist *pl)
+{
+	return pl->type == GP_PL_TYPE_PHOTO;
+}
+
+/**
+ * gphoto_display_photo_window
+ *
+ * When the photo playlist is clicked on, it hands off to this
+ * function which changes the entire display to the photo
+ * window
+ * 
+ * @itdb: itunes db associated with the photo playlist clicked on
+ */
+void gphoto_display_photo_window(iTunesDB *itdb)
+{
+	ExtraiTunesDBData *eitdb;
+
+	ipod_itdb = itdb;
+#if DEBUG
+	printf ("Displaying photo window\n");
+	debug_list_photos (itdb);
+#endif
+
+	eitdb = itdb->userdata;
+	photodb = eitdb->photodb;
+	device = itdb->device;
+
+	if (!photodb)
+	{
+		gtkpod_warning (_("Could not access the iPod's photo database."));
+		return;
+	}
+
+	gphoto_change_to_photo_window (TRUE);
+
+	gphoto_create_albumview ();
+	gphoto_create_thumbnailview ();
+
+	if (eitdb->photo_data_changed != TRUE)
+		eitdb->photo_data_changed = FALSE;
+}
+
+/**
+ * gphoto_change_to_photo_window
+ *
+ * When the photo playlist is NOT clicked on;
+ * this changes the entire display back to original
+ * rather than the photo window.
+ * 
+ */
+void gphoto_change_to_photo_window(gboolean showflag)
+{
+	GtkWidget *paned1 = gtkpod_xml_get_widget (main_window_xml, "paned1");
+	GtkWidget *downbutton = gtkpod_xml_get_widget (main_window_xml, "cover_down_button");
+	GtkWidget *coverpanel = gtkpod_xml_get_widget (main_window_xml, "cover_display_window");
+	GtkWidget *controlbox = gtkpod_xml_get_widget (main_window_xml, "cover_display_controlbox");
+	GtkWidget *upbutton = gtkpod_xml_get_widget (main_window_xml, "cover_up_button");
+
+	GtkWidget *addfilesbutton = gtkpod_xml_get_widget (main_window_xml, "add_files_button");
+	GtkWidget *adddirsbutton = gtkpod_xml_get_widget (main_window_xml, "add_dirs_button");
+	GtkWidget *menu_add_files = gtkpod_xml_get_widget (main_window_xml, "add_files1");
+	GtkWidget *menu_add_dirs = gtkpod_xml_get_widget (main_window_xml, "add_directory1");
+	GtkWidget *menu_update_file = gtkpod_xml_get_widget (main_window_xml, "update_menu");
+	GtkWidget *menu_mserv_file = gtkpod_xml_get_widget (main_window_xml, "mserv_from_file_menu");
+	GtkWidget *sync_menu = gtkpod_xml_get_widget (main_window_xml, "sync_menu");
+	GtkWidget *export_menu = gtkpod_xml_get_widget (main_window_xml, "export_menu");
+	GtkWidget *create_pl_menu = gtkpod_xml_get_widget (main_window_xml, "create_playlist_file_menu");
+	GtkWidget *edit_menu = gtkpod_xml_get_widget (main_window_xml, "edit_menu");
+	GtkWidget *more_sort_tabs = gtkpod_xml_get_widget (main_window_xml, "more_sort_tabs");
+	GtkWidget *less_sort_tabs = gtkpod_xml_get_widget (main_window_xml, "less_sort_tabs");
+	GtkWidget *arr_sort_tabs = gtkpod_xml_get_widget (main_window_xml, "arrange_sort_tabs");
+	GtkWidget *tools_menu = gtkpod_xml_get_widget (main_window_xml, "tools1");
+	GtkWidget *main_vbox = gtkpod_xml_get_widget (main_window_xml, "main_vbox");
+	GladeXML *photo_xml;
+	GtkWidget *photowin;
+	gint i;
+
+	if (showflag)
+	{
+		/* Record which pages are selected in the visible sorttabs */
+		for (i = 0; i < SORT_TAB_MAX; ++i)
+		{
+			sorttab_pages[i] = st_get_sorttab_page_number (i);
+		}
+
+		/* Hide track related panes */
+		gtk_widget_hide_all (paned1);
+		/* Hide the coverart display */
+		gtk_widget_hide (downbutton);
+		gtk_widget_hide_all (coverpanel);
+		gtk_widget_hide_all (controlbox);
+		gtk_widget_show (upbutton);
+		/* Hide menu entries and buttons */
+		gtk_widget_set_sensitive (upbutton, FALSE);
+		gtk_widget_set_sensitive (addfilesbutton, FALSE);
+		gtk_widget_set_sensitive (adddirsbutton, FALSE);
+		gtk_widget_set_sensitive (menu_add_files, FALSE);
+		gtk_widget_set_sensitive (menu_add_dirs, FALSE);
+		gtk_widget_set_sensitive (menu_update_file, FALSE);
+		gtk_widget_set_sensitive (menu_mserv_file, FALSE);
+		gtk_widget_set_sensitive (sync_menu, FALSE);
+		gtk_widget_set_sensitive (export_menu, FALSE);
+		gtk_widget_set_sensitive (create_pl_menu, FALSE);
+		gtk_widget_set_sensitive (edit_menu, FALSE);
+		gtk_widget_set_sensitive (more_sort_tabs, FALSE);
+		gtk_widget_set_sensitive (less_sort_tabs, FALSE);
+		gtk_widget_set_sensitive (arr_sort_tabs, FALSE);
+		gtk_widget_set_sensitive (tools_menu, FALSE);
+
+		if (photo_viewport == NULL)
+		{
+			photo_xml = glade_xml_new (xml_file, "photo_panel", NULL);
+			photowin = gtkpod_xml_get_widget (photo_xml, "photo_panel");
+			photo_album_window = gtkpod_xml_get_widget (photo_xml, "photo_album_window");
+			photo_thumb_window = gtkpod_xml_get_widget (photo_xml, "photo_thumbnail_window");
+			photo_preview_image = GTK_IMAGE (gtkpod_xml_get_widget (photo_xml, "photo_preview_image"));
+			photo_add_album_menuItem = GTK_MENU_ITEM (gtkpod_xml_get_widget (photo_xml, "photo_add_album_menuItem"));
+			photo_add_image_menuItem = GTK_MENU_ITEM (gtkpod_xml_get_widget (photo_xml, "photo_add_image_menuItem"));
+			photo_add_image_dir_menuItem = GTK_MENU_ITEM (gtkpod_xml_get_widget (photo_xml, "photo_add_image_dir_menuItem"));
+			photo_remove_album_menuItem = GTK_MENU_ITEM (gtkpod_xml_get_widget (photo_xml, "photo_remove_album_menuItem"));
+			photo_remove_image_menuItem = GTK_MENU_ITEM (gtkpod_xml_get_widget (photo_xml, "photo_remove_image_menuItem"));
+			photo_view_full_size_menuItem = GTK_MENU_ITEM (gtkpod_xml_get_widget (photo_xml, "photo_view_full_size_menuItem"));
+			photo_rename_album_menuItem = GTK_MENU_ITEM (gtkpod_xml_get_widget (photo_xml, "photo_rename_album_menuItem"));
+			
+			photo_viewport = gtkpod_xml_get_widget (photo_xml, "photo_viewport");
+			g_object_ref (photo_album_window);
+			g_object_ref (photo_thumb_window);
+			g_object_ref (photo_preview_image);
+			g_object_ref (photo_viewport);
+			gtk_container_remove (GTK_CONTAINER (photowin), photo_viewport);
+			/* we don't need this any more */
+			gtk_widget_destroy (photowin);
+		}
+
+		if (gtk_widget_get_parent (photo_viewport) == NULL)
+			gtk_container_add (GTK_CONTAINER (main_vbox), photo_viewport);
+
+		/* Bring the menus to life */
+		g_signal_connect (G_OBJECT(photo_add_album_menuItem), "activate", G_CALLBACK(on_photodb_add_album_menuItem_activate), 
+		NULL);
+		g_signal_connect (G_OBJECT(photo_add_image_menuItem), "activate", G_CALLBACK(on_photodb_add_image_menuItem_activate), 
+		NULL);
+		g_signal_connect (G_OBJECT(photo_add_image_dir_menuItem), "activate", G_CALLBACK(on_photodb_add_image_dir_menuItem_activate), 
+		NULL);
+		g_signal_connect (G_OBJECT(photo_remove_album_menuItem), "activate", G_CALLBACK(on_photodb_remove_album_menuItem_activate), 
+		NULL);
+		g_signal_connect (G_OBJECT(photo_remove_image_menuItem), "activate", G_CALLBACK(on_photodb_remove_image_menuItem_activate), 
+		NULL);
+		g_signal_connect (G_OBJECT(photo_view_full_size_menuItem), "activate", G_CALLBACK(on_photodb_view_full_size_menuItem_activate), 
+				NULL);
+		g_signal_connect (G_OBJECT(photo_rename_album_menuItem), "activate", G_CALLBACK(on_photodb_rename_album_menuItem_activate),
+				NULL);
+		
+	} else
+	{
+		if (!GTK_WIDGET_VISIBLE (paned1))
+		{
+			if (gtk_widget_get_parent (photo_viewport) != NULL)
+				gtk_container_remove (GTK_CONTAINER (main_vbox), photo_viewport);
+
+			/* Show track related panes */
+			gtk_widget_show_all (paned1);
+			st_show_visible();
+
+			/* Reselect the originally selected sorttab pages */
+			for (i = 0; i < SORT_TAB_MAX; ++i)
+			{
+				/* Need to change current category in sorttab */
+				st_set_sorttab_page ((gint) i, sorttab_pages [i]);
+			}
+		}
+
+		if (prefs_get_int (KEY_DISPLAY_COVERART))
+		{
+			/* Show the coverart display */
+			gtk_widget_show (downbutton);
+			gtk_widget_show_all (coverpanel);
+			gtk_widget_show_all (controlbox);
+			gtk_widget_hide (upbutton);
+		}
+		gtk_widget_set_sensitive (upbutton, TRUE);
+		gtk_widget_set_sensitive (addfilesbutton, TRUE);
+		gtk_widget_set_sensitive (adddirsbutton, TRUE);
+		gtk_widget_set_sensitive (menu_add_files, TRUE);
+		gtk_widget_set_sensitive (menu_add_dirs, TRUE);
+		gtk_widget_set_sensitive (menu_update_file, TRUE);
+		gtk_widget_set_sensitive (menu_mserv_file, TRUE);
+		gtk_widget_set_sensitive (sync_menu, TRUE);
+		gtk_widget_set_sensitive (export_menu, TRUE);
+		gtk_widget_set_sensitive (create_pl_menu, TRUE);
+		gtk_widget_set_sensitive (edit_menu, TRUE);
+		gtk_widget_set_sensitive (more_sort_tabs, TRUE);
+		gtk_widget_set_sensitive (less_sort_tabs, TRUE);
+		gtk_widget_set_sensitive (arr_sort_tabs, TRUE);
+		gtk_widget_set_sensitive (tools_menu, TRUE);
+	}
+}
+
+/**
+ * gphoto_create_albumview:
+ *
+ * Construct the album tree based upon the albums
+ * stored on the iPod. If necessary destory and old
+ * existing tree object.
+ * 
+ */
+static void gphoto_create_albumview()
+{
+	GtkListStore *model;
+	GtkTreeSelection *selection;
+	GtkTreeIter iter;
+	GtkCellRenderer *renderer;
+	GList *gl_album;
+
+	/* destroy old listview */
+	if (album_view)
+	{
+		model = GTK_LIST_STORE (gtk_tree_view_get_model (album_view));
+		g_return_if_fail (model);
+		g_object_unref (model);
+		gtk_widget_destroy (GTK_WIDGET (album_view));
+		album_view = NULL;
+	}
+
+	/* === Create New One === */
+
+	/* create tree view */
+	album_view = GTK_TREE_VIEW (gtk_tree_view_new ());
+	if (!GTK_WIDGET_REALIZED(album_view))
+		gtk_widget_set_events (GTK_WIDGET(album_view), GDK_KEY_PRESS_MASK);
+
+	renderer = gtk_cell_renderer_text_new ();
+	gtk_tree_view_insert_column_with_attributes (album_view, -1, _("Photo Albums"), renderer, "text", COL_ALBUM_NAME, 
+	NULL);
+
+	/* create model */
+	model = gtk_list_store_new (NUM_ALBUM_COLUMNS, G_TYPE_STRING);
+	for (gl_album=photodb->photoalbums; gl_album; gl_album=gl_album->next)
+	{
+		PhotoAlbum *album = gl_album->data;
+		g_return_if_fail (album);
+
+		gchar *name = album->name ? album->name : _("<Unnamed>");
+		/*printf ("name of album: %s\n", name);*/
+		/* Add a new row to the model */
+		gtk_list_store_append (model, &iter);
+		gtk_list_store_set (model, &iter, COL_ALBUM_NAME, name, -1);
+	}
+
+	/* set tree model */
+	gtk_tree_view_set_model (album_view, GTK_TREE_MODEL (model));
+	gtk_tree_view_set_rules_hint (album_view, TRUE);
+
+	gtk_tree_selection_set_mode (gtk_tree_view_get_selection (album_view), GTK_SELECTION_SINGLE);
+
+	gtk_container_add (GTK_CONTAINER (photo_album_window), GTK_WIDGET(album_view));
+	gtk_widget_show_all (photo_album_window);
+
+	/* function to be enacted when the album is changed */
+	selection = gtk_tree_view_get_selection (album_view);
+	g_signal_connect (G_OBJECT (selection), "changed", G_CALLBACK (gphoto_album_selection_changed), 
+	NULL);
+
+	g_signal_connect (G_OBJECT (album_view), "button-press-event", G_CALLBACK (gphoto_button_press), (gpointer) GPHOTO_ALBUM_VIEW);
+
+	/* Disable the remove album menu item until an album is selected */
+	gtk_widget_set_sensitive (GTK_WIDGET(photo_remove_album_menuItem), FALSE);
+
+	/* Dnd destinaton for album view */
+	gtk_drag_dest_set (
+			GTK_WIDGET (album_view), 
+			GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_HIGHLIGHT, 
+			photo_drop_types, 
+			TGNR (photo_drop_types), 
+			GDK_ACTION_COPY|GDK_ACTION_MOVE);
+
+	g_signal_connect ((gpointer) album_view, "drag-drop",
+			G_CALLBACK (dnd_album_drag_drop), 
+			NULL);
+	
+	g_signal_connect ((gpointer) album_view, "drag-data-received",
+			G_CALLBACK (dnd_album_drag_data_received), 
+			NULL);
+}
+
+/**
+ * gphoto_create_thumbnailview:
+ *
+ * Construct the thumbnail tree based upon the
+ * photos stored on the iPod associated with the
+ * selected album.
+ * 
+ */
+static void gphoto_create_thumbnailview()
+{
+	/* destroy old listview */
+	if (thumbnail_view)
+	{
+		gtk_widget_destroy (GTK_WIDGET (thumbnail_view));
+		thumbnail_view = NULL;
+	}
+
+	/* === Create New One === */
+	if (thumbnail_view == NULL)
+		thumbnail_view = GTK_ICON_VIEW (gtk_icon_view_new ());
+
+	if (!GTK_WIDGET_REALIZED(thumbnail_view))
+		gtk_widget_set_events (GTK_WIDGET(thumbnail_view), GDK_KEY_PRESS_MASK);
+
+	gphoto_build_thumbnail_model (NULL);
+
+	gtk_container_add (GTK_CONTAINER (photo_thumb_window), GTK_WIDGET(thumbnail_view));
+	gtk_widget_show_all (photo_thumb_window);
+
+	g_signal_connect (G_OBJECT (thumbnail_view), "button-press-event", G_CALLBACK (gphoto_button_press), (gpointer) GPHOTO_ICON_VIEW);
+
+	/* DnD */
+	gtk_drag_source_set (
+			GTK_WIDGET (thumbnail_view),
+			GDK_BUTTON1_MASK,
+			photo_drag_types, 
+			TGNR (photo_drag_types),
+			GDK_ACTION_COPY|GDK_ACTION_MOVE);
+
+	g_signal_connect ((gpointer) thumbnail_view, "drag-data-get", 
+			G_CALLBACK (dnd_images_drag_data_get), 
+			NULL);
+}
+
+/**
+ * gphoto_build_thumbnail_model:
+ *
+ * Create the model for the thumbnail view
+ * based upon the selected album.
+ * 
+ * @ album_name: name of the selected album or null if none selected
+ * 
+ */
+static void gphoto_build_thumbnail_model(gchar *album_name)
+{
+	GtkListStore *model;
+	PhotoAlbum *album;
+	GList *photos;
+	gint i;
+
+	model = GTK_LIST_STORE (gtk_icon_view_get_model (thumbnail_view));
+	if (model)
+		gtk_list_store_clear (model);
+	else
+	{
+		/* create model */
+		model = gtk_list_store_new (NUM_THUMB_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_POINTER);
+		gtk_icon_view_set_model (thumbnail_view, GTK_TREE_MODEL(model));
+	}
+
+	/* Get currently selected album from photo database */
+	album = itdb_photodb_photoalbum_by_name (photodb, album_name);
+	g_return_if_fail (album);
+
+	for (i = 0, photos = album->members; i < g_list_length (photos); ++i)
+	{
+		Artwork *photo = g_list_nth_data (photos, i);
+		g_return_if_fail (photo);
+
+		gphoto_add_image_to_iconview (photo, (i + 1));
+
+		/* On creation of the model, place the first image into the preview pane */
+		if (i == 0)
+			gphoto_display_photo_preview (photo);
+	}
+
+	gtk_icon_view_set_pixbuf_column (thumbnail_view, 0);
+	gtk_icon_view_set_text_column (thumbnail_view, 1);
+	gtk_icon_view_set_selection_mode (thumbnail_view, GTK_SELECTION_MULTIPLE);
+	gtk_icon_view_set_columns (thumbnail_view, 0);
+	gtk_icon_view_set_item_width(thumbnail_view, -1); // let the model decide how wide
+
+	/* function to be enacted when the thumbnail is changed */
+	g_signal_connect (thumbnail_view, "selection-changed", G_CALLBACK (gphoto_thumb_selection_changed), 
+	NULL);
+
+	/* Disable the remove image menu item until an image is selected */
+	gtk_widget_set_sensitive (GTK_WIDGET(photo_remove_image_menuItem), FALSE);
+	/* Disable the view full size menu item until an image is selected */
+	gtk_widget_set_sensitive (GTK_WIDGET(photo_view_full_size_menuItem), FALSE);
+	/* Disable the rename menu item untill an album is selected */
+	gtk_widget_set_sensitive (GTK_WIDGET(photo_rename_album_menuItem), FALSE);
+}
+
+/**
+ * gphoto_album_selection_changed:
+ *
+ * When the album selection is changed, rebuild the thumbnail model
+ * to display those thumbnails only associated with the album.
+ * 
+ * @ selection: album name selection
+ * @ user_data: not used.
+ * 
+ */
+static void gphoto_album_selection_changed(GtkTreeSelection *selection, gpointer user_data)
+{
+	gchar *album_name= NULL;
+	PhotoAlbum *selected_album = NULL;
+
+	album_name = gphoto_get_selected_album_name (selection);
+
+	/* if album_name returns NULL then it merely selects the default Photo Library */
+	gphoto_build_thumbnail_model (album_name);
+
+	if (album_name != NULL)
+	{
+		/* Enable the remove album menu item now that one is selected */
+		gtk_widget_set_sensitive (GTK_WIDGET(photo_remove_album_menuItem), TRUE);
+		
+		selected_album = itdb_photodb_photoalbum_by_name (photodb, album_name);
+		if (selected_album->album_type != 0x01)
+		{
+			/* Only allow renaming of album if not the Photo Library */
+			gtk_widget_set_sensitive (GTK_WIDGET(photo_rename_album_menuItem), TRUE);
+			return;
+		}
+	}
+	gtk_widget_set_sensitive (GTK_WIDGET(photo_rename_album_menuItem), FALSE);
+	return;
+}
+
+/**
+ * gphoto_thumb_selection_changed:
+ *
+ * When the thumb view selection is changed, update the
+ * preview image to display that which is selected.
+ * 
+ * @ iconview: thumbnail view
+ * @ user_data: not used
+ * 
+ */
+static void gphoto_thumb_selection_changed(GtkIconView *iconview, gpointer user_data)
+{
+	GtkTreeModel *model;
+	GtkTreeIter iter;
+	Artwork *artwork;
+	GList *selected_items= NULL;
+
+	selected_items = gtk_icon_view_get_selected_items (iconview);
+
+	if (selected_items == NULL|| g_list_length (selected_items) == 0)
+		return;
+
+	model = gtk_icon_view_get_model (iconview);
+	gtk_tree_model_get_iter (model, &iter, selected_items->data);
+	gtk_tree_model_get (model, &iter, COL_THUMB_ARTWORK, &artwork, -1);
+	g_return_if_fail (artwork);
+	gphoto_display_photo_preview (artwork);
+
+	/* Enable the remove image menu item until an album is selected */
+	gtk_widget_set_sensitive (GTK_WIDGET(photo_remove_image_menuItem), TRUE);
+	/* Enable the view full size menu item */
+	gtk_widget_set_sensitive (GTK_WIDGET(photo_view_full_size_menuItem), TRUE);
+}
+
+/**
+ * gphoto_display_photo_preview:
+ *
+ * Display the supplied photo is the preview window.
+ * 
+ * @ artwork: photo to be displayed
+ * 
+ */
+static void gphoto_display_photo_preview(Artwork *artwork)
+{
+	Thumb *thumb = NULL;
+	GdkPixbuf *pixbuf, *scaled;
+	gint width, height;
+	gdouble ratio;
+	gint i;
+	
+	g_return_if_fail (artwork);
+
+	for (i = (PHOTO_TYPES_SIZE - 1); i >= 0 && thumb == NULL; --i)
+	{
+		/* Start from biggest photo type and go smaller */
+		thumb = itdb_artwork_get_thumb_by_type (artwork, photo_types[i]);
+	}
+			
+	/* should have a thumb now but check anyway and fire off a warning if it is still null */
+	g_return_if_fail (thumb);
+	
+	pixbuf = itdb_thumb_get_gdk_pixbuf (device, thumb);
+	g_return_if_fail (pixbuf);
+
+	/* Size of the preview GtkImage is set to 220x176, technically 
+	 * the same as PHOTO_FULL_SCREEN for a normal ipod.
+	 */
+	width = gdk_pixbuf_get_width (pixbuf);
+	height = gdk_pixbuf_get_height (pixbuf);
+	ratio = (gdouble) width / (gdouble) height;
+
+	if (height > PHOTO_FULL_SCREEN_HEIGHT)
+	{
+		height = PHOTO_FULL_SCREEN_HEIGHT;
+		width = ratio * height;
+	}
+
+	if (width > PHOTO_FULL_SCREEN_WIDTH)
+	{
+		width = PHOTO_FULL_SCREEN_WIDTH;
+		height = width / ratio;
+	}
+
+	scaled = gdk_pixbuf_scale_simple (pixbuf, width, height, GDK_INTERP_NEAREST);
+	gdk_pixbuf_unref (pixbuf);
+
+	gtk_image_set_from_pixbuf (photo_preview_image, scaled);
+	gtk_misc_set_padding (GTK_MISC(photo_preview_image), 20, 20);
+}
+
+/**
+ * 
+ * signal_data_changed:
+ * 
+ * Convenience function that sets the flags on the Extra iTunes Database
+ * that the photo database has changed and will need saving
+ * 
+ */
+static void signal_data_changed()
+{
+	ExtraiTunesDBData *eitdb;
+
+	eitdb = ipod_itdb->userdata;
+	eitdb->photo_data_changed = TRUE;
+	eitdb->data_changed = TRUE;
+	
+	gtk_image_clear (photo_preview_image);
+}
+
+/**
+ * get_selected_album_name
+ *
+ * Given the selection of the album_treeview,
+ * return the album name selected..
+ * 
+ * @ selection: GtkTreeSelection
+ * 
+ * Returns:
+ * string value representing the album name selected
+ */
+static gchar *gphoto_get_selected_album_name(GtkTreeSelection *selection)
+{
+	gchar *album_name= NULL;
+	GtkTreeModel *album_model;
+	GtkTreeIter iter;
+
+	if (selection == NULL)
+		return NULL;
+
+	if (gtk_tree_selection_get_selected (selection, &album_model, &iter) == TRUE)
+	{ /* handle new selection */
+		gtk_tree_model_get (album_model, &iter, COL_ALBUM_NAME, &album_name, -1);
+	}
+
+	return album_name;
+}
+
+/**
+ * gphoto_get_selected_photo_count
+ *
+ * Function to return the number of photos
+ * currently selected in the iconview.
+ * 
+ */
+gint gphoto_get_selected_photo_count ()
+{
+	GList *selected_items= NULL;
+
+	selected_items = gtk_icon_view_get_selected_items (thumbnail_view);
+
+	if (selected_items == NULL)
+		return 0;
+	
+	return g_list_length (selected_items);
+}
+
+/**
+ * gphoto_add_image_to_database
+ *
+ * Add a photo from file name to the photo database and
+ * hence to the gui. If an album is selected other than the
+ * Photo Library then the photo is added to it.
+ * 
+ * @ photo_filename: gchar *
+ * 
+ */
+static void gphoto_add_image_to_database(gchar *photo_filename)
+{
+	gchar *album_name= NULL;
+	PhotoAlbum *selected_album;
+	GError *error= NULL;
+	Artwork *image= NULL;
+
+	/* Add the photo to the photo database and the 
+	 * default photo library album
+	 */
+	image = itdb_photodb_add_photo (photodb, photo_filename, -1, GDK_PIXBUF_ROTATE_NONE, &error);
+
+	if (image == NULL)
+	{
+		if (error && error->message)
+			gtkpod_warning ("%s\n\n", error->message);
+		else
+			g_warning ("error->message == NULL!\n");
+
+		g_error_free (error);
+		error = NULL;
+		return;
+	}
+
+	/* Add the image to the selected album if there is one selected */
+	album_name= gphoto_get_selected_album_name (gtk_tree_view_get_selection (album_view));
+
+	/* Find the selected album. If no selection then returns the Main Album */
+	selected_album = itdb_photodb_photoalbum_by_name (photodb, album_name);
+	g_return_if_fail (selected_album);
+
+	if (selected_album->album_type != 0x01)
+	{
+		/* Add the photo to the selected album only if it is not 
+		 * the Photo Library, as already done that.
+		 */
+		itdb_photodb_photoalbum_add_photo (photodb, selected_album, image, -1);
+	}
+
+	gphoto_add_image_to_iconview (image, g_list_length (selected_album->members));
+
+	signal_data_changed ();
+}
+
+/**
+ * gphoto_add_image_to_iconview
+ *
+ * Add an Artwork image to the icon_view
+ * 
+ * @ photo: Artwork
+ * 
+ */
+static void gphoto_add_image_to_iconview(Artwork *photo, gint index)
+{
+	GdkPixbuf *pixbuf= NULL;
+		GdkPixbuf *scaled = NULL;
+		Thumb *thumb= NULL;
+		GtkListStore *model= NULL;
+		GtkTreeIter iter;
+		gint i;
+		/* default sizes taken from smallest photo image type in itdb_device.c */
+		gint icon_width = 42, icon_height = 30;
+		gfloat pixbuf_width, pixbuf_height;
+		gfloat ratio;
+
+		model = GTK_LIST_STORE (gtk_icon_view_get_model (thumbnail_view));
+		for (i = 0; i < PHOTO_TYPES_SIZE && thumb == NULL; ++i)
+		{
+			thumb = itdb_artwork_get_thumb_by_type (photo, photo_types[i]);
+		}
+		
+		/* should have a thumb now but check anyway and fire off a warning if it is still null */
+		g_return_if_fail (thumb);
+		
+		pixbuf = itdb_thumb_get_gdk_pixbuf (device, thumb);
+		g_return_if_fail (pixbuf);
+
+		pixbuf_width = gdk_pixbuf_get_width (pixbuf);
+		pixbuf_height = gdk_pixbuf_get_height (pixbuf);
+		ratio = pixbuf_width / pixbuf_height;
+		
+		if (pixbuf_width > icon_width)
+		{
+			pixbuf_width = icon_width;
+			pixbuf_height = pixbuf_width / ratio;
+		}
+		
+		if (pixbuf_height > icon_height)
+		{
+			pixbuf_height = icon_height;
+			pixbuf_width = pixbuf_height * ratio;
+		}
+		
+		scaled = gdk_pixbuf_scale_simple(pixbuf, pixbuf_width, pixbuf_height, GDK_INTERP_NEAREST);
+		gdk_pixbuf_unref (pixbuf);
+		
+		gchar *index_str= NULL;
+		index_str = (gchar *) g_malloc (sizeof(gint));
+		g_sprintf (index_str, "%d", index);
+		
+		/* Add a new row to the model */
+		gtk_list_store_append (model, &iter);
+		gtk_list_store_set (model, &iter, COL_THUMB_NAIL, scaled, COL_THUMB_FILENAME, index_str, COL_THUMB_ARTWORK, photo, -1);
+		g_free (index_str);
+}
+
+/**
+ * gphoto_remove_album_from_database
+ *
+ * Remove the selected album from the photo database and the view
+ * 
+ */
+void gphoto_remove_album_from_database()
+{
+	GtkTreeModel *album_model;
+	GtkTreeIter iter;
+	GtkTreeSelection *curr_selection;
+	gchar *album_name;
+	PhotoAlbum *selected_album;
+
+	curr_selection = gtk_tree_view_get_selection (album_view);
+	if (curr_selection == NULL)
+		return;
+
+	if (gtk_tree_selection_get_selected (curr_selection, &album_model, &iter) == TRUE)
+		gtk_tree_model_get (album_model, &iter, COL_ALBUM_NAME, &album_name, -1);
+	else
+		return;
+	
+	g_return_if_fail (album_name);
+
+	/* Find the selected album. If no selection then returns the Main Album */
+	selected_album = itdb_photodb_photoalbum_by_name (photodb, album_name);
+	g_return_if_fail (selected_album);
+	g_free (album_name);
+	
+	if (selected_album->album_type == 0x01)
+	{
+		gtkpod_warning (_("The Photo Library album cannot be removed"));
+		return;
+	}
+
+	gboolean remove_pics = FALSE;
+	if (prefs_get_int("photo_library_confirm_delete") == FALSE ||
+			g_list_length (selected_album->members) <= 0)
+	{
+		/* User has chosen to assume yes and not display a confirm dialog
+		 * or the album is empty
+		 */
+		remove_pics = TRUE;
+	}
+	else
+	{
+		/* Display a dialog asking if the user wants the photos removed as well */
+		gint result;
+		GtkWindow *parent = GTK_WINDOW (gtkpod_xml_get_widget (main_window_xml, "gtkpod"));
+		GtkWidget *dialog = gtk_message_dialog_new (parent,
+				GTK_DIALOG_DESTROY_WITH_PARENT,
+				GTK_MESSAGE_QUESTION,
+				GTK_BUTTONS_NONE,
+				_("Do you want to remove the album's photos too?"));
+			gtk_dialog_add_buttons (
+				GTK_DIALOG (dialog),
+				GTK_STOCK_YES, GTK_RESPONSE_YES,
+				GTK_STOCK_NO, GTK_RESPONSE_NO,
+				GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
+				_("Yes. Do Not Display Again"), PHOTO_YES_DONT_DISPLAY_RESPONSE,
+				NULL);
+	
+		result = gtk_dialog_run (GTK_DIALOG (dialog));
+		gtk_widget_destroy (dialog);
+
+		switch (result)
+		{
+			case PHOTO_YES_DONT_DISPLAY_RESPONSE:
+				prefs_set_int("photo_library_confirm_delete", FALSE);
+			case GTK_RESPONSE_YES:
+				remove_pics = TRUE;
+				break;
+				case GTK_RESPONSE_NO:
+				remove_pics = FALSE;
+				break;
+			case GTK_RESPONSE_REJECT:
+				return;
+			default:
+				break;
+		}
+	}
+	
+	album_model = gtk_tree_view_get_model (album_view);
+	gtk_list_store_remove (GTK_LIST_STORE(album_model), &iter);
+
+	itdb_photodb_photoalbum_remove (photodb, selected_album, remove_pics);
+
+	/* Display the default Photo Library */
+	gphoto_build_thumbnail_model (NULL);
+
+	signal_data_changed ();
+}
+
+/**
+ * gphoto_remove_image_from_album
+ *
+ * Remove the selected image from the album
+ * 
+ */
+void gphoto_remove_selected_photos_from_album (gboolean show_dialogs)
+{
+	GList *selected_images;
+	GtkTreeModel *thumbnail_model;
+	gint i;
+	GtkTreeIter image_iter;
+	Artwork *image;
+	gchar *album_name;
+	PhotoAlbum *selected_album;
+
+	/* Find which images are selected */
+	selected_images = gtk_icon_view_get_selected_items (thumbnail_view);
+	if (g_list_length (selected_images) == 0)
+		return;
+
+	/* Find which album is selected if any */
+	album_name = gphoto_get_selected_album_name (gtk_tree_view_get_selection (album_view));
+
+	selected_album = itdb_photodb_photoalbum_by_name (photodb, album_name);
+	GtkWindow *parent = GTK_WINDOW (gtkpod_xml_get_widget (main_window_xml, "gtkpod"));
+	GtkWidget *dialog;
+	gboolean delete_pics = FALSE;
+	
+	if (show_dialogs)
+	{
+		if (selected_album != NULL&& selected_album->album_type != 0x01)
+		{
+			dialog = gtk_message_dialog_new (parent,
+					GTK_DIALOG_DESTROY_WITH_PARENT,
+					GTK_MESSAGE_QUESTION,
+					GTK_BUTTONS_NONE,
+					_("This will remove the photo selection from the selected album.\n Do you want to delete them from the database as well?"));
+		
+			gtk_dialog_add_buttons (
+					GTK_DIALOG (dialog),
+					GTK_STOCK_YES, GTK_RESPONSE_YES,
+					GTK_STOCK_NO, GTK_RESPONSE_NO,
+					GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
+					NULL);
+		}
+		else
+		{
+			dialog = gtk_message_dialog_new (parent,
+					GTK_DIALOG_DESTROY_WITH_PARENT,
+					GTK_MESSAGE_QUESTION,
+					GTK_BUTTONS_NONE,
+					_("This will delete the photo selection from the Photo Library and all albums. Are you sure?"));
+			
+			gtk_dialog_add_buttons (
+					GTK_DIALOG (dialog),
+					GTK_STOCK_YES, GTK_RESPONSE_YES,
+					GTK_STOCK_NO, GTK_RESPONSE_REJECT,
+					NULL);
+		}
+		/* Display the dialog  */
+		gint result = gtk_dialog_run (GTK_DIALOG (dialog));
+		gtk_widget_destroy (dialog);
+
+		switch (result)
+		{
+			case GTK_RESPONSE_YES:
+				delete_pics = TRUE;
+				break;
+			case GTK_RESPONSE_NO:
+				delete_pics = FALSE;
+				break;
+			case GTK_RESPONSE_REJECT:
+				return;
+			default:
+				return;
+		}
+	}
+	else
+	{
+		delete_pics = FALSE;
+	}
+	
+	thumbnail_model = gtk_icon_view_get_model (thumbnail_view);
+	for (i = 0; i < g_list_length (selected_images); ++i)
+	{
+		/* Find the selected image and remove it */
+		gtk_tree_model_get_iter (thumbnail_model, &image_iter, g_list_nth_data (selected_images, i));
+		gtk_tree_model_get (thumbnail_model, &image_iter, COL_THUMB_ARTWORK, &image, -1);
+
+		gtk_list_store_remove (GTK_LIST_STORE(thumbnail_model), &image_iter);
+		if (delete_pics)
+			itdb_photodb_remove_photo (photodb, NULL, image); /* pass in NULL to delete pics as well */
+		else
+			itdb_photodb_remove_photo (photodb, selected_album, image);
+	}
+
+	g_free (album_name);
+
+	signal_data_changed ();
+}
+
+/**
+ * gphoto_rename_selected_album
+ *
+ * Remove the selected image from the album
+ * 
+ */
+void gphoto_rename_selected_album ()
+{
+	gchar *album_name= NULL;
+	PhotoAlbum *selected_album;
+	GtkTreeSelection *selection;
+	/* Get the currently selected album */
+	selection = gtk_tree_view_get_selection (album_view);
+	album_name= gphoto_get_selected_album_name (selection);
+	/* Find the selected album. If no selection then returns the Main Album */
+	selected_album = itdb_photodb_photoalbum_by_name (photodb, album_name);
+	g_return_if_fail (selected_album);
+	
+	if (selected_album->album_type == 0x01)
+	{
+		/* Dont rename the Photo Library */
+		return;
+	}
+	
+	gchar *new_album_name = get_user_string (
+			_("New Photo Album Name"),
+			_("Please enter a new name for the photo album"), 
+			NULL, 
+			NULL, 
+			NULL);
+	if (new_album_name == NULL|| strlen (new_album_name) == 0)
+		return;
+	
+	/* Check an album with this name doesnt already exist */
+	PhotoAlbum *curr_album;
+	curr_album = itdb_photodb_photoalbum_by_name (photodb, new_album_name);
+	if (curr_album != NULL)
+	{
+		gtkpod_warning (_("An album with that name already exists."));
+		g_free (new_album_name);
+		return;
+	}
+	
+	/* Rename the album in the database */
+	selected_album->name = g_strdup (new_album_name);
+	
+	/* Update the row in the album view */
+	GtkTreeModel *album_model;
+	GtkTreeIter iter;
+	
+	album_model = gtk_tree_view_get_model (album_view);
+	if (gtk_tree_selection_get_selected (selection, &album_model, &iter) == TRUE)
+	{
+		gtk_list_store_set (GTK_LIST_STORE(album_model), &iter, COL_ALBUM_NAME, new_album_name, -1);;
+	}
+		
+	g_free (new_album_name);
+	
+	signal_data_changed();
+	
+	/* Using the existing selection, reselect the album so it reloads the preview of the first image */
+	gphoto_album_selection_changed (selection, NULL);
+}
+
+/**
+ * 
+ * gphoto_button_press:
+ * 
+ *  When right mouse button is pressed on one of the widgets,
+ * a popup menu is displayed.
+ * 
+ * @ w: widget upon which button press has occurred
+ * @ e: button event
+ * @ data: not used
+ */
+static gboolean gphoto_button_press(GtkWidget *w, GdkEventButton *e, gpointer data)
+{
+	g_return_val_if_fail (w && e, FALSE);
+	switch (e->button)
+	{
+		case 3:
+			gphoto_context_menu_init (GPOINTER_TO_INT(data));
+			return TRUE;
+		default:
+			break;
+	}
+	return FALSE;
+}
+
+/* Callbacks for the menu items in the photo window */
+
+/**
+ * on_photodb_add_album_menuItem_activate:
+ *
+ * Callback for add album menu item
+ * 
+ * @ menuitem: add album menu item
+ * @ user_data: not used
+ * 
+ */
+void on_photodb_add_album_menuItem_activate(GtkMenuItem *menuItem, gpointer user_data)
+{
+	PhotoAlbum *new_album;
+	GtkTreeIter iter;
+	GtkListStore *model;
+
+	gchar *album_name = get_user_string (
+			_("New Photo Album"),
+			_("Please enter a name for the new photo album"), 
+			NULL, 
+			NULL, 
+			NULL);
+
+	if (album_name == NULL|| strlen (album_name) == 0)
+		return;
+
+	/* Check an album with this name doesnt already exist */
+	new_album = itdb_photodb_photoalbum_by_name (photodb, album_name);
+	if (new_album != NULL)
+	{
+		gtkpod_warning (_("An album with that name already exists."));
+		g_free (album_name);
+		return;
+	}
+
+	/* Album doesn't exist so create it */
+	new_album = itdb_photodb_photoalbum_create (photodb, album_name, -1);
+	if (new_album == NULL)
+	{
+		gtkpod_warning (_("The new album failed to be created."));
+		g_free (album_name);
+		return;
+	}
+
+	model = GTK_LIST_STORE (gtk_tree_view_get_model (album_view));
+	gtk_list_store_append (model, &iter);
+	gtk_list_store_set (model, &iter, COL_ALBUM_NAME, album_name, -1);
+
+	g_free (album_name);
+	signal_data_changed ();
+}
+
+/**
+ * on_photodb_add_image_menuItem_activate:
+ *
+ * Callback for add image menu item
+ * 
+ * @ menuitem: add image menu item
+ * @ user_data: not used
+ * 
+ */
+void on_photodb_add_image_menuItem_activate(GtkMenuItem *menuItem, gpointer user_data)
+{
+	gchar *image_name = fileselection_get_file_or_dir (_("Add Image to iPod"), 
+	NULL, GTK_FILE_CHOOSER_ACTION_OPEN);
+
+	if (image_name == NULL)
+		return;
+
+	gphoto_add_image_to_database (image_name);
+
+	g_free (image_name);
+}
+
+/**
+ * _strptrcmp:
+ *
+ * Comparision function for comparing the filenames
+ * of newly added images.
+ * 
+ * @ a: filename 1
+ * @ b: filename 2
+ * 
+ */
+static int _strptrcmp(const void* _a, const void* _b)
+{
+	const char* const* a = (const char* const*) _a;
+	const char* const* b = (const char* const*) _b;
+
+	/* paranoia */
+	if (a == b)
+		return 0;
+	else if (!a)
+		return -1;
+	else if (!b)
+		return 1;
+	/* real work */
+	else if (*a == *b)
+		return 0;
+	else
+		return strcmp(*a, *b);
+}
+
+/**
+ * on_photodb_add_image_dir_menuItem_activate:
+ *
+ * Callback for add image directory menu item
+ * 
+ * @ menuitem: add album menu item
+ * @ user_data: not used
+ * 
+ */
+void on_photodb_add_image_dir_menuItem_activate(GtkMenuItem *menuItem, gpointer user_data)
+{
+	GDir *directory;
+	GError *error= NULL;
+
+	/* Open a dialog directory chooser window */
+	gchar*dir_name = fileselection_get_file_or_dir (_("Add a Directory of Images to the iPod. Select the Directory."), 
+	NULL, GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
+
+	if (dir_name == NULL)
+		return;
+
+	if (!g_file_test (dir_name, G_FILE_TEST_IS_DIR))
+	{
+		g_free (dir_name);
+		return;
+	}
+
+	/* Get the directory from the name chosen */
+	directory = g_dir_open (dir_name, 0, &error);
+
+	if (directory == NULL)
+	{
+		if (error && error->message)
+			gtkpod_warning ("%s\n\n", error->message);
+		else
+			g_warning ("error->message == NULL!\n");
+
+		g_error_free (error);
+		error = NULL;
+		g_free (dir_name);
+		return;
+	}
+
+	/* Leaf through all the files inside the directory and check if they are image
+	 * files. If they are then add them to the database.
+	 */
+	G_CONST_RETURN gchar *filename;
+	GPtrArray* filename_arr = g_ptr_array_new();
+	unsigned u;
+	
+	do
+	{
+		filename = g_dir_read_name(directory);
+		if (filename != NULL)
+		{
+			g_ptr_array_add(filename_arr, (void*) filename);
+		}
+	} while (filename != NULL);
+	
+	/* Conduct an alphabetical sort on the filenames so
+	 * they are added in order.
+	 */
+	g_ptr_array_sort(filename_arr, _strptrcmp);
+
+	for (u = 0; u < filename_arr->len; ++u)
+	{
+		gchar *full_filename;
+		GdkPixbufFormat *fileformat= NULL;
+
+		filename = g_ptr_array_index(filename_arr, u);
+		full_filename = g_build_filename (dir_name, filename, NULL);
+
+		/* Only allow valid image files to be added to the photo db. If it file is not a
+		 * valid image according to pixbuf then that is good enough for me!
+		 */
+		fileformat = gdk_pixbuf_get_file_info (full_filename, NULL, NULL);
+		if (fileformat != NULL)
+		{
+			gphoto_add_image_to_database (full_filename);
+		}
+		g_free (full_filename);
+	}
+
+	g_ptr_array_free(filename_arr, TRUE);
+	g_dir_close(directory);
+	g_free(dir_name);
+}
+
+/**
+ * on_photodb_remove_album_menuItem_activate:
+ *
+ * Callback for remove album menu item
+ * 
+ * @ menuitem: remove album menu item
+ * @ user_data: not used
+ * 
+ */
+void on_photodb_remove_album_menuItem_activate(GtkMenuItem *menuItem, gpointer user_data)
+{
+	gphoto_remove_album_from_database ();
+}
+
+/**
+ * on_photodb_remove_image_menuItem_activate:
+ *
+ * Callback for remove image menu item
+ * 
+ * @ menuitem: remove image menu item
+ * @ user_data: not used
+ * 
+ */
+void on_photodb_remove_image_menuItem_activate(GtkMenuItem *menuItem, gpointer user_data)
+{
+	gphoto_remove_selected_photos_from_album (TRUE);
+}
+
+/**
+ * on_photodb_view_full_size_menuItem_activate
+ *
+ * Callback used to display a dialog contain a full 
+ * size / screen size version of the selected image.
+ * Same as that used in coverart display.
+ * 
+ * @ menuitem: remove image menu item
+ * @ user_data: not used
+ * 
+ */
+void on_photodb_view_full_size_menuItem_activate (GtkMenuItem *menuItem, gpointer user_data)
+{
+	GList * selected_images;
+	GtkTreeModel *model;
+	GtkTreePath *treePath = NULL;
+	GtkTreeIter iter;
+	Artwork *artwork = NULL;
+	GdkPixbuf * pixbuf;
+	gint i;
+	Thumb *thumb = NULL;
+	
+	/* Find which images are selected */
+	selected_images = gtk_icon_view_get_selected_items (GTK_ICON_VIEW(thumbnail_view));
+	if (selected_images == NULL|| g_list_length (selected_images) == 0)
+		return;
+
+	/* Using the model find the first Artwork object from the selected images list
+	 * Should only be one in the list if the toolbar button is being enabled/disabled
+	 * correctly.
+	 */
+	model = gtk_icon_view_get_model (GTK_ICON_VIEW(thumbnail_view));
+				
+	treePath = g_list_nth_data (selected_images, 0);
+	gtk_tree_model_get_iter (model, &iter, treePath);
+	gtk_tree_model_get (model, &iter, COL_THUMB_ARTWORK, &artwork, -1);
+	
+	/* Find the biggest thumb that exists on the pod */
+	for (i = (PHOTO_TYPES_SIZE - 1); i >= 0 && thumb == NULL; --i)
+	{
+		/* Start from biggest photo type and go smaller */
+		thumb = itdb_artwork_get_thumb_by_type (artwork, photo_types[i]);
+	}
+	/* should have a thumb now but check anyway and fire off a warning if it is still null */
+	g_return_if_fail (thumb);
+		
+	pixbuf = itdb_thumb_get_gdk_pixbuf (device, thumb);
+	g_return_if_fail (pixbuf);
+	
+	display_image_dialog (pixbuf);
+
+}
+
+/**
+ * on_photodb_rename_album_menuItem_activate
+ *
+ * Callback used to rename an album.
+ * 
+ * @ menuitem: remove image menu item
+ * @ user_data: not used
+ * 
+ */
+void on_photodb_rename_album_menuItem_activate (GtkMenuItem *menuItem, gpointer user_data)
+{
+	gphoto_rename_selected_album ();
+}
+
+/* -----------------------------------------------------------*/
+/* Section for album display                                  */
+/* drag and drop                                                   */
+/* -----------------------------------------------------------*/
+
+/**
+ * dnd_album_drag_drop:
+ *
+ * Allow dnd of an image onto an album row in the
+ * album tree. Gives ability to add an image to a
+ * different album.
+ * 
+ */
+static gboolean dnd_album_drag_drop(GtkWidget *widget, GdkDragContext *drag_context, gint x, gint y, guint time, gpointer user_data)
+{
+	GdkAtom target;
+	target = gtk_drag_dest_find_target (widget, drag_context, NULL);
+
+	if (target != GDK_NONE)
+	{
+		gboolean rowfound;
+		
+		/* determine whether a row has been dropped over in album view */
+		rowfound = gtk_tree_view_get_dest_row_at_pos (GTK_TREE_VIEW(widget), x, y, NULL, NULL);
+		if (rowfound == TRUE)
+		{
+			gtk_drag_get_data (widget, drag_context, target, time);
+			return TRUE;
+		}
+		else
+			return FALSE;
+	}
+	return FALSE;
+}
+
+/**
+ * dnd_images_drag_data_get:
+ *
+ * Provide the images which are to be dnded
+ * onto the new album in the album tree.
+ * 
+ */
+static void dnd_images_drag_data_get(GtkWidget *widget, GdkDragContext *dc, GtkSelectionData *data, guint info, guint time,
+		gpointer user_data)
+{
+	GtkTreeModel *model;
+	GList *selected_images;
+	gint i;
+	
+	if (!data)
+		return;
+
+	/* Find which images are selected */
+	selected_images = gtk_icon_view_get_selected_items (GTK_ICON_VIEW(widget));
+	if (selected_images == NULL|| g_list_length (selected_images) == 0)
+		return;
+
+	model = gtk_icon_view_get_model (GTK_ICON_VIEW(widget));
+	
+	GtkTreePath *treePath = NULL;
+	GtkTreeIter iter;
+	Artwork *artwork = NULL;
+	GString *reply = g_string_sized_new (2000);
+				
+	for (i = 0; i < g_list_length(selected_images); ++i)
+	{
+		treePath = g_list_nth_data (selected_images, i);
+		gtk_tree_model_get_iter (model, &iter, treePath);
+		gtk_tree_model_get (model, &iter, COL_THUMB_ARTWORK, &artwork, -1);
+		g_string_append_printf (reply, "%p\n", artwork);
+	}
+	
+	switch (info)
+	{
+		case DND_GTKPOD_PHOTOIMAGELIST:
+			gtk_selection_data_set(data, data->target, 8, reply->str, reply->len);
+			g_string_free (reply, TRUE);
+			break;
+		default:
+			g_warning ("Programming error: pm_drag_data_get received unknown info type (%d)\n", info);
+			break;
+	}
+}
+
+/**
+ * dnd_album_data_received:
+ *
+ * The final part of the dnd images onto album dnd
+ * operation. This uses the data received and adds
+ * the images to the new album.
+ * 
+ */
+static void dnd_album_drag_data_received(GtkWidget *widget, GdkDragContext *dc, gint x, gint y, GtkSelectionData *data, guint info,
+		guint time, gpointer user_data)
+{
+	g_return_if_fail (widget);
+	g_return_if_fail (dc);
+	g_return_if_fail (data);
+	g_return_if_fail (data->length > 0);
+	g_return_if_fail (data->data);
+	g_return_if_fail (data->format == 8);
+
+	gboolean rowfound;
+	GtkTreePath *treepath;
+	GtkTreeModel *model;
+	GtkTreeIter iter;
+	gchar *tgt_name;
+	gchar *src_name;
+	PhotoAlbum *tgt_album;
+	PhotoAlbum *src_album;
+	
+	/* determine whether a row has been dropped over in album view */
+	rowfound = gtk_tree_view_get_dest_row_at_pos (GTK_TREE_VIEW(widget), x, y, &treepath, NULL);
+	if (! rowfound)
+	{
+		gtk_drag_finish (dc, FALSE, FALSE, time);
+		return;
+	}
+	
+	g_return_if_fail (treepath);
+	
+	model = gtk_tree_view_get_model (GTK_TREE_VIEW(widget));
+	
+	/* Find the target album to drop the artwork into */
+	if(gtk_tree_model_get_iter (model, &iter, treepath))
+		gtk_tree_model_get (model, &iter, COL_ALBUM_NAME, &tgt_name, -1);
+	
+	gtk_tree_path_free (treepath);
+	treepath = NULL;
+	g_return_if_fail (tgt_name);
+	
+	tgt_album = itdb_photodb_photoalbum_by_name (photodb, tgt_name);
+	g_return_if_fail (tgt_album);
+	if (tgt_name != NULL)
+		g_free (tgt_name);
+	
+	/* Find the selected album, ie. the source, or else the Photo Library if no selection */
+	GtkTreeSelection *selection = NULL;
+	selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(widget));
+	if (selection != NULL)
+		src_name = gphoto_get_selected_album_name (selection);
+	else
+		src_name = NULL;
+	
+	/* Find the selected album. If no selection then returns the Photo Library */
+	src_album = itdb_photodb_photoalbum_by_name (photodb, src_name);
+	g_return_if_fail (src_album);
+	if (src_name != NULL)
+		g_free (src_name);
+	
+	if (src_album == tgt_album)
+	{
+		gtk_drag_finish (dc, FALSE, FALSE, time);
+		return;
+	}
+	
+	Artwork *artwork;
+	GList *artwork_list = NULL;
+	gchar *datap = data->data;
+	gint i = 0;
+	
+	/* parse artwork and add each one to a GList */
+	while (parse_artwork_from_string (&datap, &artwork))
+		artwork_list = g_list_append (artwork_list, artwork);
+			    
+	if (tgt_album->album_type != 0x01)
+	{
+		/* Only if the target is not the Photo Library (which should have the photo
+		 * already) should the artwork be added to the album
+		 */
+		for (i = 0; i < g_list_length (artwork_list); ++i)
+		{
+			artwork = g_list_nth_data (artwork_list, i);
+			itdb_photodb_photoalbum_add_photo (photodb, tgt_album, artwork, -1);
+		}
+	}
+	
+	/* Remove the artwork from the selected album if it is not the Photo Library */	
+	if (src_album->album_type != 0x01)
+		gphoto_remove_selected_photos_from_album (FALSE);
+	
+	signal_data_changed ();
+}
+
+#if DEBUG
+static void debug_list_photos(iTunesDB *itdb)
+{
+	ExtraiTunesDBData *eitdb;
+	PhotoDB *db;
+	GList *gl_album;
+
+	eitdb = itdb->userdata;
+	db = eitdb->photodb;
+	if (db == NULL)
+	{
+		printf ("Reference to photo database is null\n");
+		return;
+	}
+
+	printf ("List of Photos stored on the ipod\n");
+	for (gl_album=db->photoalbums; gl_album; gl_album=gl_album->next)
+	{
+		GList *gl_photo;
+		PhotoAlbum *album = gl_album->data;
+		g_return_if_fail (album);
+
+		printf ("%s: ", album->name ? album->name : _("<Unnamed>"));
+
+		for (gl_photo=album->members; gl_photo; gl_photo=gl_photo->next)
+		{
+			Artwork *photo = gl_photo->data;
+			g_return_if_fail (photo);
+
+			printf ("%d ", photo->id);
+		}
+		if (g_list_length (album->members) > 0)
+		{
+			printf ("\n");
+		} else
+		{
+			printf (_("<No members>\n"));
+		}
+	}
+}
+#endif
+	

Added: trunk/src/display_photo.h
===================================================================
--- trunk/src/display_photo.h	                        (rev 0)
+++ trunk/src/display_photo.h	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,66 @@
+/*
+|  Copyright (C) 2007 P.G. Richardson <phantom_sf at users.sourceforge.net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+| 
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+| 
+|  iTunes and iPod are trademarks of Apple
+| 
+|  This product is not supported/written/published by Apple!
+|
+*/
+
+#ifndef DISPLAY_PHOTO_H_
+#define DISPLAY_PHOTO_H_
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <gtk/gtk.h>
+#include "display_itdb.h"
+
+/* Gtkpod value for the photo playlists on the ipod.
+ * This means a different value from both the mpl and podcast playlist values defined in libgpod.
+ * Dont want to change latter as this is not a real playlist defined on the ipod but used for gtkpod
+ * purposes only.
+ */
+#define GP_PL_TYPE_PHOTO 2
+/* The values set in itdb_artwork.c for the width and height of ITDB_THUMB_PHOTO_FULL_SCREEN */
+#define PHOTO_FULL_SCREEN_WIDTH 220
+#define PHOTO_FULL_SCREEN_HEIGHT 176
+
+/* Drag n Drop */
+#define DND_GTKPOD_PHOTOIMAGELIST_TYPE "application/gtkpod-photoimagelist"
+#define DND_GTKPOD_PHOTOIMAGELIST 1
+
+#define GPHOTO_ALBUM_VIEW 0
+#define GPHOTO_ICON_VIEW 1
+#define GPHOTO_PREVIEW 2
+
+void gphoto_load_photodb (iTunesDB *itdb);
+gboolean gphoto_ipod_supports_photos (iTunesDB *itdb);
+gboolean gphoto_is_photo_playlist (Playlist *pl);
+void gphoto_display_photo_window (iTunesDB *itdb);
+void gphoto_change_to_photo_window (gboolean showflag);
+gint gphoto_get_selected_photo_count ();
+void gphoto_remove_selected_photos_from_album (gboolean show_dialogs);
+void gphoto_remove_album_from_database ();
+void gphoto_rename_selected_album ();
+
+#endif /*DISPLAY_PHOTO_H_*/

Added: trunk/src/display_playlists.c
===================================================================
--- trunk/src/display_playlists.c	                        (rev 0)
+++ trunk/src/display_playlists.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,2428 @@
+/*
+|  Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+| 
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+| 
+|  iTunes and iPod are trademarks of Apple
+| 
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: display_playlists.c 1776 2007-11-12 22:38:00Z phantom_sf $
+*/
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <string.h>
+#include <stdlib.h>
+#include <gdk/gdkkeysyms.h>
+
+#include "display_private.h"
+#include "prefs.h"
+#include "misc.h"
+#include "misc_track.h"
+#include "info.h"
+#include "context_menus.h"
+#include "display_photo.h"
+#include "stock_icons.h"
+
+/* pointer to the treeview for the playlist display */
+static GtkTreeView *playlist_treeview = NULL;
+/* pointer to the currently selected playlist */
+static Playlist *current_playlist = NULL;
+/* flag set if selection changes to be ignored temporarily */
+static gboolean pm_selection_blocked = FALSE;
+
+
+/* Drag and drop definitions */
+static GtkTargetEntry pm_drag_types [] = {
+    { DND_GTKPOD_PLAYLISTLIST_TYPE, 0, DND_GTKPOD_PLAYLISTLIST },
+    { "text/uri-list", 0, DND_TEXT_URI_LIST },
+    { "text/plain", 0, DND_TEXT_PLAIN },
+    { "STRING", 0, DND_TEXT_PLAIN }
+};
+static GtkTargetEntry pm_drop_types [] = {
+    { DND_GTKPOD_PLAYLISTLIST_TYPE, 0, DND_GTKPOD_PLAYLISTLIST },
+    { DND_GTKPOD_TRACKLIST_TYPE, 0, DND_GTKPOD_TRACKLIST },
+    { "text/uri-list", 0, DND_TEXT_URI_LIST },
+    { "text/plain", 0, DND_TEXT_PLAIN },
+    { "STRING", 0, DND_TEXT_PLAIN }
+};
+
+
+static void pm_rows_reordered (void);
+static GtkTreePath *pm_get_path_for_itdb (iTunesDB *itdb);
+static GtkTreePath *pm_get_path_for_playlist (Playlist *pl);
+static gint pm_get_position_for_playlist (Playlist *pl);
+static gboolean pm_get_iter_for_itdb (iTunesDB *itdb, GtkTreeIter *iter);
+static gboolean pm_get_iter_for_playlist (Playlist *pl, GtkTreeIter *iter);
+
+
+
+/* ---------------------------------------------------------------- */
+/* Section for playlist display                                     */
+/* drag and drop                                                    */
+/* ---------------------------------------------------------------- */
+
+
+/* ----------------------------------------------------------------
+ *
+ * For drag and drop within the playlist view the following rules apply:
+ *
+ * 1) Drags between different itdbs: playlists are copied (moved with
+ *    CONTROL pressed)
+ *
+ * 2) Drags within the same itdb: playlist is moved (copied with CONTROL
+ *    pressed)
+ *
+ * ---------------------------------------------------------------- */
+
+
+static void pm_drag_begin (GtkWidget *widget,
+			   GdkDragContext *drag_context,
+			   gpointer user_data)
+{
+/*     puts ("drag_begin"); */
+}
+
+
+/* remove dragged playlist after successful MOVE */
+static void pm_drag_data_delete (GtkWidget *widget,
+			   GdkDragContext *drag_context,
+			   gpointer user_data)
+{
+    void pm_drag_data_delete_remove_playlist(
+	GtkTreeModel *tm, GtkTreePath *tp,
+	GtkTreeIter *iter, gpointer data)
+	{
+	    Playlist *pl;
+	    g_return_if_fail (tm);
+	    g_return_if_fail (iter);
+	    gtk_tree_model_get (tm, iter, PM_COLUMN_PLAYLIST, &pl, -1);
+	    g_return_if_fail (pl);
+	    gp_playlist_remove (pl);
+	}
+
+    g_return_if_fail (widget);
+    g_return_if_fail (drag_context);
+
+/*     printf ("drag_data_delete: %d\n", drag_context->action); */
+
+    if (drag_context->action == GDK_ACTION_MOVE)
+    {
+	GtkTreeSelection *ts = gtk_tree_view_get_selection(
+	    GTK_TREE_VIEW (widget));
+	gtk_tree_selection_selected_foreach (ts, pm_drag_data_delete_remove_playlist, NULL);
+    }
+}
+
+static gboolean pm_drag_drop (GtkWidget *widget,
+			      GdkDragContext *drag_context,
+			      gint x,
+			      gint y,
+			      guint time,
+			      gpointer user_data)
+{
+    GdkAtom target;
+
+/*     puts ("drag_data_drop"); */
+
+    display_remove_autoscroll_row_timeout (widget);
+
+    target = gtk_drag_dest_find_target (widget, drag_context, NULL);
+
+    if (target != GDK_NONE)
+    {
+	gtk_drag_get_data (widget, drag_context, target, time);
+	return TRUE;
+    }
+    return FALSE;
+}
+
+static void pm_drag_end (GtkWidget *widget,
+			 GdkDragContext *drag_context,
+			 gpointer user_data)
+{
+/*     puts ("drag_end"); */
+    display_remove_autoscroll_row_timeout (widget);
+    gtkpod_tracks_statusbar_update ();
+}
+
+static void pm_drag_leave (GtkWidget *widget,
+			   GdkDragContext *drag_context,
+			   guint time,
+			   gpointer user_data)
+{
+/*     puts ("drag_leave"); */
+    display_remove_autoscroll_row_timeout (widget);
+}
+
+static gboolean pm_drag_motion (GtkWidget *widget,
+				GdkDragContext *dc,
+				gint x,
+				gint y,
+				guint time,
+				gpointer user_data)
+{
+    GtkTreeModel *model;
+    GtkTreeIter iter_d;
+    GtkTreePath *path;
+    GtkTreeViewDropPosition pos;
+    GdkAtom target;
+    guint info;
+    Playlist *pl_d;
+    iTunesDB *itdb;
+    ExtraiTunesDBData *eitdb;
+
+    g_return_val_if_fail (widget, FALSE);
+    g_return_val_if_fail (GTK_IS_TREE_VIEW (widget), FALSE);
+
+    display_install_autoscroll_row_timeout (widget);
+
+    /* no drop possible if position is not valid */
+    if (!gtk_tree_view_get_dest_row_at_pos (GTK_TREE_VIEW (widget),
+					    x, y, &path, &pos))
+	return FALSE;
+
+    g_return_val_if_fail (path, FALSE);
+
+/*     printf ("pm_drag_motion (x/y/pos/s/a): %d %d %d %d %d\n", */
+/* 	    x, y, pos, dc->suggested_action, dc->actions); */
+
+    gtk_tree_view_set_drag_dest_row (GTK_TREE_VIEW (widget), path, pos);
+
+    /* Get destination playlist in case it's needed */
+    model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
+    g_return_val_if_fail (model, FALSE);
+
+    if(gtk_tree_model_get_iter (model, &iter_d, path))
+    {
+	gtk_tree_model_get (model, &iter_d, PM_COLUMN_PLAYLIST, &pl_d, -1);
+    }
+    g_return_val_if_fail (pl_d, FALSE);
+    itdb = pl_d->itdb;
+    g_return_val_if_fail (itdb, FALSE);
+    eitdb = itdb->userdata;
+    g_return_val_if_fail (eitdb, FALSE);
+
+    target = gtk_drag_dest_find_target (widget, dc, NULL);
+
+    /* no drop possible if repository is not loaded */
+    if (!eitdb->itdb_imported)
+    {
+	gtk_tree_path_free (path);
+	gdk_drag_status (dc, 0, time);
+	return FALSE;
+    }
+
+    /* no drop possible if no valid target can be found */
+    if (target == GDK_NONE)
+    {
+	gtk_tree_path_free (path);
+	gdk_drag_status (dc, 0, time);
+	return FALSE;
+    }
+
+    /* no drop possible _before_ MPL */
+    if (gtk_tree_path_get_depth (path) == 1)
+    {   /* MPL */
+	if (pos == GTK_TREE_VIEW_DROP_BEFORE)
+	{
+	    gtk_tree_path_free (path);
+	    gdk_drag_status (dc, 0, time);
+	    return FALSE;
+	}
+    }
+
+    /* get 'info'-id from target-atom */
+    if (!gtk_target_list_find (
+	    gtk_drag_dest_get_target_list (widget), target, &info))
+    {
+	gtk_tree_path_free (path);
+	gdk_drag_status (dc, 0, time);
+	return FALSE;
+    }
+
+    switch (info)
+    {
+    case DND_GTKPOD_PLAYLISTLIST:
+	/* need to consult drag data to decide */
+	g_object_set_data (G_OBJECT (widget), "drag_data_by_motion_path", path);
+	g_object_set_data (G_OBJECT (widget), "drag_data_by_motion_pos", (gpointer)pos);
+	gtk_drag_get_data (widget, dc, target, time);
+	return TRUE;
+    case DND_GTKPOD_TRACKLIST:
+	/* do not allow drop into currently selected playlist */
+	if (pl_d == pm_get_selected_playlist ())
+	{
+	    if ((pos == GTK_TREE_VIEW_DROP_INTO_OR_BEFORE) ||
+		(pos == GTK_TREE_VIEW_DROP_INTO_OR_AFTER))
+	    {
+		gtk_tree_path_free (path);
+		gdk_drag_status (dc, 0, time);
+		return FALSE;
+	    }
+	}
+	/* need to consult drag data to decide */
+	g_object_set_data (G_OBJECT (widget), "drag_data_by_motion_path", path);
+	g_object_set_data (G_OBJECT (widget), "drag_data_by_motion_pos", (gpointer)pos);
+	gtk_drag_get_data (widget, dc, target, time);
+	return TRUE;
+    case DND_TEXT_PLAIN:
+    case DND_TEXT_URI_LIST:
+	gdk_drag_status (dc, dc->suggested_action, time);
+	gtk_tree_path_free (path);
+	return TRUE;
+    default:
+	g_warning ("Programming error: pm_drag_motion received unknown info type (%d)\n", info);
+	gtk_tree_path_free (path);
+	return FALSE;
+    }
+}
+
+
+
+/*
+ * utility function for appending file for track view (DND)
+ */
+static void 
+on_pm_dnd_get_file_foreach(GtkTreeModel *tm, GtkTreePath *tp, 
+			   GtkTreeIter *iter, gpointer data)
+{
+    Playlist *pl=NULL;
+    GList *gl;
+    GString *filelist = data;
+
+    g_return_if_fail (tm);
+    g_return_if_fail (iter);
+    g_return_if_fail (data);
+
+    /* get current playlist */
+    gtk_tree_model_get (tm, iter, PM_COLUMN_PLAYLIST, &pl, -1); 
+    g_return_if_fail (pl);
+
+    for (gl=pl->members; gl; gl=gl->next)
+    {
+	gchar *name;
+	Track *track = gl->data;
+
+	g_return_if_fail (track);
+	name = get_file_name_from_source (track, SOURCE_PREFER_LOCAL);
+	if (name)
+	{
+	    g_string_append_printf (filelist, "file:%s\n", name);
+	    g_free (name);
+	}
+    }
+}
+
+
+/*
+ * utility function for appending uris for track view (DND)
+ */
+static void 
+on_pm_dnd_get_uri_foreach(GtkTreeModel *tm, GtkTreePath *tp, 
+			  GtkTreeIter *iter, gpointer data)
+{
+    Playlist *pl=NULL;
+    GList *gl;
+    GString *filelist = data;
+
+    g_return_if_fail (tm);
+    g_return_if_fail (iter);
+    g_return_if_fail (data);
+
+    /* get current playlist */
+    gtk_tree_model_get (tm, iter, PM_COLUMN_PLAYLIST, &pl, -1); 
+    g_return_if_fail (pl);
+
+    for (gl=pl->members; gl; gl=gl->next)
+    {
+	gchar *name;
+	Track *track = gl->data;
+
+	g_return_if_fail (track);
+	name = get_file_name_from_source (track, SOURCE_PREFER_LOCAL);
+	if (name)
+	{
+	    gchar *uri = g_filename_to_uri (name, NULL, NULL);
+	    if (uri)
+	    {
+		g_string_append_printf (filelist, "file:%s\n", name);
+		g_free (uri);
+	    }
+	    g_free (name);
+	}
+    }
+}
+
+
+/*
+ * utility function for appending pointers to a playlist (DND)
+ */
+static void
+on_pm_dnd_get_playlist_foreach(GtkTreeModel *tm, GtkTreePath *tp,
+			       GtkTreeIter *iter, gpointer data)
+{
+    Playlist *pl=NULL;
+    GString *playlistlist = (GString *)data;
+
+    g_return_if_fail (tm);
+    g_return_if_fail (iter);
+    g_return_if_fail (playlistlist);
+
+    gtk_tree_model_get (tm, iter, PM_COLUMN_PLAYLIST, &pl, -1);
+    g_return_if_fail (pl);
+    g_string_append_printf (playlistlist, "%p\n", pl);
+}
+
+
+
+static void
+pm_drag_data_get (GtkWidget       *widget,
+		  GdkDragContext  *dc,
+		  GtkSelectionData *data,
+		  guint            info,
+		  guint            time,
+		  gpointer         user_data)
+{
+    GtkTreeSelection *ts;
+    GString *reply = g_string_sized_new (2000);
+
+    if (!data) return;
+
+/*     puts ("data_get"); */
+
+    /* printf("sm drag get info: %d\n", info);*/
+
+    ts = gtk_tree_view_get_selection(GTK_TREE_VIEW (widget));
+    if (ts)
+    {
+	switch (info)
+	{
+	case DND_GTKPOD_PLAYLISTLIST:
+	    gtk_tree_selection_selected_foreach(ts,
+				    on_pm_dnd_get_playlist_foreach, reply);
+	    break;
+	case DND_TEXT_PLAIN:
+	    gtk_tree_selection_selected_foreach(ts,
+				    on_pm_dnd_get_file_foreach, reply);
+	    break;
+	case DND_TEXT_URI_LIST:
+	    gtk_tree_selection_selected_foreach(ts,
+				    on_pm_dnd_get_uri_foreach, reply);
+	    break;
+	default:
+	    g_warning ("Programming error: pm_drag_data_get received unknown info type (%d)\n", info);
+	    break;
+	}
+    }
+    gtk_selection_data_set(data, data->target, 8, reply->str, reply->len);
+    g_string_free (reply, TRUE);
+}
+
+
+/* get the action to be used for a drag and drop within the playlist
+ * view */
+static GdkDragAction pm_pm_get_action (Playlist *src, Playlist *dest,
+				       GtkWidget *widget,
+				       GtkTreeViewDropPosition pos,
+				       GdkDragContext *dc)
+{
+    GdkModifierType mask;
+
+    g_return_val_if_fail (src, 0);
+    g_return_val_if_fail (dest, 0);
+    g_return_val_if_fail (widget, 0);
+    g_return_val_if_fail (dc, 0);
+
+    /* get modifier mask */
+    gdk_window_get_pointer (
+	gtk_tree_view_get_bin_window (GTK_TREE_VIEW (widget)),
+	NULL, NULL, &mask);
+
+    /* don't allow copy/move before the MPL */
+    if ((itdb_playlist_is_mpl (dest)) && 
+	(pos == GTK_TREE_VIEW_DROP_BEFORE))
+	return 0;
+
+    /* don't allow moving of MPL */
+    if (itdb_playlist_is_mpl (src))
+	return GDK_ACTION_COPY;
+
+    /* don't allow drop onto itself */
+    if ((src == dest) &&
+	((pos == GTK_TREE_VIEW_DROP_INTO_OR_AFTER) ||
+	 (pos == GTK_TREE_VIEW_DROP_INTO_OR_BEFORE)))
+	return 0;
+
+    if (src->itdb == dest->itdb)
+    {   /* DND within the same itdb */
+        /* don't allow copy/move onto MPL */
+	if ((itdb_playlist_is_mpl (dest)) &&
+	    (pos != GTK_TREE_VIEW_DROP_AFTER))
+	    return 0;
+
+	/* DND within the same itdb -> default is moving, shift means
+	   copying */
+	if (mask & GDK_SHIFT_MASK)
+	{
+	    return GDK_ACTION_COPY;
+	}
+	else
+	{   /* don't allow move if view is sorted */
+	    gint column;
+	    GtkSortType order;
+	    GtkTreeModel *model;
+	    GtkWidget *src_widget = gtk_drag_get_source_widget (dc);
+	    g_return_val_if_fail (src_widget, 0);
+	    model = gtk_tree_view_get_model (GTK_TREE_VIEW(src_widget));
+	    g_return_val_if_fail (model, 0);
+	    if (gtk_tree_sortable_get_sort_column_id (
+		    GTK_TREE_SORTABLE (model), &column, &order))
+	    {
+		return 0;
+	    }
+	    else
+	    {
+		return GDK_ACTION_MOVE;
+	    }
+	}
+    }
+    else
+    {   /* DND between different itdbs */
+	/* Do not allow drags from the iPod in offline mode */
+	if (get_offline (src->itdb) &&
+	    (src->itdb->usertype & GP_ITDB_TYPE_IPOD))
+	{   /* give a notice on the statusbar -- otherwise the user
+	     * will never know why the drag is not possible */
+	    gtkpod_statusbar_message (_("Error: drag from iPod not possible in offline mode."));
+	    return 0;
+	}
+	/* default is copying, shift means moving */
+	if (mask & GDK_SHIFT_MASK)
+	    return GDK_ACTION_MOVE;
+	else
+	    return GDK_ACTION_COPY;
+    }
+}
+
+
+/* get the action to be used for a drag and drop from the track view
+ * or filter tab view to the playlist view */
+static GdkDragAction pm_tm_get_action (Track *src, Playlist *dest,
+				       GtkTreeViewDropPosition pos,
+				       GdkDragContext *dc)
+{
+    g_return_val_if_fail (src, 0);
+    g_return_val_if_fail (dest, 0);
+    g_return_val_if_fail (dc, 0);
+
+
+    /* don't allow copy/move before the MPL */
+    if ((itdb_playlist_is_mpl (dest)) &&
+	(pos == GTK_TREE_VIEW_DROP_BEFORE))
+	return 0;
+
+    if (src->itdb == dest->itdb)
+    {   /* DND within the same itdb */
+        /* don't allow copy/move onto MPL */
+	if ((itdb_playlist_is_mpl (dest)) &&
+	    (pos != GTK_TREE_VIEW_DROP_AFTER))
+	    return 0;
+    }
+    else
+    {   /* drag between different itdbs */
+	/* Do not allow drags from the iPod in offline mode */
+	if (get_offline (src->itdb) &&
+	    (src->itdb->usertype & GP_ITDB_TYPE_IPOD))
+	{   /* give a notice on the statusbar -- otherwise the user
+	     * will never know why the drag is not possible */
+	    gtkpod_statusbar_message (_("Error: drag from iPod not possible in offline mode."));
+	    return 0;
+	}
+    }
+    /* otherwise: do as suggested */
+    return dc->suggested_action;
+}
+
+
+/* Print a message about the number of tracks copied (the number of
+   tracks moved is printed in tm_drag_data_delete() */
+static void pm_tm_tracks_moved_or_copied (gchar *tracks, gboolean moved)
+{
+    g_return_if_fail (tracks);
+    if (!moved)
+    {
+	gchar *ptr = tracks;
+	gint n = 0;
+
+	/* count the number of tracks */
+	while ((ptr=strchr (ptr, '\n')))
+	{
+	    ++n;
+	    ++ptr;
+	}
+	/* display message in statusbar */
+	gtkpod_statusbar_message (
+	    ngettext ("Copied one track",
+		      "Copied %d tracks", n), n);
+    }
+}
+
+
+static void pm_drag_data_received (GtkWidget       *widget,
+				   GdkDragContext  *dc,
+				   gint             x,
+				   gint             y,
+				   GtkSelectionData *data,
+				   guint            info,
+				   guint            time,
+				   gpointer         user_data)
+{
+    GtkTreeIter iter_d, iter_s;
+    GtkTreePath *path_d=NULL;
+    GtkTreePath *path_m;
+    GtkTreeModel *model;
+    GtkTreeViewDropPosition pos = 0;
+    gint position = -1;
+    Playlist *pl, *pl_s, *pl_d;
+    Track *tr_s = NULL;
+    gboolean path_ok;
+    gboolean del_src;
+
+/* printf ("drag_data_received: x y a: %d %d %d\n", x, y, dc->suggested_action); */
+
+    g_return_if_fail (widget); 
+    g_return_if_fail (dc);
+    g_return_if_fail (data);
+    g_return_if_fail (data->length > 0);
+    g_return_if_fail (data->data);
+    g_return_if_fail (data->format == 8);
+
+/* puts(gtk_tree_path_to_string (path)); */
+
+    model = gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
+    g_return_if_fail (model);
+
+    path_m = g_object_get_data (G_OBJECT (widget), "drag_data_by_motion_path");
+
+    if (path_m)
+    {   /* this callback was caused by pm_drag_motion -- we are
+	 * supposed to call gdk_drag_status () */
+/* puts ("...by motion"); */
+        pos = (GtkTreeViewDropPosition)g_object_get_data (G_OBJECT (widget), "drag_data_by_motion_pos");
+        /* unset flag that */ 
+	g_object_set_data (G_OBJECT (widget), "drag_data_by_motion_path", NULL);
+	g_object_set_data (G_OBJECT (widget), "drag_data_by_motion_pos", NULL);
+	if(gtk_tree_model_get_iter (model, &iter_d, path_m))
+	{
+	    gtk_tree_model_get (model, &iter_d, PM_COLUMN_PLAYLIST, &pl, -1);
+	}
+	gtk_tree_path_free (path_m);
+
+	g_return_if_fail (pl);
+
+	switch (info)
+	{
+	case DND_GTKPOD_TRACKLIST:
+	    /* get first track and check itdb */
+	    sscanf (data->data, "%p", &tr_s);
+	    if (!tr_s)
+	    {
+		gdk_drag_status (dc, 0, time);
+		g_return_if_reached ();
+	    }
+	    gdk_drag_status (dc,
+			     pm_tm_get_action (tr_s, pl, pos, dc),
+			     time);
+/* 	    printf ("src: %p  dest: %p  sugg: %d a:%d\n", */
+/* 		    pl_s->itdb, pl->itdb, dc->suggested_action, */
+/* 		    pm_tm_get_action (tr_s, pl, pos, dc)); */
+	    return;
+	case DND_GTKPOD_PLAYLISTLIST:
+	    /* get first playlist and check itdb */
+	    sscanf (data->data, "%p", &pl_s);
+	    if (!pl_s)
+	    {
+		gdk_drag_status (dc, 0, time);
+		g_return_if_reached ();
+	    }
+	    gdk_drag_status (dc,
+			     pm_pm_get_action (pl_s, pl, widget, pos, dc),
+			     time);
+/* 	    printf ("src: %p  dest: %p  sugg: %d a:%d\n", */
+/* 		    pl_s->itdb, pl->itdb, dc->suggested_action, */
+/* 		    pm_pm_get_action (pl_s, pl, widget, pos, dc)); */
+	    return;
+	}
+	g_return_if_reached ();
+	return;
+    }
+
+/*     printf ("treeview received drag data/length/format: %p/%d/%d\n", data, data?data->length:0, data?data->format:0); */
+/*     printf ("treeview received drag context/actions/suggested action: %p/%d/%d\n", context, context?context->actions:0, context?context->suggested_action:0); */
+
+    display_remove_autoscroll_row_timeout (widget);
+
+    path_ok = gtk_tree_view_get_dest_row_at_pos (GTK_TREE_VIEW(widget),
+						 x, y, &path_d, &pos);
+
+    /* return if drop path is invalid */
+    if (!path_ok)
+    {
+	gtk_drag_finish (dc, FALSE, FALSE, time);
+	return;
+    }
+    g_return_if_fail (path_d);
+
+    if(gtk_tree_model_get_iter (model, &iter_d, path_d))
+    {
+	gtk_tree_model_get (model, &iter_d, PM_COLUMN_PLAYLIST, &pl, -1);
+    }
+    gtk_tree_path_free (path_d);
+    path_d = NULL;
+
+    g_return_if_fail (pl);
+
+    position = pm_get_position_for_playlist (pl);
+
+/*  printf("position: %d\n", position); */
+    switch (info)
+    {
+    case DND_GTKPOD_TRACKLIST:
+	/* get first track */
+	sscanf (data->data, "%p", &tr_s);
+	if (!tr_s)
+	{
+	    gtk_drag_finish (dc, FALSE, FALSE, time);
+	    g_return_if_reached ();
+	}
+
+	/* Find out action */
+	dc->action = pm_tm_get_action (tr_s, pl, pos, dc);
+
+	if (dc->action & GDK_ACTION_MOVE)
+	    del_src = TRUE;
+	else del_src = FALSE;
+
+	if ((pos == GTK_TREE_VIEW_DROP_INTO_OR_BEFORE) ||
+	    (pos == GTK_TREE_VIEW_DROP_INTO_OR_AFTER))
+	{ /* drop into existing playlist */
+	    /* copy files from iPod if necessary */
+	    GList *trackglist =
+		export_tracklist_when_necessary (tr_s->itdb,
+						 pl->itdb,
+						 data->data);
+	    if (trackglist)
+	    {
+		add_trackglist_to_playlist (pl, trackglist);
+		g_list_free (trackglist);
+		trackglist = NULL;
+		pm_tm_tracks_moved_or_copied (data->data, del_src);
+		gtk_drag_finish (dc, TRUE, del_src, time);
+	    }
+	    else
+	    {
+		gtk_drag_finish (dc, FALSE, FALSE, time);
+	    }
+	}
+	else
+	{ /* drop between playlists */
+	    Playlist *plitem;
+	    /* adjust position */
+	    if (pos == GTK_TREE_VIEW_DROP_AFTER)
+		plitem = add_new_pl_user_name (pl->itdb, NULL, position+1);
+	    else
+		plitem = add_new_pl_user_name (pl->itdb, NULL, position);
+
+	    if (plitem)
+	    {
+		/* copy files from iPod if necessary */
+		GList *trackglist =
+		    export_tracklist_when_necessary (tr_s->itdb,
+						     pl->itdb,
+						     data->data);
+		if (trackglist)
+		{
+		    add_trackglist_to_playlist (plitem, trackglist);
+		    g_list_free (trackglist);
+		    trackglist = NULL;
+		    pm_tm_tracks_moved_or_copied (data->data, del_src);
+		    gtk_drag_finish (dc, TRUE, del_src, time);
+		}
+		else
+		{
+		    gp_playlist_remove (plitem);
+		    plitem = NULL;
+		    gtk_drag_finish (dc, FALSE, FALSE, time);
+		}
+	    }
+	    else
+	    {
+		gtk_drag_finish (dc, FALSE, FALSE, time);
+	    }
+	}
+	break;
+    case DND_TEXT_URI_LIST:
+    case DND_TEXT_PLAIN:
+	if ((pos == GTK_TREE_VIEW_DROP_INTO_OR_BEFORE) ||
+	    (pos == GTK_TREE_VIEW_DROP_INTO_OR_AFTER))
+	{ /* drop into existing playlist */
+	    add_text_plain_to_playlist (pl->itdb, pl, data->data,
+					0, NULL, NULL);
+	    dc->action = GDK_ACTION_COPY;
+	    gtk_drag_finish (dc, TRUE, FALSE, time);
+	}
+	else
+	{ /* drop between playlists */
+	    Playlist *plitem;
+	    if (pos == GTK_TREE_VIEW_DROP_AFTER)
+		plitem = add_text_plain_to_playlist (
+		    pl->itdb, NULL, data->data, position+1, NULL, NULL);
+	    else
+		plitem = add_text_plain_to_playlist (
+		    pl->itdb, NULL, data->data, position, NULL, NULL);
+
+	    if (plitem)
+	    {
+		dc->action = GDK_ACTION_COPY;
+		gtk_drag_finish (dc, TRUE, FALSE, time);
+	    }
+	    else
+	    {
+		dc->action = 0;
+		gtk_drag_finish (dc, FALSE, FALSE, time);
+	    }
+	}
+	break;
+    case DND_GTKPOD_PLAYLISTLIST:
+	/* get first playlist and check action */
+	sscanf (data->data, "%p", &pl_s);
+	if (!pl_s)
+	{
+	    gtk_drag_finish (dc, FALSE, FALSE, time);
+	    g_return_if_reached ();
+	}
+
+	dc->action = pm_pm_get_action (pl_s, pl, widget, pos, dc);
+
+	if (dc->action == 0)
+	{
+	    gtk_drag_finish (dc, FALSE, FALSE, time);
+	    return;
+	}
+
+	if (pl->itdb == pl_s->itdb)
+	{   /* handle DND within the same itdb */
+	    switch (dc->action)
+	    {
+	    case GDK_ACTION_COPY:
+		/* if copy-drop is between two playlists, create new
+		 * playlist */
+		switch (pos)
+		{
+		case GTK_TREE_VIEW_DROP_BEFORE:
+		    pl_d = itdb_playlist_duplicate (pl_s);
+		    gp_playlist_add (pl->itdb, pl_d, position);
+		    break;
+		case GTK_TREE_VIEW_DROP_AFTER:
+		    pl_d = itdb_playlist_duplicate (pl_s);
+		    gp_playlist_add (pl->itdb, pl_d, position+1);
+		    break;
+		default:
+		    pl_d = pl;
+		    if (pl_d != pl_s)
+			add_trackglist_to_playlist (pl_d, pl_s->members);
+		    break;
+		}
+		gtk_drag_finish (dc, TRUE, FALSE, time);
+		break;
+	    case GDK_ACTION_MOVE:
+		pm_get_iter_for_playlist (pl_s, &iter_s);
+		switch (pos)
+		{
+		case GTK_TREE_VIEW_DROP_BEFORE:
+		    if (prefs_get_int("pm_sort") != SORT_NONE)
+		    {
+			gtkpod_statusbar_message (_("Can't reorder sorted treeview."));
+			gtk_drag_finish (dc, FALSE, FALSE, time);
+			return;
+		    }
+		    gtk_tree_store_move_before (GTK_TREE_STORE (model),
+						&iter_s, &iter_d);
+		    pm_rows_reordered ();
+		    gtk_drag_finish (dc, TRUE, FALSE, time);
+		    break;
+		case GTK_TREE_VIEW_DROP_AFTER:
+		    if (prefs_get_int("pm_sort") != SORT_NONE)
+		    {
+			gtkpod_statusbar_message (_("Can't reorder sorted treeview."));
+			gtk_drag_finish (dc, FALSE, FALSE, time);
+			return;
+		    }
+		    gtk_tree_store_move_after (GTK_TREE_STORE (model),
+					       &iter_s, &iter_d);
+		    pm_rows_reordered ();
+		    gtk_drag_finish (dc, TRUE, FALSE, time);
+		    break;
+		default:
+		    pl_d = pl;
+		    if (pl_d != pl_s)
+			add_trackglist_to_playlist (pl_d, pl_s->members);
+		    gtk_drag_finish (dc, TRUE, FALSE, time);
+		    break;
+		}
+		break;
+	    default:
+		gtk_drag_finish (dc, FALSE, FALSE, time);
+		g_return_if_reached ();
+	    }
+	}
+	else
+	{   /*handle DND between two itdbs */
+	    /* set destination pl */
+	    GList *trackglist = NULL;
+	    pl_d = pl;
+	    /* if drop is between two playlists, create new playlist */
+	    /* FIXME: support copying of SPL data? */
+	    if (pos == GTK_TREE_VIEW_DROP_BEFORE)
+		pl_d = gp_playlist_add_new (pl->itdb, pl_s->name,
+					    FALSE, position);
+	    if (pos == GTK_TREE_VIEW_DROP_AFTER)
+		pl_d = gp_playlist_add_new (pl->itdb, pl_s->name,
+					    FALSE, position+1);
+	    g_return_if_fail (pl_d);
+
+	    /* copy files from iPod if necessary */
+	    trackglist = export_trackglist_when_necessary (pl_s->itdb,
+							   pl_d->itdb,
+							   pl_s->members);
+
+	    /* check if copying went fine (trackglist is empty if
+	       pl_s->members is empty, so this must not be counted as
+	       an error */
+	    if (trackglist || !pl_s->members)
+	    {
+		add_trackglist_to_playlist (pl_d, trackglist);
+		g_list_free (trackglist);
+		trackglist = NULL;
+		switch (dc->action)
+		{
+		case GDK_ACTION_MOVE:
+		    gtk_drag_finish (dc, TRUE, TRUE, time);
+		    break;
+		case GDK_ACTION_COPY:
+		    gtk_drag_finish (dc, TRUE, FALSE, time);
+		    break;
+		default:
+		    gtk_drag_finish (dc, FALSE, FALSE, time);
+		    break;
+		}
+	    }
+	    else
+	    {
+		if (pl_d != pl)
+		{   /* remove newly created playlist */
+		    gp_playlist_remove (pl_d);
+		    pl_d = NULL;
+		}
+		gtk_drag_finish (dc, FALSE, FALSE, time);
+	    }
+
+	}
+	pm_rows_reordered ();
+	break;
+    default:
+	gtkpod_warning (_("This DND type (%d) is not (yet) supported. If you feel implementing this would be useful, please contact the author.\n\n"), info);
+	gtk_drag_finish (dc, FALSE, FALSE, time);
+	break;
+    }
+
+    /* display if any duplicates were skipped */
+    gp_duplicate_remove (NULL, NULL);
+}
+
+
+
+/* ---------------------------------------------------------------- */
+/* Section for playlist display                                     */
+/* other callbacks                                                  */
+/* ---------------------------------------------------------------- */
+
+static gboolean
+on_playlist_treeview_key_release_event (GtkWidget       *widget,
+					GdkEventKey     *event,
+					gpointer         user_data)
+{
+    guint mods;
+
+    mods = event->state;
+
+    if(!widgets_blocked && (mods & GDK_CONTROL_MASK))
+    {
+	iTunesDB *itdb = gp_get_selected_itdb();
+
+	switch(event->keyval)
+	{
+/* 	    case GDK_u: */
+/* 		gp_do_selected_playlist (update_tracks); */
+/* 		break; */
+	    case GDK_n:
+		if (itdb)
+		{
+		    add_new_pl_or_spl_user_name (itdb, NULL, -1);
+		}
+		else
+		{
+		    message_sb_no_itdb_selected ();
+		}
+		break;
+	    default:
+		break;
+	}
+
+    }
+  return FALSE;
+}
+
+
+/* ---------------------------------------------------------------- */
+/* Section for playlist display helper functions                    */
+/* ---------------------------------------------------------------- */
+
+
+/* Find the iter that represents the repository @itdb
+ *
+ * Return TRUE if the repository could be found. In that case @itdb_iter
+ * will be set to the corresponding iter. The value of @itdb_iter is
+ * undefined when the repository couldn't be found, in which case FALSE
+ * is returned. */
+static gboolean pm_get_iter_for_itdb (iTunesDB *itdb, GtkTreeIter *itdb_iter)
+{
+    GtkTreeModel *model;
+
+    g_return_val_if_fail (playlist_treeview, FALSE);
+    g_return_val_if_fail (itdb, FALSE);
+    g_return_val_if_fail (itdb_iter, FALSE);
+
+    model = GTK_TREE_MODEL (gtk_tree_view_get_model (playlist_treeview));
+
+    if (gtk_tree_model_get_iter_first (model, itdb_iter))
+    {
+	do
+	{
+	    iTunesDB *itdb_model;
+	    gtk_tree_model_get (model, itdb_iter,
+				PM_COLUMN_ITDB, &itdb_model,
+				-1);
+	    g_return_val_if_fail (itdb_model, FALSE);
+	    if (itdb == itdb_model)
+	    {
+		return TRUE;
+	    }
+	} while (gtk_tree_model_iter_next (model, itdb_iter));
+    }
+    return FALSE;
+}
+
+
+/* Find the iter that contains Playlist @playlist
+ *
+ * Return TRUE if the playlist could be found. In that case @pl_iter
+ * will be set to the corresponding iter. The value of @pl_iter is
+ * undefined when the playlist couldn't be found, in which case FALSE
+ * is returned. */
+static gboolean pm_get_iter_for_playlist (Playlist *playlist, GtkTreeIter *pl_iter)
+{
+    GtkTreeIter itdb_iter;
+
+    g_return_val_if_fail (playlist_treeview, FALSE);
+    g_return_val_if_fail (playlist, FALSE);
+    g_return_val_if_fail (pl_iter, FALSE);
+
+    /* First get the iter with the itdb in it */
+
+    if (pm_get_iter_for_itdb (playlist->itdb, &itdb_iter))
+    {
+	GtkTreeModel *model;
+	Playlist *pl;
+
+	model = GTK_TREE_MODEL (gtk_tree_view_get_model (playlist_treeview));
+
+	/* Check if this is already the right iter */
+	gtk_tree_model_get (model, &itdb_iter,
+			    PM_COLUMN_PLAYLIST, &pl,
+			    -1);
+	g_return_val_if_fail (pl, FALSE);
+	if (pl == playlist)
+	{
+	    *pl_iter = itdb_iter;
+	    return TRUE;
+	}
+
+	/* no -- go down one hierarchy and try all other iters */
+	if (!gtk_tree_model_iter_children (model, pl_iter, &itdb_iter))
+	{   /* This indicates screwed up programming so we better cry
+	       out */
+	    g_return_val_if_reached (FALSE);
+	}
+
+	do
+	{
+	    gtk_tree_model_get (model, pl_iter,
+				PM_COLUMN_PLAYLIST, &pl,
+				-1);
+	    g_return_val_if_fail (pl, FALSE);
+	    if (pl == playlist)
+	    {
+		return TRUE;
+	    }
+	} while (gtk_tree_model_iter_next (model, pl_iter));
+    }
+    return FALSE;
+}
+
+
+
+
+/* ---------------------------------------------------------------- */
+/* Section for playlist display                                     */
+/* ---------------------------------------------------------------- */
+
+
+/* remove a track from a current playlist (model) */
+void pm_remove_track (Playlist *playlist, Track *track)
+{
+    g_return_if_fail (playlist);
+    g_return_if_fail (track);
+
+    /* notify sort tab if currently selected playlist is affected */
+    if (current_playlist)
+    {   /* only remove if selected playlist is in same itdb as track */
+	if (track->itdb == current_playlist->itdb)
+	{
+	    if ((playlist == current_playlist) ||
+		itdb_playlist_is_mpl (current_playlist))
+	    {
+	    	if (prefs_get_int (KEY_DISPLAY_COVERART))
+	    {
+	  		coverart_track_changed (track, COVERART_REMOVE_SIGNAL);
+	    }
+		st_remove_track (track, 0);
+	    }
+	}
+    }
+}
+
+
+/* Add track to the display if it's in the currently displayed playlist.
+ * @display: TRUE: add to track model (i.e. display it) */
+void pm_add_track (Playlist *playlist, Track *track, gboolean display)
+{
+    if (playlist == current_playlist)
+    {
+	st_add_track (track, TRUE, display, 0); /* Add to first sort tab */
+    
+    	/* As with add_track above, only add to the playlist if it is the current one */
+    	if (prefs_get_int (KEY_DISPLAY_COVERART))
+	    {
+  			coverart_track_changed (track, COVERART_CREATE_SIGNAL);
+	    }
+    }
+}
+
+/* One of the playlist names has changed (this happens when the
+   iTunesDB is read */
+void pm_itdb_name_changed (iTunesDB *itdb)
+{
+  GtkTreeIter iter;
+
+  g_return_if_fail (itdb);
+
+  if (pm_get_iter_for_itdb (itdb, &iter))
+  {
+      GtkTreeModel *model;
+      GtkTreePath *path;
+      model = GTK_TREE_MODEL (gtk_tree_view_get_model (playlist_treeview));
+      path = gtk_tree_model_get_path (model, &iter);
+      gtk_tree_model_row_changed (model, path, &iter);
+      gtk_tree_path_free (path);
+  }
+}
+
+
+/* If a track got changed (i.e. it's ID3 entries have changed), we check
+   if it's in the currently displayed playlist, and if yes, we notify the
+   first sort tab of a change */
+void pm_track_changed (Track *track)
+{
+  if (!current_playlist) return;
+  
+ coverart_track_changed (track, COVERART_CHANGE_SIGNAL);
+  
+  /* Check if track is member of current playlist */
+  if (g_list_find (current_playlist->members, track))
+      st_track_changed (track, FALSE, 0);
+}
+
+/* Add playlist to the playlist model */
+/* If @position = -1: append to end */
+/* If @position >=0: insert at that position (count starts with MPL as
+ * 0) */
+void pm_add_playlist (Playlist *playlist, gint pos)
+{
+  GtkTreeIter mpl_iter;
+  GtkTreeIter *mpl = NULL;
+  GtkTreeIter iter;
+  GtkTreeModel *model;
+  GtkTreeSelection *selection;
+  iTunesDB *itdb;
+
+  g_return_if_fail (playlist_treeview);
+  g_return_if_fail (playlist);
+
+  model = GTK_TREE_MODEL (gtk_tree_view_get_model (playlist_treeview));
+  g_return_if_fail (model);
+
+  if (itdb_playlist_is_mpl (playlist))
+  {   /* MPLs are always added top-level */
+      mpl = NULL;
+      itdb = playlist->itdb;
+  }
+  else
+  {   /* We need to find the iter with the mpl in it */
+      if (pm_get_iter_for_itdb (playlist->itdb, &mpl_iter))
+      {
+	  mpl = &mpl_iter;
+      }
+      else
+      {
+	  g_warning ("Programming error: need to add mpl before adding normal playlists.\n");
+      }
+      /* reduce position by one because the MPL is not included in the
+	 tree model's count */
+      --pos;
+      itdb = NULL;
+  }
+
+  gtk_tree_store_insert (GTK_TREE_STORE (model), &iter, mpl, pos);
+
+  gtk_tree_store_set (GTK_TREE_STORE (model), &iter,
+		      PM_COLUMN_ITDB, itdb,
+		      PM_COLUMN_PLAYLIST, playlist,
+		      -1);
+
+  /* If the current_playlist is "playlist", we select it. This can
+     happen during a display_reset */
+  if (current_playlist == playlist)
+  {
+      selection = gtk_tree_view_get_selection (playlist_treeview);
+      gtk_tree_selection_select_iter (selection, &iter);
+  }
+  else if (current_playlist == NULL)
+  {
+      /* If it's the first playlist (no playlist selected AND playlist is
+	 the MPL, we select it, unless prefs_get_mpl_autoselect() says
+	 otherwise */
+      if (itdb_playlist_is_mpl(playlist) && prefs_get_int("mpl_autoselect"))
+      {
+	  selection = gtk_tree_view_get_selection (playlist_treeview);
+	  gtk_tree_selection_select_iter (selection, &iter);
+      }
+  }
+}
+
+
+
+/* Remove "playlist" from the display model. 
+   "select": TRUE: a new playlist is selected
+             FALSE: no selection is taking place
+                    (useful when quitting program) */
+void pm_remove_playlist (Playlist *playlist, gboolean select)
+{
+    GtkTreeModel *model;
+    gboolean have_iter = FALSE;
+    GtkTreeIter select_iter, delete_iter;
+    GtkTreeSelection *ts = NULL;
+
+  g_return_if_fail (playlist);
+  model = gtk_tree_view_get_model (playlist_treeview);
+  g_return_if_fail (model);
+
+  ts = gtk_tree_view_get_selection (playlist_treeview);
+
+  if (itdb_playlist_is_mpl (playlist) && current_playlist &&
+      (playlist->itdb == current_playlist->itdb))
+  {   /* We are about to remove the entire itdb (playlist is MPL) and
+       * a playlist of this itdb is selected --> clear display
+       * (pm_unselect_playlist probably works as well, but the
+       * unselect won't be done until later (callback)) */
+      st_init (-1, 0);
+      current_playlist = NULL;
+  }
+
+  if (select && (current_playlist == playlist))
+  {   /* We are about to delete the currently selected
+	 playlist. Try to select the next. */
+      if (gtk_tree_selection_get_selected (ts, NULL, &select_iter))
+      {
+	  GtkTreePath *path = gtk_tree_model_get_path (model, &select_iter);
+	  if(gtk_tree_model_iter_next (model, &select_iter))
+	  {
+	      have_iter = TRUE;
+	  }
+	  else
+	  {   /* no next iter -- try previous iter */
+	      if (gtk_tree_path_prev (path))
+	      {   /* OK -- make iter from it */
+		  gtk_tree_model_get_iter (model, &select_iter, path);
+		  have_iter = TRUE;
+	      }
+	  }
+	  gtk_tree_path_free (path);
+      }
+  }
+
+  if (pm_get_iter_for_playlist (playlist, &delete_iter))
+  {
+      gtk_tree_store_remove (GTK_TREE_STORE (model), &delete_iter);
+  }
+
+  /* select our new iter !!! */
+  if (have_iter && select)   gtk_tree_selection_select_iter(ts, &select_iter);
+}
+
+
+/* Remove all playlists from the display model */
+/* ATTENTION: the playlist_treeview and model might be changed by
+   calling this function */
+/* @clear_sort: TRUE: clear "sortable" setting of treeview */
+void pm_remove_all_playlists (gboolean clear_sort)
+{
+  GtkTreeModel *model;
+  GtkTreeIter iter;
+  gint column;
+  GtkSortType order;
+
+  g_return_if_fail (playlist_treeview);
+  model = gtk_tree_view_get_model (playlist_treeview);
+  g_return_if_fail (model);
+
+  while (gtk_tree_model_get_iter_first (model, &iter))
+  {
+      gtk_tree_store_remove (GTK_TREE_STORE (model), &iter);
+  }
+  if(clear_sort &&
+     gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE (model),
+					   &column, &order))
+  { /* recreate track treeview to unset sorted column */
+      if (column >= 0)
+      {
+	  pm_create_treeview ();
+      }
+  }
+}
+
+
+/* Select specified playlist */
+void pm_select_playlist (Playlist *playlist)
+{
+    GtkTreeIter iter;
+
+    g_return_if_fail (playlist_treeview);
+    g_return_if_fail (playlist);
+
+    if (pm_get_iter_for_playlist (playlist, &iter))
+    {
+	GtkTreeSelection *ts;
+	ts = gtk_tree_view_get_selection (playlist_treeview);
+	gtk_tree_selection_select_iter (ts, &iter);
+    }
+}
+
+
+/* Unselect specified playlist */
+void pm_unselect_playlist (Playlist *playlist)
+{
+    GtkTreeIter iter;
+
+    g_return_if_fail (playlist_treeview);
+    g_return_if_fail (playlist);
+
+    if (pm_get_iter_for_playlist (playlist, &iter))
+    {
+	GtkTreeSelection *ts;
+	ts = gtk_tree_view_get_selection (playlist_treeview);
+	gtk_tree_selection_unselect_iter (ts, &iter);
+    }
+}
+
+
+static void pm_selection_changed_cb (GtkTreeSelection *selection,
+				     gpointer user_data2)
+{
+  GtkTreeModel *model;
+  GtkTreeIter  iter;
+  Playlist *new_playlist = NULL;
+
+#if DEBUG_TIMING
+  GTimeVal time;
+  g_get_current_time (&time);
+  printf ("pm_selection_changed_cb enter: %ld.%06ld sec\n",
+	  time.tv_sec % 3600, time.tv_usec);
+#endif
+
+	/* Avoid track selection errors on coverart while enacting a change
+	 * in playlist
+	 */
+	 coverart_block_change (TRUE);
+  
+  if (gtk_tree_selection_get_selected (selection, &model, &iter) == FALSE)
+  {  /* no selection -> reset sort tabs */
+      st_init (-1, 0);
+      current_playlist = NULL;
+  }
+  else
+  {   /* handle new selection */
+      gtk_tree_model_get (model, &iter, 
+			  PM_COLUMN_PLAYLIST, &new_playlist,
+			  -1);
+
+      /* If new playlist is in an iPod itdb, set the mountpoint for
+       * the free space display to this iPod (there may be several
+       * iPods connected */
+      g_return_if_fail (new_playlist);
+      g_return_if_fail (new_playlist->itdb);
+      if (new_playlist->itdb->usertype & GP_ITDB_TYPE_IPOD)
+      {
+	  space_set_ipod_itdb (new_playlist->itdb);
+      }
+      
+      if (gphoto_is_photo_playlist (new_playlist))
+      {
+				/* This is the photo playlist so need to load photo database
+      * rather than get tracks.
+				*/
+				gphoto_display_photo_window (new_playlist->itdb);
+      }
+      else
+      {
+				gphoto_change_to_photo_window (FALSE);
+      }
+
+      /* remove all entries from sort tab 0 */
+      /* printf ("removing entries: %x\n", current_playlist);*/
+      st_init (-1, 0);
+
+     current_playlist = new_playlist;
+      if (new_playlist->is_spl && new_playlist->splpref.liveupdate)
+	  itdb_spl_update (new_playlist);
+      if (new_playlist->members)
+      {
+	  GList *gl;
+
+	  st_enable_disable_view_sort (0, FALSE);
+	  for (gl=new_playlist->members; gl; gl=gl->next)
+	  { /* add all tracks to sort tab 0 */
+	      Track *track = gl->data;
+	      st_add_track (track, FALSE, TRUE, 0);
+	  }
+	  st_enable_disable_view_sort (0, TRUE);
+	  st_add_track (NULL, TRUE, TRUE, 0);
+      }
+      gtkpod_tracks_statusbar_update();
+  }
+  
+  /* Reallow the coverart selection update */
+  coverart_block_change (FALSE);
+  /* Set the coverart display based on the selected playlist */
+  coverart_set_images(TRUE);
+	 
+  space_data_update ();
+    
+#if DEBUG_TIMING
+  g_get_current_time (&time);
+  printf ("pm_selection_changed_cb exit:  %ld.%06ld sec\n",
+	  time.tv_sec % 3600, time.tv_usec);
+#endif 
+  /* make only suitable delete menu items available */
+  display_adjust_menus ();
+}
+
+/* Callback function called when the selection
+   of the playlist view has changed */
+static void pm_selection_changed (GtkTreeSelection *selection,
+				  gpointer user_data)
+{
+    if (!pm_selection_blocked)
+	pm_selection_changed_cb (selection, user_data);
+}
+
+
+/* Stop editing. If @cancel is TRUE, the edited value will be
+   discarded (I have the feeling that the "discarding" part does not
+   work quite the way intended). */
+void pm_stop_editing (gboolean cancel)
+{
+    GtkTreeViewColumn *col;
+
+    g_return_if_fail (playlist_treeview);
+
+    gtk_tree_view_get_cursor (playlist_treeview, NULL, &col);
+    if (col)
+    {
+	if (!cancel && col->editable_widget)  
+	    gtk_cell_editable_editing_done (col->editable_widget);
+	if (col->editable_widget)
+	    gtk_cell_editable_remove_widget (col->editable_widget);
+    }
+}
+
+
+/* set/read the counter used to remember how often the sort column has
+   been clicked.
+   @inc: negative: reset counter to 0
+   @inc: positive or zero : add to counter
+   return value: new value of the counter */
+static gint pm_sort_counter (gint inc)
+{
+    static gint cnt = 0;
+    if (inc <0) cnt = 0;
+    else        cnt += inc;
+    return cnt;
+}
+
+
+/* Add all playlists of @itdb at position @pos */
+void pm_add_itdb (iTunesDB *itdb, gint pos)
+{
+    GList *gl_pl;
+
+    g_return_if_fail (itdb);
+
+    for (gl_pl=itdb->playlists; gl_pl; gl_pl=gl_pl->next)
+    {
+			Playlist *pl = gl_pl->data;
+			g_return_if_fail (pl);
+			if (itdb_playlist_is_mpl (pl))     pm_add_playlist (pl, pos);
+			else                               pm_add_playlist (pl, -1);
+    }
+    
+    /* Add the photo playlist onto IPOD itdb if the
+	 * IPOD supports photos
+	 */
+	if (gphoto_ipod_supports_photos (itdb))
+	{   /* add photo playlist */
+/*		printf ("Photos supported. Adding node.\n"); */
+		GtkTreeIter itdb_iter;
+		
+		if (pm_get_iter_for_itdb (itdb, &itdb_iter))
+    {
+			gboolean createpl = TRUE;
+   	GtkTreeIter pl_iter;
+   	GtkTreeModel *model;
+			Playlist *pl;
+
+			model = GTK_TREE_MODEL (gtk_tree_view_get_model (playlist_treeview));
+
+			/* go down one hierarchy and try all other iters */
+			if (gtk_tree_model_iter_children (model, &pl_iter, &itdb_iter))
+			{
+				do
+				{
+	   		gtk_tree_model_get (model, &pl_iter,
+					PM_COLUMN_PLAYLIST, &pl,
+					-1);
+	    		if (pl->type == GP_PL_TYPE_PHOTO)
+	    		{
+	    			/* Photo playlist already found so dont need to readd */
+	    		createpl = FALSE;
+	    			break;
+	    		}
+				} while (gtk_tree_model_iter_next (model, &pl_iter));
+    	}
+    	
+    	if (createpl)
+    	{
+    		/* no existing photo playlist found so add one
+    	 * either itdb had no children or none of them
+    	 * were of the photo type.
+    	 */
+				Playlist *pl = itdb_playlist_new (_("Photos"), FALSE);
+				pl->type = GP_PL_TYPE_PHOTO;
+				pl->itdb = itdb;
+				pm_add_playlist (pl, -1);
+			}
+    }
+	}
+}
+
+
+/* Helper function: add all playlists to playlist model */
+void pm_add_all_itdbs (void)
+{
+    GList *gl_itdb;    
+    struct itdbs_head *itdbs_head;
+
+    g_return_if_fail (gtkpod_window);
+    itdbs_head = g_object_get_data (G_OBJECT (gtkpod_window),
+				    "itdbs_head");
+    g_return_if_fail (itdbs_head);
+    for (gl_itdb=itdbs_head->itdbs; gl_itdb; gl_itdb=gl_itdb->next)
+    {
+	iTunesDB *itdb = gl_itdb->data;
+	g_return_if_fail (itdb);
+	pm_add_itdb (itdb, -1);
+    }
+}
+
+
+/* Return GtkTreePath for playlist @playlist. The returned path must be
+   freed using gtk_tree_path_free() after it is no needed any more */
+static GtkTreePath *pm_get_path_for_playlist (Playlist *playlist)
+{
+    GtkTreeIter iter;
+
+    g_return_val_if_fail (playlist_treeview, NULL);
+    g_return_val_if_fail (playlist, NULL);
+
+    if (pm_get_iter_for_playlist (playlist, &iter))
+    {
+	GtkTreeModel *model;
+	model = gtk_tree_view_get_model (playlist_treeview);
+	return gtk_tree_model_get_path (model, &iter);
+    }
+    return NULL;
+}
+
+
+/* Return GtkTreePath for repository @itdb. The returned path must be
+   freed using gtk_tree_path_free() after it is no needed any more */
+GtkTreePath *pm_get_path_for_itdb (iTunesDB *itdb)
+{
+    GtkTreeIter iter;
+
+    g_return_val_if_fail (playlist_treeview, NULL);
+    g_return_val_if_fail (itdb, NULL);
+
+    if (pm_get_iter_for_itdb (itdb, &iter))
+    {
+	GtkTreeModel *model;
+	model = gtk_tree_view_get_model (playlist_treeview);
+	return gtk_tree_model_get_path (model, &iter);
+    }
+    return NULL;
+}
+
+
+/* Return position of repository @itdb */
+gint pm_get_position_for_itdb (iTunesDB *itdb)
+{
+    GtkTreePath *path;
+    gint position = -1;
+
+    g_return_val_if_fail (playlist_treeview, -1);
+    g_return_val_if_fail (itdb, -1);
+
+    path = pm_get_path_for_itdb (itdb);
+
+    if (path)
+    {
+	gint *indices = gtk_tree_path_get_indices (path);
+	if (indices)
+	{
+	    position = indices[0];
+	}
+	gtk_tree_path_free (path);
+    }
+    return position;
+}
+
+
+/* Return position of repository @itdb */
+static gint pm_get_position_for_playlist (Playlist *playlist)
+{
+    GtkTreePath *path;
+    gint position = -1;
+
+    g_return_val_if_fail (playlist_treeview, -1);
+    g_return_val_if_fail (playlist, -1);
+
+    path = pm_get_path_for_playlist (playlist);
+
+    if (path)
+    {
+	/* get position of current path */
+	if (gtk_tree_path_get_depth (path) == 1)
+	{   /* MPL */
+	    position = 0;
+	}
+	else
+	{
+	    gint *indices = gtk_tree_path_get_indices (path);
+	    /* need to add 1 because MPL is one level higher and not
+	       counted */
+	    position = indices[1] + 1;
+	}
+	gtk_tree_path_free (path);
+    }
+    return position;
+}
+
+
+/* "unsort" the playlist view without causing the sort tabs to be
+   touched. */
+static void pm_unsort ()
+{
+    Playlist *cur_pl;
+
+    pm_selection_blocked = TRUE;
+
+    /* remember */
+    cur_pl = pm_get_selected_playlist ();
+
+    pm_remove_all_playlists (TRUE);
+
+    pm_set_selected_playlist (cur_pl);
+
+    /* add playlists back to model (without selecting) */
+    pm_add_all_itdbs ();
+
+    pm_selection_blocked = FALSE;
+    /* reset sort counter */
+    pm_sort_counter (-1);
+}
+
+
+/* Set the sorting accordingly */
+void pm_sort (GtkSortType order)
+{
+    GtkTreeModel *model= gtk_tree_view_get_model (playlist_treeview);
+    g_return_if_fail (model);
+    if (order != SORT_NONE)
+    {
+	gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (model),
+					      PM_COLUMN_PLAYLIST, order);
+    }
+    else
+    { /* only unsort if treeview is sorted */
+	gint column;
+	GtkSortType order;
+	if (gtk_tree_sortable_get_sort_column_id
+	    (GTK_TREE_SORTABLE (model), &column, &order))
+	    pm_unsort ();
+    }
+}
+
+
+#if 0
+FIXME: see comments at pm_data_compare_func()
+/**
+ * pm_track_column_button_clicked
+ * @tvc - the tree view colum that was clicked
+ * @data - ignored user data
+ * When the sort button is clicked we want to update our internal playlist
+ * representation to what's displayed on screen.
+ * If the button was clicked three times, the sort order is undone.
+ */
+static void
+pm_track_column_button_clicked(GtkTreeViewColumn *tvc, gpointer data)
+{
+    gint cnt = pm_sort_counter (1);
+    if (cnt >= 3)
+    {
+	prefs_set_int("pm_sort", SORT_NONE);
+	pm_unsort (); /* also resets the sort_counter */
+    }
+    else
+    {
+	prefs_set_int("pm_sort", gtk_tree_view_column_get_sort_order (tvc));
+	pm_rows_reordered ();
+    }
+}
+#endif
+
+
+/**
+ * Reorder playlists to match order of playlists displayed.
+ * data_changed() is called when necessary.
+ */
+void
+pm_rows_reordered (void)
+{
+    GtkTreeModel *tm = NULL;
+    GtkTreeIter parent;
+    gboolean p_valid;
+
+    g_return_if_fail (playlist_treeview);
+    tm = gtk_tree_view_get_model (GTK_TREE_VIEW(playlist_treeview));
+    g_return_if_fail (tm);
+
+    p_valid = gtk_tree_model_get_iter_first(tm, &parent);
+    while(p_valid)
+    {
+	guint32 pos;
+	Playlist *pl;
+	iTunesDB *itdb;
+	GtkTreeIter child;
+	gboolean c_valid;
+
+	/* get master playlist */
+	gtk_tree_model_get (tm, &parent, PM_COLUMN_PLAYLIST, &pl, -1); 
+	g_return_if_fail (pl);
+	g_return_if_fail (itdb_playlist_is_mpl (pl));
+	itdb = pl->itdb;
+	g_return_if_fail (itdb);
+
+	pos = 1;
+	/* get all children */
+	c_valid = gtk_tree_model_iter_children (tm, &child, &parent);
+	while (c_valid)
+	{
+	    gtk_tree_model_get (tm, &child,
+				PM_COLUMN_PLAYLIST, &pl, -1);
+	    g_return_if_fail (pl);
+	    if (itdb_playlist_by_nr (itdb, pos) != pl)
+	    {
+		/* move the playlist to indicated position */
+		g_return_if_fail (!itdb_playlist_is_mpl (pl));
+		itdb_playlist_move (pl, pos);
+		data_changed (itdb);
+	    }
+	    ++pos;
+	    c_valid = gtk_tree_model_iter_next (tm, &child);
+	}
+	p_valid = gtk_tree_model_iter_next (tm, &parent);
+    }
+}
+
+
+/* Function used to compare two cells during sorting (playlist view) */
+gint pm_data_compare_func (GtkTreeModel *model,
+			GtkTreeIter *a,
+			GtkTreeIter *b,
+			gpointer user_data)
+{
+  Playlist *playlist1=NULL;
+  Playlist *playlist2=NULL;
+  GtkSortType order;
+  gint corr, colid;
+
+  return 0;  /* FIXME: see below -- deactivated for now */
+
+  g_return_val_if_fail (model, 0);
+  g_return_val_if_fail (a, 0);
+  g_return_val_if_fail (b, 0);
+
+  if (gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE (model),
+					    &colid, &order) == FALSE)
+      return 0;
+
+  gtk_tree_model_get (model, a, colid, &playlist1, -1);
+  gtk_tree_model_get (model, b, colid, &playlist2, -1);
+
+/* FIXME: this function crashes because it is provided illegal
+ * GtkTreeIters. */
+/* FIXME: after the introduction of a GtkTreeView rather than a
+ * ListView, sorting should be done by a customs sort mechanism
+ * anyway. */
+
+  g_return_val_if_fail (playlist1 && playlist2, 0);
+
+  /* We make sure that the master playlist always stays on top */
+  if (order == GTK_SORT_ASCENDING) corr = +1;
+  else                             corr = -1;
+  if (itdb_playlist_is_mpl (playlist1)) return (-corr);
+  if (itdb_playlist_is_mpl (playlist2)) return (corr);
+
+  /* compare the two entries */
+  return compare_string (playlist1->name, playlist2->name);
+}
+
+
+/* Called when editable cell is being edited. Stores new data to
+   the playlist list. */
+static void
+pm_cell_edited (GtkCellRendererText *renderer,
+		const gchar         *path_string,
+		const gchar         *new_text,
+		gpointer             data)
+{
+  GtkTreeModel *model = data;
+  GtkTreeIter iter;
+  Playlist *playlist = NULL;
+
+  g_return_if_fail (model);
+  g_return_if_fail (new_text);
+  if (!gtk_tree_model_get_iter_from_string (model, &iter, path_string))
+  {
+      g_return_if_reached ();
+  }
+
+  gtk_tree_model_get (model, &iter, PM_COLUMN_PLAYLIST, &playlist, -1);
+  g_return_if_fail (playlist);
+
+  /*printf("pm_cell_edited: column: %d  track:%lx\n", PM_COLUMN_PLAYLIST, track);*/
+
+  /* We only do something, if the name actually got changed */
+  if (!playlist->name ||
+      g_utf8_collate (playlist->name, new_text) != 0)
+  {
+      g_free (playlist->name);
+      playlist->name = g_strdup (new_text);
+      data_changed (playlist->itdb);
+      if (itdb_playlist_is_mpl (playlist))
+      {   /* Need to change name in prefs system */
+	  set_itdb_prefs_string (playlist->itdb, "name", new_text);
+      }
+  }
+}
+
+
+/**
+ * pm_set_renderer_text
+ *
+ * Set the playlist name in appropriate style.
+ *
+ * @renderer: renderer to be set
+ * @playlist: playlist to consider.
+ */
+void pm_set_renderer_text (GtkCellRenderer *renderer,
+			   Playlist *playlist)
+{
+    if (playlist)
+    {
+	ExtraiTunesDBData *eitdb;
+
+	g_return_if_fail (playlist->itdb);
+	eitdb = playlist->itdb->userdata;
+	g_return_if_fail (eitdb);
+
+	if (itdb_playlist_is_mpl (playlist))
+	{   /* mark MPL */
+	    g_object_set (G_OBJECT (renderer),
+			  "text", playlist->name, 
+			  "weight", PANGO_WEIGHT_BOLD,
+			  NULL);
+	    if (eitdb->data_changed)
+	    {
+		g_object_set (G_OBJECT (renderer),
+			      "style", PANGO_STYLE_ITALIC,
+			      NULL);
+	    }
+	    else
+	    {
+		g_object_set (G_OBJECT (renderer),
+			      "style", PANGO_STYLE_NORMAL,
+			      NULL);
+	    }
+	}
+	else
+	{
+	    if (itdb_playlist_is_podcasts (playlist))
+	    {
+		g_object_set (G_OBJECT (renderer),
+			      "text", playlist->name, 
+			      "weight", PANGO_WEIGHT_SEMIBOLD,
+			      "style", PANGO_STYLE_ITALIC,
+			      NULL);
+	    }
+	    else
+	    {
+		g_object_set (G_OBJECT (renderer),
+			      "text", playlist->name, 
+			      "weight", PANGO_WEIGHT_NORMAL,
+			      "style", PANGO_STYLE_NORMAL,
+			      NULL);
+	    }
+	}
+    }
+    else
+    {
+	g_object_set (G_OBJECT (renderer),
+		      "text", "",
+		      NULL);
+    }
+}
+
+
+/**
+ * pm_set_renderer_pix
+ *
+ * Set the appropriate playlist icon.
+ *
+ * @renderer: renderer to be set
+ * @playlist: playlist to consider.
+ */
+void pm_set_renderer_pix (GtkCellRenderer *renderer,
+			  Playlist *playlist)
+{
+    const gchar *stock_id=NULL;
+
+    g_return_if_fail (renderer);
+
+    if (playlist)
+    {
+	iTunesDB *itdb;
+	ExtraiTunesDBData *eitdb;
+
+	g_return_if_fail (playlist->itdb);
+	itdb = playlist->itdb;
+	g_return_if_fail (itdb->userdata);
+	eitdb = itdb->userdata;
+
+	if (playlist->is_spl)
+	{
+	    stock_id = GTK_STOCK_PROPERTIES;
+	}
+	else if (!itdb_playlist_is_mpl (playlist))
+	{
+		if (gphoto_is_photo_playlist (playlist))
+		{
+			stock_id = GPHOTO_PLAYLIST_ICON_STOCK_ID;
+		}
+		else
+		{
+			stock_id = TUNES_PLAYLIST_ICON_STOCK_ID;
+		}
+	}
+	else
+	{
+	    if (itdb->usertype & GP_ITDB_TYPE_LOCAL)
+	    {
+		stock_id = GTK_STOCK_HARDDISK;
+	    }
+	    else
+	    {
+		if (eitdb->itdb_imported)
+		{
+		    stock_id = GTK_STOCK_CONNECT;
+		}
+		else
+		{
+		    stock_id = GTK_STOCK_DISCONNECT;
+		}
+	    }
+	}
+    }
+
+  g_object_set (G_OBJECT (renderer),
+		"stock-id", stock_id, NULL);
+}
+
+
+/* The playlist data is stored in a separate list
+   and only pointers to the corresponding playlist structure are placed
+   into the model.
+   This function reads the data for the given cell from the list and
+   passes it to the renderer. */
+static void pm_cell_data_func (GtkTreeViewColumn *tree_column,
+			       GtkCellRenderer   *renderer,
+			       GtkTreeModel      *model,
+			       GtkTreeIter       *iter,
+			       gpointer           data)
+{
+  Playlist *playlist = NULL;
+
+  g_return_if_fail (renderer);
+  g_return_if_fail (model);
+  g_return_if_fail (iter);
+
+  gtk_tree_model_get (model, iter, PM_COLUMN_PLAYLIST, &playlist, -1);
+  g_return_if_fail (playlist);
+
+  pm_set_renderer_text (renderer, playlist);
+}
+
+
+/* set graphic indicator for smart playlists */
+static void pm_cell_data_func_pix (GtkTreeViewColumn *tree_column,
+				   GtkCellRenderer   *renderer,
+				   GtkTreeModel      *model,
+				   GtkTreeIter       *iter,
+				   gpointer           data)
+{
+  Playlist *playlist=NULL;
+
+  g_return_if_fail (renderer);
+  g_return_if_fail (model);
+  g_return_if_fail (iter);
+
+  gtk_tree_model_get (model, iter, PM_COLUMN_PLAYLIST, &playlist, -1);
+  g_return_if_fail (playlist);
+
+  pm_set_renderer_pix (renderer, playlist);
+}
+
+
+static void pm_select_current_position (gint x, gint y)
+{
+    GtkTreePath *path;
+
+    g_return_if_fail (playlist_treeview);
+
+    gtk_tree_view_get_path_at_pos (playlist_treeview,
+				   x, y, &path, NULL, NULL, NULL);
+    if (path)
+    {
+	GtkTreeSelection *ts = gtk_tree_view_get_selection
+	    (playlist_treeview);
+	gtk_tree_selection_select_path (ts, path);
+	gtk_tree_path_free (path);
+    }
+}
+
+
+
+/* Return the number (0...) of the renderer the click was in or -1 if
+   no renderer was found. @cell (if != NULL) is filled with a pointer
+   to the renderer. */
+gint tree_view_get_cell_from_pos(GtkTreeView *view, guint x, guint y,
+				 GtkCellRenderer **cell)
+{
+    GtkTreeViewColumn *col = NULL;
+    GList             *node, *cells;
+    gint               pos = 0;
+    GdkRectangle       rect;
+    GtkTreePath        *path = NULL;
+    gint               cell_x, cell_y;
+
+    g_return_val_if_fail ( view != NULL, -1 );
+
+    if (cell)
+	*cell = NULL;
+
+    gtk_tree_view_get_path_at_pos (view, x, y, &path, &col,
+				   &cell_x, &cell_y);
+
+    if (col == NULL)
+	return -1; /* not found */
+
+    cells = gtk_tree_view_column_get_cell_renderers(col);
+
+    gtk_tree_view_get_cell_area (view, path, col, &rect);
+    gtk_tree_path_free (path);
+
+    /* gtk_tree_view_get_cell_area() should return the rectangle
+       _excluding_ the expander arrow(s), but until 2.8.17 it forgets
+       about the space occupied by the top level expander arrow. We
+       therefore need to add the width of one expander arrow */
+    if (!RUNTIME_GTK_CHECK_VERSION(2,8,18))
+    {
+	if (col ==  gtk_tree_view_get_expander_column (view))
+	{
+	    GValue *es = g_malloc0 (sizeof (GValue)); 
+	    g_value_init (es, G_TYPE_INT);
+	    gtk_widget_style_get_property (GTK_WIDGET (view),
+					   "expander_size",
+					   es);
+	    rect.x += g_value_get_int (es);
+	    rect.width -= g_value_get_int (es);
+	    g_free (es);
+	}
+    }
+
+    for (node = cells;  node != NULL;  node = node->next)
+    {
+	GtkCellRenderer *checkcell = (GtkCellRenderer*)node->data;
+	gint start_pos, width;
+
+	if (gtk_tree_view_column_cell_get_position (col, checkcell,
+						    &start_pos, &width))
+	{
+	    if (x >= (rect.x + start_pos) &&
+		x < (rect.x + start_pos + width))
+	    {
+		if (cell)
+		    *cell = checkcell;
+		g_list_free(cells);
+		return pos;
+	    }
+	}
+	++pos;
+    }
+
+    g_list_free(cells);
+    return -1; /* not found */
+}
+
+
+
+static gboolean
+pm_button_press (GtkWidget *w, GdkEventButton *e, gpointer data)
+{
+    gint cell_nr;
+    GtkTreeModel *model;
+    GtkTreePath *path;
+    GtkTreeIter iter;
+    Playlist *pl;
+    ExtraiTunesDBData *eitdb;
+
+    g_return_val_if_fail (w && e, FALSE);
+    switch(e->button)
+    {
+    case 1:
+	cell_nr = tree_view_get_cell_from_pos (GTK_TREE_VIEW(w),
+					       e->x, e->y, NULL);
+	if (cell_nr == 0)
+	{
+	    /* don't accept clicks while widgets are blocked -- this
+	       might cause a crash (e.g. when we click the 'Eject
+	       iPod' symbol while we are ejecting it already) */
+	    if (widgets_blocked) return FALSE;
+	    /* */
+	    model= gtk_tree_view_get_model (GTK_TREE_VIEW (w));
+	    gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW(w),
+					   e->x, e->y,
+					   &path, NULL,
+					   NULL, NULL);
+	    gtk_tree_model_get_iter (model, &iter, path);
+	    gtk_tree_path_free (path);
+	    gtk_tree_model_get (model, &iter,
+				PM_COLUMN_PLAYLIST, &pl,
+				-1);
+	    if (pl == NULL)
+		break;
+
+	    g_return_val_if_fail (pl->itdb, FALSE);
+
+	    if (!itdb_playlist_is_mpl (pl))
+		break;
+
+	    if (pl->itdb->usertype & GP_ITDB_TYPE_IPOD)
+	    {
+
+		/* the user clicked on the connect/disconnect icon of
+		 * an iPod */
+		eitdb = pl->itdb->userdata;
+		g_return_val_if_fail (eitdb, FALSE);
+		if (!eitdb->itdb_imported)
+		{
+		    gp_load_ipod (pl->itdb);
+		}
+		else
+		{
+		    gp_eject_ipod (pl->itdb);
+		}
+		return TRUE;
+	    }
+	    if (pl->itdb->usertype & GP_ITDB_TYPE_LOCAL)
+	    {
+
+		/* the user clicked on the 'harddisk' icon of
+		 * a local repository */
+	    }
+	}
+	break;
+    case 3:
+	pm_select_current_position (e->x, e->y);
+	pm_context_menu_init ();
+	return TRUE;
+    default:
+	break;
+    }
+    return FALSE;
+}
+
+/* Adds the columns to our playlist_treeview */
+static void pm_add_columns (void)
+{
+  GtkTreeViewColumn *column;
+  GtkCellRenderer *renderer;
+  GtkTreeModel *model;
+
+  model = gtk_tree_view_get_model (playlist_treeview);
+  g_return_if_fail (model);
+
+
+  /* playlist column */
+  column = gtk_tree_view_column_new ();
+  gtk_tree_view_column_set_title (column, _("Playlists"));
+/* FIXME: see comments at pm_data_compare_func() */
+/*
+  gtk_tree_view_column_set_sort_column_id (column, PM_COLUMN_PLAYLIST);
+  gtk_tree_view_column_set_sort_order (column, GTK_SORT_ASCENDING);
+  gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (model),
+				   PM_COLUMN_PLAYLIST,
+				   pm_data_compare_func, column, NULL);
+  gtk_tree_view_column_set_clickable(column, TRUE);
+  g_signal_connect (G_OBJECT (column), "clicked",
+		    G_CALLBACK (pm_track_column_button_clicked),
+				(gpointer)PM_COLUMN_PLAYLIST);
+*/
+  gtk_tree_view_append_column (playlist_treeview, column);
+
+  /* cell for graphic indicator */
+  renderer = gtk_cell_renderer_pixbuf_new ();
+
+  gtk_tree_view_column_pack_start (column, renderer, FALSE); 
+  gtk_tree_view_column_set_cell_data_func (column, renderer,
+					   pm_cell_data_func_pix,
+					   NULL, NULL);
+  /* cell for playlist name */
+  renderer = gtk_cell_renderer_text_new ();
+  g_signal_connect (G_OBJECT (renderer), "edited",
+		    G_CALLBACK (pm_cell_edited), model);
+  gtk_tree_view_column_pack_start (column, renderer, FALSE);
+  gtk_tree_view_column_set_cell_data_func (column, renderer,
+					   pm_cell_data_func,
+					   NULL, NULL);
+  g_object_set (G_OBJECT (renderer),
+		"editable", TRUE,
+		NULL);
+}
+
+
+/* Create playlist listview */
+void pm_create_treeview (void)
+{
+  GtkTreeStore *model;
+  GtkTreeSelection *selection;
+  GtkWidget *playlist_window;
+  GtkWidget *tree;
+
+  playlist_window = gtkpod_xml_get_widget (main_window_xml, "playlist_window");
+  g_return_if_fail (playlist_window);
+
+  /* destroy old treeview */
+  if (playlist_treeview)
+  {
+      model = GTK_TREE_STORE (gtk_tree_view_get_model(playlist_treeview));
+      g_return_if_fail (model);
+      g_object_unref (model);
+      gtk_widget_destroy (GTK_WIDGET (playlist_treeview));
+      playlist_treeview = NULL;
+  }
+  /* create new one */
+  tree = gtk_tree_view_new ();
+  gtk_widget_set_events (tree, GDK_KEY_RELEASE_MASK);
+  gtk_widget_show (tree);
+  playlist_treeview = GTK_TREE_VIEW (tree);
+  gtk_container_add (GTK_CONTAINER (playlist_window), tree);
+
+  /* create model */
+  model =   gtk_tree_store_new (PM_NUM_COLUMNS, G_TYPE_POINTER, G_TYPE_POINTER);
+
+  /* set tree model */
+  gtk_tree_view_set_model (playlist_treeview, GTK_TREE_MODEL (model));
+  gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (playlist_treeview), TRUE);
+  gtk_tree_selection_set_mode (gtk_tree_view_get_selection (playlist_treeview),
+			       GTK_SELECTION_SINGLE);
+  selection = gtk_tree_view_get_selection (playlist_treeview);
+  g_signal_connect (G_OBJECT (selection), "changed",
+		    G_CALLBACK (pm_selection_changed), NULL);
+  pm_add_columns ();
+
+  gtk_drag_source_set (GTK_WIDGET (playlist_treeview),
+		       GDK_BUTTON1_MASK,
+		       pm_drag_types, TGNR (pm_drag_types),
+		       GDK_ACTION_COPY|GDK_ACTION_MOVE);
+  gtk_drag_dest_set (GTK_WIDGET (playlist_treeview),
+		     GTK_DEST_DEFAULT_HIGHLIGHT,
+		     pm_drop_types, TGNR (pm_drop_types),
+		     GDK_ACTION_COPY|GDK_ACTION_MOVE);
+
+
+/*   gtk_tree_view_enable_model_drag_dest (playlist_treeview, */
+/* 					pm_drop_types, TGNR (pm_drop_types), */
+/* 					GDK_ACTION_COPY); */
+  /* need the gtk_drag_dest_set() with no actions ("0") so that the
+     data_received callback gets the correct info value. This is most
+     likely a bug... */
+/*   gtk_drag_dest_set_target_list (GTK_WIDGET (playlist_treeview), */
+/* 				 gtk_target_list_new (pm_drop_types, */
+/* 						      TGNR (pm_drop_types))); */
+
+  g_signal_connect ((gpointer) playlist_treeview, "drag-begin",
+		    G_CALLBACK (pm_drag_begin),
+		    NULL);
+
+  g_signal_connect ((gpointer) playlist_treeview, "drag-data-delete",
+		    G_CALLBACK (pm_drag_data_delete),
+		    NULL);
+
+  g_signal_connect ((gpointer) playlist_treeview, "drag-data-get",
+		    G_CALLBACK (pm_drag_data_get),
+		    NULL);
+
+  g_signal_connect ((gpointer) playlist_treeview, "drag-data-received",
+		    G_CALLBACK (pm_drag_data_received),
+		    NULL);
+
+  g_signal_connect ((gpointer) playlist_treeview, "drag-drop",
+		    G_CALLBACK (pm_drag_drop),
+		    NULL);
+
+  g_signal_connect ((gpointer) playlist_treeview, "drag-end",
+		    G_CALLBACK (pm_drag_end),
+		    NULL);
+
+  g_signal_connect ((gpointer) playlist_treeview, "drag-leave",
+		    G_CALLBACK (pm_drag_leave),
+		    NULL);
+
+  g_signal_connect ((gpointer) playlist_treeview, "drag-motion",
+		    G_CALLBACK (pm_drag_motion),
+		    NULL);
+
+  g_signal_connect_after ((gpointer) playlist_treeview, "key_release_event",
+			  G_CALLBACK (on_playlist_treeview_key_release_event),
+			  NULL);
+  g_signal_connect (G_OBJECT (playlist_treeview), "button-press-event",
+		    G_CALLBACK (pm_button_press), model);
+}
+
+
+
+Playlist*
+pm_get_selected_playlist (void)
+{
+/* return(current_playlist);*/
+/* we can't just return the "current_playlist" because the context
+   menus require the selection before "current_playlist" is updated */
+
+    GtkTreeSelection *ts;
+    GtkTreeIter iter;
+    GtkTreeModel *model;
+    Playlist *result = NULL;
+
+    g_return_val_if_fail (playlist_treeview, NULL);
+    ts = gtk_tree_view_get_selection (playlist_treeview);
+    g_return_val_if_fail (ts, NULL);
+
+    if (gtk_tree_selection_get_selected (ts, &model, &iter))
+    {
+	gtk_tree_model_get (model, &iter,
+			    PM_COLUMN_PLAYLIST, &result, -1);
+    }
+
+    /* playlist was just changed -- wait until current_playlist is
+       updated. */
+    if (result != current_playlist)  result=NULL;
+    return result;
+}
+
+/* use with care!! */
+void
+pm_set_selected_playlist (Playlist *pl)
+{
+    current_playlist = pl;
+}

Added: trunk/src/display_private.h
===================================================================
--- trunk/src/display_private.h	                        (rev 0)
+++ trunk/src/display_private.h	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,102 @@
+/* Time-stamp: <2007-03-19 23:11:13 jcs>
+|
+|  Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+| 
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+| 
+|  iTunes and iPod are trademarks of Apple
+| 
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: display_private.h 1750 2007-11-01 21:57:01Z phantom_sf $
+*/
+
+#ifndef __DISPLAY_PRIVATE_H__
+#define __DISPLAY_PRIVATE_H__
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "display.h"
+#include "misc.h"
+#include "display_coverart.h"
+
+/* tree sort cannot be unsorted by choosing the default sort
+ * column. Set to 1 if it's broken, 0 if it's not broken */
+#define BROKEN_GTK_TREE_SORT (!RUNTIME_GTK_CHECK_VERSION(2,5,4))
+
+/* This was defined in 2.5.4 -- as I want to detect whether
+   GTK_TREE_SORT is BROKEN at run-time (see above), I need to define
+   it here in case it's not defined */
+#ifndef GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID 
+#define GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID (-2)
+#endif
+
+/* print some timing info for tuning purposes */
+#define DEBUG_TIMING 0
+/* print info when callbacks are initialized */
+#define DEBUG_CB_INIT 0
+/* print info when adding tracks */
+#define DEBUG_ADD_TRACK 0
+
+/* used for display organization */
+void pm_create_treeview (void);
+void pm_set_selected_playlist(Playlist *pl);
+void pm_remove_all_playlists (gboolean clear_sort);
+void pm_add_all_itdbs (void);
+void tm_create_treeview (void);
+void tm_track_changed (Track *track);
+void tm_remove_track (Track *track);
+void tm_remove_all_tracks (void);
+void st_remove_all_entries_from_model (guint32 inst);
+void st_track_changed (Track *track, gboolean removed, guint32 inst);
+void st_add_track (Track *track, gboolean final, gboolean display, guint32 inst);
+void st_create_tabs (void);
+void st_remove_track (Track *track, guint32 inst);
+void st_init (ST_CAT_item new_category, guint32 inst);
+void st_cleanup (void);
+void st_set_default_sizes (void);
+void st_update_default_sizes (void);
+void st_set_sorttab_page (int inst, gint category);
+void tm_update_default_sizes (void);
+void st_show_hide_tooltips (void);
+GList *st_get_selected_members (guint32 inst);
+gint st_get_sorttab_page_number (int inst);
+
+void st_enable_disable_view_sort (gint inst, gboolean enable);
+void tm_enable_disable_view_sort (gboolean enable);
+
+
+/* Drag and drop definitions */
+#define TGNR(a) (guint)(sizeof(a)/sizeof(GtkTargetEntry))
+#define DND_GTKPOD_TRACKLIST_TYPE "application/gtkpod-tracklist"
+#define DND_GTKPOD_TM_PATHLIST_TYPE "application/gtkpod-tm_pathlist"
+#define DND_GTKPOD_PLAYLISTLIST_TYPE "application/gtkpod-playlistlist"
+
+/* Prefs strings */
+extern const gchar *TM_PREFS_SEARCH_COLUMN;
+
+struct asf_data
+{
+    GtkTreeIter *to_iter;
+    GtkTreeViewDropPosition pos;
+};
+
+#endif /* __DISPLAY_PRIVATE_H__ */

Added: trunk/src/display_sorttabs.c
===================================================================
--- trunk/src/display_sorttabs.c	                        (rev 0)
+++ trunk/src/display_sorttabs.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,3718 @@
+/*
+|  Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+|
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: display_sorttabs.c 1750 2007-11-01 21:57:01Z phantom_sf $
+*/
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <gdk/gdkkeysyms.h>
+
+#include "display_private.h"
+#include "info.h"
+#include "prefs.h"
+#include "misc.h"
+#include "misc_track.h"
+#include "context_menus.h"
+#include "date_parser.h"
+#include "itdb.h"
+#include <string.h>
+#include <stdlib.h>
+
+/* array with pointers to the sort tabs */
+static SortTab *sorttab[SORT_TAB_MAX];
+/* pointer to paned elements holding the sort tabs */
+static GtkPaned *st_paned[PANED_NUM_ST];
+/* compare function to be used for string comparisons */
+
+static void sp_store_sp_entries (gint inst);
+static void st_page_selected (GtkNotebook *notebook, guint page);
+static void st_create_notebook (gint inst);
+static TimeInfo *sp_update_date_interval_from_string (guint32 inst,
+						      T_item item,
+						      gboolean force_update);
+
+/* Drag and drop definitions */
+static GtkTargetEntry st_drag_types [] = {
+    { DND_GTKPOD_TRACKLIST_TYPE, 0, DND_GTKPOD_TRACKLIST },
+    { "text/uri-list", 0, DND_TEXT_URI_LIST },
+    { "text/plain", 0, DND_TEXT_PLAIN },
+    { "STRING", 0, DND_TEXT_PLAIN }
+};
+
+typedef enum {
+    IS_INSIDE,  /* track's timestamp is inside the specified interval  */
+    IS_OUTSIDE, /* track's timestamp is outside the specified interval */
+    IS_ERROR,   /* error parsing date string (or wrong parameters)    */
+} IntervalState;
+
+GladeXML *cal_xml;
+
+
+
+/* ---------------------------------------------------------------- */
+/*                                                                  */
+/* Section for filter tab display (callback)                        */
+/*                                                                  */
+/* ---------------------------------------------------------------- */
+
+/*
+ * utility function for appending ipod track for st treeview callback
+ */
+static void
+on_st_dnd_get_track_foreach(GtkTreeModel *tm, GtkTreePath *tp,
+			    GtkTreeIter *i, gpointer data)
+{
+    GList *gl;
+    TabEntry *entry=NULL;
+    GString *tracklist = (GString *)data;
+
+    g_return_if_fail (tracklist);
+
+    gtk_tree_model_get (tm, i, ST_COLUMN_ENTRY, &entry, -1);
+    g_return_if_fail (entry);
+
+
+    /* add all member tracks of entry to tracklist */
+    for (gl=entry->members; gl; gl=gl->next)
+    {
+	Track *tr = gl->data;
+	g_return_if_fail (tr);
+	g_string_append_printf (tracklist, "%p\n", tr);
+    }
+}
+
+
+/*
+ * utility function for appending filenames for st treeview callback
+ */
+static void
+on_st_dnd_get_file_foreach(GtkTreeModel *tm, GtkTreePath *tp,
+			   GtkTreeIter *iter, gpointer data)
+{
+    GList *gl;
+    TabEntry *entry=NULL;
+    GString *filelist = data;
+
+    g_return_if_fail (tm);
+    g_return_if_fail (iter);
+    g_return_if_fail (data);
+
+    gtk_tree_model_get (tm, iter, ST_COLUMN_ENTRY, &entry, -1);
+    g_return_if_fail (entry);
+
+
+    /* add all member tracks of entry to tracklist */
+    for (gl=entry->members; gl; gl=gl->next)
+    {
+	gchar *name;
+	Track *tr = gl->data;
+
+	g_return_if_fail (tr);
+	name = get_file_name_from_source (tr, SOURCE_PREFER_LOCAL);
+	if (name)
+	{
+	    g_string_append_printf (filelist, "file:%s\n", name);
+	    g_free (name);
+	}
+    }
+}
+
+
+static void st_drag_end (GtkWidget *widget,
+			 GdkDragContext *dc,
+			 gpointer user_data)
+{
+/*     puts ("st_drag_end"); */
+    gtkpod_tracks_statusbar_update ();
+}
+
+
+
+/*
+ * utility function for appending uris for st treeview callback
+ */
+static void
+on_st_dnd_get_uri_foreach(GtkTreeModel *tm, GtkTreePath *tp,
+			  GtkTreeIter *iter, gpointer data)
+{
+    GList *gl;
+    TabEntry *entry=NULL;
+    GString *filelist = data;
+
+    g_return_if_fail (tm);
+    g_return_if_fail (iter);
+    g_return_if_fail (data);
+
+    gtk_tree_model_get (tm, iter, ST_COLUMN_ENTRY, &entry, -1);
+    g_return_if_fail (entry);
+
+
+    /* add all member tracks of entry to tracklist */
+    for (gl=entry->members; gl; gl=gl->next)
+    {
+	gchar *name;
+	Track *tr = gl->data;
+
+	g_return_if_fail (tr);
+	name = get_file_name_from_source (tr, SOURCE_PREFER_LOCAL);
+	if (name)
+	{
+	    gchar *uri = g_filename_to_uri (name, NULL, NULL);
+	    if (uri)
+	    {
+		g_string_append_printf (filelist, "file:%s\n", name);
+		g_free (uri);
+	    }
+	    g_free (name);
+	}
+    }
+}
+
+
+static void
+st_drag_data_get (GtkWidget       *widget,
+		  GdkDragContext  *context,
+		  GtkSelectionData *data,
+		  guint            info,
+		  guint            time,
+		  gpointer         user_data)
+{
+    GtkTreeSelection *ts = NULL;
+    GString *reply = g_string_sized_new (2000);
+
+    if (!data) return;
+    
+    ts = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget));
+    if (ts)
+    {
+	switch (info)
+	{
+	case DND_GTKPOD_TRACKLIST:
+	    gtk_tree_selection_selected_foreach(ts,
+				    on_st_dnd_get_track_foreach, reply);
+	    break;
+	case DND_TEXT_URI_LIST:
+	    gtk_tree_selection_selected_foreach(ts,
+				    on_st_dnd_get_uri_foreach, reply);
+	    break;
+	case DND_TEXT_PLAIN:
+	    gtk_tree_selection_selected_foreach(ts,
+				    on_st_dnd_get_file_foreach, reply);
+	    break;
+	default:
+	    g_warning ("Programming error: st_drag_data_get received unknown info type (%d)\n", info);
+	    break;
+	}
+    }
+    gtk_selection_data_set(data, data->target, 8, reply->str, reply->len);
+    g_string_free (reply, TRUE);
+}
+
+
+/* delete selected entry in sort tab */
+static gboolean
+on_st_treeview_key_release_event       (GtkWidget       *widget,
+					GdkEventKey     *event,
+					gpointer         user_data)
+{
+    guint mods;
+    mods = event->state;
+
+    if(!widgets_blocked && (mods & GDK_CONTROL_MASK))
+    {
+	switch(event->keyval)
+	{
+/* 	    case GDK_u: */
+/* 		gp_do_selected_entry (update_tracks, */
+/* 				   st_get_instance_from_treeview ( */
+/* 				       GTK_TREE_VIEW (widget))); */
+/* 		break; */
+	    default:
+		break;
+	}
+
+    }
+  return FALSE;
+}
+
+
+/* set string compare function according to whether the ignore field
+   is set or not */
+static void st_set_string_compare_func (guint inst, guint page_num)
+{
+    gchar *buf;
+    buf = g_strdup_printf ("sort_ign_field_%d", ST_to_T (page_num));
+    if (prefs_get_int (buf))
+	sorttab[inst]->string_compare_func = compare_string_fuzzy;
+    else
+	sorttab[inst]->string_compare_func = compare_string;
+    g_free (buf);
+}
+
+
+/* callback */
+static void
+on_st_switch_page                 (GtkNotebook     *notebook,
+				   GtkNotebookPage *page,
+				   guint            page_num,
+				   gpointer         user_data)
+{
+    guint inst = GPOINTER_TO_UINT( user_data );
+
+    
+
+/*     printf ("switch_page: inst/page: %d/%d\n", inst, page_num); */
+    /* set compare function for strings (to speed up sorting) */
+    if (page_num != ST_CAT_SPECIAL)
+    {
+	st_set_string_compare_func (inst, page_num);
+    }
+    space_data_update ();
+    st_page_selected (notebook, page_num);
+}
+
+
+
+/* ---------------------------------------------------------------- */
+/*                                                                  */
+/* Section for filter tab display (special sort tab)                */
+/*                                                                  */
+/* ---------------------------------------------------------------- */
+
+/* Set rating  for tab @inst and rating @n */
+static void set_sp_rating_n(guint32 inst, gint n, gboolean state)
+{
+  guint32 rating;
+  
+  if ((inst <= SORT_TAB_MAX) && (n <= RATING_MAX))
+  {
+    rating = (guint32) prefs_get_int_index("sp_rating_state", inst);
+    
+    if (state)
+      rating |= (1 << n);
+    else
+      rating &= ~(1 << n);
+    
+    prefs_set_int_index("sp_rating_state", inst, rating);
+  }
+}
+
+static gboolean get_sp_rating_n(guint32 inst, gint n)
+{
+  guint32 rating;
+  
+  if ((inst <= SORT_TAB_MAX) && (n <= RATING_MAX))
+  {
+    rating = (guint32) prefs_get_int_index("sp_rating_state", inst);
+    
+    if ((rating & (1 << n)) != 0)
+      return TRUE;
+    else
+      return FALSE;      
+  }
+  
+  return FALSE;
+}
+
+/* Remove all members of special sort tab (ST_CAT_SPECIAL) in instance
+ * @inst */
+static void sp_remove_all_members (guint32 inst)
+{
+    SortTab *st;
+
+    /* Sanity */
+    if (inst >= prefs_get_int("sort_tab_num"))  return;
+
+    st = sorttab[inst];
+
+    if (!st)  return;
+
+    g_list_free (st->sp_members);
+    st->sp_members = NULL;
+    g_list_free (st->sp_selected);
+    st->sp_selected = NULL;
+}
+
+
+/* Return a pointer to ti_added, ti_modified or ti_played. Returns
+   NULL if either inst or item are out of range */
+static TimeInfo *sp_get_timeinfo_ptr (guint32 inst, T_item item)
+{
+    if (inst >= SORT_TAB_MAX)
+    {
+	fprintf (stderr, "Programming error: st_get_timeinfo_ptr: inst out of range: %d\n", inst);
+    }
+    else
+    {
+	SortTab *st = sorttab[inst];
+	switch (item)
+	{
+	case T_TIME_ADDED:
+	    return &st->ti_added;
+	case T_TIME_PLAYED:
+	    return &st->ti_played;
+	case T_TIME_MODIFIED:
+	    return &st->ti_modified;
+	default:
+	    fprintf (stderr, "Programming error: st_get_timeinfo_ptr: item invalid: %d\n", item);
+	}
+    }
+    return NULL;
+}
+
+/* Update the date interval from the string provided by
+   prefs_get_sp_entry() */
+/* @inst: instance
+   @item: T_TIME_PLAYED, or T_TIME_MODIFIED,
+   @force_update: usually the update is only performed if the string
+   has changed. TRUE will re-evaluate the string (and print an error
+   message again, if necessary */
+/* Return value: pointer to the corresponding TimeInfo struct (for
+   convenience) or NULL if error occurred */
+static TimeInfo *sp_update_date_interval_from_string (guint32 inst,
+						      T_item item,
+						      gboolean force_update)
+{
+    SortTab *st;
+    TimeInfo *ti;
+    
+
+    if (inst >= SORT_TAB_MAX) return NULL;
+
+    st = sorttab[inst];
+    ti = sp_get_timeinfo_ptr (inst, item);
+
+    if (ti)
+    {
+      gchar *new_string=NULL; 
+      switch (item)
+      {
+      case T_TIME_PLAYED:
+          new_string = prefs_get_string_index("sp_played_state", inst);
+          break;
+      case T_TIME_MODIFIED:
+          new_string = prefs_get_string_index("sp_modified_state", inst);
+          break;
+      case T_TIME_ADDED:
+          new_string = prefs_get_string_index("sp_added_state", inst);;
+          break;
+      default:
+          break;
+      }
+
+      if (!new_string)
+      {
+	  new_string = g_strdup ("");
+      }
+
+      if (force_update || !ti->int_str ||
+	  (strcmp (new_string, ti->int_str) != 0))
+      {   /* Re-evaluate the interval */
+	  g_free (ti->int_str);
+	  ti->int_str = g_strdup (new_string);
+	  dp2_parse (ti);
+      }
+      g_free(new_string);
+    }
+    
+    return ti;
+}
+
+
+/* check if @track's timestamp is within the interval given for @item.
+ *
+ * Return value:
+ *
+ * IS_ERROR:   error parsing date string (or wrong parameters)
+ * IS_INSIDE:  track's timestamp is inside the specified interval
+ * IS_OUTSIDE: track's timestamp is outside the specified interval
+ */
+static IntervalState sp_check_time (guint32 inst, T_item item, Track *track)
+{
+    TimeInfo *ti;
+    IntervalState result = IS_ERROR;
+
+    ti = sp_update_date_interval_from_string (inst, item, FALSE);
+    if (ti && ti->valid)
+    {
+	guint32 stamp = track_get_timestamp (track, item);
+	if (stamp && (ti->lower <= stamp) && (stamp <= ti->upper))
+	      result = IS_INSIDE;
+	else  result = IS_OUTSIDE;
+    }
+    if (result == IS_ERROR)
+    {
+	switch (item)
+	{
+	case T_TIME_PLAYED:
+	    gtkpod_statusbar_message (_("'Played' condition ignored because of error."));
+	    break;
+	case T_TIME_MODIFIED:
+	    gtkpod_statusbar_message (_("'Modified' condition ignored because of error."));
+	    break;
+	case T_TIME_ADDED:
+	    gtkpod_statusbar_message (_("'Added' condition ignored because of error."));
+	    break;
+	default:
+	    break;
+	}
+    }
+    return result;
+}
+
+
+/* decide whether or not @track satisfies the conditions specified in
+ * the special sort tab of instance @inst.
+ * Return value:  TRUE: satisfies, FALSE: does not satisfy */
+static gboolean sp_check_track (Track *track, guint32 inst)
+{
+    gboolean sp_or = prefs_get_int_index("sp_or", inst);
+    gboolean result, cond, checked=FALSE;
+
+    if (!track) return FALSE;
+
+    /* Initial state depends on logical operation */
+    if (sp_or) result = FALSE;  /* OR  */
+    else       result = TRUE;   /* AND */
+
+    /* RATING */
+    if (prefs_get_int_index("sp_rating_cond", inst))
+    {
+	/* checked = TRUE: at least one condition was checked */
+	checked = TRUE;
+	cond = get_sp_rating_n (inst, track->rating/ITDB_RATING_STEP);
+	/* If one of the two combinations occur, we can take a
+	   shortcut and stop checking the other conditions */
+	if (sp_or && cond)       return TRUE;
+	if ((!sp_or) && (!cond)) return FALSE;
+	/* We don't have to calculate a new 'result' value because for
+	   the other two combinations it does not change */
+    }
+
+    /* PLAYCOUNT */
+    if (prefs_get_int_index("sp_playcount_cond", inst))
+    {
+	guint32 low = prefs_get_int_index("sp_playcount_low", inst);
+	/* "-1" will translate into about 4 billion because I use
+	   guint32 instead of gint32. Since 4 billion means "no upper
+	   limit" the logic works fine */
+	guint32 high = prefs_get_int_index("sp_playcount_high", inst);
+	checked = TRUE;
+	if ((low <= track->playcount) && (track->playcount <= high))
+	    cond = TRUE;
+	else
+	    cond = FALSE;
+	if (sp_or && cond)       return TRUE;
+	if ((!sp_or) && (!cond)) return FALSE;
+    }
+    /* time played */
+    if (prefs_get_int_index("sp_played_cond", inst))
+    {
+	IntervalState result = sp_check_time (inst, T_TIME_PLAYED, track);
+	if (sp_or && (result == IS_INSIDE))      return TRUE;
+	if ((!sp_or) && (result == IS_OUTSIDE))  return FALSE;
+	if (result != IS_ERROR)                  checked = TRUE;
+    }
+    /* time modified */
+    if (prefs_get_int_index("sp_modified_cond", inst))
+    {
+	IntervalState result = sp_check_time (inst, T_TIME_MODIFIED, track);
+	if (sp_or && (result == IS_INSIDE))      return TRUE;
+	if ((!sp_or) && (result == IS_OUTSIDE))  return FALSE;
+	if (result != IS_ERROR)                  checked = TRUE;
+    }
+    /* time added */
+    if (prefs_get_int_index("sp_added_cond", inst))
+    {
+	IntervalState result = sp_check_time (inst, T_TIME_ADDED, track);
+	if (sp_or && (result == IS_INSIDE))      return TRUE;
+	if ((!sp_or) && (result == IS_OUTSIDE))  return FALSE;
+	if (result != IS_ERROR)                  checked = TRUE;
+    }
+
+    if (checked) return result;
+    else         return FALSE;
+}
+
+
+/* called by st_add_track(): add a track to ST_CAT_SPECIAL */
+static void st_add_track_special (Track *track, gboolean final,
+				 gboolean display, guint32 inst)
+{
+    SortTab *st;
+
+    /* Sanity */
+    if (inst >= prefs_get_int("sort_tab_num"))  return;
+
+    st = sorttab[inst];
+
+    /* Sanity */
+    if (!st)  return;
+
+    /* Sanity */
+    if (st->current_category != ST_CAT_SPECIAL) return;
+
+    st->final = final;
+
+    if (track != NULL)
+    {
+	/* Add track to member list */
+	st->sp_members = g_list_append (st->sp_members, track);
+	/* Check if track is to be passed on to next sort tab */
+	if (st->is_go || prefs_get_int_index("sp_autodisplay", inst))
+	{   /* Check if track matches sort criteria to be displayed */
+	    if (sp_check_track (track, inst))
+	    {
+		st->sp_selected = g_list_append (st->sp_selected, track);
+		st_add_track (track, final, display, inst+1);
+	    }
+	}
+    }
+    if (!track && final)
+    {
+	if (st->is_go || prefs_get_int_index("sp_autodisplay", inst))
+	    st_add_track (NULL, final, display, inst+1);
+
+    }
+}
+
+
+/* Callback for sp_go() */
+static void sp_go_cb (gpointer user_data1, gpointer user_data2)
+{
+    guint32 inst = (guint32)GPOINTER_TO_UINT(user_data1);
+    SortTab *st = sorttab[inst];
+
+#if DEBUG_TIMING
+    GTimeVal time;
+    g_get_current_time (&time);
+    printf ("sp_go_cb enter: %ld.%06ld sec\n",
+	    time.tv_sec % 3600, time.tv_usec);
+#endif
+
+    space_data_update ();
+
+    /* Sanity */
+    if (st == NULL) return;
+
+    /* remember that "Display" was already pressed */
+    st->is_go = TRUE;
+
+    /* Clear the sp_selected list */
+    g_list_free (st->sp_selected);
+    st->sp_selected = NULL;
+
+    /* initialize next instance */
+    st_init (-1, inst+1);
+
+    if (st->sp_members)
+    {
+	GList *gl;
+
+	st_enable_disable_view_sort (inst+1, FALSE);
+	for (gl=st->sp_members; gl; gl=gl->next)
+	{ /* add all member tracks to next instance */
+	    Track *track = (Track *)gl->data;
+	    if (sp_check_track (track, inst))
+	    {
+		st->sp_selected = g_list_append (st->sp_selected, track);
+		st_add_track (track, FALSE, TRUE, inst+1);
+	    }
+	}
+	st_enable_disable_view_sort (inst+1, TRUE);
+	st_add_track (NULL, TRUE, st->final, inst+1);
+    }
+    gtkpod_tracks_statusbar_update();
+#if DEBUG_TIMING
+    g_get_current_time (&time);
+    printf ("st_selection_changed_cb exit:  %ld.%06ld sec\n",
+	    time.tv_sec % 3600, time.tv_usec);
+#endif
+}
+
+/* save the contents of the entry to prefs */
+static void sp_store_sp_entries (gint inst)
+{
+    SortTab *st;
+
+    /* Sanity */
+    if (inst >= prefs_get_int("sort_tab_num"))  return;
+
+    st = sorttab[inst];
+
+    /* Sanity */
+    if (!st || (st->current_category != ST_CAT_SPECIAL)) return;
+
+    prefs_set_string_index("sp_played_state", inst,
+			gtk_entry_get_text (GTK_ENTRY(st->ti_played.entry)));
+    prefs_set_string_index("sp_modified_state", inst,
+			gtk_entry_get_text (GTK_ENTRY(st->ti_modified.entry)));
+    prefs_set_string_index("sp_added_state", inst,
+			gtk_entry_get_text (GTK_ENTRY(st->ti_added.entry)));
+}
+
+/* display the members satisfying the conditions specified in the
+ * special sort tab of instance @inst */
+void sp_go (guint32 inst)
+{
+    SortTab *st;
+
+#if DEBUG_CB_INIT
+    printf ("st_go: inst: %d\n", inst);
+#endif
+
+    /* Sanity */
+    if (inst >= prefs_get_int("sort_tab_num"))  return;
+
+    st = sorttab[inst];
+
+    /* Sanity */
+    if (st->current_category != ST_CAT_SPECIAL) return;
+
+    /* Make sure the information typed into the entries is actually
+     * being used (maybe the user 'forgot' to press enter */
+    sp_store_sp_entries (inst);
+
+    sp_go_cb (GUINT_TO_POINTER(inst), NULL);
+}
+
+
+/* called by st_remove_track() */
+static void st_remove_track_special (Track *track, guint32 inst)
+{
+    SortTab *st;
+    GList *link;
+
+    /* Sanity */
+    if (inst >= prefs_get_int("sort_tab_num"))  return;
+
+    st = sorttab[inst];
+
+    /* Sanity */
+    if (st->current_category != ST_CAT_SPECIAL) return;
+
+    /* Remove track from member list */
+    link = g_list_find (st->sp_members, track);
+    if (link)
+    {   /* only remove track from next sort tab if it was a member of
+	   this sort tab (slight performance improvement when being
+	   called with non-existing tracks */
+	st->sp_members = g_list_delete_link (st->sp_members, link);
+	st_remove_track (track, inst+1);
+    }
+}
+
+
+/* called by st_track_changed */
+static void st_track_changed_special (Track *track,
+				     gboolean removed, guint32 inst)
+{
+    SortTab *st;
+
+    /* Sanity */
+    if (inst >= prefs_get_int("sort_tab_num"))  return;
+
+    st = sorttab[inst];
+
+    /* Sanity */
+    if (st->current_category != ST_CAT_SPECIAL) return;
+
+    if (g_list_find (st->sp_members, track))
+    {   /* only do anything if @track was a member of this sort tab
+	   (slight performance improvement when being called with
+	   non-existing tracks */
+	if (removed)
+	{
+	    /* Remove track from member list */
+	    st->sp_members = g_list_remove (st->sp_members, track);
+	    if (g_list_find (st->sp_selected, track))
+	    {   /* only remove from next sort tab if it was passed on */
+		st->sp_selected = g_list_remove (st->sp_selected, track);
+		st_track_changed (track, TRUE, inst+1);
+	    }
+	}
+	else
+	{
+	    if (g_list_find (st->sp_selected, track))
+	    {   /* track is being passed on to next sort tab */
+		if (sp_check_track (track, inst))
+		{   /* only changed */
+		    st_track_changed (track, FALSE, inst+1);
+		}
+		else
+		{   /* has to be removed */
+		    st->sp_selected = g_list_remove (st->sp_selected, track);
+		    st_track_changed (track, TRUE, inst+1);
+		}
+	    }
+	    else
+	    {   /* track is not being passed on to next sort tab */
+		if (sp_check_track (track, inst))
+		{   /* add to next sort tab */
+		    st->sp_selected = g_list_append (st->sp_selected, track);
+		    st_add_track (track, TRUE, TRUE, inst+1);
+		}
+	    }
+	}
+    }
+}
+
+
+/* Called when the user changed the sort conditions in the special
+ * sort tab */
+void sp_conditions_changed (guint32 inst)
+{
+    SortTab *st;
+
+    /* Sanity */
+    if (inst >= prefs_get_int("sort_tab_num"))  return;
+
+    st = sorttab[inst];
+    /* Sanity */
+    if (!st || st->current_category != ST_CAT_SPECIAL) return;
+
+    /* Only redisplay if data is actually being passed on to the next
+       sort tab */
+    if (st->is_go || prefs_get_int_index("sp_autodisplay", inst))
+    {
+	st_redisplay (inst);
+    }
+}
+
+
+/* ---------------------------------------------------------------- */
+/*                                                                  */
+/* Callbacks for special sort tab display                           */
+/*                                                                  */
+/* ---------------------------------------------------------------- */
+
+void
+on_sp_or_button_toggled                (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+    guint32 inst = (guint32)(GPOINTER_TO_UINT(user_data) & SP_MASK);
+
+    prefs_set_int_index("sp_or", inst, 
+                        gtk_toggle_button_get_active (togglebutton));
+    
+  sp_conditions_changed (inst);
+}
+
+
+void
+on_sp_cond_button_toggled            (GtkToggleButton *togglebutton,
+				      gpointer         user_data)
+{
+    guint32 inst = (guint32)(GPOINTER_TO_UINT(user_data) & SP_MASK);
+    T_item cond = (guint32)GPOINTER_TO_UINT(user_data) >> SP_SHIFT;
+
+  switch (cond)
+	{
+	case T_RATING:
+	    prefs_set_int_index("sp_rating_cond", inst, 
+                          gtk_toggle_button_get_active(togglebutton));
+	    break;
+	case T_PLAYCOUNT:
+	    prefs_set_int_index("sp_playcount_cond", inst, 
+                          gtk_toggle_button_get_active(togglebutton));
+	    break;
+	case T_TIME_PLAYED:
+	    prefs_set_int_index("sp_played_cond", inst, 
+                          gtk_toggle_button_get_active(togglebutton));
+	    break;
+	case T_TIME_MODIFIED:
+	    prefs_set_int_index("sp_modified_cond", inst, 
+                          gtk_toggle_button_get_active(togglebutton));
+	    break;
+	case T_TIME_ADDED:
+	    prefs_set_int_index("sp_added_cond", inst, 
+                          gtk_toggle_button_get_active(togglebutton));
+	    break;
+	default:
+	    break;
+	}
+    sp_conditions_changed (inst);
+}
+
+void
+on_sp_rating_n_toggled                 (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+    guint32 inst = (guint32)(GPOINTER_TO_UINT(user_data) & SP_MASK);
+    guint32 n = (guint32)GPOINTER_TO_UINT(user_data) >> SP_SHIFT;
+
+    set_sp_rating_n (inst, n,
+			               gtk_toggle_button_get_active (togglebutton));
+    if (prefs_get_int_index("sp_rating_cond", inst))
+	sp_conditions_changed (inst);
+}
+
+
+void
+on_sp_entry_activate             (GtkEditable     *editable,
+				  gpointer         user_data)
+{
+    guint32 inst = (guint32)(GPOINTER_TO_UINT(user_data) & SP_MASK);
+    T_item item = (guint32)GPOINTER_TO_UINT(user_data) >> SP_SHIFT;
+    gchar *buf = gtk_editable_get_chars(editable,0, -1);
+
+/*    printf ("sp_entry_activate inst: %d, item: %d\n", inst, item);*/
+
+	switch (item)
+	{
+	case T_TIME_PLAYED:
+	    prefs_set_string_index("sp_played_state", inst, buf);
+	    break;
+	case T_TIME_MODIFIED:
+	    prefs_set_string_index("sp_modified_state", inst, buf);
+	    break;
+	case T_TIME_ADDED:
+	    prefs_set_string_index("sp_added_state", inst, buf);
+	    break;
+	default:
+	    break;
+  }
+  
+    g_free (buf);
+    sp_update_date_interval_from_string (inst, item, TRUE);
+    sp_go (inst);
+}
+
+
+void
+on_sp_cal_button_clicked        (GtkButton       *button,
+				 gpointer         user_data)
+{
+    guint32 inst = (guint32)GPOINTER_TO_UINT(user_data) & SP_MASK;
+    T_item item = (guint32)GPOINTER_TO_UINT(user_data) >> SP_SHIFT;
+
+    cal_open_calendar (inst, item);
+}
+
+
+void
+on_sp_go_clicked                       (GtkButton       *button,
+					gpointer         user_data)
+{
+    guint32 inst = (guint32)GPOINTER_TO_UINT(user_data) & SP_MASK;
+    sp_go (inst);
+}
+
+
+void
+on_sp_go_always_toggled                (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+    guint32 inst = (guint32)GPOINTER_TO_UINT(user_data) & SP_MASK;
+    gboolean state = gtk_toggle_button_get_active (togglebutton);
+
+    /* display data if autodisplay is turned on */
+    if (state)  on_sp_go_clicked (NULL, user_data);
+    prefs_set_int_index("sp_autodisplay", inst, state);
+}
+
+void
+on_sp_playcount_low_value_changed      (GtkSpinButton   *spinbutton,
+					gpointer         user_data)
+{
+    guint32 inst = (guint32)GPOINTER_TO_UINT(user_data) & SP_MASK;
+
+    prefs_set_int_index("sp_playcount_low", inst,
+				gtk_spin_button_get_value (spinbutton));
+    if (prefs_get_int_index("sp_playcount_cond", inst))
+	sp_conditions_changed (inst);
+}
+
+
+void
+on_sp_playcount_high_value_changed     (GtkSpinButton   *spinbutton,
+					gpointer         user_data)
+{
+    guint32 inst = (guint32)GPOINTER_TO_UINT(user_data) & SP_MASK;
+
+    prefs_set_int_index("sp_playcount_high", inst,
+				 gtk_spin_button_get_value (spinbutton));
+    if (prefs_get_int_index("sp_playcount_cond", inst))
+	sp_conditions_changed (inst);
+}
+
+
+
+/* ---------------------------------------------------------------- */
+/*                                                                  */
+/* Section for sort tab display (normal and general)                */
+/*                                                                  */
+/* ---------------------------------------------------------------- */
+
+/* return a pointer to the list of members selected in the sort tab
+   @inst. For a normal sort tab this is
+   sorttab[inst]->current_entry->members, for a special sort tab this
+   is sorttab[inst]->sp_selected.
+   You must not g_list_free() the returned list */
+GList *st_get_selected_members (guint32 inst)
+{
+    SortTab *st;
+
+    /* Sanity */
+    if (inst >= prefs_get_int("sort_tab_num"))  return NULL;
+
+    st = sorttab[inst];
+
+    /* Sanity */
+    if (!st) return NULL;
+
+    if (st->current_category != ST_CAT_SPECIAL)
+    {
+	if (st->current_entry)    return st->current_entry->members;
+	else                      return NULL;
+    }
+    else
+    {
+	return st->sp_selected;
+    }
+}
+
+
+/* Get the instance of the sort tab that corresponds to
+   "notebook". Returns -1 if sort tab could not be found
+   and prints error message */
+static gint st_get_instance_from_notebook (GtkNotebook *notebook)
+{
+    gint i;
+
+    for(i=0; i<SORT_TAB_MAX; ++i)
+    {
+	if (sorttab[i] && (sorttab[i]->notebook == notebook)) return i;
+    }
+/*  g_warning ("Programming error (st_get_instance_from_notebook): notebook could
+    not be found.\n"); function somehow can get called after notebooks got
+    destroyed */
+    return -1;
+}
+
+/* Get the instance of the sort tab that corresponds to
+   "treeview". Returns -1 if sort tab could not be found
+   and prints error message */
+gint st_get_instance_from_treeview (GtkTreeView *tv)
+{
+    gint i,cat;
+
+    for(i=0; i<SORT_TAB_MAX; ++i)
+    {
+	for(cat=0; cat<ST_CAT_NUM; ++cat)
+	{
+	    if (sorttab[i] && (sorttab[i]->treeview[cat] == tv)) return i;
+	}
+    }
+    return -1;
+}
+
+/* returns the selected entry */
+TabEntry *st_get_selected_entry (gint inst)
+{
+    TabEntry *result = NULL;
+
+    if ((inst >= 0) && (inst < SORT_TAB_MAX) && sorttab[inst])
+/*	return sorttab[inst]->current_entry;*/
+/* we can't just return the "->current_entry" because the context
+   menus require the selection before "->current_entry" is updated */
+    {
+	SortTab *st = sorttab[inst];
+	GtkTreeView *tv = st->treeview[st->current_category];
+	GtkTreeSelection *ts = gtk_tree_view_get_selection (tv);
+	GtkTreeIter iter;
+
+	if (gtk_tree_selection_get_selected (ts, NULL, &iter))
+	{
+	    gtk_tree_model_get (st->model, &iter,
+				ST_COLUMN_ENTRY, &result, -1);
+	}
+    }
+    /* wait until current_entry was updated */
+    if (result != sorttab[inst]->current_entry) result=NULL;
+    return result;
+}
+
+
+/* Append playlist to the playlist model. */
+static void st_add_entry (TabEntry *entry, guint32 inst)
+{
+    GtkTreeIter iter;
+    GtkTreeModel *model;
+    SortTab *st;
+
+    st = sorttab[inst];
+    model = st->model;
+    g_return_if_fail (model != NULL);
+    /* Insert the compilation entry between All and the first entry
+       so it remains at the top even when the list is not sorted */
+    if (entry->compilation) 
+    {
+        gtk_list_store_insert (GTK_LIST_STORE (model), &iter, 1);
+    }
+    else 
+    {
+        gtk_list_store_append (GTK_LIST_STORE (model), &iter);
+    }
+    gtk_list_store_set (GTK_LIST_STORE (model), &iter,
+			ST_COLUMN_ENTRY, entry, -1);
+    st->entries = g_list_append (st->entries, entry);
+    if (!entry->master && !entry->compilation)
+    {
+	if (!st->entry_hash)
+	{
+	    st->entry_hash = g_hash_table_new (g_str_hash, g_str_equal);
+	}
+	g_hash_table_insert (st->entry_hash, entry->name, entry);
+    }
+}
+
+/* Used by st_remove_entry_from_model() to remove entry from model by calling
+   gtk_tree_model_foreach () */
+static gboolean st_delete_entry_from_model (GtkTreeModel *model,
+					    GtkTreePath *path,
+					    GtkTreeIter *iter,
+					    gpointer data)
+{
+  TabEntry *entry;
+
+  gtk_tree_model_get (model, iter, ST_COLUMN_ENTRY, &entry, -1);
+  if(entry == (TabEntry *)data)
+  {
+      gtk_list_store_remove (GTK_LIST_STORE (model), iter);
+      return TRUE;
+  }
+  return FALSE;
+}
+
+
+/* Remove entry from the display model and the sorttab */
+static void st_remove_entry_from_model (TabEntry *entry, guint32 inst)
+{
+    SortTab *st = sorttab[inst];
+    GtkTreeModel *model = st->model;
+    if (model && entry)
+    {
+/* 	printf ("entry: %p, cur_entry: %p\n", entry, st->current_entry); */
+	if (entry == st->current_entry)
+	{
+	    GtkTreeSelection *selection = gtk_tree_view_get_selection
+		(st->treeview[st->current_category]);
+	    st->current_entry = NULL;
+	    /* We have to unselect the previous selection */
+	    gtk_tree_selection_unselect_all (selection);
+	}
+	gtk_tree_model_foreach (model, st_delete_entry_from_model, entry);
+	st->entries = g_list_remove (st->entries, entry);
+	g_list_free (entry->members);
+	/* remove entry from hash */
+	if (st->entry_hash)
+	{
+	    TabEntry *hashed_entry =
+		(TabEntry *)g_hash_table_lookup (st->entry_hash, entry->name);
+	    if (hashed_entry == entry)
+		g_hash_table_remove (st->entry_hash, entry->name);
+	}
+	C_FREE (entry->name);
+	g_free (entry);
+    }
+}
+
+/* Remove all entries from the display model and the sorttab */
+/* @clear_sort: reset sorted columns to the non-sorted state */
+void st_remove_all_entries_from_model (guint32 inst)
+{
+  TabEntry *entry;
+  SortTab *st = sorttab[inst];
+  gint column;
+  GtkSortType order;
+
+  if (st)
+  {
+      if (st->current_entry)
+      {
+	  GtkTreeSelection *selection = gtk_tree_view_get_selection
+	      (st->treeview[st->current_category]);
+	  st->current_entry = NULL;
+	  /* We may have to unselect the previous selection */
+	  gtk_tree_selection_unselect_all (selection);
+      }
+      while (st->entries != NULL)
+      {
+	  entry = (TabEntry *)g_list_nth_data (st->entries, 0);
+	  st_remove_entry_from_model (entry, inst);
+      }
+      if (st->entry_hash)  g_hash_table_destroy (st->entry_hash);
+      st->entry_hash = NULL;
+
+      if((prefs_get_int("st_sort") == SORT_NONE) &&
+	 gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE (st->model),
+					       &column, &order))
+      { /* recreate track treeview to unset sorted column */
+	  if (column >= 0)
+	  {
+	      st_create_notebook (inst);
+	  }
+      }
+  }
+}
+
+/* Remove "entry" from the model (used by delete_entry_ok()). The
+ * entry should be empty (otherwise it's not removed).
+ * If "entry" is the master entry 'All', the sort tab is redisplayed
+ * (it's empty).
+ * If the entry is currently selected (usually will be), the next
+ * or previous entry will be selected automatically (unless it's the
+ * master entry and prefs_get_int_index("st_autoselect", inst) says don't select
+ * the 'All' entry). If no new entry is selected, the next sort tab will be
+ * redisplayed (should be empty) */
+void st_remove_entry (TabEntry *entry, guint32 inst)
+{
+    TabEntry *next=NULL;
+    GtkTreeIter iter;
+    GtkTreeSelection *selection;
+    SortTab *st = sorttab[inst];
+
+    if (!entry) return;
+    /* is the entry empty (contains no tracks)? */
+    if (g_list_length (entry->members) != 0) return;
+    /* if the entry is the master entry 'All' -> the tab is empty,
+       re-init tab */
+    if (entry->master)
+    {
+	st_init (-1, inst);
+	return;
+    }
+
+    /* is the entry currently selected? Remember! */
+    selection = gtk_tree_view_get_selection (st->treeview[st->current_category]);
+#if 0  /* it doesn't make much sense to select the next entry, or? */
+    if (sorttab[inst]->current_entry == entry)
+    {
+	gboolean valid;
+	TabEntry *entry2=NULL;
+	GtkTreeIter iter2;
+	/* what's the next entry (displayed)? */
+	if (gtk_tree_selection_get_selected (selection, NULL, &iter))
+	{ /* found selected entry -> now chose next one */
+	    if (gtk_tree_model_iter_next (st->model, &iter))
+	    {
+		gtk_tree_model_get(st->model, &iter, ST_COLUMN_ENTRY, &next, -1);
+	    }
+	    else
+	    { /* no next entry, try to find previous one */
+		/* There doesn't seem to be a ..._iter_previous()
+		 * call... */
+		next = NULL;
+		valid = gtk_tree_model_get_iter_first(st->model, &iter2);
+		while(valid)
+		{
+		    gtk_tree_model_get(st->model, &iter2, ST_COLUMN_ENTRY, &entry2, -1);
+		    if (entry == entry2)   break;  /* found it */
+		    iter = iter2;
+		    next = entry2;
+		    valid = gtk_tree_model_iter_next(st->model, &iter2);
+		}
+		if (!valid) next = NULL;
+	    }
+	    /* don't select master entry 'All' until requested to do so */
+	    if (next && next->master && !prefs_get_int_index("st_autoselect", inst))
+		next = NULL;
+	}
+    }
+#endif
+    /* remove entry from display model */
+    st_remove_entry_from_model (entry, inst);
+    /* if we have a next entry, select it. */
+    if (next)
+    {
+	gtk_tree_selection_select_iter (selection, &iter);
+    }
+}
+
+/* Get the correct name for the entry according to currently
+   selected category (page). Do _not_ g_free() the return value! */
+static const gchar *st_get_entryname (Track *track, guint32 inst)
+{
+    T_item t_item = ST_to_T (sorttab[inst]->current_category);
+
+    return track_get_item (track, t_item);
+}
+
+
+/* Returns the entry "track" is stored in or NULL. The master entry
+   "All" is skipped */
+static TabEntry *st_get_entry_by_track (Track *track, guint32 inst)
+{
+  GList *entries;
+  TabEntry *entry;
+  guint i;
+
+  if (track == NULL) return NULL;
+  entries = sorttab[inst]->entries;
+  i=1; /* skip master entry, which is supposed to be at first position */
+  while ((entry = (TabEntry *)g_list_nth_data (entries, i)) != NULL)
+    {
+      if (g_list_find (entry->members, track) != NULL)   break; /* found! */
+      ++i;
+    }
+  return entry;
+}
+
+
+/* Find TabEntry with name "name". Return NULL if no entry was found.
+   If "name" is {-1, 0x00}, it returns the master entry. Otherwise
+   it skips the master entry. */
+static TabEntry *st_get_entry_by_name (const gchar *name, guint32 inst)
+{
+  TabEntry *entry = NULL;
+  SortTab *st = sorttab[inst];
+  GList *entries = st->entries;
+
+  if (name == NULL) return NULL;
+  /* check if we need to return the master entry */
+  if ((strlen (name) == 1) && (*name == -1))
+  {
+      entry = (TabEntry *)g_list_nth_data (entries, 0);
+  }
+  else
+  {
+      if (st->entry_hash)
+	  entry = g_hash_table_lookup (st->entry_hash, name);
+  }
+  return entry;
+}
+
+/* Find TabEntry with compilation set true. Return NULL if no entry was found. */
+static TabEntry *st_get_compilation_entry (guint32 inst)
+{
+  GList *entries;
+  TabEntry *entry;
+  guint i;
+
+  entries = sorttab[inst]->entries;
+  i=1; /* skip master entry, which is supposed to be at first position */
+  while ((entry = (TabEntry *)g_list_nth_data (entries, i)) != NULL)
+    {
+      if (entry->compilation)   break; /* found! */
+      ++i;
+    }
+  return entry;
+}
+
+/* moves a track from the entry it is currently in to the one it
+   should be in according to its tags (if a Tag had been changed).
+   Returns TRUE, if track has been moved, FALSE otherwise */
+/* 07 Feb 2003: I decided that recategorizing is a bad thing: the
+   current code only moves the tracks "up" in the entry list, so it's
+   incomplete. More important: it leaves the display in an
+   inconsistent state: the tracks are not removed from the
+   trackview (this would confuse the user). But if he changes the entry
+   again, nothing happens to the tracks displayed, because they are no
+   longer members. Merging the two identical entries is no option
+   either, because that takes away the possibility to easily "undo"
+   what you have just done. It's also not intuitive if you have
+   additional tracks appear on the screen. JCS */
+static gboolean st_recategorize_track (Track *track, guint32 inst)
+{
+#if 0
+  TabEntry *oldentry, *newentry;
+  gchar *entryname;
+
+  oldentry = st_get_entry_by_track (track, inst);
+  /*  printf("%d: recat_oldentry: %x\n", inst, oldentry);*/
+  /* should not happen: track is not in sort tab */
+  if (oldentry == NULL) return FALSE;
+  entryname = st_get_entryname (track, inst);
+  newentry = st_get_entry_by_name (entryname, inst);
+  if (newentry == NULL)
+    { /* not found, create new one */
+      newentry = g_malloc0 (sizeof (TabEntry));
+      newentry->name = g_strdup (entryname);
+      newentry->master = FALSE;
+      newentry->compilation = FALSE;
+      st_add_entry (newentry, inst);
+    }
+  if (newentry != oldentry)
+    { /* track category changed */
+      /* add track to entry members list */
+      newentry->members = g_list_append (newentry->members, track);
+      /* remove track from old entry members list */
+      oldentry->members = g_list_remove (oldentry->members, track);
+      /*  printf("%d: recat_return_TRUE\n", inst);*/
+      return TRUE;
+    }
+  /*  printf("%d: recat_return_FALSE\n", inst);*/
+#endif
+  return FALSE;
+}
+
+
+
+/* called by st_track_changed */
+static void st_track_changed_normal (Track *track, gboolean removed, guint32 inst)
+{
+    SortTab *st;
+    TabEntry *master, *entry;
+
+    st = sorttab[inst];
+    master = g_list_nth_data (st->entries, 0);
+    if (master == NULL) return; /* should not happen */
+    /* if track is not in tab, don't proceed (should not happen) */
+    if (g_list_find (master->members, track) == NULL) return;
+    if (removed)
+    {
+	/* remove "track" from master entry "All" */
+	master->members = g_list_remove (master->members, track);
+	/* find entry which other entry contains the track... */
+	entry = st_get_entry_by_track (track, inst);
+	/* ...and remove it */
+	if (entry) entry->members = g_list_remove (entry->members, track);
+	if ((st->current_entry == entry) || (st->current_entry == master))
+	    st_track_changed (track, TRUE, inst+1);
+    }
+    else
+    {
+	if (st->current_entry &&
+	    g_list_find (st->current_entry->members, track) != NULL)
+	{ /* "track" is in currently selected entry */
+	    if (!st->current_entry->master)
+	    { /* it's not the master list */
+		if (st_recategorize_track (track, inst))
+		    st_track_changed (track, TRUE, inst+1);
+		else st_track_changed (track, FALSE, inst+1);
+	    }
+	    else
+	    { /* master entry ("All") is currently selected */
+		st_recategorize_track (track, inst);
+		st_track_changed (track, FALSE, inst+1);
+	    }
+	}
+	else
+	{ /* "track" is not in an entry currently selected */
+	    if (st_recategorize_track (track, inst))
+	    { /* track was moved to a different entry */
+		if (st_get_entry_by_track (track, inst) == st->current_entry)
+		{ /* this entry is selected! */
+		    st_add_track (track, TRUE, TRUE, inst+1);
+		}
+	    }
+	}
+    }
+}
+
+
+
+/* Some tags of a track currently stored in a sort tab have been changed.
+   - if not "removed"
+     - if the track is in the entry currently selected:
+       - remove entry and put into correct category
+       - if current entry != "All":
+         - if sort category changed:
+           - notify next sort tab ("removed")
+	 - if sort category did not change:
+	   - notify next sort tab ("not removed")
+       - if current entry == "All":
+         - notify next sort tab ("not removed")
+     - if the track is not in the entry currently selected (I don't know
+       how that could happen, though):
+       - if sort category changed: remove entry and put into correct category
+       - if this "correct" category is selected, call st_add_track for next
+         instance.
+   - if "removed"
+     - remove the track from the sort tab
+     - if track was in the entry currently selected, notify next instance
+       ("removed")
+  "removed": track has been removed from sort tab. This is different
+  from st_remove_track, because we will not notify the track model if a
+  track has been removed: it might confuse the user if the track, whose
+  tabs he/she just edited, disappeared from the display */
+void st_track_changed (Track *track, gboolean removed, guint32 inst)
+{
+  if (inst == prefs_get_int("sort_tab_num"))
+    {
+      tm_track_changed (track);
+      return;
+    }
+  else if (inst < prefs_get_int("sort_tab_num"))
+  {
+      switch (sorttab[inst]->current_category)
+      {
+      case ST_CAT_ARTIST:
+      case ST_CAT_ALBUM:
+      case ST_CAT_GENRE:
+      case ST_CAT_COMPOSER:
+      case ST_CAT_TITLE:
+      case ST_CAT_YEAR:
+	  st_track_changed_normal (track, removed, inst);
+	  break;
+      case ST_CAT_SPECIAL:
+	  st_track_changed_special (track, removed, inst);
+	  break;
+      case ST_CAT_NUM:
+	  break;
+      }
+  }
+}
+
+
+/* Reorders the tracks stored in the sort tabs according to the order
+ * in the selected playlist. This has to be done e.g. if we change the
+ * order in the track view.
+ *
+ * Right now I simply delete all members of all tab entries, then add
+ * the tracks again without having them added to the track view. This
+ * is very fast because neither the sort tab display nor the track
+ * view display is affected in any way. For my 2459 tracks that takes
+ * approx. 1.3 seconds (850 MHz AMD Duron) */
+void st_adopt_order_in_playlist (void)
+{
+    gint inst;
+    Playlist *current_playlist = pm_get_selected_playlist ();
+
+#if DEBUG_TIMING
+    GTimeVal time;
+    g_get_current_time (&time);
+    printf ("st_adopt_order_in_playlist enter: %ld.%06ld sec\n",
+	    time.tv_sec % 3600, time.tv_usec);
+#endif
+
+    /* first delete all tracks in all visible sort tabs */
+    for (inst = 0; inst< prefs_get_int("sort_tab_num"); ++inst)
+    {
+	SortTab *st = sorttab[inst];
+	GList *link;
+	for (link=st->entries; link; link=link->next)
+	{   /* in each entry delete all tracks */
+	    TabEntry *entry = (TabEntry *)link->data;
+	    g_list_free (entry->members);
+	    entry->members = NULL;
+	}
+    }
+
+    /* now add the tracks again, without adding them to the track view */
+    if (current_playlist)
+    {
+	GList *link;
+
+	for (link=current_playlist->members; link; link=link->next)
+	{
+	    st_add_track ((Track *)link->data, FALSE, FALSE, 0);
+	}
+    }
+#if DEBUG_TIMING
+    g_get_current_time (&time);
+    printf ("st_adopt_order_in_playlist enter: %ld.%06ld sec\n",
+	    time.tv_sec % 3600, time.tv_usec);
+#endif
+}
+
+
+/* called by st_add_track() */
+static void st_add_track_normal (Track *track, gboolean final,
+				gboolean display, guint32 inst)
+{
+    SortTab *st;
+    TabEntry *entry, *master_entry, *iter_entry;
+    const gchar *entryname = NULL;
+    GtkTreeSelection *selection;
+    GtkTreeIter iter;
+    TabEntry *select_entry = NULL;
+    gboolean first = FALSE;
+    gboolean group_track = FALSE;
+
+    st = sorttab[inst];
+    st->final = final;
+
+/*       if (track)   printf ("%d: add track: %s\n", inst, track->title); */
+/*       else        printf ("%d: add track: %p\n", inst, track); */
+
+    if (track != NULL)
+    {
+	/* add track to "All" (master) entry */
+	master_entry = g_list_nth_data (st->entries, 0);
+	if (master_entry == NULL)
+	{ /* doesn't exist yet -- let's create it */
+	    master_entry = g_malloc0 (sizeof (TabEntry));
+	    master_entry->name = g_strdup (_("All"));
+	    master_entry->master = TRUE;
+	    master_entry->compilation = FALSE;
+	    st_add_entry (master_entry, inst);
+	    first = TRUE; /* this is the first track */
+	}
+	master_entry->members = g_list_append (master_entry->members, track);
+	/* Check if this track should go in the compilation artist group */
+	group_track = ( prefs_get_int("group_compilations") &&
+	    (track->compilation == TRUE) && 
+	    (st->current_category == ST_CAT_ARTIST) );
+	/* Check whether entry of same name already exists */
+	if ( group_track )
+	{
+	    entry = st_get_compilation_entry (inst);
+	}
+	else
+	{
+	    entryname = st_get_entryname (track, inst);
+	    entry = st_get_entry_by_name (entryname, inst);
+	}
+	if (entry == NULL)
+	{ /* not found, create new one */
+	    entry = g_malloc0 (sizeof (TabEntry));
+	    if ( group_track )
+	    {
+		entry->name = g_strdup (_("Compilations"));
+	    }
+	    else
+	    {
+		entry->name = g_strdup (entryname);
+	    }
+	    entry->compilation = group_track;
+	    entry->master = FALSE;
+	    st_add_entry (entry, inst);
+	}
+	/* add track to entry members list */
+	entry->members = g_list_append (entry->members, track);
+	/* add track to next tab if "entry" is selected */
+	if (st->current_entry &&
+	    ((st->current_entry->master) || (entry == st->current_entry)))
+	{
+	    st_add_track (track, final, display, inst+1);
+	}
+	/* check if we should select some entry */
+	if (!st->current_entry)
+	{
+	    if (st->lastselection[st->current_category] == NULL)
+	    {
+		/* no last selection -- check if we should select "All" */
+		/* only select "All" when currently adding the first track */
+		if (first && prefs_get_int_index("st_autoselect", inst))
+		{
+		    select_entry = master_entry;
+		}
+	    }
+	    else
+	    {
+		/* select current entry if it corresponds to the last
+		   selection, or last_entry if that's the master entry */
+		TabEntry *last_entry = st_get_entry_by_name (
+		    st->lastselection[st->current_category], inst);
+		if (last_entry &&
+		    ((entry == last_entry) || last_entry->master))
+		{
+		    select_entry = last_entry;
+		}
+	    }
+	}
+    }
+    /* select "All" if it's the last track added, no entry currently
+       selected (including "select_entry", which is to be selected" and
+       prefs_get_int_index("st_autoselect", index) allows us to select "All" */
+    if (final && !st->current_entry && !select_entry &&
+	!st->unselected && prefs_get_int_index("st_autoselect", inst))
+    { /* auto-select entry "All" */
+	select_entry = g_list_nth_data (st->entries, 0);
+    }
+
+    if (select_entry)
+    {  /* select current select_entry */
+/* 	  printf("%d: selecting: %p: %s\n", inst, select_entry, select_entry->name); */
+	if (!gtk_tree_model_get_iter_first (st->model, &iter))
+	{
+	    g_warning ("Programming error: st_add_track: iter invalid\n");
+	    return;
+	}
+	do {
+	    gtk_tree_model_get (st->model, &iter,
+				ST_COLUMN_ENTRY, &iter_entry,
+				-1);
+	    if (iter_entry == select_entry)
+	    {
+		selection = gtk_tree_view_get_selection
+		    (st->treeview[st->current_category]);
+		/* We may need to unselect the previous selection */
+		/* gtk_tree_selection_unselect_all (selection); */
+		st->current_entry = select_entry;
+		gtk_tree_selection_select_iter (selection, &iter);
+		break;
+	    }
+	} while (gtk_tree_model_iter_next (st->model, &iter));
+    }
+    else if (!track && final)
+    {
+	st_add_track (NULL, final, display, inst+1);
+    }
+}
+
+/* Add track to sort tab. If the track matches the currently
+   selected sort criteria, it will be passed on to the next
+   sort tab. The last sort tab will pass the track on to the
+   track model (currently two sort tabs).
+   When the first track is added, the "All" entry is created.
+   If prefs_get_int_index("st_autoselect", inst) is true, the "All" entry is
+   automatically selected, if there was no former selection
+   @display: TRUE: add to track model (i.e. display it) */
+void st_add_track (Track *track, gboolean final, gboolean display, guint32 inst)
+{
+  static gint count = 0;
+
+#if DEBUG_ADD_TRACK
+  printf ("st_add_track: inst: %d, final: %d, display: %d, track: %p\n",
+	  inst, final, display, track);
+#endif
+
+  if (inst == prefs_get_int("sort_tab_num"))
+  {  /* just add to track model */
+      if ((track != NULL) && display)    tm_add_track_to_track_model (track, NULL);
+      if (final || (++count % 20 == 0))
+	  gtkpod_tracks_statusbar_update();
+  }
+  else if (inst < prefs_get_int("sort_tab_num"))
+  {
+      switch (sorttab[inst]->current_category)
+      {
+      case ST_CAT_ARTIST:
+      case ST_CAT_ALBUM:
+      case ST_CAT_GENRE:
+      case ST_CAT_COMPOSER:
+      case ST_CAT_TITLE:
+      case ST_CAT_YEAR:
+	  st_add_track_normal (track, final, display, inst);
+	  break;
+      case ST_CAT_SPECIAL:
+	  st_add_track_special (track, final, display, inst);
+	  break;
+      case ST_CAT_NUM:
+	  break;
+      }
+  }
+}
+
+
+/* called by st_remove_track() */
+static void st_remove_track_normal (Track *track, guint32 inst)
+{
+    TabEntry *master, *entry;
+    SortTab *st = sorttab[inst];
+
+    master = g_list_nth_data (st->entries, 0);
+    if (master == NULL) return; /* should not happen! */
+    /* remove "track" from master entry "All" */
+    master->members = g_list_remove (master->members, track);
+    /* find entry which other entry contains the track... */
+    entry = st_get_entry_by_track (track, inst);
+    /* ...and remove it */
+    if (entry) entry->members = g_list_remove (entry->members, track);
+    st_remove_track (track, inst+1);
+}
+
+
+/* Remove track from sort tab. If the track matches the currently
+   selected sort criteria, it will be passed on to the next
+   sort tab (i.e. removed).
+   The last sort tab will remove the
+   track from the track model (currently two sort tabs). */
+/* 02. Feb 2003: bugfix: track is always passed on to the next sort
+ * tab: it might have been recategorized, but still be displayed. JCS */
+void st_remove_track (Track *track, guint32 inst)
+{
+    if (inst == prefs_get_int("sort_tab_num"))
+    {
+	tm_remove_track (track);
+    }
+    else if (inst < prefs_get_int("sort_tab_num"))
+    {
+	switch (sorttab[inst]->current_category)
+	{
+	case ST_CAT_ARTIST:
+	case ST_CAT_ALBUM:
+	case ST_CAT_GENRE:
+	case ST_CAT_COMPOSER:
+	case ST_CAT_TITLE:
+	case ST_CAT_YEAR:
+	    st_remove_track_normal (track, inst);
+	    break;
+	case ST_CAT_SPECIAL:
+	    st_remove_track_special (track, inst);
+	    break;
+	case ST_CAT_NUM:
+	    break;
+	}
+    }
+}
+
+
+
+/* Init a sort tab: all current entries are removed. The next sort tab
+   is initialized as well (st_init (-1, inst+1)).  Set new_category to
+   -1 if the current category is to be left unchanged */
+/* Normally we do not specifically remember the "All" entry and will
+   select "All" in accordance to the prefs settings. */
+void st_init (ST_CAT_item new_category, guint32 inst)
+{
+  if (inst == prefs_get_int("sort_tab_num"))
+  {
+      tm_remove_all_tracks ();
+      gtkpod_tracks_statusbar_update ();
+      return;
+  }
+  if (inst < prefs_get_int("sort_tab_num"))
+  {
+      SortTab *st = sorttab[inst];
+
+      if (st == NULL) return; /* could happen during initialisation */
+      sp_store_sp_entries (inst); /* store sp entries (if applicable) */
+      st->unselected = FALSE; /* nothing was unselected so far */
+      st->final = TRUE;       /* all tracks are added */
+      st->is_go = FALSE;      /* did not press "Display" yet (special) */
+#if 0
+      if (st->current_entry != NULL)
+      {
+	  ST_CAT_item cat = st->current_category;
+	  if (!st->current_entry->master)
+	  {
+	      C_FREE (st->lastselection[cat]);
+	      st->lastselection[cat] = g_strdup (st->current_entry->name);
+	  }
+/* don't remember entry 'All' */
+#if 0
+	  else
+	  {
+	      gchar buf[] = {-1, 0}; /* this is how I mark the "All"
+				      * entry as string: should be
+				      * illegal UTF8 */
+	      C_FREE (st->lastselection[cat]);
+	      st->lastselection[cat] = g_strdup (buf);*/
+	  }
+#endif
+      }
+#endif
+      switch (sorttab[inst]->current_category)
+      {
+      case ST_CAT_ARTIST:
+      case ST_CAT_ALBUM:
+      case ST_CAT_GENRE:
+      case ST_CAT_COMPOSER:
+      case ST_CAT_TITLE:
+      case ST_CAT_YEAR:
+	  st_remove_all_entries_from_model (inst);
+	  break;
+      case ST_CAT_SPECIAL:
+	  sp_remove_all_members (inst);
+	  break;
+      case ST_CAT_NUM:
+	  break;
+      }
+      if (new_category != -1)
+      {
+	  st->current_category = new_category;
+	  prefs_set_int_index("st_category", inst, new_category);
+      }
+      st_init (-1, inst+1);
+  }
+}
+
+
+static void st_page_selected_cb (gpointer user_data1, gpointer user_data2)
+{
+  GtkNotebook *notebook = (GtkNotebook *)user_data1;
+  guint page = (guint)GPOINTER_TO_UINT(user_data2);
+  guint32 inst = st_get_instance_from_notebook (notebook);
+  guint oldpage;
+  gboolean is_go;
+  GList *copy = NULL;
+  SortTab *st;
+
+#if DEBUG_TIMING
+  GTimeVal time;
+  g_get_current_time (&time);
+  printf ("st_page_selected_cb enter (inst: %d, page: %d): %ld.%06ld sec\n",
+	  inst, page,
+	  time.tv_sec % 3600, time.tv_usec);
+#endif
+
+/*  printf("ps%d: cat: %d\n", inst, page);*/
+
+  if (inst == -1) return; /* invalid notebook */
+  st = sorttab[inst];
+  /* remember old is_go state and current page */
+  is_go = st->is_go;
+  oldpage = st->current_category;
+  /* re-initialize current instance */
+  st_init (page, inst);
+  /* write back old is_go state if page hasn't changed (redisplay) */
+  if (page == oldpage)  st->is_go = is_go;
+  /* Get list of tracks to re-insert */
+  copy = display_get_selected_members (inst-1);
+  if (copy)
+  {
+      GList *gl;
+      gboolean final;
+      /* add all tracks previously present to sort tab */
+      st_enable_disable_view_sort (inst, FALSE);
+      for (gl=copy; gl; gl=gl->next)
+      {
+	  Track *track = gl->data;
+	  st_add_track (track, FALSE, TRUE, inst);
+      }
+      st_enable_disable_view_sort (inst, TRUE);
+      final = TRUE;  /* playlist is always complete */
+      /* if playlist is not source, get final flag from
+       * corresponding sorttab */
+      if ((inst > 0) && (sorttab[inst-1])) final = sorttab[inst-1]->final;
+      st_add_track (NULL, final, TRUE, inst);
+  }
+#if DEBUG_TIMING
+  g_get_current_time (&time);
+  printf ("st_page_selected_cb exit (inst: %d, page: %d):  %ld.%06ld sec\n",
+	  inst, page,
+	  time.tv_sec % 3600, time.tv_usec);
+#endif
+}
+
+
+/* Called when page in sort tab is selected */
+static void st_page_selected (GtkNotebook *notebook, guint page)
+{
+  guint32 inst;
+
+  inst = st_get_instance_from_notebook (notebook);
+#if DEBUG_CB_INIT
+  printf ("st_page_selected: inst: %d, page: %d\n", inst, page);
+#endif
+  if (inst == -1) return; /* invalid notebook */
+  /* inst-1: changing a page in the first sort tab is like selecting a
+     new playlist and so on. Therefore we subtract 1 from the
+     instance. */
+  st_page_selected_cb (notebook, GUINT_TO_POINTER(page));
+}
+
+
+/* Redisplay the sort tab "inst" */
+void st_redisplay (guint32 inst)
+{
+    if (inst < prefs_get_int("sort_tab_num"))
+    {
+	if (sorttab[inst])
+	    st_page_selected (sorttab[inst]->notebook,
+			      sorttab[inst]->current_category);
+    }
+}
+
+/* Start sorting */
+static void st_sort_inst (guint32 inst, GtkSortType order)
+{
+    if (inst < prefs_get_int("sort_tab_num"))
+    {
+	SortTab *st = sorttab[inst];
+	if (st)
+	{
+	    switch (st->current_category)
+	    {
+	    case ST_CAT_ARTIST:
+	    case ST_CAT_ALBUM:
+	    case ST_CAT_GENRE:
+	    case ST_CAT_COMPOSER:
+	    case ST_CAT_TITLE:
+	    case ST_CAT_YEAR:
+		if (order != SORT_NONE)
+		    gtk_tree_sortable_set_sort_column_id (
+			GTK_TREE_SORTABLE (st->model),
+			ST_COLUMN_ENTRY, order);
+		else if (inst == 0)
+		{   /* we only redisplay for st0 because the others
+		       are reinitialized automatically */
+		    /* and we only redisplay if the tree is actually
+		       sorted */
+		    gint column;
+		    GtkSortType order;
+		    if (gtk_tree_sortable_get_sort_column_id
+			(GTK_TREE_SORTABLE (st->model), &column, &order))
+			st_redisplay (0);
+		}
+		break;
+	    case ST_CAT_SPECIAL:
+	    case ST_CAT_NUM:
+		break;
+	    }
+	}
+    }
+}
+
+
+void st_sort (GtkSortType order)
+{
+  gint i;
+  for (i=0; i < prefs_get_int("sort_tab_num"); ++i)
+		st_sort_inst (i, order);
+	
+	/* Reset the cover images. Unfortunately the track order is not maintained when the 
+	 * display list of tracks is created. Thus, if the desired track order is the original order
+	 * then unfortunately the tracks must be collected from the playlist once again and the
+	 * displaytracks list in coverart recreated.
+	 * ie. easy to sort ascending and descending but difficult to return to unsorted state
+	 */
+	coverart_set_images (order == SORT_NONE);
+}
+
+gint st_get_sorttab_page_number (int inst)
+{
+	if (sorttab[inst])
+		return gtk_notebook_get_current_page (sorttab[inst]->notebook);
+	else
+		return -1;
+}
+
+void st_set_sorttab_page (gint inst, gint category)
+{
+	if (sorttab[inst])
+	{
+		gtk_notebook_set_current_page (sorttab[inst]->notebook, category); 
+		st_page_selected (sorttab[inst]->notebook, category);
+  
+  	while (gtk_events_pending ()) gtk_main_iteration ();
+	}
+}
+
+gboolean st_set_selection (Itdb_Track *track)
+{
+    GtkTreeSelection *selection;
+    GtkTreeView *treeview;
+    GtkTreeModel *model;
+    GtkTreeIter iter;
+    TabEntry *entry = NULL;
+    gboolean status;
+	
+    gtk_notebook_set_current_page (sorttab[0]->notebook, ST_CAT_ARTIST); 
+    st_page_selected (sorttab[0]->notebook, ST_CAT_ARTIST);
+  
+    while (gtk_events_pending ()) gtk_main_iteration ();
+	
+  /* ######## Select the artist from the first sorttab ######## */
+  treeview = sorttab[0]->treeview[ST_CAT_ARTIST];
+  model = gtk_tree_view_get_model (treeview);
+  selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
+  
+  status = gtk_tree_model_get_iter_first (model, &iter);
+  g_return_val_if_fail (status, FALSE);
+  
+  do
+  {
+  	gtk_tree_model_get (model, &iter, ST_COLUMN_ENTRY, &entry , -1);
+		g_return_val_if_fail (entry, FALSE);
+		
+		if (g_ascii_strcasecmp (entry->name, track->artist) == 0)
+		{
+			/* break out the loop once the correct iter has been found */
+			break;
+		}
+  }
+  while (gtk_tree_model_iter_next (model, &iter));
+  
+  while (gtk_events_pending ()) gtk_main_iteration ();
+  
+  gtk_tree_selection_select_iter (selection, &iter);
+    	
+	while (gtk_events_pending ()) gtk_main_iteration ();
+	
+	/* ######## Select the album from the second sorttab ######## */
+	gtk_notebook_set_current_page (sorttab[1]->notebook, ST_CAT_ALBUM); 
+  st_page_selected (sorttab[1]->notebook, ST_CAT_ALBUM);
+  
+  while (gtk_events_pending ()) gtk_main_iteration ();
+	
+  treeview = sorttab[1]->treeview[ST_CAT_ALBUM];
+  model = gtk_tree_view_get_model (treeview);
+  selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
+  
+  status = gtk_tree_model_get_iter_first (model, &iter);
+  g_return_val_if_fail (status, FALSE);
+  
+  do
+  {
+  	gtk_tree_model_get (model, &iter, ST_COLUMN_ENTRY, &entry , -1);
+		g_return_val_if_fail (entry, FALSE);
+		
+		if (g_ascii_strcasecmp (entry->name, track->album) == 0)
+		{
+    	/* break out the loop once the correct iter has been found */
+    	break;
+		}
+  }
+  while (gtk_tree_model_iter_next (model, &iter));
+  
+  while (gtk_events_pending ()) gtk_main_iteration ();
+	  	
+  gtk_tree_selection_select_iter (selection, &iter);
+    	
+	return TRUE;	
+}
+
+
+static void st_selection_changed_cb (gpointer user_data1, gpointer user_data2)
+{
+  GtkTreeSelection *selection = (GtkTreeSelection *)user_data1;
+  guint32 inst = (guint32)GPOINTER_TO_UINT(user_data2);
+  GtkTreeModel *model;
+  GtkTreeIter  iter;
+  TabEntry *new_entry;
+  SortTab *st;
+
+#if DEBUG_TIMING || DEBUG_CB_INIT
+  GTimeVal time;
+  g_get_current_time (&time);
+  printf ("st_selection_changed_cb enter (inst: %d): %ld.%06ld sec\n",
+	  inst, time.tv_sec % 3600, time.tv_usec);
+#endif
+
+/*   printf("st_s_c_cb %d: entered\n", inst); */
+  st = sorttab[inst];
+  if (st == NULL) return;
+  if (gtk_tree_selection_get_selected (selection, &model, &iter) == FALSE)
+  {
+      /* no selection -- unselect current selection (unless
+         st->current_entry == NULL -- that means we're in the middle
+         of a  st_init() (removing all entries). In that case we don't
+	 want to forget our last selection! */
+      if (st->current_entry)
+      {
+	  st->current_entry = NULL;
+	  C_FREE (st->lastselection[st->current_category]);
+	  st->unselected = TRUE;
+      }
+	  st_init (-1, inst+1);
+  }
+  else
+  {   /* handle new selection */
+      gtk_tree_model_get (model, &iter,
+			  ST_COLUMN_ENTRY, &new_entry,
+			  -1);
+      /*printf("selected instance %d, entry %x (was: %x)\n", inst,
+       *new_entry, st->current_entry);*/
+
+      /* initialize next instance */
+      st_init (-1, inst+1);
+      /* remember new selection */
+      st->current_entry = new_entry;
+      if (!new_entry->master)
+      {
+	  C_FREE (st->lastselection[st->current_category]);
+	  st->lastselection[st->current_category] = g_strdup (new_entry->name);
+      }
+      st->unselected = FALSE;
+
+      if (new_entry->members)
+      {
+	  GList *gl;
+	  st_enable_disable_view_sort (inst+1, FALSE);
+	  	  
+	  for (gl=new_entry->members; gl; gl=gl->next)
+	  { /* add all member tracks to next instance */
+	      Track *track = gl->data;
+	      st_add_track (track, FALSE, TRUE, inst+1);
+	  }
+	  st_enable_disable_view_sort (inst+1, TRUE);
+	  st_add_track (NULL, TRUE, st->final, inst+1);
+      }
+      gtkpod_tracks_statusbar_update();
+      
+      /* Select the cover in the coverart_display */
+      GList *gl = g_list_first(new_entry->members);
+      if (gl != NULL)
+      {
+	  		Track *track = gl->data;
+	  		if (track != NULL)
+	  			coverart_select_cover (track);
+      }
+  }
+
+  space_data_update ();
+
+#if DEBUG_TIMING
+  g_get_current_time (&time);
+  printf ("st_selection_changed_cb exit:  %ld.%06ld sec\n",
+	  time.tv_sec % 3600, time.tv_usec);
+#endif
+}
+
+
+/* Callback function called when the selection
+   of the sort tab view has changed */
+/* Instead of handling the selection directly, we add a
+   "callback". Currently running display updates will be stopped
+   before the st_selection_changed_cb is actually called */
+static void st_selection_changed (GtkTreeSelection *selection,
+				  gpointer user_data)
+{
+#if DEBUG_CB_INIT
+    printf("st_s_c enter (inst: %d)\n", (gint)user_data);
+#endif
+    st_selection_changed_cb ((gpointer)selection, user_data);
+#if DEBUG_CB_INIT
+    printf("st_s_c exit (inst: %d)\n", (gint)user_data);
+#endif
+}
+
+
+/* Called when editable cell is being edited. Stores new data to
+   the entry list and changes all members. */
+static void
+st_cell_edited (GtkCellRendererText *renderer,
+		const gchar         *path_string,
+		const gchar         *new_text,
+		gpointer             data)
+{
+  GtkTreeModel *model;
+  GtkTreePath *path;
+  GtkTreeIter iter;
+  TabEntry *entry;
+  ST_item column;
+  gint i, n, inst;
+  GList *members;
+  SortTab *st;
+
+  inst = (guint32)GPOINTER_TO_UINT(data);
+  st = sorttab[inst];
+  model = st->model;
+  path = gtk_tree_path_new_from_string (path_string);
+  column = (ST_item)g_object_get_data (G_OBJECT (renderer), "column");
+  gtk_tree_model_get_iter (model, &iter, path);
+  gtk_tree_model_get (model, &iter, column, &entry, -1);
+
+  /*printf("Inst %d: st_cell_edited: column: %d  :%lx\n", inst, column, entry);*/
+
+  switch (column)
+    {
+    case ST_COLUMN_ENTRY:
+      /* We only do something, if the name actually got changed */
+      if (g_utf8_collate (entry->name, new_text) != 0)
+      {
+	  iTunesDB *itdb = NULL;
+	  /* remove old hash entry if available */
+	  TabEntry *hash_entry =
+	      g_hash_table_lookup (st->entry_hash, entry->name);
+	  if (hash_entry == entry)
+	      g_hash_table_remove (st->entry_hash, entry->name);
+	  /* replace entry name */
+	  if (sorttab[inst]->current_category == ST_CAT_YEAR)
+	  {   /* make sure the entry->name is identical to
+		 atoi(new_text) */
+	      g_free (entry->name);
+	      entry->name = g_strdup_printf ("%d", atoi (new_text));
+	      g_object_set (G_OBJECT (renderer), "text", entry->name, NULL);
+	  }
+	  else
+	  {
+	      g_free (entry->name);
+	      entry->name = g_strdup (new_text);
+	  }
+
+	  /* re-insert into hash table if the same name doesn't
+	     already exist */
+	  if (g_hash_table_lookup (st->entry_hash, entry->name) == NULL)
+	      g_hash_table_insert (st->entry_hash, entry->name, entry);
+	  /* Now we look up all the tracks and change the ID3 Tag as well */
+	  /* We make a copy of the current members list, as it may change
+             during the process */
+	  members = g_list_copy (entry->members);
+	  n = g_list_length (members);
+	  /* block user input if we write tags (might take a while) */
+	  if (prefs_get_int("id3_write"))   block_widgets ();
+	  for (i=0; i<n; ++i)
+	  {
+	      ExtraTrackData *etr;
+	      Track *track = (Track *)g_list_nth_data (members, i);
+	      T_item t_item;
+
+	      g_return_if_fail (track);
+	      etr = track->userdata;
+	      g_return_if_fail (etr);
+	      g_return_if_fail (track->itdb);
+	      if (!itdb) itdb = track->itdb;
+
+	      t_item = ST_to_T (sorttab[inst]->current_category);
+
+	      if (t_item == T_YEAR)
+	      {
+		  gint nr = atoi (new_text);
+		  if (nr < 0)  nr = 0;
+		  track->year = nr;
+		  g_free (etr->year_str);
+		  etr->year_str = g_strdup_printf ("%d", nr);
+	      }
+	      else
+	      {
+		  gchar **itemp_utf8 = track_get_item_pointer (track, t_item);
+		  g_return_if_fail (itemp_utf8);
+		  g_free (*itemp_utf8);
+		  *itemp_utf8 = g_strdup (new_text);
+	      }
+	      track->time_modified = time (NULL);
+	      pm_track_changed (track);
+	      /* If prefs say to write changes to file, do so */
+	      if (prefs_get_int("id3_write"))
+	      {
+		  /* T_item tag_id;*/
+		  /* should we update all ID3 tags or just the one
+		     changed? -- obsoleted in 0.71 */
+/*		  if (prefs_get_id3_writeall ()) tag_id = T_ALL;
+		  else		                 tag_id = t_item;*/
+		  write_tags_to_file (track);
+		  while (widgets_blocked && gtk_events_pending ())
+		      gtk_main_iteration ();
+	      }
+	  }
+	  g_list_free (members);
+	  /* allow user input again */
+	  if (prefs_get_int("id3_write"))   release_widgets ();
+	  /* display possible duplicates that have been removed */
+	  gp_duplicate_remove (NULL, NULL);
+	  /* indicate that data has changed */
+	  if (itdb) data_changed (itdb);
+      }
+      break;
+    default:
+	break;
+    }
+  gtk_tree_path_free (path);
+}
+
+
+/* The sort tab entries are stored in a separate list (sorttab->entries)
+   and only pointers to the corresponding TabEntry structure are placed
+   into the model.
+   This function reads the data for the given cell from the list and
+   passes it to the renderer. */
+static void st_cell_data_func (GtkTreeViewColumn *tree_column,
+			       GtkCellRenderer   *renderer,
+			       GtkTreeModel      *model,
+			       GtkTreeIter       *iter,
+			       gpointer           data)
+{
+  TabEntry *entry;
+  gint column;
+
+  column = (gint)GPOINTER_TO_INT(g_object_get_data (G_OBJECT (renderer), "column"));
+  gtk_tree_model_get (model, iter, ST_COLUMN_ENTRY, &entry, -1);
+
+  switch (column)
+    {  /* We only have one column, so this code is overkill... */
+    case ST_COLUMN_ENTRY:
+      if (entry->master || entry->compilation)
+      {   /* mark the "All" entry */
+	  g_object_set (G_OBJECT (renderer),
+			"text", entry->name,
+			"editable", FALSE,
+			"weight", PANGO_WEIGHT_BOLD,
+			NULL);
+      }
+      else
+      {
+	  g_object_set (G_OBJECT (renderer),
+			"text", entry->name,
+			"editable", TRUE,
+			"weight", PANGO_WEIGHT_NORMAL,
+			NULL);
+      }
+      break;
+    }
+}
+
+/* Function used to compare rows with user's search string */
+gboolean st_search_equal_func (GtkTreeModel *model,
+			       gint column,
+			       const gchar *key,
+			       GtkTreeIter *iter,
+			       gpointer search_data)
+{
+  TabEntry *entry1;
+  gboolean cmp;
+  gtk_tree_model_get (model, iter, ST_COLUMN_ENTRY, &entry1, -1);
+
+  cmp = (compare_string_start_case_insensitive (
+	  entry1->name,
+	  key) != 0);
+  return cmp;
+};
+
+/* Function used to compare two cells during sorting (sorttab view) */
+gint st_data_compare_func (GtkTreeModel *model,
+			   GtkTreeIter *a,
+			   GtkTreeIter *b,
+			   gpointer user_data)
+{
+  TabEntry *entry1;
+  TabEntry *entry2;
+  GtkSortType order;
+  gint corr, colid;
+  gint inst;
+  SortTab *st;
+
+  inst = (guint32)GPOINTER_TO_UINT(user_data);
+
+  gtk_tree_model_get (model, a, ST_COLUMN_ENTRY, &entry1, -1);
+  gtk_tree_model_get (model, b, ST_COLUMN_ENTRY, &entry2, -1);
+  if(gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE (model),
+					   &colid, &order) == FALSE)
+      return 0;
+
+  /* We make sure that the "all" entry always stays on top, closely followed
+     by the compilation entry */
+  if (order == GTK_SORT_ASCENDING) corr = +1;
+  else                             corr = -1;
+  if (entry1->master) return (-corr);
+  if (entry2->master) return (corr);
+  if (entry1->compilation) return (-corr);
+  if (entry2->compilation) return (corr);
+
+  /* compare the two entries */
+  /* string_compare_func is set to either compare_string_fuzzy or
+     compare_string in on_st_switch_page() which is called
+     once before the comparing begins. */
+
+  st = sorttab[inst];
+
+  return st->string_compare_func (entry1->name, entry2->name);
+}
+
+/* Stop editing. If @cancel is TRUE, the edited value will be
+   discarded (I have the feeling that the "discarding" part does not
+   work quite the way intended). */
+void st_stop_editing (gint inst, gboolean cancel)
+{
+    if (inst < prefs_get_int("sort_tab_num"))
+    {
+	SortTab *st = sorttab[inst];
+	if (st)
+	{
+	    GtkTreeViewColumn *col;
+	    gtk_tree_view_get_cursor (st->treeview[st->current_category],
+				      NULL, &col);
+	    if (col)
+	    {
+		if (!cancel && col->editable_widget)
+		    gtk_cell_editable_editing_done (col->editable_widget);
+		if (col->editable_widget)
+		    gtk_cell_editable_remove_widget (col->editable_widget);
+	    }
+	}
+    }
+}
+
+
+/* Compare function to avoid sorting */
+static gint st_nosort_comp (GtkTreeModel *model,
+			    GtkTreeIter *a,
+			    GtkTreeIter *b,
+			    gpointer user_data)
+{
+    return 0;
+}
+
+
+
+/* Disable sorting of the view during lengthy updates. */
+/* @enable: TRUE: enable, FALSE: disable */
+void st_enable_disable_view_sort (gint inst, gboolean enable)
+{
+    static gint disable_count[SORT_TAB_MAX];
+
+    if (inst >= prefs_get_int("sort_tab_num"))
+    {
+	tm_enable_disable_view_sort (enable);
+	return;
+    }
+
+    if (enable)
+    {
+	disable_count[inst]--;
+	if (disable_count[inst] < 0)
+	    fprintf (stderr, "Programming error: disable_count < 0\n");
+	if (disable_count[inst] == 0)
+	{
+	    /* Re-enable sorting */
+	    if (prefs_get_int("st_sort") != SORT_NONE)
+	    {
+		SortTab *st = sorttab[inst];
+		if (st && 
+		    (st->current_category != ST_CAT_SPECIAL) &&
+		    st->model)
+		{
+		    if (BROKEN_GTK_TREE_SORT)
+		    {
+			gtk_tree_sortable_set_sort_func (
+			    GTK_TREE_SORTABLE (st->model),
+			    ST_COLUMN_ENTRY,
+			    st_data_compare_func, GINT_TO_POINTER(inst), NULL);
+		    }
+		    else
+		    {
+			gtk_tree_sortable_set_sort_column_id (
+			    GTK_TREE_SORTABLE (st->model),
+			    ST_COLUMN_ENTRY,
+			    prefs_get_int("st_sort"));
+		    }
+		}
+	    }
+	    st_enable_disable_view_sort (inst+1, enable);
+	}
+    }
+    else
+    {
+	if (disable_count[inst] == 0)
+	{
+	    /* Disable sorting */
+	    if (prefs_get_int("st_sort") != SORT_NONE)
+	    {
+		SortTab *st = sorttab[inst];
+		if (st && 
+		    (st->current_category != ST_CAT_SPECIAL) &&
+		    st->model)
+		{
+		    if (BROKEN_GTK_TREE_SORT)
+		    {
+			gtk_tree_sortable_set_sort_func (
+			    GTK_TREE_SORTABLE (st->model),
+			    ST_COLUMN_ENTRY,
+			    st_nosort_comp, NULL, NULL);
+		    }
+		    else
+		    {
+			gtk_tree_sortable_set_sort_column_id (
+			    GTK_TREE_SORTABLE (st->model),
+			    GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID,
+			    prefs_get_int("st_sort"));
+		    }
+		}
+	    }
+	    st_enable_disable_view_sort (inst+1, enable);
+	}
+	disable_count[inst]++;
+    }
+}
+
+
+
+void st_select_current_position (gint inst, gint x, gint y)
+{
+    if (inst < prefs_get_int("sort_tab_num"))
+    {
+	SortTab *st = sorttab[inst];
+	if (st)
+	{
+	    GtkTreePath *path;
+	    GtkTreeView *tv = st->treeview[st->current_category];
+
+	    gtk_tree_view_get_path_at_pos (tv, x, y, &path, NULL, NULL, NULL);
+	    if (path)
+	    {
+		GtkTreeSelection *ts = gtk_tree_view_get_selection (tv);
+		gtk_tree_selection_select_path (ts, path);
+		gtk_tree_path_free (path);
+	    }
+	}
+    }
+}
+
+
+/* Make the appropriate number of sort tab instances visible */
+/* Also: make the menu items "more/less sort tabs" active/inactive as
+ * needed. */
+static void st_adjust_visible (void)
+{
+    gint i,n;
+    GtkWidget *w;
+
+    if (!st_paned[0])  return;
+
+    /* first initialize (clear) all sorttabs */
+    n = prefs_get_int("sort_tab_num");
+    prefs_set_int("sort_tab_num", SORT_TAB_MAX);
+    st_init (-1, 0);
+    prefs_set_int("sort_tab_num", n);
+
+    /* set the visible elements */
+    for (i=0; i<n; ++i)
+    {
+	gtk_widget_show (GTK_WIDGET (sorttab[i]->notebook));
+	if (i < PANED_NUM_ST)	gtk_widget_show (GTK_WIDGET (st_paned[i]));
+    }
+    /* set the invisible elements */
+    for (i=n; i<SORT_TAB_MAX; ++i)
+    {
+	gtk_widget_hide (GTK_WIDGET (sorttab[i]->notebook));
+	if (i < PANED_NUM_ST)	gtk_widget_hide (GTK_WIDGET (st_paned[i]));
+    }
+
+    /* activate / deactiveate "less sort tabs" menu item */
+    w = gtkpod_xml_get_widget (main_window_xml, "less_sort_tabs");
+    if (n == 0) gtk_widget_set_sensitive (w, FALSE);
+    else        gtk_widget_set_sensitive (w, TRUE);
+
+    /* activate / deactiveate "more sort tabs" menu item */
+    w = gtkpod_xml_get_widget (main_window_xml, "more_sort_tabs");
+    if (n == SORT_TAB_MAX) gtk_widget_set_sensitive (w, FALSE);
+    else                   gtk_widget_set_sensitive (w, TRUE);
+}
+
+/* Make the appropriate number of sort tab instances visible */
+/* Also: make the menu items "more/less sort tabs" active/inactive as
+ * needed. */
+void st_show_visible (void)
+{
+    /* Adjust visibility */
+    st_adjust_visible ();
+
+    /* redisplay */
+    st_redisplay (0);
+}
+
+
+/* set the paned positions for the visible sort tabs in the prefs
+ * structure. This function is called when first creating the paned
+ * elements and from within st_arrange_visible_sort_tabs() */
+static void st_set_visible_sort_tab_paned (void)
+{
+    gint i, x, y, p0, num, width;
+
+    num = prefs_get_int("sort_tab_num");
+    if (num > 0)
+    {
+	gchar *buf;
+	GtkWidget *w;
+
+	gtk_window_get_size (GTK_WINDOW (gtkpod_window), &x, &y);
+	buf = g_strdup_printf ("paned%d", PANED_PLAYLIST);
+	if((w = gtkpod_xml_get_widget (main_window_xml,  buf)))
+	{
+	    p0 = gtk_paned_get_position (GTK_PANED (w));
+	    width = (x-p0) / num;
+	    for (i=0; i<num; ++i)
+	    {
+		prefs_set_int_index("paned_pos_", PANED_NUM_GLADE+i, width);
+	    }
+	}
+	g_free (buf);
+    }
+}
+
+
+/* Regularly arrange the visible sort tabs */
+void st_arrange_visible_sort_tabs (void)
+{
+    gint i, num;
+
+    num = prefs_get_int("sort_tab_num");
+    if (num > 0)
+    {
+	st_set_visible_sort_tab_paned ();
+	for (i=0; i<num; ++i)
+	{
+	    if (prefs_get_int_index("paned_pos_", PANED_NUM_GLADE + i) != -1)
+	    {
+		if (st_paned[i])
+		    gtk_paned_set_position (
+			st_paned[i], prefs_get_int_index("paned_pos_", PANED_NUM_GLADE+i));
+	    }
+	}
+    }
+}
+
+
+
+/* Created paned elements for sorttabs */
+static void st_create_paned (void)
+{
+    gint i;
+
+    /* sanity check */
+    g_return_if_fail (st_paned[0] == NULL);
+
+    for (i=0; i<PANED_NUM_ST; ++i)
+    {
+	GtkWidget *paned;
+
+	paned = gtk_hpaned_new ();
+	gtk_widget_show (paned);
+ 	if (i==0)
+	{
+	    GtkWidget *parent;
+	    GtkWidget *dummy;
+	    parent = gtkpod_xml_get_widget (main_window_xml, "paned1");
+	    dummy = gtkpod_xml_get_widget (main_window_xml, "paned1_dummy");
+	    g_return_if_fail (parent);
+	    g_return_if_fail (dummy);
+	    gtk_widget_destroy (dummy);
+	    gtk_paned_pack1 (GTK_PANED (parent), paned, TRUE, TRUE);
+	}
+	else
+	{
+	    gtk_paned_pack2 (st_paned[i-1], paned, TRUE, TRUE);
+	}
+	st_paned[i] = GTK_PANED (paned);
+    }
+    /* set position of visible paned to decent values if not already
+       set */
+    if (prefs_get_int_index("paned_pos_", PANED_NUM_GLADE) == -1)
+	st_set_visible_sort_tab_paned ();
+}
+
+static gboolean
+st_button_press_event(GtkWidget *w, GdkEventButton *e, gpointer data)
+{
+    if(w && e)
+    {
+	switch(e->button)
+	{
+	    case 3:
+		st_select_current_position (GPOINTER_TO_INT(data), e->x, e->y);
+		st_context_menu_init(GPOINTER_TO_INT(data));
+		return TRUE;
+	    default:
+		break;
+	}
+
+    }
+    return(FALSE);
+}
+
+/* Create tracks listview */
+static void st_create_treeview (gint inst, ST_CAT_item st_cat)
+{
+  SortTab *st = sorttab[inst];
+  GtkTreeSelection *selection;
+  GtkTreeView *treeview;
+  GtkCellRenderer *renderer;
+  GtkTreeViewColumn *column;
+
+  /* create treeview */
+  treeview = GTK_TREE_VIEW (gtk_tree_view_new ());
+  gtk_widget_show (GTK_WIDGET (treeview));
+  st->treeview[st_cat] = treeview;
+  gtk_container_add (GTK_CONTAINER (st->window[st_cat]),
+		     GTK_WIDGET (treeview));
+  gtk_tree_view_set_model (treeview, st->model);
+  g_signal_connect_after ((gpointer) treeview, "key_release_event",
+			  G_CALLBACK (on_st_treeview_key_release_event),
+			  NULL);
+  gtk_drag_source_set (GTK_WIDGET (treeview), GDK_BUTTON1_MASK,
+		       st_drag_types, TGNR (st_drag_types),
+		       GDK_ACTION_COPY|GDK_ACTION_MOVE);
+  g_signal_connect (G_OBJECT (treeview), "button-press-event",
+		    G_CALLBACK (st_button_press_event), GINT_TO_POINTER(inst));
+  g_signal_connect ((gpointer) treeview, "drag_data_get",
+		    G_CALLBACK (st_drag_data_get),
+		    NULL);
+  g_signal_connect ((gpointer) treeview, "drag-end",
+		    G_CALLBACK (st_drag_end),
+		    NULL);
+  gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (treeview), TRUE);
+  gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (treeview), FALSE);
+  gtk_tree_view_set_enable_search (GTK_TREE_VIEW (treeview), TRUE);
+  gtk_tree_view_set_search_column (GTK_TREE_VIEW (treeview), 0);
+  gtk_tree_view_set_search_equal_func (GTK_TREE_VIEW (treeview), 
+				       st_search_equal_func,
+				       NULL,
+				       NULL);
+
+  selection = gtk_tree_view_get_selection (treeview);
+  gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
+  g_signal_connect (G_OBJECT (selection), "changed",
+		    G_CALLBACK (st_selection_changed),
+		    GINT_TO_POINTER(inst));
+  /* Add column */
+  renderer = gtk_cell_renderer_text_new ();
+  g_signal_connect (G_OBJECT (renderer), "edited",
+		    G_CALLBACK (st_cell_edited),
+		    GINT_TO_POINTER(inst));
+  g_object_set_data (G_OBJECT (renderer), "column",
+		     (gint *)ST_COLUMN_ENTRY);
+  column = gtk_tree_view_column_new ();
+  gtk_tree_view_column_pack_start (column, renderer, TRUE);
+  column = gtk_tree_view_column_new_with_attributes ("", renderer, NULL);
+  gtk_tree_view_column_set_cell_data_func (column, renderer,
+					   st_cell_data_func, NULL, NULL);
+  gtk_tree_view_column_set_sort_column_id (column, ST_COLUMN_ENTRY);
+  gtk_tree_view_column_set_resizable (column, TRUE);
+  gtk_tree_view_column_set_sort_order (column, GTK_SORT_ASCENDING);
+  gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (st->model),
+				   ST_COLUMN_ENTRY,
+				   st_data_compare_func,
+				   GINT_TO_POINTER(inst), NULL);
+  gtk_tree_view_append_column (treeview, column);
+}
+
+
+
+/* Create the "special" page in the notebook and connect all the
+   signals */
+static void st_create_special (gint inst, GtkWidget *window)
+{
+      GtkWidget *special; 
+      GtkWidget *viewport; 
+      GtkWidget *w;
+      SortTab   *st = sorttab[inst];
+      gint i;
+      GladeXML *special_xml;
+      gchar *buf;
+
+      special_xml = glade_xml_new (xml_file, "special_sorttab", NULL);
+      special = gtkpod_xml_get_widget (special_xml, "special_sorttab");
+     
+      viewport = gtkpod_xml_get_widget (special_xml, "special_viewport");
+
+
+      /* according to GTK FAQ: move a widget to a new parent */
+      gtk_widget_ref (viewport);
+      gtk_container_remove (GTK_CONTAINER (special), viewport);
+      gtk_container_add (GTK_CONTAINER (window), viewport);
+      gtk_widget_unref (viewport);
+
+      /* Connect the signal handlers and set default value. User data
+	 is @inst+(additional data << SP_SHIFT) */
+      /* AND/OR button */
+      w = gtkpod_xml_get_widget (special_xml, "sp_or_button");
+      g_signal_connect ((gpointer)w,
+			"toggled", G_CALLBACK (on_sp_or_button_toggled),
+			GINT_TO_POINTER(inst));
+      if (prefs_get_int_index("sp_or", inst))
+	  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), TRUE);
+      else
+      {
+	  w = gtkpod_xml_get_widget (special_xml, "sp_and_button");
+	  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), TRUE);
+      }
+
+      /* RATING */
+      w = gtkpod_xml_get_widget (special_xml, "sp_rating_button");
+      g_signal_connect ((gpointer)w,
+			"toggled", G_CALLBACK (on_sp_cond_button_toggled),
+			GUINT_TO_POINTER((T_RATING<<SP_SHIFT) + inst));
+      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+				   prefs_get_int_index("sp_rating_cond", inst));
+      for (i=0; i<=RATING_MAX; ++i)
+      {
+	  gchar *buf = g_strdup_printf ("sp_rating%d", i);
+	  w = gtkpod_xml_get_widget (special_xml, buf);
+	  g_signal_connect ((gpointer)w,
+			    "toggled", G_CALLBACK (on_sp_rating_n_toggled),
+			    GUINT_TO_POINTER((i<<SP_SHIFT) + inst));
+	  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+				       get_sp_rating_n (inst, i));
+	  g_free (buf);
+      }
+
+      /* PLAYCOUNT */
+      w = gtkpod_xml_get_widget (special_xml, "sp_playcount_button");
+      g_signal_connect ((gpointer)w,
+			"toggled", G_CALLBACK (on_sp_cond_button_toggled),
+			GUINT_TO_POINTER((T_PLAYCOUNT<<SP_SHIFT) + inst));
+      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+				   prefs_get_int_index("sp_playcound_cond", inst));
+      w = gtkpod_xml_get_widget (special_xml, "sp_playcount_low");
+      g_signal_connect ((gpointer)w,
+			"value_changed",
+			G_CALLBACK (on_sp_playcount_low_value_changed),
+			GINT_TO_POINTER(inst));
+      gtk_spin_button_set_value (GTK_SPIN_BUTTON (w),
+				 prefs_get_int_index("sp_playcount_low", inst));
+      w = gtkpod_xml_get_widget (special_xml, "sp_playcount_high");
+      g_signal_connect ((gpointer)w,
+			"value_changed",
+			G_CALLBACK (on_sp_playcount_high_value_changed),
+			GINT_TO_POINTER(inst));
+      gtk_spin_button_set_value (GTK_SPIN_BUTTON (w),
+				 prefs_get_int_index("sp_playcount_high", inst));
+
+      /* PLAYED */
+      buf = prefs_get_string_index("sp_played_state", inst);
+      
+      w = gtkpod_xml_get_widget (special_xml, "sp_played_button");
+      st->ti_played.active = w;
+      g_signal_connect ((gpointer)w,
+			"toggled", G_CALLBACK (on_sp_cond_button_toggled),
+			GUINT_TO_POINTER((T_TIME_PLAYED<<SP_SHIFT) + inst));
+      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+				   prefs_get_int_index("sp_played_cond", inst));
+      w = gtkpod_xml_get_widget (special_xml, "sp_played_entry");
+      st->ti_played.entry = w;
+      gtk_entry_set_text (GTK_ENTRY (w),
+			  buf);
+      g_signal_connect ((gpointer)w,
+			"activate", G_CALLBACK (on_sp_entry_activate),
+			GUINT_TO_POINTER((T_TIME_PLAYED<<SP_SHIFT) + inst));
+      g_signal_connect ((gpointer)gtkpod_xml_get_widget (special_xml,
+						 "sp_played_cal_button"),
+			"clicked",
+			G_CALLBACK (on_sp_cal_button_clicked),
+			GUINT_TO_POINTER((T_TIME_PLAYED<<SP_SHIFT) + inst));
+      g_free(buf);
+
+      /* MODIFIED */
+      buf = prefs_get_string_index("sp_modified_state", inst);
+      
+      w = gtkpod_xml_get_widget (special_xml, "sp_modified_button");
+      st->ti_modified.active = w;
+      g_signal_connect ((gpointer)w,
+			"toggled", G_CALLBACK (on_sp_cond_button_toggled),
+			GUINT_TO_POINTER((T_TIME_MODIFIED<<SP_SHIFT) + inst));
+      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+				   prefs_get_int_index("sp_modified_cond", inst));
+      w = gtkpod_xml_get_widget (special_xml, "sp_modified_entry");
+      st->ti_modified.entry = w;
+      gtk_entry_set_text (GTK_ENTRY (w),
+			  buf);
+      g_signal_connect ((gpointer)w,
+			"activate", G_CALLBACK (on_sp_entry_activate),
+			GUINT_TO_POINTER((T_TIME_MODIFIED<<SP_SHIFT) + inst));
+      g_signal_connect ((gpointer)gtkpod_xml_get_widget (special_xml,
+						 "sp_modified_cal_button"),
+			"clicked",
+			G_CALLBACK (on_sp_cal_button_clicked),
+			GUINT_TO_POINTER((T_TIME_MODIFIED<<SP_SHIFT) + inst));
+      g_free(buf);
+
+      /* ADDED */
+      buf = prefs_get_string_index("sp_added_state", inst);
+      
+      w = gtkpod_xml_get_widget (special_xml, "sp_added_button");
+      st->ti_added.active = w;
+      g_signal_connect ((gpointer)w,
+			"toggled", G_CALLBACK (on_sp_cond_button_toggled),
+			GUINT_TO_POINTER((T_TIME_ADDED<<SP_SHIFT) + inst));
+      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+				   prefs_get_int_index("sp_added_cond", inst));
+      w = gtkpod_xml_get_widget (special_xml, "sp_added_entry");
+      st->ti_added.entry = w;
+      gtk_entry_set_text (GTK_ENTRY (w),
+			  buf);
+      g_signal_connect ((gpointer)w,
+			"activate", G_CALLBACK (on_sp_entry_activate),
+			GUINT_TO_POINTER((T_TIME_ADDED<<SP_SHIFT) + inst));
+      g_signal_connect ((gpointer)gtkpod_xml_get_widget (special_xml,
+						 "sp_added_cal_button"),
+			"clicked",
+			G_CALLBACK (on_sp_cal_button_clicked),
+			GUINT_TO_POINTER((T_TIME_ADDED<<SP_SHIFT) + inst));
+
+
+      g_signal_connect ((gpointer)gtkpod_xml_get_widget (special_xml, "sp_go"),
+			"clicked", G_CALLBACK (on_sp_go_clicked),
+			GINT_TO_POINTER(inst));
+      w = gtkpod_xml_get_widget (special_xml, "sp_go_always");
+      g_signal_connect ((gpointer)w,
+			"toggled", G_CALLBACK (on_sp_go_always_toggled),
+			GINT_TO_POINTER(inst));
+      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+				   prefs_get_int_index("sp_autodisplay", inst));
+      g_free (buf);
+
+      /* Safe pointer to tooltips */
+      st->sp_tooltips_data = gtk_tooltips_data_get(gtkpod_xml_get_widget (special_xml, "sp_modified_entry"));
+      /* Show / don't show tooltips */
+      g_return_if_fail (st->sp_tooltips_data);
+      if (prefs_get_int("display_tooltips_main")) 
+	  gtk_tooltips_enable (st->sp_tooltips_data->tooltips);
+      else gtk_tooltips_disable (st->sp_tooltips_data->tooltips);
+      /* we don't need this any more */
+      gtk_widget_destroy (special);
+}
+
+
+/* create the treeview for category @st_cat of instance @inst */
+static void st_create_page (gint inst, ST_CAT_item st_cat)
+{
+  GtkWidget *st0_notebook;
+  GtkWidget *st0_window0;
+  GtkWidget *st0_label0 = NULL;
+  SortTab *st = sorttab[inst];
+
+  /* destroy treeview if already present */
+  if (st->treeview[st_cat])
+  {
+      gtk_widget_destroy (GTK_WIDGET (st->treeview[st_cat]));
+      st->treeview[st_cat] = NULL;
+  }
+
+  st0_notebook = GTK_WIDGET (st->notebook);
+
+  if (st->window[st_cat])
+  {
+      st0_window0 = GTK_WIDGET (st->window[st_cat]);
+  }
+  else
+  {   /* create window if not already present */
+      st0_window0 = gtk_scrolled_window_new (NULL, NULL);
+      gtk_widget_show (st0_window0);
+      gtk_container_add (GTK_CONTAINER (st0_notebook), st0_window0);
+      gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (st0_window0), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+      st->window[st_cat] = st0_window0;
+  }
+
+  switch (st_cat)
+  {
+  case ST_CAT_ARTIST:
+      st0_label0 = gtk_label_new (_("Artist"));
+      break;
+  case ST_CAT_ALBUM:
+      st0_label0 = gtk_label_new (_("Album"));
+      break;
+  case ST_CAT_GENRE:
+      st0_label0 = gtk_label_new (_("Genre"));
+      break;
+  case ST_CAT_COMPOSER:
+      st0_label0 = gtk_label_new (_("Comp."));
+      break;
+  case ST_CAT_TITLE:
+      st0_label0 = gtk_label_new (_("Title"));
+      break;
+  case ST_CAT_YEAR:
+      st0_label0 = gtk_label_new (_("Year"));
+      break;
+  case ST_CAT_SPECIAL:
+      st0_label0 = gtk_label_new (_("Special"));
+      break;
+  case ST_CAT_NUM: /* should not happen... */
+      g_return_if_reached ();
+      break;
+  }
+  gtk_widget_show (st0_label0);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (st0_notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (st0_notebook), st_cat), st0_label0);
+  gtk_label_set_justify (GTK_LABEL (st0_label0), GTK_JUSTIFY_LEFT);
+
+  if (st_cat != ST_CAT_SPECIAL)
+  {
+      st_create_treeview (inst, st_cat);
+  }
+  else
+  {
+      st_create_special (inst, st0_window0);
+  }
+}
+
+
+/* create all ST_CAT_NUM treeviews and the special page in sort tab of
+ * instance @inst, then set the model */
+static void st_create_pages (gint inst)
+{
+  GtkTreeModel *model;
+  GtkListStore *liststore;
+  SortTab *st = sorttab[inst];
+
+  /* remove old model */
+  if (st->model)
+  {
+      g_object_unref (G_OBJECT (st->model));
+      st->model = NULL;
+  }
+  /* create model */
+  liststore = gtk_list_store_new (ST_NUM_COLUMNS, G_TYPE_POINTER);
+  model = GTK_TREE_MODEL (liststore);
+  st->model = model;
+
+  st_create_page (inst, ST_CAT_ARTIST);
+  st_create_page (inst, ST_CAT_ALBUM);
+  st_create_page (inst, ST_CAT_GENRE);
+  st_create_page (inst, ST_CAT_COMPOSER);
+  st_create_page (inst, ST_CAT_TITLE);
+  st_create_page (inst, ST_CAT_YEAR);
+  st_create_page (inst, ST_CAT_SPECIAL);
+}
+
+
+/* Create notebook and fill in sorttab[@inst] */
+static void st_create_notebook (gint inst)
+{
+  GtkWidget *st0_notebook;
+  GtkPaned *paned;
+  gint i, page;
+  SortTab *st = sorttab[inst];
+
+  if (st->notebook)
+  {
+      gtk_widget_destroy (GTK_WIDGET (st->notebook));
+      st->notebook = NULL;
+      for (i=0; i<ST_CAT_NUM; ++i)
+      {
+	  st->treeview[i] = NULL;
+	  st->window[i] = NULL;
+      }
+  }
+
+  /* paned elements exist? */
+  if (!st_paned[0])   st_create_paned ();
+
+  st0_notebook = gtk_notebook_new ();
+  if (inst < prefs_get_int("sort_tab_num")) gtk_widget_show (st0_notebook);
+  else                                  gtk_widget_hide (st0_notebook);
+  /* which pane? */
+  if (inst == SORT_TAB_MAX-1)  i = inst-1;
+  else                         i = inst;
+  paned = st_paned[i];
+  /* how to pack? */
+  if (inst == SORT_TAB_MAX-1)
+      gtk_paned_pack2 (paned, st0_notebook, TRUE, TRUE);
+  else
+      gtk_paned_pack1 (paned, st0_notebook, FALSE, TRUE);
+  gtk_notebook_set_scrollable (GTK_NOTEBOOK (st0_notebook), TRUE);
+
+  st->notebook = GTK_NOTEBOOK (st0_notebook);
+  st_create_pages (inst);
+  page = prefs_get_int_index("st_category", inst);
+  st->current_category = page;
+  gtk_notebook_set_current_page (st->notebook, page);
+  st_set_string_compare_func (inst, page);
+
+  if (prefs_get_int("st_sort") != SORT_NONE)
+    st_sort_inst (inst, prefs_get_int("st_sort"));
+
+  g_signal_connect ((gpointer) st0_notebook, "switch_page",
+                    G_CALLBACK (on_st_switch_page),
+                    GINT_TO_POINTER(inst));
+}
+
+
+/* Create sort tabs */
+void st_create_tabs (void)
+{
+  gint inst;
+/*   gchar *name; */
+
+  /* we count downward here because the smaller sort tabs might try to
+     initialize the higher one's -> create the higher ones first */
+  for (inst=SORT_TAB_MAX-1; inst>=0; --inst)
+  {
+	sorttab[inst] = g_malloc0 (sizeof (SortTab));
+	st_create_notebook (inst);
+  }
+  /* adjust number of visible sorttabs (cannot use st_show_visible()
+     because the latter calls st_redisplay(0) which refers to the
+     playlist view which hasn't yet set up) */
+  st_adjust_visible ();
+}
+
+/* Clean up the memory used by sort tabs (program quit). */
+void st_cleanup (void)
+{
+    gint i,j;
+    for (i=0; i<SORT_TAB_MAX; ++i)
+    {
+	if (sorttab[i] != NULL)
+	{
+	    sp_store_sp_entries (i);
+	    st_remove_all_entries_from_model (i);
+	    for (j=0; j<ST_CAT_NUM; ++j)
+	    {
+		C_FREE (sorttab[i]->lastselection[j]);
+	    }
+	    g_free (sorttab[i]);
+	    sorttab[i] = NULL;
+	}
+    }
+}
+
+
+/* set the default sizes for the gtkpod main window according to prefs:
+   position of the PANED_NUM GtkPaned elements (the width of the
+   colums is set when setting up the colums in the listview. Called by
+   display_set_default_sizes() */
+void st_set_default_sizes (void)
+{
+    gint i;
+
+    /* GtkPaned elements */
+    g_return_if_fail (gtkpod_window);
+    /* Elements defined with glade */
+    for (i=0; i<PANED_NUM_GLADE; ++i)
+    {
+	gchar *buf = g_strdup_printf ("paned%d", i);
+	GtkWidget *w = gtkpod_xml_get_widget (main_window_xml,  buf);
+	g_free (buf);
+	g_return_if_fail (w);
+	if (prefs_get_int_index("paned_pos_", i) != -1)
+	{
+	    gtk_paned_set_position (GTK_PANED (w),
+				    prefs_get_int_index("paned_pos_", i));
+	}
+    }
+    /* Elements defined with display.c (sort tab hpaned) */
+    for (i=0; i<PANED_NUM_ST; ++i)
+    {
+	g_return_if_fail (st_paned[i]);
+	if (prefs_get_int_index("paned_pos_", PANED_NUM_GLADE + i) != -1)
+	{
+	    gtk_paned_set_position (
+		st_paned[i], prefs_get_int_index("paned_pos_", PANED_NUM_GLADE+i));
+	}
+    }
+}
+
+
+/* update the cfg structure (preferences) with the current sizes /
+   positions (called by display_update_default_sizes():
+   position of GtkPaned elements */
+void st_update_default_sizes (void)
+{
+    /* GtkPaned elements */
+    if (gtkpod_window)
+    {
+	gint i;
+	/* Elements defined with glade */
+	for (i=0; i<PANED_NUM_GLADE; ++i)
+	{
+	    gchar *buf;
+	    GtkWidget *w;
+	    buf = g_strdup_printf ("paned%d", i);
+	    if((w = gtkpod_xml_get_widget (main_window_xml,  buf)))
+	    {
+		prefs_set_int_index("paned_pos_", i,
+				     gtk_paned_get_position (GTK_PANED (w)));
+	    }
+	    g_free (buf);
+	}
+	/* Elements defined with display.c (sort tab hpaned) */
+	for (i=0; i<PANED_NUM_ST; ++i)
+	{
+	    if (st_paned[i])
+		prefs_set_int_index("paned_pos_", i + PANED_NUM_GLADE,
+				     gtk_paned_get_position (st_paned[i]));
+	}
+    }
+}
+
+
+/* make the tooltips visible or hide it depending on the value set in
+ * the prefs (tooltips_main) (called by display_show_hide_tooltips() */
+void st_show_hide_tooltips (void)
+{
+    gint i;
+
+    for (i=0; i<SORT_TAB_MAX; ++i)
+    {
+	GtkTooltips *tt;
+	GtkTooltipsData *ttd;
+
+	g_return_if_fail (sorttab[i]);
+	ttd = sorttab[i]->sp_tooltips_data;
+	g_return_if_fail (ttd);
+	tt = ttd->tooltips;
+	g_return_if_fail (tt);
+
+	if (prefs_get_int("display_tooltips_main"))
+	    gtk_tooltips_enable (tt);
+	else   gtk_tooltips_disable (tt);
+    }
+}
+
+
+
+
+
+
+/* ---------------------------------------------------------------- */
+/*                                                                  */
+/*                Section for calendar display                      */
+/*                                                                  */
+/* ---------------------------------------------------------------- */
+
+/* Strings for 'Category-Combo' */
+
+const gchar *cat_strings[] = {
+    N_("Last Played"),
+    N_("Last Modified"),
+    N_("Added"),
+    NULL };
+
+/* enum to access cat_strings */
+enum {
+    CAT_STRING_PLAYED = 0,
+    CAT_STRING_MODIFIED = 1,
+    CAT_STRING_ADDED = 2 };
+
+/* typedef to specify lower or upper margin */
+typedef enum {
+    LOWER_MARGIN,
+    UPPER_MARGIN
+} MarginType;
+
+
+/* Set the calendar @calendar, as well as spin buttons @hour and @min
+ * according to @mactime. If @mactime is 0, check @no_margin
+ * togglebutton, otherwise uncheck it. */
+static void cal_set_time_widgets (GtkCalendar *cal,
+				  GtkSpinButton *hour,
+				  GtkSpinButton *min,
+				  GtkToggleButton *no_margin,
+				  time_t timet)
+{
+    struct tm *tm;
+    time_t tt = time (NULL);
+
+    /* 0, -1 are treated in a special way (no lower/upper margin
+     * -> set calendar to current time */
+    if ((timet != 0) && (timet != -1))
+    {
+	tt = timet;
+	if (no_margin)  gtk_toggle_button_set_active (no_margin, FALSE);
+    }
+    else if (no_margin) gtk_toggle_button_set_active (no_margin, TRUE);
+
+    tm = localtime (&tt);
+
+    if (cal)
+    {
+	gtk_calendar_select_month (cal, tm->tm_mon, 1900+tm->tm_year);
+	gtk_calendar_select_day (cal, tm->tm_mday);
+    }
+
+    if (hour)
+	gtk_spin_button_set_value (hour, tm->tm_hour);
+    if (min)
+	gtk_spin_button_set_value (min, tm->tm_min);
+}
+
+
+static void cal_set_time (GtkWidget *cal, MarginType type, time_t timet)
+{
+    GtkCalendar *calendar = NULL;
+    GtkSpinButton *hour = NULL;
+    GtkSpinButton *min = NULL;
+    GtkToggleButton *no_margin = NULL;
+
+    switch (type)
+    {
+    case LOWER_MARGIN:
+	calendar = GTK_CALENDAR (gtkpod_xml_get_widget (cal_xml, "lower_cal"));
+	hour = GTK_SPIN_BUTTON (gtkpod_xml_get_widget (cal_xml, "lower_hours"));
+	min = GTK_SPIN_BUTTON (gtkpod_xml_get_widget (cal_xml, "lower_minutes"));
+	no_margin = GTK_TOGGLE_BUTTON (gtkpod_xml_get_widget (cal_xml, "no_lower_margin"));
+	break;
+    case UPPER_MARGIN:
+	calendar = GTK_CALENDAR (gtkpod_xml_get_widget (cal_xml, "upper_cal"));
+	hour = GTK_SPIN_BUTTON (gtkpod_xml_get_widget (cal_xml, "upper_hours"));
+	min = GTK_SPIN_BUTTON (gtkpod_xml_get_widget (cal_xml, "upper_minutes"));
+	no_margin = GTK_TOGGLE_BUTTON (gtkpod_xml_get_widget (cal_xml, "no_upper_margin"));
+	break;
+    }
+    cal_set_time_widgets (calendar, hour, min, no_margin, timet);
+}
+
+
+/* Extract data from calendar/time.
+ *
+ * Return value:
+ *
+ * pointer to 'struct tm' filled with the relevant data or NULL, if
+ * the button no_margin was selected.
+ *
+ * If @tm is != NULL, modify that instead.
+ *
+ * You must g_free() the retuned value.
+ */
+static struct tm *cal_get_time (GtkWidget *cal, MarginType type, struct tm *tm)
+{
+    GtkCalendar *calendar = NULL;
+    GtkSpinButton *hour = NULL;
+    GtkSpinButton *min = NULL;
+    GtkSpinButton *sec = NULL;
+    GtkToggleButton *no_margin = NULL;
+    GtkToggleButton *no_time = NULL;
+
+    switch (type)
+    {
+    case LOWER_MARGIN:
+	calendar = GTK_CALENDAR (gtkpod_xml_get_widget (cal_xml, "lower_cal"));
+	hour = GTK_SPIN_BUTTON (gtkpod_xml_get_widget (cal_xml, "lower_hours"));
+	min = GTK_SPIN_BUTTON (gtkpod_xml_get_widget (cal_xml, "lower_minutes"));
+	no_margin = GTK_TOGGLE_BUTTON (gtkpod_xml_get_widget (cal_xml, "no_lower_margin"));
+	no_time =  GTK_TOGGLE_BUTTON (gtkpod_xml_get_widget (cal_xml, "lower_time"));
+	break;
+    case UPPER_MARGIN:
+	calendar = GTK_CALENDAR (gtkpod_xml_get_widget (cal_xml, "upper_cal"));
+	hour = GTK_SPIN_BUTTON (gtkpod_xml_get_widget (cal_xml, "upper_hours"));
+	min = GTK_SPIN_BUTTON (gtkpod_xml_get_widget (cal_xml, "upper_minutes"));
+	no_margin = GTK_TOGGLE_BUTTON (gtkpod_xml_get_widget (cal_xml, "no_upper_margin"));
+	no_time =  GTK_TOGGLE_BUTTON (gtkpod_xml_get_widget (cal_xml, "upper_time"));
+	break;
+    }
+
+    if (!gtk_toggle_button_get_active (no_margin))
+    {
+	/* Initialize tm with current time and copy the result of
+	 * localtime() to persistent memory that can be g_free()'d */
+	time_t tt = time (NULL);
+	if (!tm)
+	{
+	    tm = g_malloc (sizeof (struct tm));
+	    memcpy (tm, localtime (&tt), sizeof (struct tm));
+	}
+
+	if (calendar)
+	{
+	    guint year, month, day;
+	    gtk_calendar_get_date (calendar, &year, &month, &day);
+	    tm->tm_year = year-1900;
+	    tm->tm_mon = month;
+	    tm->tm_mday = day;
+	}
+	if (gtk_toggle_button_get_active (no_time))
+	{
+	    if (hour)
+		tm->tm_hour = gtk_spin_button_get_value_as_int (hour);
+	    if (min)
+		tm->tm_min = gtk_spin_button_get_value_as_int (min);
+	    if (sec)
+		tm->tm_min = gtk_spin_button_get_value_as_int (sec);
+	}
+	else
+	{   /* use 0:00 for lower and 23:59 for upper margin */
+	    switch (type)
+	    {
+	    case LOWER_MARGIN:
+		if (hour) tm->tm_hour = 0;
+		if (min) tm->tm_min = 0;
+		if (sec) tm->tm_sec = 0;
+		break;
+	    case UPPER_MARGIN:
+		if (hour) tm->tm_hour = 23;
+		if (min) tm->tm_min = 59;
+		if (sec) tm->tm_sec = 59;
+		break;
+	    }
+	}
+    }
+    return tm;
+}
+
+
+/* get the category (T_TIME_PLAYED or T_TIME_MODIFIED) selected in the
+ * combo */
+static T_item cal_get_category (GtkWidget *cal)
+{
+    const gchar *str;
+    GtkWidget *w;
+    T_item item;
+    gint i = -1;
+
+    w = gtkpod_xml_get_widget (cal_xml, "cat_combo");
+    str = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO (w)->entry));
+    /* Check which string is selected in the combo */
+    if (str)
+	for (i=0; cat_strings[i]; ++i)
+	    if (strcmp (gettext (cat_strings[i]), str) == 0)  break;
+    switch (i)
+    {
+    case CAT_STRING_PLAYED:
+	item = T_TIME_PLAYED;
+	break;
+    case CAT_STRING_MODIFIED:
+	item = T_TIME_MODIFIED;
+	break;
+    case CAT_STRING_ADDED:
+	item = T_TIME_ADDED;
+	break;
+    default:
+	fprintf (stderr, "Programming error: cal_get_category () -- item not found.\n");
+	/* set to something reasonable at least */
+	item = T_TIME_PLAYED;
+    }
+    return item;
+}
+
+
+/* Returns a string "DD/MM/YYYY HH:MM". Data is taken from
+ * @tm. Returns NULL if tm==NULL. You must g_free() the returned
+ * string */
+static gchar *cal_get_time_string (struct tm *tm)
+{
+    gchar *str = NULL;
+
+    if (tm)
+	str = g_strdup_printf ("%02d/%02d/%04d %d:%02d",
+			       tm->tm_mday, tm->tm_mon+1, 1900+tm->tm_year,
+			       tm->tm_hour, tm->tm_min);
+    return str;
+}
+
+
+/* Extract data from calendar/time and write it to the corresponding
+   entry in the specified sort tab */
+static void cal_apply_data (GtkWidget *cal)
+{
+    struct tm *lower, *upper;
+    TimeInfo *ti;
+    T_item item;
+    gint inst;
+
+    lower = cal_get_time (cal, LOWER_MARGIN, NULL);
+    upper = cal_get_time (cal, UPPER_MARGIN, NULL);
+
+    /* Get selected instance */
+    inst = gtk_spin_button_get_value_as_int (
+	GTK_SPIN_BUTTON (gtkpod_xml_get_widget (cal_xml, "sorttab_num_spin"))) - 1;
+    /* Get selected category (played, modified or added) */
+    item = cal_get_category (cal);
+    /* Get pointer to corresponding TimeInfo struct */
+    ti = sp_get_timeinfo_ptr (inst, item);
+
+    if (ti)
+    {
+	GtkToggleButton *act = 	GTK_TOGGLE_BUTTON (ti->active);
+	/* is criteria currently checked (active)? */
+	gboolean active = gtk_toggle_button_get_active (act);
+	gchar *str = NULL;
+	gchar *str1 = cal_get_time_string (lower);
+	gchar *str2 = cal_get_time_string (upper);
+
+	if (!lower && !upper)
+	    if (!active) /* deactivate this criteria */
+		gtk_toggle_button_set_active (act, FALSE);
+	if (lower && !upper)
+	    str = g_strdup_printf ("> %s", str1);
+	if (!lower && upper)
+	    str = g_strdup_printf ("< %s", str2);
+	if (lower && upper)
+	    str = g_strdup_printf ("%s < < %s", str1, str2);
+	C_FREE (str1);
+	C_FREE (str2);
+
+	if (str)
+	{   /* set the new string if it's different */
+	    if (strcmp (str,
+			gtk_entry_get_text (GTK_ENTRY (ti->entry))) != 0)
+	    {
+		gtk_entry_set_text (GTK_ENTRY (ti->entry), str);
+		/* notification that contents have changed */
+		g_signal_emit_by_name (ti->entry, "activate");
+	    }
+	    g_free (str);
+	}
+	if (!active)
+	{   /* activate the criteria */
+	    gtk_toggle_button_set_active (act, TRUE);
+	}
+    }
+    g_free (lower);
+    g_free (upper);
+}
+
+
+
+/* Callback for 'Lower/Upper time ' buttons */
+static void cal_time_toggled (GtkToggleButton *togglebutton,
+			      gpointer         user_data)
+{
+    gboolean sens = gtk_toggle_button_get_active (togglebutton);
+
+    if ((GtkWidget *)togglebutton == gtkpod_xml_get_widget (cal_xml, "lower_time"))
+    {
+	gtk_widget_set_sensitive (gtkpod_xml_get_widget (cal_xml, "lower_time_box"), sens);
+    }
+    if ((GtkWidget *)togglebutton == gtkpod_xml_get_widget (cal_xml, "upper_time"))
+    {
+	gtk_widget_set_sensitive (gtkpod_xml_get_widget (cal_xml, "upper_time_box"), sens);
+    }
+}
+
+/* Callback for 'No Lower/Upper Margin' buttons */
+static void cal_no_margin_toggled (GtkToggleButton *togglebutton,
+				   gpointer         user_data)
+{
+    gboolean sens = !gtk_toggle_button_get_active (togglebutton);
+
+    if ((GtkWidget *)togglebutton == gtkpod_xml_get_widget (cal_xml, "no_lower_margin"))
+    {
+	gtk_widget_set_sensitive (gtkpod_xml_get_widget (cal_xml, "lower_cal_box"), sens);
+    }
+    if ((GtkWidget *)togglebutton == gtkpod_xml_get_widget (cal_xml, "no_upper_margin"))
+    {
+	gtk_widget_set_sensitive (gtkpod_xml_get_widget (cal_xml, "upper_cal_box"), sens);
+    }
+}
+
+
+/* Save the default geometry of the window */
+static void cal_save_default_geometry (GtkWindow *cal)
+{
+    gint x,y;
+
+    gtk_window_get_size (cal, &x, &y);
+    prefs_set_int("size_cal.x", x);
+	prefs_set_int("size_cal.y", y);
+	
+}
+
+/* Callback for 'delete' event */
+static gboolean cal_delete_event (GtkWidget       *widget,
+				  GdkEvent        *event,
+				  gpointer         user_data)
+{
+    cal_save_default_geometry (GTK_WINDOW (user_data));
+    return FALSE;
+}
+
+/* Callback for 'Cancel' button */
+static void cal_cancel (GtkButton *button, gpointer user_data)
+{
+    cal_save_default_geometry (GTK_WINDOW (user_data));
+    gtk_widget_destroy (user_data);
+}
+
+/* Callback for 'Apply' button */
+static void cal_apply (GtkButton *button, gpointer user_data)
+{
+    cal_save_default_geometry (GTK_WINDOW (user_data));
+    cal_apply_data (GTK_WIDGET (user_data));
+}
+
+/* Callback for 'OK' button */
+static void cal_ok (GtkButton *button, gpointer user_data)
+{
+    cal_apply (button, user_data);
+    gtk_widget_destroy (user_data);
+}
+
+/* Open a calendar window. Preset the values for instance @inst,
+   category @item (time played, time modified or time added) */
+void cal_open_calendar (gint inst, T_item item)
+{
+    SortTab *st;
+    GtkWidget *w;
+    GtkWidget *cal;
+    gchar *str = NULL;
+    static GList *catlist = NULL;
+    gint defx, defy;
+    TimeInfo *ti;
+
+    /* Sanity */
+    if (inst >= SORT_TAB_MAX)  return;
+
+    st = sorttab[inst];
+
+    /* Sanity */
+    if (!st) return;
+
+    cal_xml = glade_xml_new (xml_file, "calendar_window", NULL);
+
+    glade_xml_signal_autoconnect (cal_xml);
+
+    cal = gtkpod_xml_get_widget (cal_xml, "calendar_window");
+
+    /* Set to saved size */
+    defx = prefs_get_int("size_cal.x");
+		defy = prefs_get_int("size_cal.y");
+    gtk_window_set_default_size (GTK_WINDOW (cal), defx, defy);
+
+    /* Set sorttab number */
+    w = gtkpod_xml_get_widget (cal_xml, "sorttab_num_spin");
+    gtk_spin_button_set_range (GTK_SPIN_BUTTON (w),
+			       1, SORT_TAB_MAX);
+    gtk_spin_button_set_value (GTK_SPIN_BUTTON (w), inst+1);
+
+    /* Set Category-Combo */
+    if (!catlist)
+    {   /* create list */
+	const gchar **bp = cat_strings;
+	while (*bp)   catlist = g_list_append (catlist, gettext (*bp++));
+    }
+    w = gtkpod_xml_get_widget (cal_xml, "cat_combo");
+    gtk_combo_set_popdown_strings (GTK_COMBO (w), catlist);
+    switch (item)
+    {
+    case T_TIME_PLAYED:
+	str = gettext (cat_strings[CAT_STRING_PLAYED]);
+	break;
+    case T_TIME_MODIFIED:
+	str = gettext (cat_strings[CAT_STRING_MODIFIED]);
+	break;
+    case T_TIME_ADDED:
+	str = gettext (cat_strings[CAT_STRING_ADDED]);
+	break;
+    default:
+	fprintf (stderr, "Programming error: cal_open_calendar() -- item not found\n");
+	break;
+    }
+    gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (w)->entry), str);
+
+    /* Make sure we use the current contents of the entry */
+    sp_store_sp_entries (inst);
+    /* set calendar */
+    ti = sp_update_date_interval_from_string (inst, item, TRUE);
+    /* set the calendar if we have a valid TimeInfo */
+    if (ti)
+    {
+	if (!ti->valid)
+	{   /* set to reasonable default */
+	    ti->lower = 0;
+	    ti->upper = 0;
+	}
+
+	/* Lower Margin */
+	w = gtkpod_xml_get_widget (cal_xml, "no_lower_margin");
+	g_signal_connect (w,
+			  "toggled",
+			  G_CALLBACK (cal_no_margin_toggled),
+			  cal);
+	w = gtkpod_xml_get_widget (cal_xml, "lower_time");
+	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), TRUE);
+	g_signal_connect (w,
+			  "toggled",
+			  G_CALLBACK (cal_time_toggled),
+			  cal);
+
+	cal_set_time (cal, LOWER_MARGIN, ti->lower);
+
+	/* Upper Margin */
+	w = gtkpod_xml_get_widget (cal_xml, "no_upper_margin");
+	g_signal_connect (w,
+			  "toggled",
+			  G_CALLBACK (cal_no_margin_toggled),
+			  cal);
+	w = gtkpod_xml_get_widget (cal_xml, "upper_time");
+	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), TRUE);
+	g_signal_connect (w,
+			  "toggled",
+			  G_CALLBACK (cal_time_toggled),
+			  cal);
+	cal_set_time (cal, UPPER_MARGIN, ti->upper);
+    }
+
+    /* Connect delete-event */
+    g_signal_connect (cal, "delete_event",
+		      G_CALLBACK (cal_delete_event), cal);
+    /* Connect cancel-button */
+    g_signal_connect (gtkpod_xml_get_widget (cal_xml, "cal_cancel"), "clicked",
+		      G_CALLBACK (cal_cancel), cal);
+    /* Connect apply-button */
+    g_signal_connect (gtkpod_xml_get_widget (cal_xml, "cal_apply"), "clicked",
+		      G_CALLBACK (cal_apply), cal);
+    /* Connect ok-button */
+    g_signal_connect (gtkpod_xml_get_widget (cal_xml, "cal_ok"), "clicked",
+		      G_CALLBACK (cal_ok), cal);
+
+    gtk_widget_show (cal);
+}

Added: trunk/src/display_spl.c
===================================================================
--- trunk/src/display_spl.c	                        (rev 0)
+++ trunk/src/display_spl.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,1722 @@
+/*
+|  Copyright (C) 2002-2007 Jorg Schuler <jcsjcs at users.sourceforge.net>
+|  Part of the gtkpod project.
+|
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: display_spl.c 1798 2007-11-17 16:12:06Z jcsjcs $
+*/
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <gtk/gtk.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "itdb.h"
+#include "misc.h"
+#include "display.h"
+#include "prefs.h"
+
+static const gchar *SPL_WINDOW_DEFX="spl_window_defx";
+static const gchar *SPL_WINDOW_DEFY="spl_window_defy";
+
+static void spl_display_checklimits (GtkWidget *spl_window);
+static void spl_update_rule (GtkWidget *spl_window, Itdb_SPLRule *splr);
+static void spl_update_rules_from_row (GtkWidget *spl_window, gint row);
+static void spl_action_changed (GtkComboBox *combobox, GtkWidget *spl_window);
+
+#define WNLEN 100 /* max length for widget names */
+#define XPAD 1    /* padding for g_table_attach () */
+#define YPAD 1    /* padding for g_table_attach () */
+
+typedef struct
+{
+    guint32 id;
+    const gchar *str;
+} ComboEntry;
+
+GladeXML *spl_window_xml;
+
+static const ComboEntry splat_inthelast_units_comboentries[] =
+{
+    { ITDB_SPLACTION_LAST_DAYS_VALUE,   N_("days") },
+    { ITDB_SPLACTION_LAST_WEEKS_VALUE,  N_("weeks") },
+    { ITDB_SPLACTION_LAST_MONTHS_VALUE, N_("months") },
+    { 0,                           NULL }
+};
+
+
+static const ComboEntry splfield_units[] =
+{
+    { ITDB_SPLFIELD_BITRATE,        N_("kbps") },
+    { ITDB_SPLFIELD_SAMPLE_RATE,    N_("Hz") },
+    { ITDB_SPLFIELD_SIZE,           N_("MB") },
+    { ITDB_SPLFIELD_TIME,           N_("secs") },
+    { 0,                       NULL }
+};
+
+
+static const ComboEntry splfield_comboentries[] =
+{
+    { ITDB_SPLFIELD_SONG_NAME,      N_("Title") },
+    { ITDB_SPLFIELD_ALBUM,          N_("Album") },
+    { ITDB_SPLFIELD_ARTIST,         N_("Artist") },
+    { ITDB_SPLFIELD_BITRATE,        N_("Bitrate") },
+    { ITDB_SPLFIELD_SAMPLE_RATE,    N_("Samplerate") },
+    { ITDB_SPLFIELD_YEAR,           N_("Year") },
+    { ITDB_SPLFIELD_GENRE,          N_("Genre") },
+    { ITDB_SPLFIELD_KIND,           N_("Kind") },
+    { ITDB_SPLFIELD_DATE_MODIFIED,  N_("Date modified") },
+    { ITDB_SPLFIELD_TRACKNUMBER,    N_("Track number") },
+    { ITDB_SPLFIELD_SIZE,           N_("Size") },
+    { ITDB_SPLFIELD_TIME,           N_("Play time") },
+    { ITDB_SPLFIELD_COMMENT,        N_("Comment") },
+    { ITDB_SPLFIELD_DATE_ADDED,     N_("Date added") },
+    { ITDB_SPLFIELD_COMPOSER,       N_("Composer") },
+    { ITDB_SPLFIELD_PLAYCOUNT,      N_("Playcount") },
+    { ITDB_SPLFIELD_LAST_PLAYED,    N_("Last played") },
+    { ITDB_SPLFIELD_DISC_NUMBER,    N_("Disc number") },
+    { ITDB_SPLFIELD_RATING,         N_("Rating") },
+    { ITDB_SPLFIELD_COMPILATION,    N_("Compilation") },
+    { ITDB_SPLFIELD_BPM,            N_("BPM") },
+    { ITDB_SPLFIELD_GROUPING,       N_("Grouping") },
+    { ITDB_SPLFIELD_PLAYLIST,       N_("Playlist") },
+    { ITDB_SPLFIELD_VIDEO_KIND,     N_("Video Kind") },
+    { ITDB_SPLFIELD_TVSHOW,         N_("TV Show") },
+    { ITDB_SPLFIELD_SEASON_NR,      N_("Season number") },
+    { ITDB_SPLFIELD_SKIPCOUNT,      N_("Skip count") },
+    { ITDB_SPLFIELD_LAST_SKIPPED,   N_("Last skipped") },
+    { ITDB_SPLFIELD_ALBUMARTIST,    N_("Album artist") },
+    { 0,                       NULL }
+};
+
+static const ComboEntry splaction_ftstring_comboentries[] =
+{
+    { ITDB_SPLACTION_CONTAINS,         N_("contains") },
+    { ITDB_SPLACTION_DOES_NOT_CONTAIN, N_("does not contain") },
+    { ITDB_SPLACTION_IS_STRING,        N_("is") },
+    { ITDB_SPLACTION_IS_NOT,           N_("is not") },
+    { ITDB_SPLACTION_STARTS_WITH,      N_("starts with") },
+    { ITDB_SPLACTION_ENDS_WITH,        N_("ends with") },
+    { 0,                          NULL }
+};
+
+static const ComboEntry splaction_ftint_comboentries[] =
+{
+    { ITDB_SPLACTION_IS_INT,          N_("is") },
+    { ITDB_SPLACTION_IS_NOT_INT,      N_("is not") },
+    { ITDB_SPLACTION_IS_GREATER_THAN, N_("is greater than") },
+    { ITDB_SPLACTION_IS_LESS_THAN,    N_("is less than") },
+    { ITDB_SPLACTION_IS_IN_THE_RANGE, N_("is in the range") },
+    { 0,                         NULL }
+};
+
+static const ComboEntry splaction_ftdate_comboentries[] =
+{
+    { ITDB_SPLACTION_IS_INT,             N_("is") },
+    { ITDB_SPLACTION_IS_NOT_INT,         N_("is not") },
+    { ITDB_SPLACTION_IS_GREATER_THAN,    N_("is after") },
+    { ITDB_SPLACTION_IS_LESS_THAN,       N_("is before") },
+    { ITDB_SPLACTION_IS_IN_THE_LAST,     N_("in the last") },
+    { ITDB_SPLACTION_IS_NOT_IN_THE_LAST, N_("not in the last") },
+    { ITDB_SPLACTION_IS_IN_THE_RANGE,    N_("is in the range") },
+    { 0,                            NULL }
+};
+
+static const ComboEntry splaction_ftboolean_comboentries[] =
+{
+    { ITDB_SPLACTION_IS_INT,     N_("is set") },
+    { ITDB_SPLACTION_IS_NOT_INT, N_("is not set") },
+    { 0,                    NULL }
+};
+
+static const ComboEntry splaction_ftplaylist_comboentries[] =
+{
+    { ITDB_SPLACTION_IS_INT,     N_("is") },
+    { ITDB_SPLACTION_IS_NOT_INT, N_("is not") },
+    { 0,                    NULL }
+};
+
+static const ComboEntry splaction_ftbinaryand_comboentries[] =
+{
+    { ITDB_SPLACTION_BINARY_AND, N_("is") },
+    { ITDB_SPLACTION_BINARY_AND, N_("is not") },
+    { 0,                    NULL }
+};
+
+static const ComboEntry splaction_notsupported_comboentries[] =
+{
+    { -1,     N_("Not supported") },
+    { 0,                    NULL }
+};
+
+/* Strings for limittypes */
+static const ComboEntry limittype_comboentries[] =
+{
+    { ITDB_LIMITTYPE_MINUTES, N_("minutes") },
+    { ITDB_LIMITTYPE_MB,      N_("MB") },
+    { ITDB_LIMITTYPE_SONGS,   N_("tracks") },
+    { ITDB_LIMITTYPE_HOURS,   N_("hours") },
+    { ITDB_LIMITTYPE_GB,      N_("GB") },
+    { 0,                 NULL }
+};
+
+/* Strings for limitsort */
+static const ComboEntry limitsort_comboentries[] =
+{
+    { ITDB_LIMITSORT_RANDOM,                N_("random order") },
+    { ITDB_LIMITSORT_SONG_NAME,             N_("title") },
+    { ITDB_LIMITSORT_ALBUM,                 N_("album") },
+    { ITDB_LIMITSORT_ARTIST,                N_("artist") },
+    { ITDB_LIMITSORT_GENRE,                 N_("genre") },
+    { ITDB_LIMITSORT_MOST_RECENTLY_ADDED,   N_("most recently added") },
+    { ITDB_LIMITSORT_LEAST_RECENTLY_ADDED,  N_("least recently added") },
+    { ITDB_LIMITSORT_MOST_OFTEN_PLAYED,     N_("most often played") },
+    { ITDB_LIMITSORT_LEAST_OFTEN_PLAYED,    N_("least often played") },
+    { ITDB_LIMITSORT_MOST_RECENTLY_PLAYED,  N_("most recently played") },
+    { ITDB_LIMITSORT_LEAST_RECENTLY_PLAYED, N_("least recently played") },
+    { ITDB_LIMITSORT_HIGHEST_RATING,        N_("highest rating") },
+    { ITDB_LIMITSORT_LOWEST_RATING,         N_("lowest rating") },
+    { 0,                               NULL }
+};
+
+/* Strings for Video Kind */
+static const ComboEntry videokind_comboentries_is[] =
+{
+    { ITDB_MEDIATYPE_MOVIE,      N_("Movie") },
+    { ITDB_MEDIATYPE_MUSICVIDEO, N_("Music Video") },
+    { ITDB_MEDIATYPE_TVSHOW,     N_("TV Show") },
+    { 0,                         NULL }
+};
+
+/* Strings for Video Kind */
+static const ComboEntry videokind_comboentries_is_not[] =
+{
+    { 0x0e00 | ITDB_MEDIATYPE_MUSICVIDEO | ITDB_MEDIATYPE_TVSHOW,    N_("Movie") },
+    { 0x0e00 | ITDB_MEDIATYPE_MOVIE | ITDB_MEDIATYPE_TVSHOW,   N_("Music Video") },
+    { 0x0e00 | ITDB_MEDIATYPE_MOVIE | ITDB_MEDIATYPE_MUSICVIDEO,   N_("TV Show") },
+    { 0,                                                                    NULL }
+};
+
+/* types used for entries (from, to, date...) */
+enum entrytype
+{
+    spl_ET_FROMVALUE = 1,
+    spl_ET_FROMVALUE_DATE,  /* fromvalue interpreted as datestamp */
+    spl_ET_FROMDATE,
+    spl_ET_TOVALUE,
+    spl_ET_TOVALUE_DATE,    /* tovalue interpreted as datestamp */
+    spl_ET_TODATE,
+    spl_ET_INTHELAST,
+    spl_ET_STRING,
+};
+
+static const gchar *entry_get_string (gchar *str, Itdb_SPLRule *splr,
+				      enum entrytype et);
+
+/* Get index from ID (returns -1 if ID could not be found) */
+static gint comboentry_index_from_id (const ComboEntry centries[],
+				      guint32 id)
+{
+    gint i;
+
+    g_return_val_if_fail (centries, -1);
+
+    /* handle field types not yet supported */
+    if (centries == splaction_notsupported_comboentries)
+	return 0;
+
+    for (i=0; centries[i].str; ++i)
+    {
+	if (centries[i].id == id)  return i;
+    }
+    return -1;
+}
+
+
+/* Get index in @array from playlist ID @id */
+/* returns -1 in case of error */
+static gint pl_ids_index_from_id (GArray *pl_ids, guint64 id)
+{
+    gint index;
+
+    g_return_val_if_fail (pl_ids, -1);
+
+    for (index=0; ; ++index)
+    {
+	guint64 sid = g_array_index (pl_ids, guint64, index);
+	if (sid == id)  return index;
+	if (sid == 0)   return -1;
+    }
+}
+
+
+/* called by spl_set_combobox() */
+static void spl_setup_combobox (GtkComboBox *cb,
+				const ComboEntry centries[], gint index,
+				GCallback cb_func, gpointer cb_data)
+{
+    const ComboEntry *old_centries = g_object_get_data (G_OBJECT (cb),
+							"spl_centries");
+
+    if ((g_object_get_data (G_OBJECT (cb), "combo_set") == NULL) ||
+	(centries != old_centries))
+    {   /* the combo has not yet been initialized */
+	const ComboEntry *ce = centries;
+	GtkCellRenderer *cell;
+	GtkListStore *store;
+
+	/* Set the model -- that is you cannot do a
+	   gtk_combo_box_new_text()! This gives us the flexibility to
+	   expand this function to set some graphic next to the text. */
+	store = gtk_list_store_new (1, G_TYPE_STRING);
+	gtk_combo_box_set_model (cb, GTK_TREE_MODEL (store));
+	g_object_unref (store);
+
+	cell = gtk_cell_renderer_text_new ();
+	gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (cb), cell, TRUE);
+	gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (cb), cell,
+					"text", 0,
+					NULL);
+
+	while (ce->str != NULL)
+	{
+	    gtk_combo_box_append_text (cb, _(ce->str));
+	    ++ce;
+	}
+	g_object_set_data (G_OBJECT (cb), "spl_centries", (gpointer)centries);
+	g_object_set_data (G_OBJECT (cb), "combo_set", "set");
+	if (cb_func)
+	    g_signal_connect (cb, "changed", cb_func, cb_data);
+    }
+    if (index != -1)
+    {
+	gtk_combo_box_set_active (cb, index);
+    }
+}
+
+
+/* Initialize/update ComboBox @cb with strings from @centries and
+   select @id. If @cb_func is != NULL, connect @cb_func to signal
+   "changed" with data @cb_data. */
+static void spl_set_combobox (GtkComboBox *cb,
+			      const ComboEntry centries[], guint32 id,
+			      GCallback cb_func, gpointer cb_data)
+{
+    gint index;
+
+    g_return_if_fail (cb);
+    g_return_if_fail (centries);
+
+    index = comboentry_index_from_id (centries, id);
+
+    spl_setup_combobox (cb, centries, index, cb_func, cb_data);
+
+}
+
+
+/* Callbacks */
+static void spl_all_radio_toggled (GtkToggleButton *togglebutton,
+				   GtkWidget *spl_window)
+{
+    Playlist *spl;
+
+    g_return_if_fail (spl_window);
+    spl =  g_object_get_data (G_OBJECT (spl_window), "spl_work");
+    g_return_if_fail (spl);
+    if (gtk_toggle_button_get_active (togglebutton))
+    {
+	GtkWidget *frame = gtkpod_xml_get_widget (spl_window_xml, "spl_rules_frame");
+	g_return_if_fail (frame);
+	gtk_widget_set_sensitive (frame, TRUE);
+	spl->splpref.checkrules = TRUE;
+	spl->splrules.match_operator = ITDB_SPLMATCH_AND;
+    }
+}
+
+static void spl_any_radio_toggled (GtkToggleButton *togglebutton,
+				   GtkWidget *spl_window)
+{
+    Playlist *spl;
+
+    g_return_if_fail (spl_window);
+    spl =  g_object_get_data (G_OBJECT (spl_window), "spl_work");
+    g_return_if_fail (spl);
+    if (gtk_toggle_button_get_active (togglebutton))
+    {
+	GtkWidget *frame = gtkpod_xml_get_widget (spl_window_xml, "spl_rules_frame");
+	g_return_if_fail (frame);
+	gtk_widget_set_sensitive (frame, TRUE);
+	spl->splpref.checkrules = TRUE;
+	spl->splrules.match_operator = ITDB_SPLMATCH_OR;
+    }
+}
+
+static void spl_none_radio_toggled (GtkToggleButton *togglebutton,
+				    GtkWidget *spl_window)
+{
+    Playlist *spl;
+    GtkWidget *frame;
+
+    g_return_if_fail (spl_window);
+    spl =  g_object_get_data (G_OBJECT (spl_window), "spl_work");
+    g_return_if_fail (spl);
+    frame = gtkpod_xml_get_widget (spl_window_xml, "spl_rules_frame");
+    g_return_if_fail (frame);
+    if (gtk_toggle_button_get_active (togglebutton))
+    {
+	gtk_widget_set_sensitive (frame, FALSE);
+	spl->splpref.checkrules = FALSE;
+    }
+}
+
+static void spl_matchcheckedonly_toggled (GtkToggleButton *togglebutton,
+					  GtkWidget *spl_window)
+{
+    Playlist *spl;
+
+    g_return_if_fail (spl_window);
+    spl =  g_object_get_data (G_OBJECT (spl_window), "spl_work");
+    g_return_if_fail (spl);
+    spl->splpref.matchcheckedonly = 
+	gtk_toggle_button_get_active (togglebutton);
+}
+
+static void spl_liveupdate_toggled (GtkToggleButton *togglebutton,
+				    GtkWidget *spl_window)
+{
+    Playlist *spl;
+
+    g_return_if_fail (spl_window);
+    spl =  g_object_get_data (G_OBJECT (spl_window), "spl_work");
+    g_return_if_fail (spl);
+    spl->splpref.liveupdate = 
+	gtk_toggle_button_get_active (togglebutton);
+}
+
+
+static void spl_checklimits_toggled (GtkToggleButton *togglebutton,
+				     GtkWidget *spl_window)
+{
+    Playlist *spl;
+
+    g_return_if_fail (spl_window);
+    spl =  g_object_get_data (G_OBJECT (spl_window), "spl_work");
+    g_return_if_fail (spl);
+    spl->splpref.checklimits =
+	gtk_toggle_button_get_active (togglebutton);
+    spl_display_checklimits (spl_window);
+}
+
+
+/* The limitvalue has changed */
+static void spl_limitvalue_changed (GtkEditable *editable,
+				    GtkWidget *spl_window)
+{
+    Playlist *spl;
+    gchar *str;
+
+    g_return_if_fail (spl_window);
+    spl =  g_object_get_data (G_OBJECT (spl_window), "spl_work");
+    g_return_if_fail (spl);
+    str = gtk_editable_get_chars (editable, 0, -1);
+    spl->splpref.limitvalue = atol (str);
+    g_free (str);
+}
+
+
+
+/* Limittype has been changed */
+static void spl_limittype_changed (GtkComboBox *combobox,
+				   GtkWidget *spl_window)
+{
+    Playlist *spl;
+    gint index = gtk_combo_box_get_active (combobox);
+
+    g_return_if_fail (index != -1);
+    g_return_if_fail (spl_window);
+    spl =  g_object_get_data (G_OBJECT (spl_window), "spl_work");
+    g_return_if_fail (spl);
+    spl->splpref.limittype = limittype_comboentries[index].id;
+}
+
+
+/* Limitsort has been changed */
+static void spl_limitsort_changed (GtkComboBox *combobox,
+				   GtkWidget *spl_window)
+{
+    Playlist *spl;
+    gint index = gtk_combo_box_get_active (combobox);
+
+    g_return_if_fail (index != -1);
+    g_return_if_fail (spl_window);
+    spl =  g_object_get_data (G_OBJECT (spl_window), "spl_work");
+    g_return_if_fail (spl);
+    spl->splpref.limitsort = limitsort_comboentries[index].id;
+}
+
+
+/* Rule field has been changed */
+static void spl_field_changed (GtkComboBox *combobox, GtkWidget *spl_window)
+{
+    Playlist *spl;
+    Itdb_SPLRule *splr;
+    gint index = gtk_combo_box_get_active (combobox);
+
+    g_return_if_fail (index != -1);
+    g_return_if_fail (spl_window);
+    spl =  g_object_get_data (G_OBJECT (spl_window), "spl_work");
+    g_return_if_fail (spl);
+
+    splr = g_object_get_data (G_OBJECT (combobox), "spl_rule");
+    g_return_if_fail (splr);
+
+    if (splr->field != splfield_comboentries[index].id)
+    {   /* data changed */
+	splr->field = splfield_comboentries[index].id;
+	/* update display */
+	spl_update_rule (spl_window, splr);
+    }
+}
+
+
+/* Action field has been changed */
+static void spl_action_changed (GtkComboBox *combobox, GtkWidget *spl_window)
+{
+    Playlist *spl;
+    Itdb_SPLRule *splr;
+    ItdbSPLFieldType ft;
+    const ComboEntry *centries;
+    gint index = gtk_combo_box_get_active (combobox);
+
+    g_return_if_fail (index != -1);
+    g_return_if_fail (spl_window);
+    spl =  g_object_get_data (G_OBJECT (spl_window), "spl_work");
+    g_return_if_fail (spl);
+
+    splr = g_object_get_data (G_OBJECT (combobox), "spl_rule");
+    g_return_if_fail (splr);
+
+    centries = g_object_get_data (G_OBJECT (combobox), "spl_centries");
+    g_return_if_fail (centries);
+
+    ft = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (combobox), "spl_fieldtype"));
+
+/* printf ("(action) value changed: %04x...", (gint)splr->fromvalue); */
+    switch (ft)
+    {
+    case ITDB_SPLFT_BINARY_AND:
+	if (splr->field == ITDB_SPLFIELD_VIDEO_KIND)
+	{   /* traet Video Kind differently */
+	    gint oldindex = GPOINTER_TO_INT (
+		g_object_get_data (G_OBJECT (combobox), "spl_binary_and_index"));
+	    if (oldindex != index)
+	    {   /* data changed */
+		/* inverse the video bits */
+		splr->fromvalue = (~splr->fromvalue) &
+		    (0x0e00 | ITDB_MEDIATYPE_MOVIE | ITDB_MEDIATYPE_MUSICVIDEO | ITDB_MEDIATYPE_TVSHOW);
+		spl_update_rule (spl_window, splr);
+	    }
+	}
+	else
+	{   /* treat as standard */
+	    if (splr->action != centries[index].id)
+	    {   /* data changed */
+		splr->action = centries[index].id;
+		/* update display */
+		spl_update_rule (spl_window, splr);
+	    }
+	}
+	break;
+    default:
+	if (splr->action != centries[index].id)
+	{   /* data changed */
+	    splr->action = centries[index].id;
+	    /* update display */
+	    spl_update_rule (spl_window, splr);
+	}
+	break;
+    }
+/* printf ("%04x\n", (gint)splr->fromvalue); */
+}
+
+
+/*  field has been changed */
+static void spl_videokind_comboentry_changed (GtkComboBox *combobox,
+					      GtkWidget *spl_window)
+{
+    Playlist *spl;
+    Itdb_SPLRule *splr;
+    const ComboEntry *centries;
+    gint index = gtk_combo_box_get_active (combobox);
+
+    g_return_if_fail (index != -1);
+    g_return_if_fail (spl_window);
+
+    spl =  g_object_get_data (G_OBJECT (spl_window), "spl_work");
+    g_return_if_fail (spl);
+
+    splr = g_object_get_data (G_OBJECT (combobox), "spl_rule");
+    g_return_if_fail (splr);
+
+    centries = g_object_get_data (G_OBJECT (combobox), "spl_centries");
+    g_return_if_fail (centries);
+
+/* printf ("(entry) value changed: %04x...", (gint)splr->fromvalue); */
+    if (splr->fromvalue != centries[index].id)
+    {   /* data changed */
+	splr->fromvalue = centries[index].id;
+    }
+/* printf ("%04x\n", (gint)splr->fromvalue); */
+}
+
+
+/* The enter key was pressed inside a rule entry (fromvalue, fromdate,
+ * tovalue, todate, string...)  --> redisplay */
+static void splr_entry_redisplay (GtkEditable *editable, GtkWidget *spl_window)
+{
+    Itdb_SPLRule *splr;
+    enum entrytype type;
+    gchar str[WNLEN];
+    const gchar *strp;
+
+    g_return_if_fail (spl_window);
+    splr =  g_object_get_data (G_OBJECT (editable), "spl_rule");
+    g_return_if_fail (splr);
+    type = (enum entrytype)g_object_get_data (
+	G_OBJECT (editable), "spl_entrytype");
+    g_return_if_fail (type != 0);
+    strp = entry_get_string (str, splr, type);
+    if (strp)  gtk_entry_set_text (GTK_ENTRY (editable), strp);
+}
+    
+
+
+/* The content of a rule entry (fromvalue, fromdate, tovalue, todate,
+ * string...)  has changed --> update */
+static void splr_entry_changed (GtkEditable *editable,
+				GtkWidget *spl_window)
+{
+    Itdb_SPLRule *splr;
+    gchar *str;
+    time_t t;
+    enum entrytype type;
+
+    g_return_if_fail (spl_window);
+    splr =  g_object_get_data (G_OBJECT (editable), "spl_rule");
+    g_return_if_fail (splr);
+    type = (enum entrytype)g_object_get_data (
+	G_OBJECT (editable), "spl_entrytype");
+    g_return_if_fail (type != 0);
+
+    str = gtk_editable_get_chars (editable, 0, -1);
+    switch (type)
+    {
+    case spl_ET_FROMVALUE:
+	switch (splr->field)
+	{
+	case ITDB_SPLFIELD_RATING:
+	    splr->fromvalue = ITDB_RATING_STEP * atol (str);
+	    break;
+	case ITDB_SPLFIELD_TIME:
+	    splr->fromvalue = 1000 * strtod (str, NULL);
+	    break;
+	default:
+	    splr->fromvalue = atol (str);
+	    break;
+	}
+	break;
+    case spl_ET_FROMVALUE_DATE:
+	t = time_string_to_fromtime (str);
+	if (t != -1)
+	    splr->fromvalue = t;
+	break;
+    case spl_ET_FROMDATE:
+	splr->fromdate = atol (str);
+	break;
+    case spl_ET_TOVALUE:
+	switch (splr->field)
+	{
+	case ITDB_SPLFIELD_RATING:
+	    splr->tovalue = ITDB_RATING_STEP * atol (str);
+	    break;
+	case ITDB_SPLFIELD_TIME:
+	    splr->tovalue = 1000 * strtod (str, NULL);
+	    break;
+	default:
+	    splr->tovalue = atol (str);
+	    break;
+	}
+	break;
+    case spl_ET_TOVALUE_DATE:
+	t = time_string_to_totime (str);
+	if (t != -1)
+	    splr->tovalue = t;
+	break;
+    case spl_ET_TODATE:
+	splr->todate = atol (str);
+	break;
+    case spl_ET_INTHELAST:
+	splr->fromdate = -atol (str);
+	break;
+    case spl_ET_STRING:
+	g_free (splr->string);
+	splr->string = g_strdup (str);
+	break;
+    default:
+	/* must not happen */
+	g_free (str);
+	g_return_if_fail (FALSE);
+	break;
+    }
+    g_free (str);
+}
+
+
+/* splat_inthelast's fromunits have changed --> update */
+static void spl_fromunits_changed (GtkComboBox *combobox,
+				   GtkWidget *spl_window)
+{
+    Itdb_SPLRule *splr;
+    gint index = gtk_combo_box_get_active (combobox);
+
+    g_return_if_fail (index != -1);
+    g_return_if_fail (spl_window);
+    splr =  g_object_get_data (G_OBJECT (combobox), "spl_rule");
+    g_return_if_fail (splr);
+    splr->fromunits =
+	splat_inthelast_units_comboentries[index].id;
+}
+
+
+
+
+/* splat_playlist has changed --> update */
+static void spl_playlist_changed (GtkComboBox *combobox,
+				  GtkWidget *spl_window)
+{
+    Itdb_SPLRule *splr;
+    GArray *pl_ids;
+    gint index;
+
+    g_return_if_fail (combobox);
+    g_return_if_fail (spl_window);
+    splr =  g_object_get_data (G_OBJECT (combobox), "spl_rule");
+    g_return_if_fail (splr);
+    pl_ids = g_object_get_data (G_OBJECT (combobox), "spl_pl_ids");
+    g_return_if_fail (pl_ids);
+    index = gtk_combo_box_get_active (combobox);
+    g_return_if_fail (index != -1);
+    splr->fromvalue = g_array_index (pl_ids, guint64, index);
+}
+
+
+/* Deactivate "minus" (delete rule) button if only one rule is
+   displayed, activate the "minus" (delete rule) buttons if more than
+   one rule is displayed. This affects only the first button
+   (spl_button-0) */
+static void spl_check_number_of_rules (GtkWidget *spl_window)
+{
+    Playlist *spl;
+    GtkTable *table;
+    gint numrules;
+    GtkWidget *button;
+
+    g_return_if_fail (spl_window);
+
+    spl =  g_object_get_data (G_OBJECT (spl_window), "spl_work");
+    g_return_if_fail (spl);
+
+    table = g_object_get_data (G_OBJECT (spl_window), "spl_rules_table");
+    g_return_if_fail (table);
+
+    numrules = g_list_length (spl->splrules.rules);
+    g_return_if_fail (numrules > 0);
+
+    button = g_object_get_data (G_OBJECT (table), "spl_button-0");
+    g_return_if_fail (button);
+    if (numrules > 1)
+	gtk_widget_set_sensitive (button, TRUE);
+    else
+	gtk_widget_set_sensitive (button, FALSE);
+}
+
+
+static void spl_button_minus_clicked (GtkButton *button,
+				      GtkWidget *spl_window)
+{
+    Playlist *spl;
+    Itdb_SPLRule *splr;
+    gint row;
+
+    g_return_if_fail (spl_window);
+
+    splr =  g_object_get_data (G_OBJECT (button), "spl_rule");
+    g_return_if_fail (splr);
+
+    spl =  g_object_get_data (G_OBJECT (spl_window), "spl_work");
+    g_return_if_fail (spl);
+
+    row = g_list_index (spl->splrules.rules, splr);
+    g_return_if_fail (row != -1);
+
+    itdb_splr_remove (spl, splr);
+    spl_update_rules_from_row (spl_window, row);
+
+    spl_check_number_of_rules (spl_window);
+}
+
+
+static void spl_button_plus_clicked (GtkButton *button,
+				     GtkWidget *spl_window)
+{
+    Playlist *spl;
+    Itdb_SPLRule *splr;
+    gint row;
+
+    g_return_if_fail (spl_window);
+
+    splr =  g_object_get_data (G_OBJECT (button), "spl_rule");
+    g_return_if_fail (splr);
+
+    spl =  g_object_get_data (G_OBJECT (spl_window), "spl_work");
+    g_return_if_fail (spl);
+
+    row = g_list_index (spl->splrules.rules, splr);
+    g_return_if_fail (row != -1);
+
+    itdb_splr_add_new (spl, row+1);
+    spl_update_rules_from_row (spl_window, row+1);
+
+    spl_check_number_of_rules (spl_window);
+}
+
+
+static void spl_store_window_size (GtkWidget *spl_window)
+{
+    gint defx, defy;
+
+    gtk_window_get_size (GTK_WINDOW (spl_window), &defx, &defy);
+    prefs_set_int (SPL_WINDOW_DEFX, defx);
+    prefs_set_int (SPL_WINDOW_DEFY, defy);
+}
+
+static void spl_cancel (GtkButton *button, GtkWidget *spl_window)
+{
+    Playlist *spl_dup = g_object_get_data (G_OBJECT (spl_window),
+					   "spl_work");
+    Playlist *spl_orig = g_object_get_data (G_OBJECT (spl_window),
+					    "spl_orig");
+    iTunesDB *itdb = g_object_get_data (G_OBJECT (spl_window),
+					"spl_itdb");
+
+    g_return_if_fail (spl_dup != NULL);
+    g_return_if_fail (spl_orig != NULL);
+    g_return_if_fail (itdb != NULL);
+
+    itdb_playlist_free (spl_dup);
+    /* does playlist already exist in display? */
+    if (!itdb_playlist_exists (itdb, spl_orig))
+    {   /* Delete */
+	itdb_playlist_free (spl_orig);
+    }
+
+    spl_store_window_size (spl_window);
+
+    gtk_widget_destroy (spl_window);
+
+    release_widgets ();
+}
+
+
+static void spl_delete_event (GtkWidget *widget,
+			      GdkEvent *event,
+			      GtkWidget *spl_window)
+{
+    spl_cancel (NULL, spl_window);
+}
+
+
+static void spl_ok (GtkButton *button, GtkWidget *spl_window)
+{
+    GtkWidget *w;
+    Playlist *spl_dup;
+    Playlist *spl_orig;
+    iTunesDB *itdb;
+    gint32 pos;
+
+    g_return_if_fail (spl_window_xml != NULL);
+
+    spl_dup = g_object_get_data (G_OBJECT (spl_window), "spl_work");
+    spl_orig = g_object_get_data (G_OBJECT (spl_window), "spl_orig");
+    pos =  (gint32)GPOINTER_TO_INT(g_object_get_data (G_OBJECT (spl_window), "spl_pos"));
+    itdb = g_object_get_data (G_OBJECT (spl_window), "spl_itdb");
+
+    g_return_if_fail (spl_dup != NULL);
+    g_return_if_fail (spl_orig != NULL);
+    g_return_if_fail (itdb != NULL);
+
+    /* Read out new playlist name */
+    if ((w = gtkpod_xml_get_widget (spl_window_xml, "spl_name_entry")))
+    {
+	g_free (spl_orig->name);
+	spl_orig->name = gtk_editable_get_chars (GTK_EDITABLE (w), 0, -1);
+    }
+
+    itdb_spl_copy_rules (spl_orig, spl_dup);
+
+    itdb_playlist_free (spl_dup);
+
+    /* does playlist already exist in itdb? */
+    if (!itdb_playlist_exists (itdb, spl_orig))
+    {   /* Insert at specified position */
+	gp_playlist_add (itdb, spl_orig, pos);
+    }
+
+    itdb_spl_update (spl_orig);
+
+    if (pm_get_selected_playlist () == spl_orig)
+    {   /* redisplay */
+	pm_unselect_playlist (spl_orig);
+	pm_select_playlist (spl_orig);
+    }
+
+    data_changed (itdb);
+
+    spl_store_window_size (spl_window);
+
+    gtk_widget_destroy (spl_window);
+
+    release_widgets ();
+}
+
+
+/* Display the "checklimits" data correctly */
+static void spl_display_checklimits (GtkWidget *spl_window)
+{
+    Playlist *spl;
+    GtkWidget *w;
+
+    g_return_if_fail (spl_window);
+    spl =  g_object_get_data (G_OBJECT (spl_window), "spl_work");
+    g_return_if_fail (spl);
+
+    if ((w = gtkpod_xml_get_widget (spl_window_xml, "spl_checklimits_button")))
+    {
+	gtk_toggle_button_set_active (
+	    GTK_TOGGLE_BUTTON (w), spl->splpref.checklimits);
+	g_signal_connect (w, "toggled",
+			  G_CALLBACK (spl_checklimits_toggled),
+			  spl_window);
+    }
+
+    if ((w = gtkpod_xml_get_widget (spl_window_xml, "spl_limitvalue_entry")))
+    {
+	gchar str[WNLEN];
+	snprintf (str, WNLEN, "%d", spl->splpref.limitvalue);
+	gtk_entry_set_text (GTK_ENTRY (w), str);
+	gtk_widget_set_sensitive (w, spl->splpref.checklimits);
+	g_signal_connect (w, "changed",
+			  G_CALLBACK (spl_limitvalue_changed),
+			  spl_window);
+    }
+
+    if ((w = gtkpod_xml_get_widget (spl_window_xml, "spl_limittype_combobox")))
+    {
+	spl_set_combobox (GTK_COMBO_BOX (w), 
+			  limittype_comboentries,
+			  spl->splpref.limittype,
+			  G_CALLBACK (spl_limittype_changed),
+			  spl_window);
+	gtk_widget_set_sensitive (w, spl->splpref.checklimits);
+    }
+
+    if ((w = gtkpod_xml_get_widget (spl_window_xml, "spl_limitsort_label")))
+    {
+	gtk_widget_set_sensitive (w, spl->splpref.checklimits);
+    }
+
+    if ((w = gtkpod_xml_get_widget (spl_window_xml, "spl_limitsort_combobox")))
+    {
+	spl_set_combobox (GTK_COMBO_BOX (w), 
+			  limitsort_comboentries,
+			  spl->splpref.limitsort,
+			  G_CALLBACK (spl_limitsort_changed),
+			  spl_window);
+	gtk_widget_set_sensitive (w, spl->splpref.checklimits);
+    }
+}
+
+
+
+/* from "man strftime 3" ("%x" behaves just like "%c"):
+
+       Some buggy versions of gcc complain about the use of %c:
+       warning: `%c' yields only last 2 digits of year in some
+       locales.  Of course program- mers are encouraged to use %c, it
+       gives the preferred date and time representation. One meets all
+       kinds of strange obfuscations to circum- vent this gcc
+       problem. A relatively clean one is to add an intermediate
+       function
+*/
+size_t my_strftime(char *s, size_t max, const char  *fmt,  const
+		   struct tm *tm)
+{
+    return strftime(s, max, fmt, tm);
+}
+
+
+/* set @str to a timestring corresponding to mac timestamp @value */
+void set_timestring (gchar *str, guint64 value, enum entrytype et)
+{
+    time_t t;
+    gchar *resstr;
+
+    g_return_if_fail (str != NULL);
+
+    t = (time_t)value;
+    if (et == spl_ET_FROMVALUE_DATE)
+    {
+	resstr = time_fromtime_to_string (t);
+    }
+    else
+    {
+	resstr = time_totime_to_string (t);
+    }
+    strncpy (str, resstr, WNLEN);
+    str[WNLEN-1] = 0;
+    g_free (resstr);
+}
+
+
+/* set the string @str for rule @splr (entrytype: @et) */
+/* @str must be WNLEN chars long. Returns a pointer to the string to
+ * be used */
+const gchar *entry_get_string (gchar *str, Itdb_SPLRule *splr,
+			       enum entrytype et)
+{
+    gchar *strp = str;
+
+    g_return_val_if_fail (str, NULL);
+    g_return_val_if_fail (splr, NULL);
+
+    switch (et)
+    {
+    case spl_ET_FROMVALUE:
+	if (splr->fromvalue == ITDB_SPL_DATE_IDENTIFIER)
+	    splr->fromvalue = 0;
+	switch (splr->field)
+	{
+	case ITDB_SPLFIELD_RATING:
+	    snprintf (str, WNLEN, "%lld", (long long int)(splr->fromvalue / ITDB_RATING_STEP));
+	    break;
+	case ITDB_SPLFIELD_TIME:
+	    snprintf (str, WNLEN, "%.10g", ((gdouble)splr->fromvalue/1000));
+	    break;
+	default:
+	    snprintf (str, WNLEN, "%lld", (long long int)(splr->fromvalue));
+	    break;
+	}
+	break;
+    case spl_ET_FROMVALUE_DATE:
+	if (splr->fromvalue == ITDB_SPL_DATE_IDENTIFIER)
+	    splr->fromvalue = 0;
+	set_timestring (str, splr->fromvalue, et);
+	break;
+    case spl_ET_FROMDATE:
+	snprintf (str, WNLEN, "%lld",  (long long int)splr->fromdate);
+	break;
+    case spl_ET_TOVALUE:
+	if (splr->tovalue == ITDB_SPL_DATE_IDENTIFIER)
+	    splr->tovalue = 0;
+	switch (splr->field )
+	{
+	case ITDB_SPLFIELD_RATING:
+	    snprintf (str, WNLEN, "%lld",  (long long int)(splr->tovalue / ITDB_RATING_STEP));
+	    break;
+	case ITDB_SPLFIELD_TIME:
+	    snprintf (str, WNLEN, "%.10g", ((gdouble)splr->tovalue/1000));
+	    break;
+	default:
+	    snprintf (str, WNLEN, "%lld", (long long int)(splr->tovalue));
+	    break;
+	}
+	break;
+    case spl_ET_TOVALUE_DATE:
+	if (splr->tovalue == ITDB_SPL_DATE_IDENTIFIER)
+	    splr->tovalue = 0;
+	set_timestring (str, splr->tovalue, et);
+	break;
+    case spl_ET_TODATE:
+	snprintf (str, WNLEN, "%lld",  (long long int)splr->todate);
+	break;
+    case spl_ET_INTHELAST:
+	snprintf (str, WNLEN, "%lld",  (long long int)-splr->fromdate);
+	break;
+    case spl_ET_STRING:
+/*	gtk_entry_set_width_chars (GTK_ENTRY (entry), 20);*/
+	strp = splr->string;
+	break;
+    default:
+	/* must not happen */
+	g_return_val_if_fail (FALSE, NULL);
+	break;
+    }
+    return strp;
+}
+
+
+
+static GtkWidget *hbox_add_entry (GtkWidget *hbox,
+				  Itdb_SPLRule *splr,
+				  enum entrytype et)
+{
+    GtkWidget *spl_window;
+    GtkWidget *entry;
+    gchar str[WNLEN];
+    const gchar *strp;
+
+    g_return_val_if_fail (hbox, NULL);
+
+    str[0] = 0;
+
+    spl_window = g_object_get_data (G_OBJECT (hbox), "spl_window");
+    g_return_val_if_fail (spl_window, NULL);
+
+    entry = gtk_entry_new ();
+    gtk_widget_show (entry);
+    gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
+    if (et == spl_ET_STRING)
+	  gtk_entry_set_max_length (GTK_ENTRY (entry),
+				    ITDB_SPL_STRING_MAXLEN);
+    else  gtk_entry_set_max_length (GTK_ENTRY (entry), 50);
+    strp = entry_get_string (str, splr, et);
+    if (strp)  gtk_entry_set_text (GTK_ENTRY (entry), strp);
+    g_object_set_data (G_OBJECT (entry), "spl_rule", splr);
+    g_object_set_data (G_OBJECT (entry), "spl_entrytype",
+		       (gpointer)et);
+    g_signal_connect (entry, "changed",
+		      G_CALLBACK (splr_entry_changed),
+		      spl_window);
+    g_signal_connect (entry, "activate",
+		      G_CALLBACK (splr_entry_redisplay),
+		      spl_window);
+    return entry;
+}
+
+
+/* Called to destroy the memory used by the array holding the playlist
+   IDs. It is called automatically when the associated object
+   (combobox) is destroyed */
+void spl_pl_ids_destroy (GArray *array)
+{
+    g_return_if_fail (array);
+    g_array_free (array, TRUE);
+}
+
+
+/* Create the widgets to hold the action data (range, date,
+ * string...) */
+GtkWidget *spl_create_hbox (GtkWidget *spl_window, Itdb_SPLRule *splr)
+{
+    GtkWidget *hbox = NULL;
+    ItdbSPLActionType at;
+    GtkWidget *entry, *label, *combobox;
+    gint index;
+    GArray *pl_ids = NULL;
+    Playlist *spl_orig;
+    iTunesDB *itdb;
+    GList *gl;
+
+
+    g_return_val_if_fail (spl_window, NULL);
+    g_return_val_if_fail (splr, NULL);
+
+    spl_orig =  g_object_get_data (G_OBJECT (spl_window), "spl_orig");
+    g_return_val_if_fail (spl_orig, NULL);
+
+    itdb =  g_object_get_data (G_OBJECT (spl_window), "spl_itdb");
+    g_return_val_if_fail (itdb, NULL);
+
+    at = itdb_splr_get_action_type (splr);
+    g_return_val_if_fail (at != ITDB_SPLAT_UNKNOWN, NULL);
+    g_return_val_if_fail (at != ITDB_SPLAT_INVALID, NULL);
+
+    hbox = gtk_hbox_new (FALSE, 3);
+    gtk_widget_show (hbox);
+    g_object_set_data (G_OBJECT (hbox), "spl_window", spl_window);
+
+    switch (at)
+    {
+    case ITDB_SPLAT_STRING:
+	entry = hbox_add_entry (hbox, splr, spl_ET_STRING);
+	break;
+    case ITDB_SPLAT_INT:
+	entry = hbox_add_entry (hbox, splr, spl_ET_FROMVALUE);
+	/* check for unit */
+	index = comboentry_index_from_id (splfield_units, splr->field);
+	if (index != -1)
+	{
+	    label = gtk_label_new (_(splfield_units[index].str));
+	    gtk_widget_show (label);
+	    gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
+	}
+	break;
+    case ITDB_SPLAT_DATE:
+	entry = hbox_add_entry (hbox, splr, spl_ET_FROMVALUE_DATE);
+	break;
+    case ITDB_SPLAT_RANGE_INT:
+	entry = hbox_add_entry (hbox, splr, spl_ET_FROMVALUE);
+	label = gtk_label_new (_("to"));
+	gtk_widget_show (label);
+	gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+	entry = hbox_add_entry (hbox, splr, spl_ET_TOVALUE),
+	/* check for unit */
+	index = comboentry_index_from_id (splfield_units, splr->field);
+	if (index != -1)
+	{
+	    label = gtk_label_new (_(splfield_units[index].str));
+	    gtk_widget_show (label);
+	    gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+	}
+	break;
+    case ITDB_SPLAT_RANGE_DATE:
+	entry = hbox_add_entry (hbox, splr, spl_ET_FROMVALUE_DATE);
+	label = gtk_label_new (_("to"));
+	gtk_widget_show (label);
+	gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+	entry = hbox_add_entry (hbox, splr, spl_ET_TOVALUE_DATE);
+	/* check for unit */
+	index = comboentry_index_from_id (splfield_units, splr->field);
+	if (index != -1)
+	{
+	    label = gtk_label_new (_(splfield_units[index].str));
+	    gtk_widget_show (label);
+	    gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+	}
+	break;
+    case ITDB_SPLAT_INTHELAST:
+	if (comboentry_index_from_id (
+		splat_inthelast_units_comboentries,
+		splr->fromunits) == -1)
+	{   /* unit currently set is not known */
+	    /* adapt to known units */
+	    guint64 units = splr->fromunits;
+	    splr->fromunits = splat_inthelast_units_comboentries[0].id;
+	    splr->fromvalue *= ((double)units)/splr->fromunits;
+	}
+	entry = hbox_add_entry (hbox, splr, spl_ET_INTHELAST);
+	combobox = gtk_combo_box_new ();
+	gtk_widget_show (combobox);
+	gtk_box_pack_start (GTK_BOX (hbox), combobox, TRUE, TRUE, 0);
+	g_object_set_data (G_OBJECT (combobox), "spl_rule", splr);
+	spl_set_combobox (GTK_COMBO_BOX (combobox),
+			  splat_inthelast_units_comboentries,
+			  splr->fromunits,
+			  G_CALLBACK (spl_fromunits_changed),
+			  spl_window);
+	break;
+    case ITDB_SPLAT_PLAYLIST:
+	combobox = gtk_combo_box_new_text ();
+	gtk_widget_show (combobox);
+	gtk_box_pack_start (GTK_BOX (hbox), combobox, TRUE, TRUE, 0);
+	pl_ids = g_array_sized_new (TRUE, TRUE, sizeof (guint64), 
+				    itdb_playlists_number (itdb));
+	gl=itdb->playlists;
+	while (gl && gl->next)
+	{
+	    Playlist *pl = gl->next->data;
+	    g_return_val_if_fail (pl, NULL);
+	    if (pl != spl_orig)
+	    {
+		gtk_combo_box_append_text (GTK_COMBO_BOX (combobox),
+					   pl->name);
+		g_array_append_val (pl_ids, pl->id);
+	    }
+	    gl = gl->next;
+	}
+	g_object_set_data (G_OBJECT (combobox), "spl_rule", splr);
+	g_object_set_data_full (G_OBJECT (combobox), "spl_pl_ids",
+				pl_ids,
+				(GDestroyNotify)spl_pl_ids_destroy);
+	if (splr->fromvalue == ITDB_SPL_DATE_IDENTIFIER)
+	    splr->fromvalue = g_array_index (pl_ids, guint64, 0);
+	index = pl_ids_index_from_id (pl_ids, splr->fromvalue);
+	gtk_combo_box_set_active (GTK_COMBO_BOX (combobox), index);
+	g_signal_connect (combobox, "changed",
+			  G_CALLBACK (spl_playlist_changed),
+			  spl_window);
+	break;
+    case ITDB_SPLAT_BINARY_AND:
+	if (splr->field == ITDB_SPLFIELD_VIDEO_KIND)
+	{
+	    const ComboEntry *use_centries = NULL;
+	    combobox = gtk_combo_box_new ();
+	    gtk_widget_show (combobox);
+	    gtk_box_pack_start (GTK_BOX (hbox), combobox, TRUE, TRUE, 0);
+	    if (comboentry_index_from_id (videokind_comboentries_is,
+					  splr->fromvalue) != -1)
+	    {
+		use_centries = videokind_comboentries_is;
+	    }
+	    else
+	    {
+		use_centries = videokind_comboentries_is_not;
+	    }
+	    g_object_set_data (G_OBJECT (combobox), "spl_rule", splr);
+	    spl_set_combobox (GTK_COMBO_BOX (combobox),
+			      use_centries,
+			      splr->fromvalue,
+			      G_CALLBACK (spl_videokind_comboentry_changed),
+			      spl_window);
+	}
+	else
+	{   /* not supported: display as standard INT */
+	    entry = hbox_add_entry (hbox, splr, spl_ET_FROMVALUE);
+	}
+	break;
+    case ITDB_SPLAT_NONE:
+	break;
+    case ITDB_SPLAT_UNKNOWN:
+    case ITDB_SPLAT_INVALID:
+	/* hopefully never reached !! */
+	break;
+    }
+    return hbox;
+}
+
+
+/* Display/update rule @n in @spl_window */
+static void spl_update_rule (GtkWidget *spl_window, Itdb_SPLRule *splr)
+{
+    GtkTable *table;
+    Playlist *spl;
+    GtkWidget *combobox, *hbox, *button;
+    gchar name[WNLEN];
+    ItdbSPLFieldType ft;
+    ItdbSPLActionType at;
+    gint row, index;
+    const ComboEntry *centries = NULL;
+
+
+    g_return_if_fail (spl_window);
+    g_return_if_fail (splr);
+
+    spl =  g_object_get_data (G_OBJECT (spl_window), "spl_work");
+    g_return_if_fail (spl);
+    table = g_object_get_data (G_OBJECT (spl_window), "spl_rules_table");
+    g_return_if_fail (table);
+
+    row = g_list_index (spl->splrules.rules, splr);
+    g_return_if_fail (row != -1);
+
+
+    /* Combobox for field */
+    /* ------------------ */
+    snprintf (name, WNLEN, "spl_fieldcombo%d", row);
+    combobox = g_object_get_data (G_OBJECT (table), name);
+    if (!combobox)
+    {  /* create combo for field */
+	combobox = gtk_combo_box_new ();
+	gtk_widget_show (combobox);
+	gtk_table_attach (table, combobox, 0,1, row,row+1,
+			  0,0,         /* expand options */
+			  XPAD,YPAD);  /* padding options */
+	g_object_set_data (G_OBJECT (table), name, combobox);
+    }
+    g_object_set_data (G_OBJECT (combobox), "spl_rule", splr);
+    spl_set_combobox (GTK_COMBO_BOX (combobox),
+		      splfield_comboentries,
+		      splr->field,
+		      G_CALLBACK (spl_field_changed),
+		      spl_window);
+
+    /* Combobox for action */
+    /* ------------------- */
+    ft = itdb_splr_get_field_type (splr);
+    snprintf (name, WNLEN, "spl_actioncombo%d", row);
+    combobox = g_object_get_data (G_OBJECT (table), name);
+
+    if (combobox)
+    {   /* check if existing combobox is of same type */
+	ItdbSPLFieldType old_ft = GPOINTER_TO_INT (
+	    g_object_get_data (G_OBJECT (combobox), "spl_fieldtype"));
+	if (old_ft != ft)
+	{
+	    gtk_widget_destroy (combobox);
+	    combobox = NULL;
+	}
+    }
+
+    if (!combobox)
+    {  /* create combo for action */
+	combobox = gtk_combo_box_new ();
+	gtk_widget_show (combobox);
+	gtk_table_attach (table, combobox, 1,2, row,row+1,
+			  GTK_FILL,0,   /* expand options */
+			  XPAD,YPAD);   /* padding options */
+	g_object_set_data (G_OBJECT (table), name, combobox);
+    }
+    g_object_set_data (G_OBJECT (combobox), "spl_rule", splr);
+    g_object_set_data (G_OBJECT (combobox), "spl_fieldtype", GINT_TO_POINTER (ft));
+
+    switch (ft)
+    {
+    case ITDB_SPLFT_STRING:
+	centries = splaction_ftstring_comboentries;
+	break;
+    case ITDB_SPLFT_INT:
+	centries = splaction_ftint_comboentries;
+	break;
+    case ITDB_SPLFT_BOOLEAN:
+	centries = splaction_ftboolean_comboentries;
+	break;
+    case ITDB_SPLFT_DATE:
+	centries = splaction_ftdate_comboentries;
+	break;
+    case ITDB_SPLFT_PLAYLIST:
+	centries = splaction_ftplaylist_comboentries;
+	break;
+    case ITDB_SPLFT_BINARY_AND:
+	centries = splaction_ftbinaryand_comboentries;
+	break;
+    case ITDB_SPLFT_UNKNOWN:
+	centries = splaction_notsupported_comboentries;
+	break;
+    }
+
+    if (centries == NULL)
+    {   /* Handle non-supported action types */
+	centries = splaction_notsupported_comboentries;
+    }
+
+    if (comboentry_index_from_id (centries, splr->action) == -1)
+    {   /* Action currently set is not a legal action for the type of
+	   field. --> adjust */
+	if (centries)    splr->action = centries[0].id;
+    }
+
+    if ((splr->field == ITDB_SPLFIELD_VIDEO_KIND) && (ft == ITDB_SPLFT_BINARY_AND))
+    {   /* this field needs to be handled differently from everything
+	   else */
+	if (comboentry_index_from_id (videokind_comboentries_is,
+				      splr->fromvalue) != -1)
+	{   /* found value to be part of "Is" */
+	    index = 0;
+	}
+	else
+	{   /* assume value to be part of "Is Not" */
+	    index = 1;
+	}
+	g_object_set_data (G_OBJECT (combobox), "spl_binary_and_index",
+			   GINT_TO_POINTER (index));
+	spl_setup_combobox (GTK_COMBO_BOX (combobox), centries, index,
+			    G_CALLBACK (spl_action_changed), spl_window);
+    }
+    else
+    {
+	spl_set_combobox (GTK_COMBO_BOX (combobox), centries, splr->action,
+			  G_CALLBACK (spl_action_changed), spl_window);
+
+    }
+
+    /* input fields (range, string, date...) */
+    /* ------------------------------------- */
+    at = itdb_splr_get_action_type (splr);
+    snprintf (name, WNLEN, "spl_actionhbox%d", row);
+    hbox = g_object_get_data (G_OBJECT (table), name);
+    if (hbox)
+    {
+	gtk_widget_destroy (hbox);
+	g_object_set_data (G_OBJECT (table), name, NULL);
+    }
+    if (centries != splaction_notsupported_comboentries)
+    {
+	g_return_if_fail (at != ITDB_SPLAT_UNKNOWN);
+	g_return_if_fail (at != ITDB_SPLAT_INVALID);
+	hbox = spl_create_hbox (spl_window, splr);
+	gtk_table_attach (table, hbox, 2,3, row,row+1,
+			  GTK_FILL,0,   /* expand options */
+			  XPAD,YPAD);   /* padding options */
+	g_object_set_data (G_OBJECT (table), name, hbox);
+    }
+
+    /* +/- buttons */
+    /* ----------- */
+    snprintf (name, WNLEN, "spl_buttonhbox%d", row);
+    hbox = g_object_get_data (G_OBJECT (table), name);
+    if (!hbox)
+    {
+	/* create hbox with buttons */
+	hbox = gtk_hbox_new (TRUE, 2);
+	gtk_widget_show (hbox);
+	g_object_set_data (G_OBJECT (table), name, hbox);
+	gtk_table_attach (table, hbox, 3,4, row,row+1,
+			  0,0,   /* expand options */
+			  XPAD,YPAD);  /* padding options */
+    }
+
+    snprintf (name, WNLEN, "spl_button-%d", row);
+    button = g_object_get_data (G_OBJECT (table), name);
+    if (!button)
+    {
+	button = gtk_button_new_with_label (_("-"));
+	gtk_widget_show (button);
+	gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 0);
+	g_signal_connect (button, "clicked",
+			  G_CALLBACK (spl_button_minus_clicked),
+			  spl_window);
+	g_object_set_data (G_OBJECT (table), name, button);
+    }
+    g_object_set_data (G_OBJECT (button), "spl_rule", splr);
+
+
+    snprintf (name, WNLEN, "spl_button+%d", row);
+    button = g_object_get_data (G_OBJECT (table), name);
+    if (!button)
+    {
+	button = gtk_button_new_with_label (_("+"));
+	gtk_widget_show (button);
+	gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 0);
+	g_signal_connect (button, "clicked",
+			  G_CALLBACK (spl_button_plus_clicked),
+			  spl_window);
+	g_object_set_data (G_OBJECT (table), name, button);
+	snprintf (name, WNLEN, "spl_button+%d", row);
+    }
+    g_object_set_data (G_OBJECT (button), "spl_rule", splr);
+}
+
+/* Display all rules stored in "spl_work" */
+static void spl_display_rules (GtkWidget *spl_window)
+{
+    Playlist *spl;
+    GtkWidget *align, *table;
+    GList *gl;
+
+    g_return_if_fail (spl_window);
+    spl =  g_object_get_data (G_OBJECT (spl_window), "spl_work");
+    g_return_if_fail (spl);
+    align = gtkpod_xml_get_widget (spl_window_xml, "spl_rules_table_align");
+    g_return_if_fail (align);
+    /* Destroy table if it already exists */
+    table = g_object_get_data (G_OBJECT (spl_window),
+			       "spl_rules_table");
+    if (table)  gtk_widget_destroy (table);
+    table = gtk_table_new (1, 4, FALSE);
+    gtk_widget_show (table);
+    gtk_container_add (GTK_CONTAINER (align), table);
+    g_object_set_data (G_OBJECT (spl_window),
+		       "spl_rules_table", table);
+
+    for (gl=spl->splrules.rules; gl; gl=gl->next)
+	spl_update_rule (spl_window, gl->data);
+
+    spl_check_number_of_rules (spl_window);
+}
+
+
+/* destroy widget @wname in row @row of table @table (used by
+   spl_update_rules_from_row() */
+gboolean splremove (GtkWidget *table, const gchar *wname, gint row)
+{
+    GtkWidget *w;
+    gchar name[WNLEN];
+    gboolean removed = FALSE;
+
+    snprintf (name, WNLEN, "%s%d", wname, row);
+    w = g_object_get_data (G_OBJECT (table), name);
+    if (w)
+    {
+	gtk_widget_destroy (w);
+	g_object_set_data (G_OBJECT (table), name, NULL);
+	removed = TRUE;
+    }
+    return removed;
+}
+
+
+/* Update rules starting in row @row */
+static void spl_update_rules_from_row (GtkWidget *spl_window, gint row)
+{
+    gint i, numrules;
+    Playlist *spl;
+    GtkWidget *table;
+    gboolean removed;
+
+    g_return_if_fail (spl_window);
+    spl =  g_object_get_data (G_OBJECT (spl_window), "spl_work");
+    g_return_if_fail (spl);
+    table = g_object_get_data (G_OBJECT (spl_window), "spl_rules_table");
+    g_return_if_fail (table);
+
+    numrules = g_list_length (spl->splrules.rules);
+
+    /* update all rules starting in row @row */
+    for (i=row; i<numrules; ++i)
+    {
+	spl_update_rule (spl_window,
+			 g_list_nth_data (spl->splrules.rules, i));
+    }
+    /* remove rules that do no longer exist */
+    for (removed=TRUE; removed==TRUE; ++i)
+    {
+	removed =  splremove (table, "spl_fieldcombo", i);
+	removed |= splremove (table, "spl_actioncombo", i);
+	removed |= splremove (table, "spl_actionhbox", i);
+	/* remove spl_button+/- BEFORE removing spl_buttonhbox, as
+	   removing spl_buttonhbox will destroy the buttons as well --
+	   we'd have to g_object_set_data(..., NULL) manually. */
+	removed |= splremove (table, "spl_button+", i);
+	removed |= splremove (table, "spl_button-", i);
+	removed |= splremove (table, "spl_buttonhbox", i);
+    }
+}
+
+
+/* Edit a smart playlist. If it is a new smartlist, it will be
+ * inserted at position @pos when 'OK' is pressed. */
+void spl_edit_all (iTunesDB *itdb, Playlist *spl, gint32 pos)
+{
+    GtkWidget *spl_window, *w;
+    gint defx, defy;
+    Playlist *spl_dup;
+
+    g_return_if_fail (spl != NULL);
+    g_return_if_fail (spl->is_spl);
+    g_return_if_fail (itdb != NULL);
+
+    spl_window_xml = glade_xml_new (xml_file, "spl_window", NULL);
+    spl_window = gtkpod_xml_get_widget (spl_window_xml, "spl_window");
+    
+    g_return_if_fail (spl_window != NULL);
+
+    /* Duplicate playlist to work on */
+    spl_dup = itdb_playlist_duplicate (spl);
+
+    /* Store pointers to original playlist and duplicate */
+    g_object_set_data (G_OBJECT (spl_window), "spl_orig", spl);
+    g_object_set_data (G_OBJECT (spl_window), "spl_work", spl_dup);
+    g_object_set_data (G_OBJECT (spl_window), "spl_pos",  GINT_TO_POINTER(pos));
+    g_object_set_data (G_OBJECT (spl_window), "spl_itdb", itdb);
+    /* Set checkboxes and connect signal handlers */
+    if ((w = gtkpod_xml_get_widget (spl_window_xml, "spl_name_entry")))
+    {
+	if (spl_dup->name)
+	    gtk_entry_set_text (GTK_ENTRY (w), spl_dup->name);	
+    }
+
+    if ((w = gtkpod_xml_get_widget (spl_window_xml, "spl_all_radio")))
+    {
+	g_signal_connect (w, "toggled",
+			  G_CALLBACK (spl_all_radio_toggled),
+			  spl_window);
+	gtk_toggle_button_set_active (
+	    GTK_TOGGLE_BUTTON (w),
+	    (spl_dup->splrules.match_operator == ITDB_SPLMATCH_AND));
+    }
+    if ((w = gtkpod_xml_get_widget (spl_window_xml, "spl_any_radio")))
+    {
+	g_signal_connect (w, "toggled",
+			  G_CALLBACK (spl_any_radio_toggled),
+			  spl_window);
+	gtk_toggle_button_set_active (
+	    GTK_TOGGLE_BUTTON (w),
+	    (spl_dup->splrules.match_operator == ITDB_SPLMATCH_OR));
+    }
+    if ((w = gtkpod_xml_get_widget (spl_window_xml, "spl_none_radio")))
+    {
+	g_signal_connect (w, "toggled",
+			  G_CALLBACK (spl_none_radio_toggled),
+			  spl_window);
+	gtk_toggle_button_set_active (
+	    GTK_TOGGLE_BUTTON (w), !spl_dup->splpref.checkrules);
+    }
+
+    if ((w = gtkpod_xml_get_widget (spl_window_xml, "spl_matchcheckedonly_button")))
+    {
+	gtk_toggle_button_set_active (
+	    GTK_TOGGLE_BUTTON (w), spl_dup->splpref.matchcheckedonly);
+	g_signal_connect (w, "toggled",
+			  G_CALLBACK (spl_matchcheckedonly_toggled),
+			  spl_window);
+    }
+
+    if ((w = gtkpod_xml_get_widget (spl_window_xml, "spl_liveupdate_button")))
+    {
+	gtk_toggle_button_set_active (
+	    GTK_TOGGLE_BUTTON (w), spl_dup->splpref.liveupdate);
+	g_signal_connect (w, "toggled",
+			  G_CALLBACK (spl_liveupdate_toggled),
+			  spl_window);
+    }
+
+    /* Signals for Cancel, OK, Delete */
+    if ((w = gtkpod_xml_get_widget (spl_window_xml, "spl_cancel_button")))
+    {
+	g_signal_connect (w, "clicked",
+		      G_CALLBACK (spl_cancel), spl_window);
+    }
+    if ((w = gtkpod_xml_get_widget (spl_window_xml, "spl_ok_button")))
+    {
+	g_signal_connect (w, "clicked",
+		      G_CALLBACK (spl_ok), spl_window);
+    }
+    g_signal_connect (spl_window, "delete_event",
+		      G_CALLBACK (spl_delete_event), spl_window);
+
+    spl_display_checklimits (spl_window);
+
+    spl_display_rules (spl_window);
+
+    /* set default size */
+    defx = prefs_get_int (SPL_WINDOW_DEFX);
+    defy = prefs_get_int (SPL_WINDOW_DEFY);
+    if ((defx != 0) && (defy != 0))
+	gtk_window_set_default_size (GTK_WINDOW (spl_window), defx, defy);
+
+    gtk_widget_show (spl_window);
+
+    block_widgets ();
+}
+
+
+/* Edit an existing smart playlist */
+void spl_edit (Playlist *spl)
+{
+    g_return_if_fail (spl);
+    g_return_if_fail (spl->itdb);
+    spl_edit_all (spl->itdb, spl, -1);
+}
+
+
+/* Edit a non-existing smartlist. If successful, it will be entered at
+   position @pos. Default name is @name */
+void spl_edit_new (iTunesDB *itdb, gchar *name, gint32 pos)
+{
+    Playlist *spl = gp_playlist_new (name? name:_("New Playlist"), TRUE);
+
+    spl_edit_all (itdb, spl, pos);
+}

Added: trunk/src/display_tracks.c
===================================================================
--- trunk/src/display_tracks.c	                        (rev 0)
+++ trunk/src/display_tracks.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,2601 @@
+/*
+|  Copyright (C) 2002-2007 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+|
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: display_tracks.c 1815 2007-12-12 15:36:40Z jcsjcs $
+*/
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <gdk/gdkkeysyms.h>
+#include <gtk/gtk.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include "prefs.h"
+#include "display_private.h"
+#include "display_itdb.h"
+#include "itdb.h"
+#include "info.h"
+#include "misc.h"
+#include "misc_track.h"
+#include "file.h"
+#include "context_menus.h"
+
+/* pointer to the treeview for the track display */
+static GtkTreeView *track_treeview = NULL;
+/* array with pointers to the columns used in the track display */
+static GtkTreeViewColumn *tm_columns[TM_NUM_COLUMNS];
+/* column in which track pointer is stored */
+static const gint READOUT_COL = 0;
+
+/* compare function to be used for string comparisons */
+static gint (*string_compare_func) (const gchar *str1, const gchar *str2) = compare_string;
+
+static GtkTreeViewColumn *tm_add_column (TM_item tm_item, gint position);
+static TM_item tm_lookup_col_id (GtkTreeViewColumn *column);
+
+/* Drag and drop definitions */
+static GtkTargetEntry tm_drag_types [] = {
+    { DND_GTKPOD_TM_PATHLIST_TYPE, 0, DND_GTKPOD_TM_PATHLIST },
+    { DND_GTKPOD_TRACKLIST_TYPE, 0, DND_GTKPOD_TRACKLIST },
+    { "text/uri-list", 0, DND_TEXT_URI_LIST },
+    { "text/plain", 0, DND_TEXT_PLAIN },
+    { "STRING", 0, DND_TEXT_PLAIN }
+};
+static GtkTargetEntry tm_drop_types [] = {
+    { DND_GTKPOD_TM_PATHLIST_TYPE, 0, DND_GTKPOD_TM_PATHLIST },
+    { "text/uri-list", 0, DND_TEXT_URI_LIST },
+    { "text/plain", 0, DND_TEXT_PLAIN },
+    { "STRING", 0, DND_TEXT_PLAIN }
+};
+
+/* prefs strings */
+const gchar *TM_PREFS_SEARCH_COLUMN = "tm_prefs_search_column";
+
+
+/* ---------------------------------------------------------------- */
+/* Section for track display                                        */
+/* DND -- Drag And Drop                                             */
+/* ---------------------------------------------------------------- */
+
+
+/* Move the paths listed in @data before or after (according to @pos)
+   @path. Used for DND */
+static gboolean tm_move_pathlist (gchar *data,
+				  GtkTreePath *path,
+				  GtkTreeViewDropPosition pos)
+{
+    GtkTreeIter to_iter;
+    GtkTreeIter *from_iter;
+    GtkTreeModel *model;
+    GList *iterlist = NULL;
+    GList *link;
+    gchar **paths, **pathp;
+
+    g_return_val_if_fail (data, FALSE);
+    g_return_val_if_fail (*data, FALSE);
+
+    model = gtk_tree_view_get_model (track_treeview);
+    g_return_val_if_fail (model, FALSE);
+
+    g_return_val_if_fail (gtk_tree_model_get_iter (model, &to_iter, path),
+			  FALSE);
+
+    /* split the path list into individual strings */
+    paths = g_strsplit (data, "\n", -1);
+    pathp = paths;
+    /* Convert the list of paths into a list of iters */
+    while (*pathp)
+    {
+	from_iter = g_malloc (sizeof (GtkTreeIter));
+	if ((strlen (*pathp) > 0) &&
+	    gtk_tree_model_get_iter_from_string (model, from_iter, *pathp))
+	{
+	    iterlist = g_list_append (iterlist, from_iter);
+	}
+	++pathp;
+    }
+    g_strfreev (paths);
+    /* Move the iters in iterlist before or after @to_iter */
+    switch (pos)
+    {
+    case GTK_TREE_VIEW_DROP_INTO_OR_AFTER:
+    case GTK_TREE_VIEW_DROP_AFTER:
+	for (link = g_list_last (iterlist); link; link = link->prev)
+	{
+	    from_iter = (GtkTreeIter *)link->data;
+	    gtk_list_store_move_after (GTK_LIST_STORE (model),
+				       from_iter, &to_iter);
+	}
+	break;
+    case GTK_TREE_VIEW_DROP_INTO_OR_BEFORE:
+    case GTK_TREE_VIEW_DROP_BEFORE:
+	for (link = g_list_first (iterlist); link; link = link->next)
+	{
+	    from_iter = (GtkTreeIter *)link->data;
+	    gtk_list_store_move_before (GTK_LIST_STORE (model),
+					from_iter, &to_iter);
+	}
+	break;
+    }
+
+    /* free iterlist */
+    for (link = iterlist; link; link = link->next)
+	g_free (link->data);
+    g_list_free (iterlist);
+
+    tm_rows_reordered ();
+    return TRUE;
+}
+
+
+/*
+ * utility function for appending ipod track ids for track view (DND)
+ */
+static void
+on_tm_dnd_get_track_foreach(GtkTreeModel *tm, GtkTreePath *tp,
+			    GtkTreeIter *i, gpointer data)
+{
+    Track *tr;
+    GString *tracklist = (GString *)data;
+
+    g_return_if_fail (tracklist);
+
+    gtk_tree_model_get(tm, i, READOUT_COL, &tr, -1);
+    g_return_if_fail (tr);
+
+    g_string_append_printf (tracklist, "%p\n", tr);
+}
+
+
+/*
+ * utility function for appending path for track view (DND)
+ */
+static void
+on_tm_dnd_get_path_foreach(GtkTreeModel *tm, GtkTreePath *tp,
+			   GtkTreeIter *iter, gpointer data)
+{
+    GString *filelist = (GString *)data;
+    gchar *ps = gtk_tree_path_to_string (tp);
+    g_string_append_printf (filelist, "%s\n", ps);
+    g_free (ps);
+}
+
+/*
+ * utility function for appending file for track view (DND)
+ */
+static void
+on_tm_dnd_get_file_foreach(GtkTreeModel *tm, GtkTreePath *tp,
+			   GtkTreeIter *iter, gpointer data)
+{
+    Track *track;
+    GString *filelist = (GString *)data;
+    gchar *name;
+
+    gtk_tree_model_get(tm, iter, READOUT_COL, &track, -1);
+    name = get_file_name_from_source (track, SOURCE_PREFER_LOCAL);
+    if (name)
+    {
+	g_string_append_printf (filelist, "file:%s\n", name);
+	g_free (name);
+    }
+}
+
+/*
+ * utility function for appending file-uri for track view (DND)
+ */
+static void
+on_tm_dnd_get_uri_foreach(GtkTreeModel *tm, GtkTreePath *tp,
+			  GtkTreeIter *iter, gpointer data)
+{
+    Track *track;
+    GString *filelist = (GString *)data;
+    gchar *name;
+
+    gtk_tree_model_get(tm, iter, READOUT_COL, &track, -1);
+    name = get_file_name_from_source (track, SOURCE_PREFER_LOCAL);
+    if (name)
+    {
+	gchar *uri = g_filename_to_uri (name, NULL, NULL);
+	if (uri)
+	{
+	    g_string_append_printf (filelist, "%s\n", uri);
+	    g_free (uri);
+	}
+	g_free (name);
+    }
+}
+
+static void tm_drag_begin (GtkWidget *widget,
+			   GdkDragContext *dc,
+			   gpointer user_data)
+{
+    tm_stop_editing (TRUE);
+}
+
+
+/* remove dragged playlist after successful MOVE */
+static void tm_drag_data_delete (GtkWidget *widget,
+			   GdkDragContext *dc,
+			   gpointer user_data)
+{
+    GtkTreeSelection *ts;
+    Playlist *pl = pm_get_selected_playlist ();
+    gint num;
+
+/*     puts ("tm_drag_data_delete"); */
+
+    g_return_if_fail (widget);
+    ts = gtk_tree_view_get_selection (GTK_TREE_VIEW(widget));
+    g_return_if_fail (ts);
+    /* number of selected tracks */
+    num = gtk_tree_selection_count_selected_rows (ts);
+    if (num == 0) return;
+
+    /* Check if we really have to delete the tracks */
+    if (!itdb_playlist_is_mpl (pl))
+    {	/* get list of selected tracks */
+	GString *reply = g_string_sized_new (2000);
+	gchar *str;
+	Track *track;
+
+	gtk_tree_selection_selected_foreach(ts,
+					    on_tm_dnd_get_track_foreach,
+					    reply);
+	str = reply->str;
+	while(parse_tracks_from_string(&str, &track))
+	{
+	    gp_playlist_remove_track (pl, track, DELETE_ACTION_PLAYLIST);
+	}
+	g_string_free (reply, TRUE);
+
+	gtkpod_statusbar_message (ngettext ("Moved one track",
+					    "Moved %d tracks", num), num);
+    }
+    else
+    {
+	gtkpod_statusbar_message (ngettext ("Copied one track",
+					    "Copied %d tracks", num), num);
+    }
+}
+
+
+
+static void tm_drag_end (GtkWidget *widget,
+			 GdkDragContext *dc,
+			 gpointer user_data)
+{
+/*     puts ("tm_drag_end"); */
+    display_remove_autoscroll_row_timeout (widget);
+    gtkpod_tracks_statusbar_update ();
+}
+
+
+static gboolean tm_drag_drop (GtkWidget *widget,
+			      GdkDragContext *dc,
+			      gint x,
+			      gint y,
+			      guint time,
+			      gpointer user_data)
+{
+    GdkAtom target;
+
+/*     puts ("tm_drag_data_drop"); */
+
+    display_remove_autoscroll_row_timeout (widget);
+
+    target = gtk_drag_dest_find_target (widget, dc, NULL);
+
+    if (target != GDK_NONE)
+    {
+	gtk_drag_get_data (widget, dc, target, time);
+	return TRUE;
+    }
+    return FALSE;
+}
+
+static void tm_drag_leave (GtkWidget *widget,
+			   GdkDragContext *dc,
+			   guint time,
+			   gpointer user_data)
+{
+/*     puts ("tm_drag_leave"); */
+    display_remove_autoscroll_row_timeout (widget);
+}
+
+
+
+static gboolean tm_drag_motion (GtkWidget *widget,
+				GdkDragContext *dc,
+				gint x,
+				gint y,
+				guint time,
+				gpointer user_data)
+{
+    GtkTreeView *treeview;
+    GdkAtom target;
+    GtkTreePath *path = NULL;
+    GtkTreeViewDropPosition pos;
+    iTunesDB *itdb;
+    ExtraiTunesDBData *eitdb;
+
+/*     printf ("drag_motion  suggested: %d actions: %d\n", */
+/*  	    dc->suggested_action, dc->actions); */
+
+/*     printf ("x: %d y: %d\n", x, y); */
+
+    g_return_val_if_fail (GTK_IS_TREE_VIEW (widget), FALSE);
+
+    treeview = GTK_TREE_VIEW (widget);
+
+    display_install_autoscroll_row_timeout (widget);
+
+    itdb = gp_get_selected_itdb ();
+    /* no drop is possible if no playlist/repository is selected */
+    if (itdb == NULL)
+    {
+	gdk_drag_status (dc, 0, time);
+	return FALSE;
+    }
+    eitdb = itdb->userdata;
+    g_return_val_if_fail (eitdb, FALSE);
+    /* no drop is possible if no repository is loaded */
+    if (!eitdb->itdb_imported)
+    {
+	gdk_drag_status (dc, 0, time);
+	return FALSE;
+    }
+
+    /* optically set destination row if available */
+    if (gtk_tree_view_get_dest_row_at_pos (GTK_TREE_VIEW (widget),
+					   x, y, &path, &pos))
+    {
+	/* drops are only allowed before and after -- not onto
+	   existing paths */
+	switch (pos)
+	{
+	case GTK_TREE_VIEW_DROP_INTO_OR_AFTER:
+	case GTK_TREE_VIEW_DROP_AFTER:
+	    gtk_tree_view_set_drag_dest_row (GTK_TREE_VIEW (widget), path,
+					     GTK_TREE_VIEW_DROP_AFTER);
+	    break;
+	case GTK_TREE_VIEW_DROP_INTO_OR_BEFORE:
+	case GTK_TREE_VIEW_DROP_BEFORE:
+	    gtk_tree_view_set_drag_dest_row (GTK_TREE_VIEW (widget), path,
+					     GTK_TREE_VIEW_DROP_BEFORE);
+	    break;
+	}
+
+ 	gtk_tree_path_free (path);
+ 	path = NULL;
+    }
+    else
+    {
+	path = gtk_tree_path_new_first ();
+	gtk_tree_view_set_drag_dest_row (GTK_TREE_VIEW (widget), path,
+					 GTK_TREE_VIEW_DROP_BEFORE);
+	gtk_tree_path_free (path);
+	path = NULL;
+    }
+
+    target = gtk_drag_dest_find_target (widget, dc, NULL);
+
+    /* no drop possible if no valid target can be found */
+    if (target == GDK_NONE)
+    {
+	gdk_drag_status (dc, 0, time);
+	return FALSE;
+    }
+
+    if (widget == gtk_drag_get_source_widget (dc))
+    {   /* drag is within the same widget */
+	gint column;
+	GtkSortType order;
+	GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
+	g_return_val_if_fail (model, FALSE);
+	if(gtk_tree_sortable_get_sort_column_id (
+	       GTK_TREE_SORTABLE (model), &column, &order))
+	{   /* don't allow move because the model is sorted */
+	    gdk_drag_status (dc, 0, time);
+	    return FALSE;
+	}
+	else
+	{   /* only allow moves within the same widget */
+	    gdk_drag_status (dc, GDK_ACTION_MOVE, time);
+	}
+    }
+    else
+    {  /* whatever the source suggests */
+	gdk_drag_status (dc, dc->suggested_action, time);
+    }
+
+    return TRUE;
+}
+
+
+static void tm_drag_data_get (GtkWidget       *widget,
+			      GdkDragContext  *context,
+			      GtkSelectionData *data,
+			      guint            info,
+			      guint            time,
+			      gpointer         user_data)
+{
+    GtkTreeSelection *ts = NULL;
+    GString *reply = g_string_sized_new (2000);
+
+/*     printf("tm drag get info: %d\n", info); */
+    if((data) && (ts = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget))))
+    {
+	switch (info)
+	{
+	case DND_GTKPOD_TRACKLIST:
+	    gtk_tree_selection_selected_foreach(ts,
+				    on_tm_dnd_get_track_foreach, reply);
+	    break;
+	case DND_GTKPOD_TM_PATHLIST:
+	    gtk_tree_selection_selected_foreach(ts,
+				    on_tm_dnd_get_path_foreach, reply);
+	    break;
+	case DND_TEXT_URI_LIST:
+	    gtk_tree_selection_selected_foreach(ts,
+				    on_tm_dnd_get_uri_foreach, reply);
+	    break;
+	case DND_TEXT_PLAIN:
+	    gtk_tree_selection_selected_foreach(ts,
+				    on_tm_dnd_get_file_foreach, reply);
+	    break;
+	default:
+	    g_warning ("Programming error: tm_drag_data_get received unknown info type (%d)\n", info);
+	    break;
+	}
+    }
+    gtk_selection_data_set(data, data->target, 8, reply->str, reply->len);
+    g_string_free (reply, TRUE);
+}
+
+static void tm_drag_data_received (GtkWidget       *widget,
+				   GdkDragContext  *dc,
+				   gint             x,
+				   gint             y,
+				   GtkSelectionData *data,
+				   guint            info,
+				   guint            time,
+				   gpointer         user_data)
+{
+    GtkTreePath *path = NULL;
+    GtkTreeModel *model = NULL;
+    GtkTreeViewDropPosition pos = 0;
+    gboolean result = FALSE;
+
+    /* printf ("sm drop received info: %d\n", info); */
+
+    /* sometimes we get empty dnd data, ignore */
+    if(widgets_blocked || (!dc) ||
+       (!data) || (data->length < 0)) return;
+    /* yet another check, i think it's an 8 bit per byte check */
+    if(data->format != 8) return;
+
+    display_remove_autoscroll_row_timeout (widget);
+
+    model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
+    g_return_if_fail (model);
+    if (!gtk_tree_view_get_dest_row_at_pos (GTK_TREE_VIEW (widget),
+					    x, y, &path, &pos))
+    {
+	gint py;
+	gdk_window_get_pointer (
+	    gtk_tree_view_get_bin_window (GTK_TREE_VIEW (widget)),
+	    NULL, &py, NULL);
+	if (py < 5)
+	{
+	    /* initialize with first displayed and drop before */
+	    GtkTreeIter iter;
+	    if (gtk_tree_model_get_iter_first (model, &iter))
+	    {
+		path = gtk_tree_model_get_path (model, &iter);
+		pos = GTK_TREE_VIEW_DROP_BEFORE;
+	    }
+	}
+	else
+	{   /* initialize with last path if available and drop after */
+	    GtkTreeIter iter;
+	    if (gtk_tree_model_get_iter_first (model, &iter))
+	    {
+		GtkTreeIter last_valid_iter;
+		do
+		{
+		    last_valid_iter = iter;
+		} while (gtk_tree_model_iter_next (model, &iter));
+		path = gtk_tree_model_get_path (model, &last_valid_iter);
+		pos = GTK_TREE_VIEW_DROP_AFTER;
+	    }
+	}
+    }
+
+    if (path)
+    {   /* map position onto BEFORE or AFTER */
+	switch (pos)
+	{
+	case GTK_TREE_VIEW_DROP_INTO_OR_AFTER:
+	case GTK_TREE_VIEW_DROP_AFTER:
+	    pos = GTK_TREE_VIEW_DROP_AFTER;
+	    break;
+	case GTK_TREE_VIEW_DROP_INTO_OR_BEFORE:
+	case GTK_TREE_VIEW_DROP_BEFORE:
+	    pos = GTK_TREE_VIEW_DROP_BEFORE;
+	    break;
+	}
+    }
+
+    switch (info)
+    {
+    case DND_GTKPOD_TM_PATHLIST:
+	g_return_if_fail (path);
+	result = tm_move_pathlist (data->data, path, pos);
+	dc->action = GDK_ACTION_MOVE;
+	gtk_drag_finish (dc, TRUE, FALSE, time);
+	break;
+    case DND_TEXT_PLAIN:
+	result = tm_add_filelist (data->data, path, pos);
+	dc->action = dc->suggested_action;
+	if (dc->action == GDK_ACTION_MOVE)
+	    gtk_drag_finish (dc, TRUE, TRUE, time);
+	else
+	    gtk_drag_finish (dc, TRUE, FALSE, time);
+	break;
+    case DND_TEXT_URI_LIST:
+	result = tm_add_filelist (data->data, path, pos);
+	dc->action = dc->suggested_action;
+	if (dc->action == GDK_ACTION_MOVE)
+	    gtk_drag_finish (dc, TRUE, TRUE, time);
+	else
+	    gtk_drag_finish (dc, TRUE, FALSE, time);
+	break;
+    default:
+	dc->action = 0;
+	gtk_drag_finish (dc, FALSE, FALSE, time);
+/* 	puts ("tm_drag_data_received(): should not be reached"); */
+	break;
+    }
+    if (path) gtk_tree_path_free(path);
+}
+
+/* ---------------------------------------------------------------- */
+/* Section for track display                                        */
+/* other callbacks                                                  */
+/* ---------------------------------------------------------------- */
+
+static gboolean
+on_track_treeview_key_release_event     (GtkWidget       *widget,
+					GdkEventKey     *event,
+					gpointer         user_data)
+{
+    guint mods;
+    mods = event->state;
+
+    if(!widgets_blocked && (mods & GDK_CONTROL_MASK))
+    {
+	switch(event->keyval)
+	{
+/* 	    case GDK_u: */
+/* 		gp_do_selected_tracks (update_tracks); */
+/* 		break; */
+	    default:
+		break;
+	}
+    }
+    return FALSE;
+}
+
+/* ---------------------------------------------------------------- */
+/* Section for track display                                        */
+/* ---------------------------------------------------------------- */
+
+/* Append track to the track model (or write into @into_iter if != 0) */
+void tm_add_track_to_track_model (Track *track, GtkTreeIter *into_iter)
+{
+    GtkTreeIter iter;
+    GtkTreeModel *model = gtk_tree_view_get_model (track_treeview);
+
+    g_return_if_fail (model != NULL);
+
+    if (into_iter)
+	iter = *into_iter;
+    else
+	gtk_list_store_append (GTK_LIST_STORE (model), &iter);
+
+    gtk_list_store_set (GTK_LIST_STORE (model), &iter,
+			READOUT_COL, track, -1);
+}
+
+
+
+/* Used by remove_track() to remove track from model by calling
+   gtk_tree_model_foreach ().
+   Entry is deleted if data == track */
+static gboolean tm_delete_track (GtkTreeModel *model,
+				GtkTreePath *path,
+				GtkTreeIter *iter,
+				gpointer data)
+{
+  Track *track;
+
+  gtk_tree_model_get (model, iter, READOUT_COL, &track, -1);
+  if(track == (Track *)data)
+  {
+      GtkTreeSelection *selection = gtk_tree_view_get_selection
+	  (track_treeview);
+/*       printf("unselect...\n"); */
+      gtk_tree_selection_unselect_iter (selection, iter);
+/*       printf("...unselect done\n"); */
+      gtk_list_store_remove (GTK_LIST_STORE (model), iter);
+      return TRUE;
+  }
+  return FALSE;
+}
+
+
+/* Remove track from the display model */
+void tm_remove_track (Track *track)
+{
+  GtkTreeModel *model = gtk_tree_view_get_model (track_treeview);
+  if (model != NULL)
+    gtk_tree_model_foreach (model, tm_delete_track, track);
+}
+
+
+/* Remove all tracks from the display model */
+void tm_remove_all_tracks ()
+{
+  GtkTreeModel *model = gtk_tree_view_get_model (track_treeview);
+  GtkTreeIter iter;
+
+  while (gtk_tree_model_get_iter_first (model, &iter))
+  {
+      gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
+  }
+  tm_store_col_order ();
+  tm_update_default_sizes ();
+}
+
+/* find out at which position column @tm_item is displayed */
+/* static gint tm_get_col_position (TM_item tm_item) */
+/* { */
+/*     gint i; */
+/*     GtkTreeViewColumn *col; */
+
+/*     if (!track_treeview) return -1; */
+
+/*     for (i=0; i<TM_NUM_COLUMNS_PREFS; ++i) */
+/*     { */
+/* 	col = gtk_tree_view_get_column (track_treeview, i); */
+/* 	if (col->sort_column_id == tm_item) return i; */
+/*     } */
+/*     return -1; */
+/* } */
+
+
+/* store the order of the track view columns */
+void tm_store_col_order (void)
+{
+    gint i;
+    GtkTreeViewColumn *col;
+
+    for (i=0; i<TM_NUM_COLUMNS; ++i)
+    {
+	col = gtk_tree_view_get_column (track_treeview, i);
+	prefs_set_int_index("col_order", i, col->sort_column_id);
+    }
+}
+
+
+/* Used by tm_track_changed() to find the track that
+   changed name. If found, emit a "row changed" signal */
+static gboolean tm_model_track_changed (GtkTreeModel *model,
+				       GtkTreePath *path,
+				       GtkTreeIter *iter,
+				       gpointer data)
+{
+  Track *track;
+
+  gtk_tree_model_get (model, iter, READOUT_COL, &track, -1);
+  if(track == (Track *)data) {
+    gtk_tree_model_row_changed (model, path, iter);
+    return TRUE;
+  }
+  return FALSE;
+}
+
+
+/* One of the tracks has changed (this happens when the
+   iTunesDB is read and some IDs are renumbered */
+void tm_track_changed (Track *track)
+{
+  GtkTreeModel *model = gtk_tree_view_get_model (track_treeview);
+  /*  printf("tm_track_changed enter\n");*/
+  if (model != NULL)
+    gtk_tree_model_foreach (model, tm_model_track_changed, track);
+  /*  printf("tm_track_changed exit\n");*/
+}
+
+
+
+#if ((GTK_MAJOR_VERSION == 2) && (GTK_MINOR_VERSION < 2))
+/* gtk_tree_selection_get_selected_rows() was introduced in 2.2 */
+struct gtsgsr
+{
+    GtkTreeModel **model;
+    GList        **list;
+};
+
+void  gtssf  (GtkTreeModel *model,
+	      GtkTreePath *path,
+	      GtkTreeIter *iter,
+	      gpointer data)
+{
+    struct gtsgsr *gts = data;
+    *gts->model = model;
+    *gts->list = g_list_append (*gts->list, gtk_tree_path_copy (path));
+}
+
+GList *gtk_tree_selection_get_selected_rows (GtkTreeSelection *selection,
+                                             GtkTreeModel     **model)
+{
+    struct gtsgsr gts;
+    GList *list = NULL;
+
+    gts.model = model;
+    gts.list = &list;
+
+    gtk_tree_selection_selected_foreach (selection, gtssf, &gts);
+    return list;
+}
+#endif
+
+
+/* Called when editable cell is being edited. Stores new data to the
+   track list. ID3 tags in the corresponding files are updated as
+   well, if activated in the pref settings */
+static void
+tm_cell_edited (GtkCellRendererText *renderer,
+		const gchar         *path_string,
+		const gchar         *new_text,
+		gpointer             data)
+{
+  GtkTreeModel *model;
+  GtkTreeSelection *selection;
+  TM_item column;
+  gboolean multi_edit;
+  gint sel_rows_num;
+  GList *row_list, *row_node, *first;
+
+
+  column = (TM_item) g_object_get_data(G_OBJECT(renderer), "column");
+  multi_edit = prefs_get_int("multi_edit");
+  if (column == TM_COLUMN_TITLE)
+      multi_edit &= prefs_get_int("multi_edit_title");
+  selection = gtk_tree_view_get_selection(track_treeview);
+  row_list = gtk_tree_selection_get_selected_rows(selection, &model);
+
+/*   printf("tm_cell_edited: column: %d\n", column); */
+
+  sel_rows_num = g_list_length (row_list);
+
+  /* block widgets and update display if multi-edit is active */
+  if (multi_edit && (sel_rows_num > 1)) block_widgets ();
+
+  first = g_list_first (row_list);
+
+  for (row_node = first;
+       row_node && (multi_edit || (row_node == first));
+       row_node = g_list_next(row_node))
+  {
+     Track *track;
+     ExtraTrackData *etr;
+     gboolean changed;
+     GtkTreeIter iter;
+     gchar *str;
+
+     gtk_tree_model_get_iter(model, &iter, (GtkTreePath *) row_node->data);
+     gtk_tree_model_get(model, &iter, READOUT_COL, &track, -1);
+     g_return_if_fail (track);
+     etr = track->userdata;
+     g_return_if_fail (etr);
+
+
+     changed = FALSE;
+
+     switch(column)
+     {
+     case TM_COLUMN_TITLE:
+     case TM_COLUMN_ALBUM:
+     case TM_COLUMN_ALBUMARTIST:
+     case TM_COLUMN_ARTIST:
+     case TM_COLUMN_GENRE:
+     case TM_COLUMN_COMPOSER:
+     case TM_COLUMN_COMMENT:
+     case TM_COLUMN_FILETYPE:
+     case TM_COLUMN_GROUPING:
+     case TM_COLUMN_CATEGORY:
+     case TM_COLUMN_DESCRIPTION:
+     case TM_COLUMN_PODCASTURL:
+     case TM_COLUMN_PODCASTRSS:
+     case TM_COLUMN_SUBTITLE:
+     case TM_COLUMN_TRACK_NR:
+     case TM_COLUMN_TRACKLEN:
+     case TM_COLUMN_CD_NR:
+     case TM_COLUMN_YEAR:
+     case TM_COLUMN_PLAYCOUNT:
+     case TM_COLUMN_RATING:
+     case TM_COLUMN_TIME_ADDED:
+     case TM_COLUMN_TIME_PLAYED:
+     case TM_COLUMN_TIME_MODIFIED:
+     case TM_COLUMN_TIME_RELEASED:
+     case TM_COLUMN_VOLUME:
+     case TM_COLUMN_SOUNDCHECK:
+     case TM_COLUMN_BITRATE:
+     case TM_COLUMN_SAMPLERATE:
+     case TM_COLUMN_BPM:
+     case TM_COLUMN_MEDIA_TYPE:
+     case TM_COLUMN_TV_SHOW:
+     case TM_COLUMN_TV_EPISODE:
+     case TM_COLUMN_TV_NETWORK:
+     case TM_COLUMN_SEASON_NR:
+     case TM_COLUMN_EPISODE_NR:
+     case TM_COLUMN_SORT_TITLE:
+     case TM_COLUMN_SORT_ALBUM:
+     case TM_COLUMN_SORT_ALBUMARTIST:
+     case TM_COLUMN_SORT_COMPOSER:
+     case TM_COLUMN_SORT_TVSHOW:
+     case TM_COLUMN_SORT_ARTIST:
+	 changed = track_set_text (track, new_text, TM_to_T (column));
+	 if (changed && (column == TM_COLUMN_TRACKLEN))
+	 {  /* be on the safe side and reset starttime, stoptime and
+	     * filesize */
+	     gchar *path = get_file_name_from_source (track,
+						      SOURCE_PREFER_LOCAL);
+	     track->starttime = 0;
+	     track->stoptime = 0;
+	     if (path)
+	     {
+		 struct stat filestat;
+		 stat (path, &filestat);
+		 track->size = filestat.st_size;
+	     }
+	 }
+	 /* redisplay some items to be on the safe side */
+	 switch (column)
+	 {
+	 case TM_COLUMN_TRACK_NR:
+	 case TM_COLUMN_CD_NR:
+	 case TM_COLUMN_TRACKLEN:
+	 case TM_COLUMN_TIME_ADDED:
+	 case TM_COLUMN_TIME_PLAYED:
+	 case TM_COLUMN_TIME_MODIFIED:
+	 case TM_COLUMN_TIME_RELEASED:
+	     str = track_get_text (track, TM_to_T (column));
+	     g_object_set (G_OBJECT (renderer), "text", str, NULL);
+	     g_free (str);
+	     break;
+	 default:
+	     break;
+	 }
+	 break;
+     case TM_COLUMN_IPOD_ID:
+     case TM_COLUMN_PC_PATH:
+     case TM_COLUMN_TRANSFERRED:
+     case TM_COLUMN_SIZE:
+     case TM_COLUMN_IPOD_PATH:
+     case TM_COLUMN_COMPILATION:
+     case TM_COLUMN_THUMB_PATH:
+     case TM_NUM_COLUMNS:
+	 /* These are not editable text fields */
+	 break;
+     }
+/*      printf ("  changed: %d\n", changed); */
+     if (changed)
+     {
+	track->time_modified = time (NULL);
+        pm_track_changed (track);    /* notify playlist model... */
+        data_changed (track->itdb); /* indicate that data has changed */
+
+        if (prefs_get_int("id3_write"))
+        {
+	    /* T_item tag_id;*/
+           /* should we update all ID3 tags or just the one
+              changed? -- obsoleted in 0.71*/
+/*           if (prefs_get_id3_writeall ()) tag_id = T_ALL;
+	     else                           tag_id = TM_to_T (column);*/
+           write_tags_to_file (track);
+           /* display possible duplicates that have been removed */
+           gp_duplicate_remove (NULL, NULL);
+        }
+     }
+     while (widgets_blocked && gtk_events_pending ())  gtk_main_iteration ();
+  }
+
+  if (multi_edit && (sel_rows_num > 1)) release_widgets ();
+
+  g_list_foreach(row_list, (GFunc) gtk_tree_path_free, NULL);
+  g_list_free(row_list);
+}
+
+
+/* The track data is stored in a separate list (static GList *tracks)
+   and only pointers to the corresponding Track structure are placed
+   into the model.
+   This function reads the data for the given cell from the list and
+   passes it to the renderer. */
+static void tm_cell_data_func (GtkTreeViewColumn *tree_column,
+			       GtkCellRenderer   *renderer,
+			       GtkTreeModel      *model,
+			       GtkTreeIter       *iter,
+			       gpointer           data)
+{
+  Track *track;
+  ExtraTrackData *etr;
+  iTunesDB *itdb;
+  TM_item column;
+  gchar *text;
+
+  column = (TM_item)g_object_get_data (G_OBJECT (renderer), "column");
+
+  g_return_if_fail ((column >= 0) && (column < TM_NUM_COLUMNS));
+
+  gtk_tree_model_get (model, iter, READOUT_COL, &track, -1);
+  g_return_if_fail (track);
+  etr = track->userdata;
+  g_return_if_fail (etr);
+  itdb = track->itdb;
+  g_return_if_fail (itdb);
+
+  text = track_get_text (track, TM_to_T (column));
+
+  switch (column)
+  {
+  case TM_COLUMN_TITLE:
+  case TM_COLUMN_ARTIST:
+  case TM_COLUMN_ALBUM:
+  case TM_COLUMN_GENRE:
+  case TM_COLUMN_COMPOSER:
+  case TM_COLUMN_COMMENT:
+  case TM_COLUMN_FILETYPE:
+  case TM_COLUMN_GROUPING:
+  case TM_COLUMN_CATEGORY:
+  case TM_COLUMN_DESCRIPTION:
+  case TM_COLUMN_PODCASTURL:
+  case TM_COLUMN_PODCASTRSS:
+  case TM_COLUMN_SUBTITLE:
+  case TM_COLUMN_TIME_PLAYED:
+  case TM_COLUMN_TIME_MODIFIED:
+  case TM_COLUMN_TIME_ADDED:
+  case TM_COLUMN_TIME_RELEASED:
+  case TM_COLUMN_TV_SHOW:
+  case TM_COLUMN_TV_EPISODE:
+  case TM_COLUMN_TV_NETWORK:
+  case TM_COLUMN_ALBUMARTIST:
+  case TM_COLUMN_SORT_ARTIST:
+  case TM_COLUMN_SORT_TITLE:
+  case TM_COLUMN_SORT_ALBUM:
+  case TM_COLUMN_SORT_ALBUMARTIST:
+  case TM_COLUMN_SORT_COMPOSER:
+  case TM_COLUMN_SORT_TVSHOW:
+      g_object_set (G_OBJECT (renderer),
+		    "text", text,
+		    "editable", TRUE,
+		    "xalign", 0.0, NULL);
+      break;
+  case TM_COLUMN_MEDIA_TYPE:
+      g_object_set (G_OBJECT (renderer),
+		    "text", text,
+		    "editable", FALSE,
+		    "xalign", 0.0, NULL);
+      break;
+  case TM_COLUMN_TRACK_NR:
+  case TM_COLUMN_CD_NR:
+  case TM_COLUMN_BITRATE:
+  case TM_COLUMN_SAMPLERATE:
+  case TM_COLUMN_BPM:
+  case TM_COLUMN_PLAYCOUNT:
+  case TM_COLUMN_YEAR:
+  case TM_COLUMN_RATING:
+  case TM_COLUMN_VOLUME:
+  case TM_COLUMN_SOUNDCHECK:
+  case TM_COLUMN_TRACKLEN:
+  case TM_COLUMN_SEASON_NR:
+  case TM_COLUMN_EPISODE_NR:
+      g_object_set (G_OBJECT (renderer),
+		    "text", text,
+		    "editable", TRUE,
+		    "xalign", 1.0, NULL);
+      break;
+  case TM_COLUMN_IPOD_ID:
+  case TM_COLUMN_SIZE:
+      g_object_set (G_OBJECT (renderer),
+		    "text", text,
+		    "editable", FALSE,
+		    "xalign", 1.0, NULL);
+      break;
+  case TM_COLUMN_PC_PATH:
+  case TM_COLUMN_IPOD_PATH:
+  case TM_COLUMN_THUMB_PATH:
+      g_object_set (G_OBJECT (renderer),
+		    "text", text,
+		    "editable", FALSE,
+		    "xalign", 0.0, NULL);
+      break;
+  case TM_COLUMN_TRANSFERRED:
+      g_object_set (G_OBJECT (renderer),
+		    "active", track->transferred,
+		    "activatable", FALSE, NULL);
+      break;
+  case TM_COLUMN_COMPILATION:
+      g_object_set (G_OBJECT (renderer),
+		    "active", track->compilation,
+		    "activatable", TRUE, NULL);
+      break;
+  case TM_NUM_COLUMNS:
+      break;
+  }
+  g_free (text);
+}
+
+
+
+/* This function is analogous to tm_cell_data_func(), but is only used
+   for the title column to distinguish between the text and the toggle
+   button there. The other toggle buttons (e.g. compilation) can
+   easily be handled in the original tm_cell_data_func() */
+static void tm_cell_data_func_toggle (GtkTreeViewColumn *tree_column,
+				      GtkCellRenderer   *renderer,
+				      GtkTreeModel      *model,
+				      GtkTreeIter       *iter,
+				      gpointer           data)
+{
+  Track *track;
+  TM_item column;
+
+  column = (TM_item)g_object_get_data (G_OBJECT (renderer), "column");
+  gtk_tree_model_get (model, iter, READOUT_COL, &track, -1);
+
+  /* printf ("tm_cell_data_func_toggle() entered\n"); */
+
+  switch (column)
+  {
+  case TM_COLUMN_TITLE:
+      g_object_set (G_OBJECT (renderer),
+		    "active", !track->checked,
+		    "activatable", TRUE, NULL);
+      break;
+  default:
+      g_warning ("Programming error: unknown column in tm_cell_data_func_toggle: %d\n", column);
+      break;
+  }
+}
+
+
+
+/* Called when a toggle cell is being changed. Stores new data to the
+   track list. */
+static void
+tm_cell_toggled (GtkCellRendererToggle *renderer,
+		 gchar *arg1,
+		 gpointer user_data)
+{
+  GtkTreeModel *model;
+  GtkTreeSelection *selection;
+  TM_item column;
+  gboolean multi_edit;
+  gint sel_rows_num;
+  GList *row_list, *row_node, *first;
+  gboolean active;
+
+  column = (TM_item) g_object_get_data(G_OBJECT(renderer), "column");
+  multi_edit = prefs_get_int("multi_edit");
+  selection = gtk_tree_view_get_selection(track_treeview);
+  row_list = gtk_tree_selection_get_selected_rows(selection, &model);
+
+  /* printf("tm_cell_toggled: column: %d, arg1: %p\n", column, arg1); */
+
+  sel_rows_num = g_list_length (row_list);
+
+  /* block widgets and update display if multi-edit is active */
+  if (multi_edit && (sel_rows_num > 1)) block_widgets ();
+
+  first = g_list_first (row_list);
+
+  /* active will show the old state -- before the toggle */
+  g_object_get (G_OBJECT (renderer), "active", &active, NULL);
+
+  for (row_node = first;
+       row_node && (multi_edit || (row_node == first));
+       row_node = g_list_next(row_node))
+  {
+     Track *track;
+     gboolean changed;
+     GtkTreeIter iter;
+
+     gtk_tree_model_get_iter(model, &iter, (GtkTreePath *) row_node->data);
+     gtk_tree_model_get(model, &iter, READOUT_COL, &track, -1);
+     changed = FALSE;
+
+     switch(column)
+     {
+     case TM_COLUMN_TITLE:
+	 if ((active && (track->checked == 0)) ||
+	     (!active && (track->checked == 1)))
+	     changed = TRUE;
+	 if (active) track->checked = 1;
+	 else        track->checked = 0;
+	 break;
+     case TM_COLUMN_COMPILATION:
+	 if ((!active && (track->compilation == 0)) ||
+	     (active && (track->compilation == 1)))
+	     changed = TRUE;
+	 if (!active) track->compilation = 1;
+	 else        track->compilation = 0;
+        break;
+     case TM_COLUMN_ARTIST:
+     case TM_COLUMN_ALBUM:
+     case TM_COLUMN_GENRE:
+     case TM_COLUMN_COMPOSER:
+     case TM_COLUMN_TRACK_NR:
+     case TM_COLUMN_IPOD_ID:
+     case TM_COLUMN_PC_PATH:
+     case TM_COLUMN_TRANSFERRED:
+     case TM_COLUMN_SIZE:
+     case TM_COLUMN_TRACKLEN:
+     case TM_COLUMN_BITRATE:
+     case TM_COLUMN_PLAYCOUNT:
+     case TM_COLUMN_RATING:
+     case TM_COLUMN_TIME_PLAYED:
+     case TM_COLUMN_TIME_MODIFIED:
+     case TM_COLUMN_VOLUME:
+     case TM_COLUMN_YEAR:
+     case TM_COLUMN_CD_NR:
+     case TM_COLUMN_TIME_ADDED:
+     case TM_COLUMN_IPOD_PATH:
+     case TM_COLUMN_SOUNDCHECK:
+     case TM_COLUMN_SAMPLERATE:
+     case TM_COLUMN_BPM:
+     case TM_COLUMN_FILETYPE:
+     case TM_COLUMN_GROUPING:
+     case TM_COLUMN_COMMENT:
+     case TM_COLUMN_CATEGORY:
+     case TM_COLUMN_DESCRIPTION:
+     case TM_COLUMN_PODCASTURL:
+     case TM_COLUMN_PODCASTRSS:
+     case TM_COLUMN_SUBTITLE:
+     case TM_COLUMN_TIME_RELEASED:
+     case TM_COLUMN_THUMB_PATH:
+     case TM_COLUMN_MEDIA_TYPE:
+     case TM_COLUMN_TV_SHOW:
+     case TM_COLUMN_TV_EPISODE:
+     case TM_COLUMN_TV_NETWORK:
+     case TM_COLUMN_SEASON_NR:
+     case TM_COLUMN_EPISODE_NR:
+     case TM_COLUMN_ALBUMARTIST:
+     case TM_COLUMN_SORT_ARTIST:
+     case TM_COLUMN_SORT_TITLE:
+     case TM_COLUMN_SORT_ALBUM:
+     case TM_COLUMN_SORT_ALBUMARTIST:
+     case TM_COLUMN_SORT_COMPOSER:
+     case TM_COLUMN_SORT_TVSHOW:
+     case TM_NUM_COLUMNS:
+	 /* these are not toggle buttons */
+	 break;
+     }
+/*      printf ("  changed: %d\n", changed); */
+     if (changed)
+     {
+	track->time_modified = time (NULL);
+/*        pm_track_changed (track);  notify playlist model... -- not
+ *        necessary here because only the track model is affected */
+        data_changed (track->itdb);  /* indicate that data has changed */
+        
+        /* If the changed column is the compilation flag update the file
+           if required */
+        if (column == TM_COLUMN_COMPILATION)
+           if (prefs_get_int("id3_write"))
+              write_tags_to_file (track);
+        
+     }
+     while (widgets_blocked && gtk_events_pending ())  gtk_main_iteration ();
+  }
+
+  if (multi_edit && (sel_rows_num > 1)) release_widgets ();
+
+  g_list_foreach(row_list, (GFunc) gtk_tree_path_free, NULL);
+  g_list_free(row_list);
+}
+
+
+
+
+/**
+ * tm_get_nr_of_tracks - get the number of tracks displayed
+ * currently in the track model Returns - the number of tracks displayed
+ * currently
+ */
+gint
+tm_get_nr_of_tracks(void)
+{
+    gint result = 0;
+    GtkTreeModel *tm = NULL;
+
+    tm = gtk_tree_view_get_model (GTK_TREE_VIEW(track_treeview));
+    if (tm)
+    {
+	result = gtk_tree_model_iter_n_children (tm, NULL);
+    }
+    return result;
+}
+
+
+static gint comp_int (gconstpointer a, gconstpointer b)
+{
+    return (GPOINTER_TO_INT(a)-(GPOINTER_TO_INT(b)));
+}
+
+
+/**
+ * Reorder tracks in playlist to match order of tracks displayed in track
+ * view. Only the subset of tracks currently displayed is reordered.
+ * data_changed() is called when necessary.
+ */
+void
+tm_rows_reordered (void)
+{
+    Playlist *current_pl;
+
+    g_return_if_fail (track_treeview);
+    current_pl = pm_get_selected_playlist ();
+
+    if(current_pl)
+    {
+	GtkTreeModel *tm = NULL;
+	GtkTreeIter i;
+	GList *new_list = NULL, *old_pos_l = NULL;
+	gboolean valid = FALSE;
+	GList *nlp, *olp;
+	gboolean changed = FALSE;
+	iTunesDB *itdb = NULL;
+
+	tm = gtk_tree_view_get_model (track_treeview);
+	g_return_if_fail (tm);
+
+	valid = gtk_tree_model_get_iter_first (tm,&i);
+	while (valid)
+	{
+	    Track *new_track;
+	    gint old_position;
+
+	    gtk_tree_model_get (tm, &i, READOUT_COL, &new_track, -1);
+	    g_return_if_fail (new_track);
+
+	    if (!itdb) itdb = new_track->itdb;
+	    new_list = g_list_append (new_list, new_track);
+	    /* what position was this track in before? */
+	    old_position = g_list_index (current_pl->members, new_track);
+	    /* check if we already used this position before (can
+	       happen if track has been added to playlist more than
+	       once */
+	    while ((old_position != -1) &&
+		   g_list_find (old_pos_l, GINT_TO_POINTER(old_position)))
+	    {  /* find next occurence */
+		GList *link;
+		gint next;
+		link = g_list_nth (current_pl->members, old_position + 1);
+		next = g_list_index (link, new_track);
+		if (next == -1)   old_position = -1;
+		else              old_position += (1+next);
+	    }
+	    /* we make a sorted list of the old positions */
+	    old_pos_l = g_list_insert_sorted (old_pos_l,
+					      GINT_TO_POINTER(old_position),
+					      comp_int);
+	    valid = gtk_tree_model_iter_next (tm, &i);
+	}
+	nlp = new_list;
+	olp = old_pos_l;
+	while (nlp && olp)
+	{
+	    GList *old_link;
+	    guint position = GPOINTER_TO_INT(olp->data);
+
+	    /* if position == -1 one of the tracks in the track view
+	       could not be found in the selected playlist -> stop! */
+	    if (position == -1)
+	    {
+		g_warning ("Programming error: tm_rows_reordered_callback: track in track view was not in selected playlist\n");
+		g_return_if_reached ();
+	    }
+	    old_link = g_list_nth (current_pl->members, position);
+	    /* replace old track with new track */
+	    if (old_link->data != nlp->data)
+	    {
+		old_link->data = nlp->data;
+		changed = TRUE;
+	    }
+	    /* next */
+	    nlp = nlp->next;
+	    olp = olp->next;
+	}
+	g_list_free (new_list);
+	g_list_free (old_pos_l);
+	/* if we changed data, mark data as changed and adopt order in
+	   sort tabs */
+	if (changed)
+	{
+	    data_changed (itdb);
+	    st_adopt_order_in_playlist ();
+	}
+    }
+}
+
+
+static void
+on_trackids_list_foreach ( GtkTreeModel *tm, GtkTreePath *tp,
+			   GtkTreeIter *i, gpointer data)
+{
+    Track *tr = NULL;
+    GList *l = *((GList**)data);
+    gtk_tree_model_get(tm, i, READOUT_COL, &tr, -1);
+    g_return_if_fail (tr);
+    l = g_list_append(l, GUINT_TO_POINTER(tr->id));
+    *((GList**)data) = l;
+}
+
+
+/* return a list containing the track IDs of all tracks currently being
+   selected */
+GList *
+tm_get_selected_trackids(void)
+{
+    GList *result = NULL;
+    GtkTreeSelection *ts = NULL;
+
+    if((ts = gtk_tree_view_get_selection(GTK_TREE_VIEW(track_treeview))))
+    {
+	gtk_tree_selection_selected_foreach(ts, on_trackids_list_foreach,
+					    &result);
+    }
+    return(result);
+}
+
+/* return a list containing the track IDs of all tracks currently being
+   displayed */
+GList *
+tm_get_all_trackids(void)
+{
+    gboolean
+	on_all_trackids_list_foreach (GtkTreeModel *tm, GtkTreePath *tp,
+				      GtkTreeIter *i, gpointer data)
+	{
+	    on_trackids_list_foreach (tm, tp, i, data);
+	    return FALSE;
+	}
+    GList *result = NULL;
+    GtkTreeModel *model;
+
+    if((model = gtk_tree_view_get_model (track_treeview)))
+    {
+	gtk_tree_model_foreach(model, on_all_trackids_list_foreach,
+			       &result);
+    }
+    return(result);
+}
+
+static void
+on_tracks_list_foreach ( GtkTreeModel *tm, GtkTreePath *tp,
+			 GtkTreeIter *i, gpointer data)
+{
+    Track *tr = NULL;
+    GList *l = *((GList**)data);
+    gtk_tree_model_get(tm, i, READOUT_COL, &tr, -1);
+    g_return_if_fail (tr);
+    l = g_list_append(l, tr);
+    *((GList**)data) = l;
+}
+
+
+/* return a list containing pointers to all tracks currently being
+   selected */
+GList *
+tm_get_selected_tracks(void)
+{
+    GList *result = NULL;
+    GtkTreeSelection *ts = NULL;
+
+    if((ts = gtk_tree_view_get_selection(GTK_TREE_VIEW(track_treeview))))
+    {
+	gtk_tree_selection_selected_foreach(ts, on_tracks_list_foreach,
+					    &result);
+    }
+    return(result);
+}
+
+
+
+    /* used by tm_get_all_tracks */
+    static gboolean on_all_tracks_list_foreach (GtkTreeModel *tm,
+						GtkTreePath *tp,
+						GtkTreeIter *i,
+						gpointer data)
+    {
+	on_tracks_list_foreach (tm, tp, i, data);
+	return FALSE;
+    }
+
+
+/* return a list containing pointers to all tracks currently being
+   displayed. You must g_list_free() the list after use. */
+GList *
+tm_get_all_tracks(void)
+{
+    GList *result = NULL;
+    GtkTreeModel *model = gtk_tree_view_get_model (track_treeview);
+
+    g_return_val_if_fail (model, NULL);
+
+    gtk_tree_model_foreach(model, on_all_tracks_list_foreach,
+			   &result);
+    return result;
+}
+
+
+/* Stop editing. If @cancel is TRUE, the edited value will be
+   discarded (I have the feeling that the "discarding" part does not
+   work quite the way intended). */
+void tm_stop_editing (gboolean cancel)
+{
+    GtkTreeViewColumn *col;
+
+    if (!track_treeview)  return;
+
+    gtk_tree_view_get_cursor (track_treeview, NULL, &col);
+    if (col)
+    {
+	/* Before removing the widget we set multi_edit to FALSE. That
+	   way at most one entry will be changed (this also doesn't
+	   seem to work the way intended) */
+	gboolean me = prefs_get_int("multi_edit");
+	prefs_set_int("multi_edit", FALSE);
+	if (!cancel && col->editable_widget)
+	    gtk_cell_editable_editing_done (col->editable_widget);
+	if (col->editable_widget)
+	    gtk_cell_editable_remove_widget (col->editable_widget);
+	prefs_set_int("multi_edit", me);
+    }
+}
+
+
+
+/* Function to compare @tm_item of @track1 and @track2. Used by
+   tm_data_compare_func() */
+static gint tm_data_compare (Track *track1, Track *track2,
+			     TM_item tm_item)
+{
+  gint cmp = 0;
+  ExtraTrackData *etr1, *etr2;
+
+
+  g_return_val_if_fail (track1 && track2, 0);
+
+  switch (tm_item)
+  {
+  case TM_COLUMN_TITLE:
+  case TM_COLUMN_ALBUM:
+  case TM_COLUMN_ALBUMARTIST:
+  case TM_COLUMN_GENRE:
+  case TM_COLUMN_COMPOSER:
+  case TM_COLUMN_COMMENT:
+  case TM_COLUMN_FILETYPE:
+  case TM_COLUMN_GROUPING:
+  case TM_COLUMN_ARTIST:
+  case TM_COLUMN_CATEGORY:
+  case TM_COLUMN_DESCRIPTION:
+  case TM_COLUMN_PODCASTURL:
+  case TM_COLUMN_PODCASTRSS:
+  case TM_COLUMN_SUBTITLE:
+  case TM_COLUMN_TV_SHOW:
+  case TM_COLUMN_TV_EPISODE:
+  case TM_COLUMN_TV_NETWORK:
+  case TM_COLUMN_SORT_TITLE:
+  case TM_COLUMN_SORT_ALBUM:
+  case TM_COLUMN_SORT_ARTIST:
+  case TM_COLUMN_SORT_ALBUMARTIST:
+  case TM_COLUMN_SORT_COMPOSER:
+  case TM_COLUMN_SORT_TVSHOW:
+      /* string_compare_func is set to either compare_string_fuzzy or
+	 compare_string in tm_sort_column_changed() which is called
+	 once before the comparing begins. */
+      cmp = string_compare_func (
+	  track_get_item (track1, TM_to_T (tm_item)),
+	  track_get_item (track2, TM_to_T (tm_item)));
+      break;
+  case TM_COLUMN_TRACK_NR:
+      cmp = track1->tracks - track2->tracks;
+      if (cmp == 0) cmp = track1->track_nr - track2->track_nr;
+      break;
+  case TM_COLUMN_CD_NR:
+      cmp = track1->cds - track2->cds;
+      if (cmp == 0) cmp = track1->cd_nr - track2->cd_nr;
+      break;
+  case TM_COLUMN_IPOD_ID:
+      cmp = track1->id - track2->id;
+      break;
+  case TM_COLUMN_PC_PATH:
+      etr1 = track1->userdata;
+      etr2 = track2->userdata;
+      g_return_val_if_fail (etr1 && etr2, 0);
+      cmp = g_utf8_collate (etr1->pc_path_utf8, etr2->pc_path_utf8);
+      break;
+  case TM_COLUMN_IPOD_PATH:
+      cmp = g_utf8_collate (track1->ipod_path, track2->ipod_path);
+      break;
+  case TM_COLUMN_THUMB_PATH:
+      etr1 = track1->userdata;
+      etr2 = track2->userdata;
+      g_return_val_if_fail (etr1 && etr2, 0);
+      cmp = g_utf8_collate (etr1->thumb_path_utf8, etr2->thumb_path_utf8);
+      break;
+  case TM_COLUMN_TRANSFERRED:
+      if(track1->transferred == track2->transferred)
+	  cmp = 0;
+      else if(track1->transferred == TRUE)
+	  cmp = 1;
+      else
+	  cmp = -1;
+      break;
+  case TM_COLUMN_COMPILATION:
+      if(track1->compilation == track2->compilation)
+	  cmp = 0;
+      else if(track1->compilation == TRUE)
+	  cmp = 1;
+      else
+	  cmp = -1;
+      break;
+  case TM_COLUMN_SIZE:
+      cmp = track1->size - track2->size;
+      break;
+  case TM_COLUMN_TRACKLEN:
+      cmp = track1->tracklen - track2->tracklen;
+      break;
+  case TM_COLUMN_BITRATE:
+      cmp = track1->bitrate - track2->bitrate;
+      break;
+  case TM_COLUMN_SAMPLERATE:
+      cmp = track1->samplerate - track2->samplerate;
+      break;
+  case TM_COLUMN_BPM:
+      cmp = track1->BPM - track2->BPM;
+      break;
+  case TM_COLUMN_PLAYCOUNT:
+      cmp = track1->playcount - track2->playcount;
+      break;
+  case  TM_COLUMN_RATING:
+      cmp = track1->rating - track2->rating;
+      break;
+  case TM_COLUMN_TIME_ADDED:
+  case TM_COLUMN_TIME_PLAYED:
+  case TM_COLUMN_TIME_MODIFIED:
+  case TM_COLUMN_TIME_RELEASED:
+      cmp = COMP (time_get_time (track1, TM_to_T (tm_item)),
+		  time_get_time (track2, TM_to_T (tm_item)));
+      break;
+  case  TM_COLUMN_VOLUME:
+      cmp = track1->volume - track2->volume;
+      break;
+  case  TM_COLUMN_SOUNDCHECK:
+      /* If soundcheck is unset (0) use 0 dB (1000) */
+      cmp = (track1->soundcheck? track1->soundcheck:1000) - 
+	  (track2->soundcheck? track2->soundcheck:1000);
+      break;
+  case TM_COLUMN_YEAR:
+      cmp = track1->year - track2->year;
+      break;
+  case TM_COLUMN_SEASON_NR:
+      cmp = track1->season_nr - track2->season_nr;
+      break;
+  case TM_COLUMN_EPISODE_NR:
+      cmp = track1->episode_nr - track2->episode_nr;
+      break;
+  case TM_COLUMN_MEDIA_TYPE:
+      cmp = track1->mediatype - track2->mediatype;
+      break;
+  case TM_NUM_COLUMNS:
+      break;
+  }
+
+  /* implement stable sorting: if two items are the same, revert to
+     the last relative positition */
+  if (cmp == 0)
+  {
+      etr1 = track1->userdata;
+      etr2 = track2->userdata;
+      g_return_val_if_fail (etr1 && etr2, 0);
+      cmp = etr1->sortindex - etr2->sortindex;
+  }
+  return cmp;
+}
+
+
+/* Function used to compare rows with user's search string */
+gboolean tm_search_equal_func (GtkTreeModel *model,
+			       gint column,
+			       const gchar *key,
+			       GtkTreeIter *iter,
+			       gpointer search_data)
+{
+  Track *track1;
+  gboolean cmp = 0;
+  gtk_tree_model_get (model, iter, READOUT_COL, &track1, -1);
+  switch ((TM_item)column)
+  {
+  case TM_COLUMN_TITLE:
+  case TM_COLUMN_ALBUM:
+  case TM_COLUMN_GENRE:
+  case TM_COLUMN_COMPOSER:
+  case TM_COLUMN_COMMENT:
+  case TM_COLUMN_FILETYPE:
+  case TM_COLUMN_GROUPING:
+  case TM_COLUMN_ARTIST:
+  case TM_COLUMN_CATEGORY:
+  case TM_COLUMN_DESCRIPTION:
+  case TM_COLUMN_PODCASTURL:
+  case TM_COLUMN_PODCASTRSS:
+  case TM_COLUMN_SUBTITLE:
+  case TM_COLUMN_PC_PATH:
+  case TM_COLUMN_YEAR:
+  case TM_COLUMN_IPOD_PATH:
+  case TM_COLUMN_COMPILATION:
+  case TM_COLUMN_THUMB_PATH:
+  case TM_COLUMN_TV_SHOW:
+  case TM_COLUMN_TV_EPISODE:
+  case TM_COLUMN_TV_NETWORK:
+  case TM_COLUMN_ALBUMARTIST:
+  case TM_COLUMN_SORT_ARTIST:
+  case TM_COLUMN_SORT_TITLE:
+  case TM_COLUMN_SORT_ALBUM:
+  case TM_COLUMN_SORT_ALBUMARTIST:
+  case TM_COLUMN_SORT_COMPOSER:
+  case TM_COLUMN_SORT_TVSHOW:
+      cmp = (compare_string_start_case_insensitive (
+		 track_get_item (track1, TM_to_T (column)),
+		 key) != 0);
+      break;
+  case TM_COLUMN_TRACK_NR:
+  case TM_COLUMN_IPOD_ID:
+  case TM_COLUMN_TRANSFERRED:
+  case TM_COLUMN_SIZE:
+  case TM_COLUMN_TRACKLEN:
+  case TM_COLUMN_BITRATE:
+  case TM_COLUMN_PLAYCOUNT:
+  case TM_COLUMN_RATING:
+  case TM_COLUMN_TIME_PLAYED:
+  case TM_COLUMN_TIME_MODIFIED:
+  case TM_COLUMN_VOLUME:
+  case TM_COLUMN_CD_NR:
+  case TM_COLUMN_TIME_ADDED:
+  case TM_COLUMN_SOUNDCHECK:
+  case TM_COLUMN_SAMPLERATE:
+  case TM_COLUMN_BPM:
+  case TM_COLUMN_TIME_RELEASED:
+  case TM_COLUMN_MEDIA_TYPE:
+  case TM_COLUMN_SEASON_NR:
+  case TM_COLUMN_EPISODE_NR:
+  case TM_NUM_COLUMNS:
+      break;
+  }
+  return cmp;
+};
+
+/* Function used to compare two cells during sorting (track view) */
+gint tm_data_compare_func (GtkTreeModel *model,
+			GtkTreeIter *a,
+			GtkTreeIter *b,
+			gpointer user_data)
+{
+  Track *track1;
+  Track *track2;
+  gint column;
+  GtkSortType order;
+  gint result;
+
+  gtk_tree_model_get (model, a, READOUT_COL, &track1, -1);
+  gtk_tree_model_get (model, b, READOUT_COL, &track2, -1);
+  if(gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE (model),
+					   &column, &order) == FALSE)
+      return 0;
+
+  result = tm_data_compare (track1, track2, column);
+  return result;
+}
+
+
+/* set/read the counter used to remember how often the sort column has
+   been clicked.
+   @inc: negative: reset counter to 0
+   @inc: positive or zero : add to counter
+   return value: new value of the counter */
+gint tm_sort_counter (gint inc)
+{
+    static gint cnt = 0;
+
+    if (inc <0)
+    {
+	cnt = 0;
+    }
+    else
+    {
+	cnt += inc;
+    }   
+    return cnt;
+}
+
+
+/* Redisplays the tracks in the track view according to the order
+ * stored in the sort tab view. This only works if the track view is
+ * not sorted --> skip if sorted */
+
+void tm_adopt_order_in_sorttab (void)
+{
+    if (prefs_get_int("tm_sort") == SORT_NONE)
+    {
+	GList *gl, *tracks = NULL;
+
+	/* retrieve the currently displayed tracks (non ordered) from
+	   the last sort tab or from the selected playlist if no sort
+	   tabs are being used */
+	tm_remove_all_tracks ();
+	tracks = display_get_selected_members (prefs_get_int("sort_tab_num")-1);
+	for (gl=tracks; gl; gl=gl->next)
+	    tm_add_track_to_track_model ((Track *)gl->data, NULL);
+    }
+}
+
+
+/* redisplay the contents of the track view in it's unsorted order */
+static void tm_unsort (void)
+{
+    if (track_treeview)
+    {
+	GtkTreeModel *model= gtk_tree_view_get_model (track_treeview);
+
+	prefs_set_int("tm_sort", SORT_NONE);
+	if (!BROKEN_GTK_TREE_SORT)
+	{
+/* no need to comment this out -- searching still works, but for lack
+   of a ctrl-g only the first occurence will be found */
+/*	    gtk_tree_view_set_enable_search (GTK_TREE_VIEW
+ * (track_treeview), FALSE);*/ 
+	    gtk_tree_sortable_set_sort_column_id
+		(GTK_TREE_SORTABLE (model),
+		 GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID,
+		 GTK_SORT_ASCENDING);
+	    tm_adopt_order_in_sorttab ();
+	}
+	else
+	{
+	    gtkpod_warning (_("Cannot unsort track view because of a bug in the GTK lib you are using (%d.%d.%d < 2.5.4). Once you sort the track view, you cannot go back to the unsorted state.\n\n"), gtk_major_version, gtk_minor_version, gtk_micro_version);
+	}
+	tm_sort_counter (-1);
+    }
+}
+
+
+static void tm_set_search_column (TM_item newcol)
+{
+/*     printf ("track_treeview: %p, col: %d\n", track_treeview, newcol); */
+    g_return_if_fail (track_treeview);
+
+    gtk_tree_view_set_search_column (GTK_TREE_VIEW (track_treeview),
+				       newcol);
+    switch (newcol)
+    {
+    case TM_COLUMN_TITLE:
+    case TM_COLUMN_ALBUM:
+    case TM_COLUMN_GENRE:
+    case TM_COLUMN_COMPOSER:
+    case TM_COLUMN_COMMENT:
+    case TM_COLUMN_FILETYPE:
+    case TM_COLUMN_GROUPING:
+    case TM_COLUMN_ARTIST:
+    case TM_COLUMN_CATEGORY:
+    case TM_COLUMN_DESCRIPTION:
+    case TM_COLUMN_PODCASTURL:
+    case TM_COLUMN_PODCASTRSS:
+    case TM_COLUMN_SUBTITLE:
+    case TM_COLUMN_PC_PATH:
+    case TM_COLUMN_YEAR:
+    case TM_COLUMN_IPOD_PATH:
+    case TM_COLUMN_COMPILATION:
+    case TM_COLUMN_THUMB_PATH:
+    case TM_COLUMN_TV_SHOW:
+    case TM_COLUMN_TV_EPISODE:
+    case TM_COLUMN_TV_NETWORK:
+    case TM_COLUMN_ALBUMARTIST:
+    case TM_COLUMN_SORT_ARTIST:
+    case TM_COLUMN_SORT_TITLE:
+    case TM_COLUMN_SORT_ALBUM:
+    case TM_COLUMN_SORT_ALBUMARTIST:
+    case TM_COLUMN_SORT_COMPOSER:
+    case TM_COLUMN_SORT_TVSHOW:
+	gtk_tree_view_set_enable_search (GTK_TREE_VIEW (track_treeview), TRUE);
+	break;
+    case TM_COLUMN_TRACK_NR:
+    case TM_COLUMN_IPOD_ID:
+    case TM_COLUMN_TRANSFERRED:
+    case TM_COLUMN_SIZE:
+    case TM_COLUMN_TRACKLEN:
+    case TM_COLUMN_BITRATE:
+    case TM_COLUMN_PLAYCOUNT:
+    case TM_COLUMN_RATING:
+    case TM_COLUMN_TIME_PLAYED:
+    case TM_COLUMN_TIME_MODIFIED:
+    case TM_COLUMN_VOLUME:
+    case TM_COLUMN_CD_NR:
+    case TM_COLUMN_TIME_ADDED:
+    case TM_COLUMN_SOUNDCHECK:
+    case TM_COLUMN_SAMPLERATE:
+    case TM_COLUMN_BPM:
+    case TM_COLUMN_TIME_RELEASED:
+    case TM_COLUMN_MEDIA_TYPE:
+    case TM_COLUMN_SEASON_NR:
+    case TM_COLUMN_EPISODE_NR:
+    case TM_NUM_COLUMNS:
+	gtk_tree_view_set_enable_search (GTK_TREE_VIEW (track_treeview), FALSE);
+	break;
+    }
+    prefs_set_int (TM_PREFS_SEARCH_COLUMN, newcol);
+}
+
+
+/* This is called before when changing the sort order or the sort
+   column, and before doing the sorting */
+static void tm_sort_column_changed (GtkTreeSortable *ts,
+				    gpointer user_data)
+{
+    static gint lastcol = -1; /* which column was sorted last time? */
+    gchar *buf;
+    gint newcol;
+    GtkSortType order;
+    GList *tracks, *gl;
+    gint32 i, inc;
+
+    gtk_tree_sortable_get_sort_column_id (ts, &newcol, &order);
+
+/*     printf ("scc -- col: %d, order: %d\n", newcol, order);  */
+
+    /* set compare function for strings (to speed up sorting) */
+    buf = g_strdup_printf ("sort_ign_field_%d", TM_to_T (newcol));
+    if (prefs_get_int (buf))
+	string_compare_func = compare_string_fuzzy;
+    else
+	string_compare_func = compare_string;
+    g_free (buf);
+
+    /* don't do anything if no sort column is set */
+    if (newcol == -2)
+    {
+	lastcol = newcol;
+	return;
+    }
+
+    if (newcol != lastcol)
+    {
+	tm_sort_counter (-1);
+	lastcol = newcol;
+    }
+
+    if (tm_sort_counter (1) >= 3)
+    { /* after clicking three times, reset sort order! */
+	tm_unsort ();  /* also resets sort counter */
+    }
+    else
+    {
+	prefs_set_int("tm_sort", order);
+    }
+    prefs_set_int("tm_sortcol", newcol);
+
+    tm_set_search_column (newcol);
+
+    if(prefs_get_int("tm_autostore"))  tm_rows_reordered ();
+    sort_window_update ();
+
+    /* stable sorting: index original order */
+    tracks = tm_get_all_tracks ();
+    /* make numbering ascending or decending depending on sort order
+       (then we don't have to worry about the sort order when doing
+       the comparison in tm_data_compare_func() */
+    if (order == GTK_SORT_ASCENDING)
+    {
+	i=0;
+	inc = 1;
+    }
+    else
+    {
+	i=-1;
+	inc = -1;
+    }
+    for (gl=tracks; gl; gl=gl->next)
+    {
+	ExtraTrackData *etr;
+	Track *tr = gl->data;
+	g_return_if_fail (tr);
+	etr = tr->userdata;
+	g_return_if_fail (etr);
+	etr->sortindex = i;
+	i+=inc;
+    }
+    g_list_free (tracks);
+}
+
+
+void tm_sort (TM_item col, GtkSortType order)
+{
+    if (track_treeview)
+    {
+	GtkTreeModel *model= gtk_tree_view_get_model (track_treeview);
+	if (order != SORT_NONE)
+	{
+	    gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (model),
+						  col, order);
+	}
+	else
+	{ /* only unsort if treeview is sorted */
+	    gint column;
+	    GtkSortType order;
+	    if (gtk_tree_sortable_get_sort_column_id
+		(GTK_TREE_SORTABLE (model), &column, &order))
+	    {
+		/* column == -2 actually is not defined, but it means
+		   that the model is unsorted. The sortable interface
+		   is badly implemented in gtk 2.4 */
+		if (column != -2)
+		    tm_unsort ();
+	    }
+	}
+    }
+}
+
+
+
+
+
+/* Adds the columns to our track_treeview */
+static GtkTreeViewColumn *tm_add_column (TM_item tm_item, gint pos)
+{
+  GtkTreeModel *model = gtk_tree_view_get_model (track_treeview);
+  GtkTreeViewColumn *col = NULL;
+  const gchar *text;
+  GtkCellRenderer *renderer = NULL;  /* default */
+  GtkTooltips *tt;
+
+  g_return_val_if_fail (gtkpod_window, NULL);
+  tt = g_object_get_data (G_OBJECT (gtkpod_window), "main_tooltips");
+  g_return_val_if_fail (tt, NULL);
+
+  g_return_val_if_fail (tm_item >= 0, NULL);
+  g_return_val_if_fail (tm_item < TM_NUM_COLUMNS, NULL);
+
+  text = gettext (get_tm_string (tm_item));
+
+  g_return_val_if_fail (text, NULL);
+
+  col = gtk_tree_view_column_new ();
+
+  switch (tm_item)
+  {
+  case TM_COLUMN_TITLE:
+      /* Add additional toggle box for 'checked' property */
+      renderer = gtk_cell_renderer_toggle_new ();
+      g_object_set_data (G_OBJECT (renderer), "column",
+			 (gint *)tm_item);
+      g_signal_connect (G_OBJECT (renderer), "toggled",
+			G_CALLBACK (tm_cell_toggled), model);
+      gtk_tree_view_column_pack_start (col, renderer, FALSE);
+      gtk_tree_view_column_set_cell_data_func (col, renderer,
+					       tm_cell_data_func_toggle,
+					       NULL, NULL);
+      renderer = NULL;
+      break;
+  case TM_COLUMN_ARTIST:
+  case TM_COLUMN_ALBUM:
+  case TM_COLUMN_GENRE:
+  case TM_COLUMN_COMPOSER:
+  case TM_COLUMN_COMMENT:
+  case TM_COLUMN_FILETYPE:
+  case TM_COLUMN_GROUPING:
+  case TM_COLUMN_BITRATE:
+  case TM_COLUMN_SAMPLERATE:
+  case TM_COLUMN_BPM:
+  case TM_COLUMN_CATEGORY:
+  case TM_COLUMN_DESCRIPTION:
+  case TM_COLUMN_PODCASTURL:
+  case TM_COLUMN_PODCASTRSS:
+  case TM_COLUMN_SUBTITLE:
+  case TM_COLUMN_PC_PATH:
+  case TM_COLUMN_IPOD_PATH:
+  case TM_COLUMN_THUMB_PATH:
+  case TM_COLUMN_SIZE:
+  case TM_COLUMN_MEDIA_TYPE:
+  case TM_COLUMN_TV_SHOW:
+  case TM_COLUMN_TV_EPISODE:
+  case TM_COLUMN_TV_NETWORK:
+  case TM_COLUMN_SEASON_NR:
+  case TM_COLUMN_EPISODE_NR:
+  case TM_COLUMN_ALBUMARTIST:
+  case TM_COLUMN_SORT_ARTIST:
+  case TM_COLUMN_SORT_TITLE:
+  case TM_COLUMN_SORT_ALBUM:
+  case TM_COLUMN_SORT_ALBUMARTIST:
+  case TM_COLUMN_SORT_COMPOSER:
+  case TM_COLUMN_SORT_TVSHOW:
+      break;
+  /* for some column names we want to use shorter alternatives to
+     get_tm_string() */
+  case TM_COLUMN_RATING:
+      text = _("Rtng");
+      break;
+  case TM_COLUMN_TRACK_NR:
+      text = _("#");
+      break;
+  case TM_COLUMN_CD_NR:
+      text = _("CD");
+      break;
+  case TM_COLUMN_IPOD_ID:
+      text = _("ID");
+      break;
+  case TM_COLUMN_TRANSFERRED:
+      text = _("Trnsfrd");
+      renderer = gtk_cell_renderer_toggle_new ();
+      break;
+  case TM_COLUMN_COMPILATION:
+      text = _("Cmpl");
+      renderer = gtk_cell_renderer_toggle_new ();
+      g_signal_connect (G_OBJECT (renderer), "toggled",
+			G_CALLBACK (tm_cell_toggled), model);
+      break;
+  case TM_COLUMN_TRACKLEN:
+      text = _("Time");
+      break;
+  case TM_COLUMN_PLAYCOUNT:
+      text = _("Plycnt");
+      break;
+  case TM_COLUMN_TIME_PLAYED:
+      text = _("Played");
+      break;
+  case TM_COLUMN_TIME_MODIFIED:
+      text = _("Modified");
+      break;
+  case TM_COLUMN_TIME_ADDED:
+      text = _("Added");
+      break;
+  case TM_COLUMN_TIME_RELEASED:
+      text = _("Released");
+      break;
+  case TM_COLUMN_YEAR:
+      text = _("Year");
+      break;
+  case TM_COLUMN_VOLUME:
+      text = _("Vol.");
+      break;
+  case TM_COLUMN_SOUNDCHECK:
+      text = _("Sndchk.");
+      break;
+  case TM_NUM_COLUMNS:
+      g_return_val_if_reached (NULL);
+      break;
+  }
+
+  if (!renderer)
+  {   /* text renderer -- editable/not editable is done in
+	 tm_cell_data_func() */
+      renderer = gtk_cell_renderer_text_new ();
+      g_signal_connect (G_OBJECT (renderer), "edited",
+			G_CALLBACK (tm_cell_edited), model);
+  }
+
+  g_object_set_data (G_OBJECT (renderer), "column",
+		     (gint *)tm_item);
+
+  gtk_tree_view_column_set_title (col, text);
+  gtk_tree_view_column_pack_start (col, renderer, FALSE);
+  gtk_tree_view_column_set_cell_data_func (col, renderer,
+					   tm_cell_data_func, NULL, NULL);
+  gtk_tree_view_column_set_sort_column_id (col, tm_item);
+  gtk_tree_view_column_set_resizable (col, TRUE);
+/*     gtk_tree_view_column_set_clickable(column, TRUE); */
+  gtk_tree_view_column_set_sizing (col, GTK_TREE_VIEW_COLUMN_FIXED);
+  gtk_tree_view_column_set_fixed_width (col,
+					prefs_get_int_index("tm_col_width", tm_item));
+  gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (model), tm_item,
+				   tm_data_compare_func, NULL, NULL);
+  gtk_tree_view_column_set_reorderable (col, TRUE);
+  gtk_tree_view_insert_column (track_treeview, col, pos);
+  tm_columns[tm_item] = col;
+
+  if (pos != -1)
+  {
+      gtk_tree_view_column_set_visible (col,
+					prefs_get_int_index("col_visible", tm_item));
+  }
+  if (get_tm_tooltip (tm_item))
+      gtk_tooltips_set_tip (tt, col->button, 
+			    gettext (get_tm_tooltip (tm_item)),
+			    NULL);
+  return col;
+}
+
+
+/* Adds the columns to our track_treeview */
+static void tm_add_columns (void)
+{
+    gint i;
+
+    for (i=0; i<TM_NUM_COLUMNS; ++i)
+    {
+	tm_add_column (prefs_get_int_index("col_order", i), -1);
+    }
+    tm_show_preferred_columns();
+}
+
+static void tm_select_current_position (gint x, gint y)
+{
+    if (track_treeview)
+    {
+	GtkTreePath *path;
+
+	gtk_tree_view_get_path_at_pos (track_treeview,
+				       x, y, &path, NULL, NULL, NULL);
+	if (path)
+	{
+	    GtkTreeSelection *ts = gtk_tree_view_get_selection (track_treeview);
+	    gtk_tree_selection_select_path (ts, path);
+	    gtk_tree_path_free (path);
+	}
+    }
+}
+
+static gboolean
+tm_button_press_event(GtkWidget *w, GdkEventButton *e, gpointer data)
+{
+    if(w && e)
+    {
+	switch(e->button)
+	{
+	case 1:
+/*
+	    printf ("Pressed in cell %d (%f/%f)\n\n",
+		    tree_view_get_cell_from_pos(GTK_TREE_VIEW(w),
+						(guint)e->x, (guint)e->y, NULL),
+		    e->x, e->y);
+*/
+	    break;
+	case 3:
+	    tm_select_current_position (e->x, e->y);
+	    tm_context_menu_init ();
+	    return TRUE;
+	default:
+	    break;
+	}
+    }
+    return(FALSE);
+}
+
+/* called when the track selection changes */
+static void
+tm_selection_changed_event(GtkTreeSelection *selection, gpointer data)
+{
+    GtkTreeView *treeview = gtk_tree_selection_get_tree_view (selection);
+    GtkTreePath *path;
+    GtkTreeViewColumn *column;
+    TM_item col_id;
+
+    gtk_tree_view_get_cursor (treeview, &path, &column);
+    if (path)
+    {
+	col_id = tm_lookup_col_id (column);
+	if (col_id != -1)  tm_set_search_column (col_id);
+    }
+    info_update_track_view_selected ();
+    
+    /* update the coverart display */
+    GList *selected = display_get_selection (prefs_get_int("sort_tab_num"));
+    if (selected != NULL)
+    {
+    	Track *track = selected->data;
+    	if(track != NULL)
+    		coverart_select_cover (track);
+    }
+}
+
+
+/* Create tracks treeview */
+void tm_create_treeview (void)
+{
+  GtkTreeModel *model = NULL;
+  GtkWidget *track_window = gtkpod_xml_get_widget (main_window_xml, "track_window");
+  GtkTreeSelection *select;
+  gint col;
+  GtkWidget *stv = gtk_tree_view_new ();
+
+  /* create tree view */
+  if (track_treeview)
+  {   /* delete old tree view */
+      model = gtk_tree_view_get_model (track_treeview);
+      /* FIXME: how to delete model? */
+      gtk_widget_destroy (GTK_WIDGET (track_treeview));
+  }
+  track_treeview = GTK_TREE_VIEW (stv);
+  gtk_widget_show (stv);
+  gtk_container_add (GTK_CONTAINER (track_window), stv);
+  /* create model (we only need one column for the model -- only a
+   * pointer to the track has to be stored) */
+  model = GTK_TREE_MODEL (
+      gtk_list_store_new (1, G_TYPE_POINTER));
+  gtk_tree_view_set_model (track_treeview, GTK_TREE_MODEL (model));
+  gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (track_treeview), TRUE);
+  gtk_tree_view_set_search_equal_func (GTK_TREE_VIEW (track_treeview), 
+				       tm_search_equal_func,
+				       NULL,
+				       NULL);
+  select = gtk_tree_view_get_selection (track_treeview);
+  gtk_tree_selection_set_mode (select,
+			       GTK_SELECTION_MULTIPLE);
+  g_signal_connect (G_OBJECT (select) , "changed",
+		    G_CALLBACK (tm_selection_changed_event),
+		    NULL);
+  tm_add_columns ();
+
+/*   gtk_drag_source_set (GTK_WIDGET (track_treeview), GDK_BUTTON1_MASK, */
+/* 		       tm_drag_types, TGNR (tm_drag_types), */
+/* 		       GDK_ACTION_COPY|GDK_ACTION_MOVE); */
+/*   gtk_tree_view_enable_model_drag_dest(track_treeview, tm_drop_types, */
+/* 				       TGNR (tm_drop_types), */
+/* 				       GDK_ACTION_COPY|GDK_ACTION_MOVE); */
+/*   /\* need the gtk_drag_dest_set() with no actions ("0") so that the */
+/*      data_received callback gets the correct info value. This is most */
+/*      likely a bug... *\/ */
+/*   gtk_drag_dest_set_target_list (GTK_WIDGET (track_treeview), */
+/* 				 gtk_target_list_new (tm_drop_types, */
+/* 						      TGNR (tm_drop_types))); */
+
+
+  gtk_drag_source_set (GTK_WIDGET (track_treeview),
+		       GDK_BUTTON1_MASK,
+		       tm_drag_types, TGNR (tm_drag_types),
+		       GDK_ACTION_COPY|GDK_ACTION_MOVE);
+  gtk_drag_dest_set (GTK_WIDGET (track_treeview),
+		     0,
+		     tm_drop_types, TGNR (tm_drop_types),
+		     GDK_ACTION_COPY|GDK_ACTION_MOVE);
+
+
+  g_signal_connect ((gpointer) track_treeview, "drag-begin",
+		    G_CALLBACK (tm_drag_begin),
+		    NULL);
+
+  g_signal_connect ((gpointer) track_treeview, "drag-data-delete",
+		    G_CALLBACK (tm_drag_data_delete),
+		    NULL);
+
+  g_signal_connect ((gpointer) track_treeview, "drag-data-get",
+		    G_CALLBACK (tm_drag_data_get),
+		    NULL);
+
+  g_signal_connect ((gpointer) track_treeview, "drag-data-received",
+		    G_CALLBACK (tm_drag_data_received),
+		    NULL);
+
+  g_signal_connect ((gpointer) track_treeview, "drag-drop",
+		    G_CALLBACK (tm_drag_drop),
+		    NULL);
+
+  g_signal_connect ((gpointer) track_treeview, "drag-end",
+		    G_CALLBACK (tm_drag_end),
+		    NULL);
+
+  g_signal_connect ((gpointer) track_treeview, "drag-leave",
+		    G_CALLBACK (tm_drag_leave),
+		    NULL);
+
+  g_signal_connect ((gpointer) track_treeview, "drag-motion",
+		    G_CALLBACK (tm_drag_motion),
+		    NULL);
+
+  g_signal_connect_after ((gpointer) stv, "key_release_event",
+			  G_CALLBACK (on_track_treeview_key_release_event),
+			  NULL);
+  g_signal_connect ((gpointer) track_treeview, "button-press-event",
+		    G_CALLBACK (tm_button_press_event),
+		    NULL);
+  g_signal_connect (G_OBJECT (model), "sort-column-changed",
+		    G_CALLBACK (tm_sort_column_changed),
+		    (gpointer)0);
+
+  /* set correct column for typeahead */
+  if (prefs_get_int_value (TM_PREFS_SEARCH_COLUMN, &col))
+  {
+      tm_set_search_column (col);
+  }
+  else
+  {   /* reasonable default */
+      tm_set_search_column (TM_COLUMN_TITLE);
+  }
+}
+
+
+void
+tm_show_preferred_columns(void)
+{
+    GtkTreeViewColumn *tvc = NULL;
+    gboolean visible;
+    gint i;
+
+    for (i=0; i<TM_NUM_COLUMNS; ++i)
+    {
+	tvc = gtk_tree_view_get_column (track_treeview, i);
+	visible = prefs_get_int_index("col_visible", 
+      prefs_get_int_index("col_order", i));
+	gtk_tree_view_column_set_visible (tvc, visible);
+    }
+}
+
+
+/* update the cfg structure (preferences) with the current sizes /
+   positions (called by display_update_default_sizes():
+   column widths of track model */
+void tm_update_default_sizes (void)
+{
+    gint i;
+    GtkTreeViewColumn *col;
+    gint col_width;
+
+    /* column widths */
+    for (i=0; i<TM_NUM_COLUMNS; ++i)
+    {
+	col = tm_columns [i];
+	if (col)
+	{
+    col_width = gtk_tree_view_column_get_width (col);
+    
+    if (col_width > 0)
+	    prefs_set_int_index ("tm_col_width", i, col_width);
+    else
+      prefs_set_int_index ("tm_col_width", i, 80);
+   
+	}
+    }
+}
+
+
+/* get the TM_ITEM column id for @column. Returns -1 if column could
+   not be found */
+static TM_item tm_lookup_col_id (GtkTreeViewColumn *column)
+{
+    gint i;
+
+    if (column)
+    {
+	for (i=0; i<TM_NUM_COLUMNS; ++i)
+	{
+	    if (column == tm_columns[i]) return i;
+	}
+    }
+    return -1;
+}
+
+
+/* Compare function to avoid sorting */
+static gint tm_nosort_comp (GtkTreeModel *model,
+			    GtkTreeIter *a,
+			    GtkTreeIter *b,
+			    gpointer user_data)
+{
+    return 0;
+}
+
+
+/* Disable sorting of the view during lengthy updates. */
+/* @enable: TRUE: enable, FALSE: disable */
+void tm_enable_disable_view_sort (gboolean enable)
+{
+    static gint disable_count = 0;
+
+    if (enable)
+    {
+	disable_count--;
+	if (disable_count < 0)
+	    fprintf (stderr, "Programming error: disable_count < 0\n");
+	if (disable_count == 0 && track_treeview)
+	{
+	    if (prefs_get_int("tm_sort") != SORT_NONE)
+	    {
+		/* Re-enable sorting */
+		GtkTreeModel *model = gtk_tree_view_get_model (track_treeview);
+		if (BROKEN_GTK_TREE_SORT)
+		{
+		    gtk_tree_sortable_set_sort_func (
+			GTK_TREE_SORTABLE (model),
+			prefs_get_int("tm_sortcol"),
+			tm_data_compare_func, NULL, NULL);
+		}
+		else
+		{
+		    gtk_tree_sortable_set_sort_column_id (
+			GTK_TREE_SORTABLE (model),
+			prefs_get_int("tm_sortcol"),
+			prefs_get_int("tm_sort"));
+		}
+	    }
+	}
+    }
+    else
+    {
+	if (disable_count == 0 && track_treeview)
+	{
+	    if (prefs_get_int("tm_sort") != SORT_NONE)
+	    {
+		/* Disable sorting */
+		GtkTreeModel *model = gtk_tree_view_get_model (track_treeview);
+		if (BROKEN_GTK_TREE_SORT)
+		{
+		    gtk_tree_sortable_set_sort_func (
+			GTK_TREE_SORTABLE (model),
+			prefs_get_int("tm_sortcol"),
+			tm_nosort_comp, NULL, NULL);
+		}
+		else
+		{
+		    gtk_tree_sortable_set_sort_column_id (
+			GTK_TREE_SORTABLE (model),
+			GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID,
+			prefs_get_int("tm_sort"));
+		}
+	    }
+	}
+	disable_count++;
+    }
+}
+
+
+
+/* Callback for adding tracks within tm_add_filelist */
+void tm_addtrackfunc (Playlist *plitem, Track *track, gpointer data)
+{
+    struct asf_data *asf = (struct asf_data *)data;
+    GtkTreeModel *model;
+    GtkTreeIter new_iter;
+
+    model = gtk_tree_view_get_model (track_treeview);
+
+/*    printf("plitem: %p\n", plitem);
+      if (plitem) printf("plitem->type: %d\n", plitem->type);*/
+    /* add to playlist but not to the display */
+    gp_playlist_add_track (plitem, track, FALSE);
+
+    /* create new iter in track view */
+    switch (asf->pos)
+    {
+    case GTK_TREE_VIEW_DROP_INTO_OR_BEFORE:
+    case GTK_TREE_VIEW_DROP_INTO_OR_AFTER:
+    case GTK_TREE_VIEW_DROP_AFTER:
+	gtk_list_store_insert_after (GTK_LIST_STORE (model),
+				     &new_iter, asf->to_iter);
+	break;
+    case GTK_TREE_VIEW_DROP_BEFORE:
+	gtk_list_store_insert_before (GTK_LIST_STORE (model),
+				      &new_iter, asf->to_iter);
+	break;
+    }
+    /* set the iter */
+    tm_add_track_to_track_model (track, &new_iter);
+}
+
+
+/* DND: insert a list of files before/after @path
+   @data: list of files
+   @path: where to drop (NULL to drop at the end)
+   @pos:  before/after... (ignored if @path is NULL)
+*/
+gboolean tm_add_filelist (gchar *data,
+			  GtkTreePath *path,
+			  GtkTreeViewDropPosition pos)
+{
+    GtkTreeModel *model;
+    gchar *buf = NULL, *use_data;
+    gchar **files, **filep;
+    Playlist *current_playlist = pm_get_selected_playlist ();
+
+    g_return_val_if_fail (data, FALSE);
+    g_return_val_if_fail (*data, FALSE);
+    g_return_val_if_fail (current_playlist, FALSE);
+
+    model = gtk_tree_view_get_model (track_treeview);
+    g_return_val_if_fail (model, FALSE);
+    if (path)
+    {
+    }
+
+    if (pos != GTK_TREE_VIEW_DROP_BEFORE)
+    {   /* need to reverse the list of files -- otherwise wie add them
+	 * in reverse order */
+	/* split the path list into individual strings */
+	gint len = strlen (data) + 1;
+	files = g_strsplit (data, "\n", -1);
+	filep = files;
+	/* find the end of the list */
+	while (*filep) ++filep;
+	/* reserve memory */
+	buf = g_malloc0 (len);
+	/* reverse the list */
+	while (filep != files)
+	{
+	    --filep;
+	    g_strlcat (buf, *filep, len);
+	    g_strlcat (buf, "\n", len);
+	}
+	g_strfreev (files);
+	use_data = buf;
+    }
+    else
+    {
+	use_data = data;
+    }
+
+/*     printf("filelist: (%s) -> (%s)\n", data, use_data); */
+    /* initialize add-track-struct */
+    if (path)
+    {   /* add where specified (@path/@pos) */
+	GtkTreeIter to_iter;
+	struct asf_data asf;
+	if (!gtk_tree_model_get_iter (model, &to_iter, path))
+	    g_return_val_if_reached (FALSE);
+	asf.to_iter = &to_iter;
+	asf.pos = pos;
+	add_text_plain_to_playlist (current_playlist->itdb,
+				    current_playlist, use_data, 0,
+				    tm_addtrackfunc, &asf);
+    }
+    else
+    {   /* add to the end */
+	add_text_plain_to_playlist (current_playlist->itdb,
+				    current_playlist, use_data, 0,
+				    NULL, NULL);
+    }
+    tm_rows_reordered ();
+    C_FREE (buf);
+    return TRUE;
+}

Added: trunk/src/fetchcover.c
===================================================================
--- trunk/src/fetchcover.c	                        (rev 0)
+++ trunk/src/fetchcover.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,467 @@
+	/*
+	|  Copyright (C) 2007 P.G. Richardson <phantom_sf at users.sourceforge.net>
+	|  Part of the gtkpod project.
+	| 
+	|  URL: http://www.gtkpod.org/
+	|  URL: http://gtkpod.sourceforge.net/
+	| 
+	|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+	| 
+	|  iTunes and iPod are trademarks of Apple
+	| 
+	|  This product is not supported/written/published by Apple!
+	|
+	|  $Id: fetchcover.c 1822 2007-12-12 16:31:26Z dforsi $
+	*/
+	
+#ifdef HAVE_CONFIG_H
+	#include <config.h>
+#endif
+	
+#include "fetchcover.h"
+#include "display_coverart.h"
+#include <glib/gprintf.h>
+#include <glib/gstdio.h>
+#include <gdk/gdkkeysyms.h>
+
+#undef FETCHCOVER_DEBUG
+
+#define IMGSCALE 256
+	
+/* Display a dialog explaining the options if a file with the proposed name already exists */
+static gchar *display_file_exist_dialog (Fetch_Cover *fetch_cover);
+static gchar *fetchcover_check_file_exists (Fetch_Cover *fetch_cover);
+	
+#ifdef HAVE_CURL
+	
+	#include <curl/curl.h>
+
+	/* Declarations */
+	static void *safe_realloc(void *ptr, size_t size);
+	static size_t curl_write_fetchcover_func(void *ptr, size_t itemsize, size_t numitems, void *data);
+  
+	struct chunk
+	{
+		gchar *memory;
+		size_t size;
+	};
+		
+	/* Data structure for use with curl */
+	struct chunk fetchcover_curl_data;
+	
+	/****
+	 * safe_realloc:
+	 *
+	 * @void: ptr
+	 * @size_t: size
+	 *
+	 * Memory allocation function
+	 **/
+	static void *safe_realloc(void *ptr, size_t size)
+	{
+		if (ptr)
+			return realloc(ptr, size);
+		else
+			return malloc(size);
+	}
+	
+	/****
+	 * 
+	 * curl_write_fetchcover_func:
+	 * 
+	 * @void: *ptr
+	 * @size_t: itemsize
+	 * @size_t:numitems
+	 * @void: *data
+	 * 
+	 * Curl writing function
+	 * 
+	 * @Return size_t
+	 **/
+	static size_t curl_write_fetchcover_func(void *ptr, size_t itemsize, size_t numitems, void *data)
+	{
+		size_t size = itemsize * numitems;
+		struct chunk *mem = (struct chunk*)data;
+		mem->memory = (gchar*)safe_realloc(mem->memory, mem->size + size + 1);
+		
+		if (mem->memory)
+		{
+			memcpy(&(mem->memory[mem->size]), ptr, size);
+			mem->size += size;
+			mem->memory[mem->size] = 0;
+		}
+		return size;
+	}
+#endif
+		
+	/*****
+	 * fetchcover_new:
+	 *
+	 * @GString: url
+	 * @GList: trks
+	 *
+	 * Initialise a new fetch cover object for use with the fetchcover functions
+	 **/
+	Fetch_Cover *fetchcover_new (gchar *url_path, GList *trks)
+	{
+		/*Create a fetchcover object */
+		Fetch_Cover * fcover;
+		
+		fcover = g_new0(Fetch_Cover, 1);
+		fcover->url = g_string_new ((gchar*) url_path);
+		fcover->image = NULL;
+		fcover->tracks = trks;
+		fcover->err_msg = NULL;
+		fcover->parent_window = NULL;
+		
+		return fcover;
+	}	
+	
+#ifdef HAVE_CURL
+	/*****
+	 * net_retrieve_image:
+	 *
+	 * @GString: url
+	 *
+	 * Use the url acquired from the net search to fetch the image,
+	 * save it to a file inside the track's parent directory then display
+	 * it as a pixbuf
+	 **/
+	gboolean fetchcover_net_retrieve_image (Fetch_Cover *fetch_cover)
+	{
+		g_return_val_if_fail (fetch_cover, FALSE);
+		
+		if (! g_str_has_suffix(fetch_cover->url->str, ".jpg") && ! g_str_has_suffix(fetch_cover->url->str, ".JPG"))
+		{
+			fetch_cover->err_msg = g_strdup("Only jpg images are currently supported at this time\n");
+			return FALSE;
+		}
+		
+		gchar *path = NULL;
+		FILE *tmpf = NULL;
+		
+		fetchcover_curl_data.size = 0;
+		fetchcover_curl_data.memory = NULL;
+		
+		/* Use curl to retrieve the data from the net */
+		CURL *curl;	
+		curl_global_init(CURL_GLOBAL_ALL);
+		curl = curl_easy_init();
+		curl_easy_setopt(curl, CURLOPT_URL, fetch_cover->url->str);
+		curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curl_write_fetchcover_func);
+		curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&fetchcover_curl_data);
+		curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcurl-agent/1.0");
+		curl_easy_perform(curl);
+		curl_easy_cleanup(curl);
+		
+		if (fetchcover_curl_data.memory == NULL)
+		{
+			fetch_cover->err_msg = g_strdup("fetchcover curl data memory is null so failed to download anything!\n");
+			return FALSE;
+		}
+	
+		/* Check that the page returned is a valid web page */	
+		if (strstr(fetchcover_curl_data.memory, "<html>") != NULL)
+		{
+			fetch_cover->err_msg = g_strdup("fetchcover memory contains <html> tag so not a valid jpg image\n");
+			return FALSE;
+		}
+		
+		if (! fetchcover_select_filename (fetch_cover))
+			return FALSE;
+		
+		path = g_build_filename(fetch_cover->dir, fetch_cover->filename, NULL);
+#if DEBUG
+		printf ("path of download file is %s\n", path);
+#endif
+		if ((tmpf = fopen(path, "wb")) == NULL)
+		{
+			if (fetchcover_curl_data.memory)
+			{
+				g_free(fetchcover_curl_data.memory);
+				fetchcover_curl_data.memory = NULL;
+				fetchcover_curl_data.size = 0;
+			}
+			g_free (path);
+			fetch_cover->err_msg = g_strdup ("Failed to create a file with the filename\n");
+			return FALSE;
+		}
+				
+		if (fwrite(fetchcover_curl_data.memory, fetchcover_curl_data.size, 1, tmpf) != 1)
+		{
+			if (fetchcover_curl_data.memory)
+			{
+				g_free(fetchcover_curl_data.memory);
+				fetchcover_curl_data.memory = NULL;
+				fetchcover_curl_data.size = 0;
+			}
+			fclose(tmpf);
+			g_free (path);
+			fetch_cover->err_msg = g_strdup("fetchcover failed to write the data to the new file\n");
+			return FALSE;
+		}
+		
+		fclose(tmpf);
+		
+		/* Check the file is a valid pixbuf type file */
+		GdkPixbufFormat *fileformat= NULL;
+		fileformat = gdk_pixbuf_get_file_info (path, NULL, NULL);
+		if (fileformat == NULL)
+		{
+			fetch_cover->err_msg = g_strdup("fetchcover downloaded file is not a valid image file\n");
+			return FALSE;
+		}
+				
+		GError *error = NULL;				
+		fetch_cover->image = gdk_pixbuf_new_from_file(path, &error);
+		if (error != NULL)
+		{
+			g_error_free (error);
+			if (fetchcover_curl_data.memory)
+			{
+				g_free(fetchcover_curl_data.memory);
+				fetchcover_curl_data.memory = NULL;
+				fetchcover_curl_data.size = 0;
+			}
+			g_free(path);
+			fetch_cover->err_msg = g_strconcat ("fetchcover error occurred while creating a pixbuf from the file\n", error->message, NULL);
+			return FALSE;
+		}
+		
+		if (fetchcover_curl_data.memory)
+			g_free(fetchcover_curl_data.memory);
+		
+		fetchcover_curl_data.memory = NULL;
+		fetchcover_curl_data.size = 0;
+		g_free(path);
+		return TRUE;
+	}
+#endif
+
+	gboolean fetchcover_select_filename (Fetch_Cover *fetch_cover)
+	{
+		GList *tracks = fetch_cover->tracks;
+		
+		if (tracks == NULL || g_list_length (tracks) <= 0)
+		{
+			fetch_cover->err_msg = g_strdup("fetchcover object's tracks list either NULL or no tracks were selected\n");
+			return FALSE;
+		}
+		
+		Track *track = g_list_nth_data (tracks, 0);
+		ExtraTrackData *etd = track->userdata;
+			
+		fetch_cover->dir = g_path_get_dirname(etd->pc_path_utf8);
+		gchar *template = prefs_get_string("coverart_template");
+		gchar **template_items = g_strsplit(template, ";", 0);
+		
+		gint i;
+		for (i = 0; fetch_cover->filename == NULL && i < g_strv_length (template_items); ++i)
+		{
+			fetch_cover->filename = get_string_from_template(track, template_items[i], FALSE, FALSE);
+			if (strlen(fetch_cover->filename) == 0)
+				fetch_cover->filename = NULL;
+		}
+		
+		g_strfreev(template_items);
+		g_free(template);
+		
+		/* Check filename still equals null then take a default stance
+		 * to ensure the file has a name. Default stance applies if the
+		 * extra track data has been left as NULL
+		 */
+		if (fetch_cover->filename == NULL)
+			fetch_cover->filename = "folder.jpg";
+		else
+		{
+			if (! g_str_has_suffix(fetch_cover->filename, ".jpg"))
+			{
+				gchar *oldname;
+				oldname = fetch_cover->filename;
+				fetch_cover->filename = g_strconcat(oldname, ".jpg", NULL);
+				g_free (oldname);
+			}
+		}
+		
+		if (fetchcover_check_file_exists (fetch_cover) == NULL)
+		{
+			fetch_cover->err_msg = g_strdup("operation cancelled\n");
+			return FALSE;
+		}
+		
+		return TRUE;
+	}
+	
+	/*****
+	 * fetchcover_check_file_exists:
+	 * 
+	 * @Fetch_Cover
+	 *
+	 * Save the displayed cover.
+	 * Set thumbnails, update details window.
+	 * Called on response to the clicking of the save button in the dialog
+	 * 
+	 * Returns:
+	 * Filename of chosen cover image file
+	 ***/
+	static gchar *fetchcover_check_file_exists (Fetch_Cover *fetch_cover)
+	{
+		gchar *newname = NULL;
+		/* The default cover image will have both dir and filename set
+		 * to null because no need to save because it is already saved (!!)
+		 * Thus, this whole process is avoided. Added bonus that pressing
+		 * save by accident if, for instance, no images are found means the
+		 * whole thing safely completes
+		 */
+		if (fetch_cover->dir && fetch_cover->filename)
+		{
+			/* path is valid so first move the file to be the folder.jpg or 
+			 * whatever is the preferred preference
+			 */
+			
+			/* Assign the full path name ready to rename the file */
+			newname = g_build_filename(fetch_cover->dir, fetch_cover->filename, NULL);
+		
+			if (g_file_test (newname, G_FILE_TEST_EXISTS))
+			{
+				newname = display_file_exist_dialog (fetch_cover);
+			}
+		}
+		return newname;
+	}
+
+	static gchar *display_file_exist_dialog (Fetch_Cover *fetch_cover)
+	{
+		gchar *filepath;
+		gint result;
+		gchar **splitarr = NULL;
+		gchar *basename = NULL;
+		gint i;
+		gchar *message;	
+		GtkWidget *label;
+		
+		if (fetch_cover->parent_window == NULL)
+			fetch_cover->parent_window = GTK_WINDOW(gtkpod_window);
+		
+		GtkWidget *dialog = gtk_dialog_new_with_buttons (_("Coverart file already exists"),
+																							fetch_cover->parent_window,
+																							GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+																							GTK_STOCK_YES,
+																							GTK_RESPONSE_YES,
+	                                            GTK_STOCK_NO,
+	                                            GTK_RESPONSE_NO,
+	                                            GTK_STOCK_CANCEL,
+	                                            GTK_RESPONSE_REJECT,
+	                                            NULL);
+	
+		filepath = g_build_filename(fetch_cover->dir, fetch_cover->filename, NULL);
+
+		message = g_strdup_printf (_("The picture file %s already exists.\n" \
+				"This may be associated with other music files in the directory.\n\n" \
+				"-  Clicking Yes will overwrite the existing file, possibly associating\n" \
+				"   other music files in the same directory with this coverart file.\n" \
+				"-  Clicking No will save the file with a unique file name.\n" \
+				"-  Clicking Cancel will abort the fetchcover operation."), filepath);
+			           
+		label = gtk_label_new (message);
+	   
+		/* Add the label, and show everything we've added to the dialog. */
+		gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox), label);
+				
+		gtk_widget_show_all (dialog);	
+		result = gtk_dialog_run (GTK_DIALOG(dialog));
+		g_free (message);
+				
+		switch (result)
+		{
+			case GTK_RESPONSE_REJECT:
+				/* Cancel has been clicked so no save */
+				gtk_widget_destroy (dialog);
+				return NULL;
+			case GTK_RESPONSE_YES:
+				/*** Yes clicked so overwrite the file is okay. Leave final_filename intact
+				 * and remove the original
+				 **/
+				g_remove (filepath);
+				gtk_widget_destroy (dialog);
+				return filepath;
+			case GTK_RESPONSE_NO:
+				/* User doesn't want to overwrite anything so need to do some work on filename */
+				/* Remove the suffix from the end of the filename */
+				splitarr = g_strsplit (fetch_cover->filename, ".", 0);
+				basename = splitarr[0];
+			
+				gchar *newfilename = g_strdup (fetch_cover->filename);;
+									
+				for (i = 1; g_file_test (filepath, G_FILE_TEST_EXISTS); ++i)
+				{		
+					g_free (newfilename);
+					gchar * intext = (gchar *) g_malloc (sizeof(gint) + (sizeof(gchar) * 4));
+					g_sprintf (intext, "%d.jpg", i);
+					newfilename = g_strconcat (basename, intext, NULL);
+					
+					g_free (filepath);
+					
+					filepath = g_build_filename(fetch_cover->dir, newfilename, NULL);
+				}
+				
+				/* Should have found a filename that really doesn't exist so this needs to be returned */
+				g_free (fetch_cover->filename);
+				fetch_cover->filename = g_strdup (newfilename);
+				g_free (newfilename);
+				newfilename = NULL;
+				basename = NULL;
+				g_strfreev(splitarr);
+				gtk_widget_destroy (dialog);
+				
+				return filepath;
+			default:
+				gtk_widget_destroy (dialog);
+				return NULL;
+		}	
+	}
+
+/****
+ * free_fetchcover:
+ * 
+ * @Fetch_Cover: fcover
+ * 
+ * Free the elements of the passed in Fetch_Cover structure
+ */
+void free_fetchcover (Fetch_Cover *fcover)
+{
+	if (! fcover)
+		return;
+		
+	if (fcover->url)
+		g_string_free (fcover->url, TRUE);
+		
+	if (fcover->image)
+		gdk_pixbuf_unref (fcover->image);
+			
+	if (fcover->dir)
+		g_free (fcover->dir);
+	
+	if (fcover->filename)
+		g_free (fcover->filename);
+	
+	if (fcover->err_msg)
+		g_free (fcover->err_msg);
+	
+	if (fcover->parent_window)
+		fcover->parent_window = NULL;
+	
+	g_free (fcover);
+}

Added: trunk/src/fetchcover.h
===================================================================
--- trunk/src/fetchcover.h	                        (rev 0)
+++ trunk/src/fetchcover.h	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,60 @@
+/*
+|  Copyright (C) 2007 P.G. Richardson <phantom_sf at users.sourceforge.net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+| 
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+| 
+|  iTunes and iPod are trademarks of Apple
+| 
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: fetchcover.h 1755 2007-11-05 01:16:19Z phantom_sf $
+*/
+
+#ifndef __FETCHCOVER_H__
+#define __FETCHCOVER_H__
+
+#include <string.h>
+#include <gtk/gtk.h>
+#include <libgnomecanvas/libgnomecanvas.h>
+#include <libxml/parser.h>
+#include <libxml/tree.h>
+#include "display.h"
+#include "display_private.h"
+#include "details.h"
+#include "itdb.h"
+#include "display_coverart.h"
+#include "prefs.h"
+
+typedef struct
+{
+	GdkPixbuf *image;
+	GString *url;
+	gchar *dir;
+	gchar *filename;
+	GList *tracks;
+	gchar *err_msg;
+	GtkWindow *parent_window;
+} Fetch_Cover;
+
+Fetch_Cover *fetchcover_new (gchar *url_path, GList *trks);
+gboolean fetchcover_net_retrieve_image (Fetch_Cover *fetch_cover);
+gboolean fetchcover_select_filename (Fetch_Cover *fetch_cover);
+void free_fetchcover (Fetch_Cover *fcover);
+
+#endif

Added: trunk/src/file.c
===================================================================
--- trunk/src/file.c	                        (rev 0)
+++ trunk/src/file.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,2412 @@
+/*
+|  Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: file.c 1824 2007-12-13 10:51:04Z dforsi $
+*/
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/file.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+
+#include "charset.h"
+#include "clientserver.h"
+#include "confirmation.h"
+#include "info.h"
+#include "file.h"
+#include "file_convert.h"
+#include "itdb.h"
+#include "sha1.h"
+#include "misc.h"
+#include "misc_track.h"
+#include "mp3file.h"
+#include "mp4file.h"
+#include "prefs.h"
+#include "wavfile.h"
+#include "oggfile.h"
+#include "flacfile.h"
+
+/* The uppercase version of these extensions is tried as well. */
+static const gchar *imageext[] =
+{".jpg", ".jpeg", ".png", ".pbm", ".pgm", ".ppm", ".tif", ".tiff",
+ ".gif", NULL};
+
+
+/*------------------------------------------------------------------*\
+ *                                                                  *
+ *      Temporary Video stuff -- move to appropriate files when     *
+ *      properly supported.                                         *
+ *                                                                  *
+\*------------------------------------------------------------------*/
+
+Track *video_get_file_info (gchar *filename)
+{
+    Track *track;
+    track = gp_track_new ();
+    switch (determine_file_type (filename))
+    {
+    case FILE_TYPE_M4V:
+	track->filetype = g_strdup ("M4V video file");
+	break;
+    case FILE_TYPE_MP4:
+	track->filetype = g_strdup ("MP4 video file");
+	break;
+    case FILE_TYPE_MOV:
+	track->filetype = g_strdup ("MOV video file");
+	break;
+    case FILE_TYPE_MPG:
+	track->filetype = g_strdup ("MPG video file");
+	break;
+    case FILE_TYPE_UNKNOWN:
+    case FILE_TYPE_MP3:
+    case FILE_TYPE_M4A:
+    case FILE_TYPE_M4P:
+    case FILE_TYPE_M4B:
+    case FILE_TYPE_WAV:
+    case FILE_TYPE_M3U:
+    case FILE_TYPE_PLS:
+    case FILE_TYPE_IMAGE:
+    case FILE_TYPE_DIRECTORY:
+    case FILE_TYPE_OGG:
+    case FILE_TYPE_FLAC:
+	g_free (track);
+	g_return_val_if_reached (NULL);
+    }
+    return track;
+}
+
+
+/* Determine the type of a file. 
+ *
+ * Currently this is done by checking the suffix of the filename. An improved
+ * version should probably only fall back to that method if everything else
+ * fails.
+ * -jlt
+ */
+
+FileType determine_file_type (const gchar *path)
+{
+    gchar *path_utf8, *suf;
+    FileType type = FILE_TYPE_UNKNOWN;
+	
+    g_return_val_if_fail (path, type);
+
+    if (g_file_test (path, G_FILE_TEST_IS_DIR))
+	return FILE_TYPE_DIRECTORY;
+
+    path_utf8 = charset_to_utf8 (path);
+    suf = strrchr (path_utf8, '.');
+    if (suf)
+    {
+	if (g_strcasecmp (suf, ".mp3") == 0) type = FILE_TYPE_MP3;
+	else if (g_strcasecmp (suf, ".m4a") == 0) type = FILE_TYPE_M4A;
+	else if (g_strcasecmp (suf, ".m4p") == 0) type = FILE_TYPE_M4P;
+	else if (g_strcasecmp (suf, ".m4b") == 0) type = FILE_TYPE_M4B;
+	else if (g_strcasecmp (suf, ".wav") == 0) type = FILE_TYPE_WAV;
+
+	else if (g_strcasecmp (suf, ".m4v") == 0) type = FILE_TYPE_M4V;
+	else if (g_strcasecmp (suf, ".mp4") == 0) type = FILE_TYPE_MP4;
+	else if (g_strcasecmp (suf, ".mov") == 0) type = FILE_TYPE_MOV;
+	else if (g_strcasecmp (suf, ".mpg") == 0) type = FILE_TYPE_MPG;
+	else if (g_strcasecmp (suf, ".mpeg") == 0) type = FILE_TYPE_MPG;
+
+	else if (g_strcasecmp (suf, ".m3u") == 0) type = FILE_TYPE_M3U;
+	else if (g_strcasecmp (suf, ".pls") == 0) type = FILE_TYPE_PLS;
+        else if (g_strcasecmp (suf, ".ogg") == 0) type = FILE_TYPE_OGG;
+        else if (g_strcasecmp (suf, ".flac") == 0) type = FILE_TYPE_FLAC;
+
+	else
+	{
+	    const gchar **extp=imageext;
+	    while (*extp)
+	    {
+		if (g_strcasecmp (suf, *extp) == 0)
+		{
+		    type = FILE_TYPE_IMAGE;
+		    break;
+		}
+		++extp;
+	    }
+	}
+    }
+
+    g_free(path_utf8);
+    return type;
+}
+
+
+/** check a filename against the "excludes file mask" from the preferences
+ *  and return TRUE if it should be excluded based on the mask
+ */
+static gboolean excludefile (gchar *filename)
+{
+    gboolean matched = FALSE;
+    gchar **masks, *prefs_masks;
+
+    prefs_masks = prefs_get_string ("exclude_file_mask");
+    
+    if (prefs_masks == NULL) 
+        return FALSE;
+    
+    masks = g_strsplit (prefs_masks, ";", -1);
+
+    if (masks != NULL)
+    {
+	gint i;
+        for(i=0; !matched && masks[i]; i++)
+	{
+	    matched = g_pattern_match_simple (g_strstrip(masks[i]), filename);
+	}
+        g_strfreev (masks);
+    }
+    
+    g_free(prefs_masks);
+    
+    return matched;
+}
+
+
+/*------------------------------------------------------------------*\
+ *                                                                  *
+ *      Add Playlists                                               *
+ *                                                                  *
+\*------------------------------------------------------------------*/
+
+
+/* Add all files specified in playlist @plfile. Will create a new
+ * playlist with the name "basename (plfile)", even if one of the same
+ * name already exists (if @plitem is != NULL, all tracks will be added
+ * to @plitem and no new playlist will be created).
+ * It will then add all tracks listed in @plfile. If set in the prefs,
+ * duplicates will be detected (and the track already present in the
+ * database will be added to the playlist instead). */
+/* @addtrackfunc: if != NULL this will be called instead of
+   "add_track_to_playlist () -- used for dropping tracks at a specific
+   position in the track view */
+/* Return value: playlist to which the files were added to or NULL on
+ * error */
+Playlist *
+add_playlist_by_filename (iTunesDB *itdb, gchar *plfile,
+			  Playlist *plitem, gint plitem_pos,
+			  AddTrackFunc addtrackfunc, gpointer data)
+{
+    gchar *bufp, *plfile_utf8;
+    gchar *dirname = NULL, *plname = NULL;
+    gchar buf[PATH_MAX];
+    FileType type = FILE_TYPE_UNKNOWN; /* type of playlist file */
+    gint line, tracks;
+    FILE *fp;
+    gboolean error;
+
+    g_return_val_if_fail (plfile, FALSE);
+    g_return_val_if_fail (itdb, FALSE);
+
+    if (g_file_test (plfile, G_FILE_TEST_IS_DIR))
+    {
+	gtkpod_warning (_("'%s' is a directory, not a playlist file.\n\n"),
+			plfile);
+	return FALSE;  /* definitely not! */
+    }
+
+    plfile_utf8 = charset_to_utf8 (plfile);
+
+    plname = g_path_get_basename (plfile_utf8);
+    g_free (plfile_utf8);
+
+    bufp = g_strrstr (plname, "."); /* find last occurence of '.' */
+    if (bufp)
+    {
+	*bufp = 0;          /* truncate playlist name */
+	type = determine_file_type(plfile);
+	switch (type)
+	{
+	case FILE_TYPE_MP3:
+	case FILE_TYPE_M4A:
+	case FILE_TYPE_M4P:
+	case FILE_TYPE_M4B:
+	case FILE_TYPE_WAV:
+	case FILE_TYPE_M4V:
+	case FILE_TYPE_MP4:
+	case FILE_TYPE_MOV:
+	case FILE_TYPE_MPG:
+        case FILE_TYPE_OGG:
+        case FILE_TYPE_FLAC:
+	case FILE_TYPE_IMAGE:
+	case FILE_TYPE_DIRECTORY:
+	    gtkpod_warning (_("'%s' is a not a known playlist file.\n\n"),
+			      plfile);
+	    g_free(plname);
+	    return FALSE;
+	case FILE_TYPE_M3U:
+	case FILE_TYPE_PLS:
+	    break;
+	case FILE_TYPE_UNKNOWN:
+	    /* assume MISC (M3U like) style */
+	    type = -2;
+	    break;
+	}
+    }
+
+    /* attempt to open playlist file */
+    if (!(fp = fopen (plfile, "r")))
+    {
+	gtkpod_warning (_("Could not open '%s' for reading.\n"), plfile);
+	g_free (plname);
+	return FALSE;  /* definitely not! */
+    }
+    /* create playlist (if none is specified) */
+    if (!plitem)  plitem = gp_playlist_add_new (itdb, plname,
+						FALSE, plitem_pos);
+    C_FREE (plname);
+    g_return_val_if_fail (plitem, NULL);
+
+    /* need dirname if playlist file contains relative paths */
+    dirname = g_path_get_dirname (plfile);
+
+    /* for now assume that all playlist files will be line-based
+       all of these are line based -- add different code for different
+       playlist files */
+    line = -1; /* nr of line being read */
+    tracks = 0; /* nr of tracks added */
+    error = FALSE;
+    while (!error && fgets (buf, PATH_MAX, fp))
+    {
+	gchar *bufp = buf;
+	gchar *filename = NULL;
+	gint len = strlen (bufp); /* remove newline */
+
+	++line;
+	if (len == 0) continue;   /* skip empty lines */
+	if (bufp[len-1] == 0x0a)  bufp[len-1] = 0;
+	if (type == -2)
+	{
+	    /* skip whitespace */
+	    while (isspace (*bufp)) ++bufp;
+	    /* assume comments start with ';' or '#' */
+	    if ((*bufp == ';') || (*bufp == '#')) break;
+	    /* assume the rest of the line is a filename */
+	    filename = concat_dir_if_relative (dirname, bufp);
+	    break;
+	}
+	else switch (type)
+	{
+	case FILE_TYPE_M3U:
+	    /* comments start with '#' */
+	    if (*bufp == '#') break;
+	    /* assume the rest of the line is a filename */
+	    filename = concat_dir_if_relative (dirname, bufp);
+	    break;
+	case FILE_TYPE_PLS:
+	    /* I don't know anything about pls playlist files and just
+	       looked at one example produced by xmms -- please
+	       correct the code if you know more */
+	    if (line == 0)
+	    { /* check for "[playlist]" */
+		if (strncasecmp (bufp, "[playlist]", 10) != 0)
+		    error = TRUE;
+	    }
+	    else if (strncasecmp (bufp, "File", 4) == 0)
+	    { /* looks like a file entry */
+		bufp = strchr (bufp, '=');
+		if (bufp)
+		{
+		    ++bufp;
+		    filename = concat_dir_if_relative (dirname, bufp);
+		}
+	    }
+	    break;
+	case FILE_TYPE_UNKNOWN:
+	case FILE_TYPE_DIRECTORY:
+	case FILE_TYPE_MP3:
+	case FILE_TYPE_M4A:
+	case FILE_TYPE_M4P:
+	case FILE_TYPE_M4B:
+	case FILE_TYPE_WAV:
+	case FILE_TYPE_M4V:
+	case FILE_TYPE_MP4:
+	case FILE_TYPE_MOV:
+	case FILE_TYPE_MPG:
+	case FILE_TYPE_OGG:
+        case FILE_TYPE_FLAC:
+	case FILE_TYPE_IMAGE:
+	    break;
+	}
+	if (filename)
+	{
+	    /* do not allow to add directories! */
+	    if (g_file_test (filename, G_FILE_TEST_IS_DIR))
+	    {
+		gtkpod_warning (_("Skipping '%s' because it is a directory.\n"), filename);
+	    }
+	    /* do not allow to add playlist file recursively */
+	    else if (strcmp (plfile, filename) == 0)
+	    {
+		gtkpod_warning (_("Skipping '%s' to avoid adding playlist file recursively\n"), filename);
+	    }
+	    else if (add_track_by_filename (itdb, filename, plitem,
+					    prefs_get_int("add_recursively"),
+					    addtrackfunc, data))
+	    {
+		++tracks;
+	    }
+	    g_free (filename);
+	}
+    }
+    fclose (fp);
+    C_FREE (dirname);
+
+    /* I don't think it's too interesting to pop up the list of
+       duplicates -- but we should reset the list. */
+    gp_duplicate_remove (NULL, (void *)-1);
+
+    if (!error) return plitem;
+    return NULL;
+}
+
+
+
+/*------------------------------------------------------------------*\
+ *                                                                  *
+ *      Add Dir                                                     *
+ *                                                                  *
+\*------------------------------------------------------------------*/
+
+/* Add all files in directory and subdirectories.
+   If @name is a regular file, just add that.
+   If @plitem != NULL, add tracks also to Playlist @plitem
+   @descend: TRUE: add recursively
+             FALSE: don't enter subdirectories */
+/* Not nice: the return value has not much meaning. TRUE: all files
+ * were added successfully. FALSE: some files could not be
+   added (e.g: duplicates)  */
+/* @addtrackfunc: if != NULL this will be called instead of
+   "add_track_to_playlist () -- used for dropping tracks at a specific
+   position in the track view */
+gboolean add_directory_by_name (iTunesDB *itdb, gchar *name,
+				Playlist *plitem, gboolean descend,
+				AddTrackFunc addtrackfunc, gpointer data)
+{
+  gboolean result = TRUE;
+
+  g_return_val_if_fail (itdb, FALSE);
+  g_return_val_if_fail (name, FALSE);
+
+  if (g_file_test (name, G_FILE_TEST_IS_DIR))
+  {
+      GDir *dir = g_dir_open (name, 0, NULL);
+      block_widgets ();
+      if (dir != NULL) {
+	  G_CONST_RETURN gchar *next;
+	  do {
+	      next = g_dir_read_name (dir);
+	      if (next != NULL)
+	      {
+		  gchar *nextfull = g_build_filename (name, next, NULL);
+		  if (descend ||
+		      !g_file_test (nextfull, G_FILE_TEST_IS_DIR))
+		      result &= add_directory_by_name (
+			  itdb, nextfull, plitem,
+			  descend, addtrackfunc, data);
+		  g_free (nextfull);
+	      }
+	  } while (next != NULL);
+	  g_dir_close (dir);
+      }
+      release_widgets ();
+  }
+  else
+  {
+      result = add_track_by_filename (itdb, name, plitem,
+				      descend, addtrackfunc, data);
+  }
+  return result;
+}
+
+
+
+/*------------------------------------------------------------------*\
+ *                                                                  *
+ *      Fill in track struct with data from file                     *
+ *                                                                  *
+\*------------------------------------------------------------------*/
+
+/* parse the file with name @filename (UTF8) and fill extract the tags
+ * to @trackas specified in @template. @track can be NULL if you just
+ * want to verify the template */
+static gboolean parse_filename_with_template (Track *track,
+					      gchar *filename,
+					      const gchar *template)
+{
+    GList *tokens=NULL, *gl;
+    gchar *tpl, *fn;
+    gchar *sps, *sp, *str;
+    gboolean parse_error = FALSE;
+
+    if (!template || !filename) return FALSE;
+
+#ifdef DEBUG
+    printf ("fn: '%s', tpl: '%s'\n", filename, template);
+#endif
+
+    /* If the template starts with a '%.' (except for '%%') we add a
+       '/' in front so that the field has a boundary */
+    if ((template[0] == '%') && (template[1] != '%'))
+	 tpl = g_strdup_printf ("%c%s", G_DIR_SEPARATOR, template);
+    else tpl = g_strdup (template);
+
+    fn = g_strdup (filename);
+
+    /* We split the template into tokens. Each token starting with a
+       '%' and two chars long specifies a field ('%.'), otherwise it's
+       normal text (used to separate two fields).
+       "/%a - %t.mp3" would become ".mp3"  "%t"  " - "  "%a"  "/" */
+    sps = tpl;
+    while ((sp = strchr (sps, '%')))
+    {
+	if (sps != sp)
+	    tokens = g_list_prepend (tokens, g_strndup (sps, sp-sps));
+	if (sp[1] != '%')
+	{
+	    tokens = g_list_prepend (tokens, g_strndup (sp, 2));
+	}
+	else
+	{
+	    tokens = g_list_prepend (tokens, g_strdup ("%"));
+	}
+	if (!sp[1]) break;
+	sps = sp+2;
+    }
+    /* add what's left */
+    if (sps[0] != 0)
+	tokens = g_list_prepend (tokens, g_strdup (sps));
+
+    /* If the "last" token does not contain a '.' (like in ".mp3"),
+       remove the filename extension ("somefile.mp3" -> "somefile")
+       because no extension was given in the template */
+    str = g_list_nth_data (tokens, 0);
+    if (str && (strchr (str, '.') == NULL))
+    {
+	gchar *str = strrchr (fn, '.');
+	if (str) str[0] = 0;
+    }
+
+#ifdef DEBUG
+    puts (tpl);
+    for (gl=tokens; gl; gl=gl->next)
+	puts (gl->data);
+    puts (fn);
+#endif
+
+    /* use the tokens to parse the filename */
+    gl = tokens;
+    while (gl)
+    {
+	gchar *token = gl->data;
+	/* remember: all tokens starting with '%' and two chars long
+	   specify a field */
+	if ((token[0] == '%') && (strlen (token) == 2))
+	{   /* handle tag item */
+	    GList *gln = gl->next;
+	    if (gln)
+	    {
+		gchar *itm;
+		gchar *next_token = gln->data;
+		/* find next token so we can determine where the
+		   current field ends */
+		gchar *fnp = g_strrstr (fn, next_token);
+
+		if (!fnp)
+		{
+		    parse_error = TRUE;
+		    break;
+		}
+
+		/* truncate the filename (for the next token) */
+		fnp[0] = 0;
+		/* adjust fnp to point to the start of the field */
+		fnp = fnp + strlen (next_token);
+#ifdef DEBUG
+		printf ("%s: '%s'\n", token, fnp);
+#endif
+		itm = g_strstrip (g_strdup (fnp));
+		switch (token[1])
+		{
+		case 'a': /* artist */
+		    if (track &&
+			(!track->artist || prefs_get_int("parsetags_overwrite")))
+		    {
+			g_free (track->artist);
+			track->artist = itm;
+		    }
+		    break;
+		case 'A': /* album */
+		    if (track &&
+			(!track->album || prefs_get_int("parsetags_overwrite")))
+		    {
+			g_free (track->album);
+			track->album = itm;
+		    }
+		    break;
+		case 'c': /* composer */
+		    if (track &&
+			(!track->composer || prefs_get_int("parsetags_overwrite")))
+		    {
+			g_free (track->composer);
+			track->composer = itm;
+		    }
+		    break;
+		case 't': /* title */
+		    if (track &&
+			(!track->title || prefs_get_int("parsetags_overwrite")))
+		    {
+			g_free (track->title);
+			track->title = itm;
+		    }
+		    break;
+		case 'g': /* genre */
+		case 'G': /* genre */
+		    if (track &&
+			(!track->genre || prefs_get_int("parsetags_overwrite")))
+		    {
+			g_free (track->genre);
+			track->genre = itm;
+		    }
+		    break;
+		case 'T': /* track */
+		    if (track &&
+			((track->track_nr == 0) ||
+			 prefs_get_int("parsetags_overwrite")))
+			track->track_nr = atoi (itm);
+		    g_free (itm);
+		    break;
+		case 'C': /* CD */
+		    if (track &&
+			(track->cd_nr == 0 || prefs_get_int("parsetags_overwrite")))
+			track->cd_nr = atoi (itm);
+		    g_free (itm);
+		    break;
+		case 'Y': /* year */
+		    if (track &&
+			(track->year == 0 || prefs_get_int("parsetags_overwrite")))
+			track->year = atoi (itm);
+		    g_free (itm);
+		    break;
+		case '*': /* placeholder to skip a field */
+		    g_free (itm);
+		    break;
+		default:
+		    g_free (itm);
+		    gtkpod_warning (_("Unknown token '%s' in template '%s'\n"),
+				    token, template);
+		    parse_error = TRUE;
+		    break;
+		}
+		if (parse_error) break;
+		gl = gln->next;
+	    }
+	    else
+	    { /* if (gln)...else... */
+		break;
+	    }
+	}
+	else
+	{   /* skip text */
+	    gchar *fnp = g_strrstr (fn, token);
+	    if (!fnp)
+	    {
+		parse_error = TRUE;
+		break;  /* could not match */
+	    }
+	    if (fnp - fn + strlen (fnp) != strlen (fn))
+	    {
+		parse_error = TRUE;
+		break; /* not at the last position */
+	    }
+	    fnp[0] = 0;
+	    gl = gl->next;
+	}
+    }
+
+    g_free (fn);
+    g_free (tpl);
+    g_list_foreach (tokens, (GFunc)g_free, NULL);
+    g_list_free (tokens);
+    return (!parse_error);
+}
+
+/* parse the filename of @track and extract the tags as specified in
+   prefs_get_string("parsetags_template"). Several templates can be separated
+   with the "," character. */
+static void parse_filename (Track *track)
+{
+    ExtraTrackData *etr;
+    gchar *template;
+    gchar **templates, **tplp;
+
+    g_return_if_fail (track);
+    etr = track->userdata;
+    g_return_if_fail (etr);
+
+    template = prefs_get_string("parsetags_template");
+    if (!template) return;
+    templates = g_strsplit (template, ";", 0);
+    tplp = templates;
+    while (*tplp)
+    {
+	if (parse_filename_with_template (NULL, etr->pc_path_utf8, *tplp))
+	    break;
+	++tplp;
+    }
+    if (*tplp)  parse_filename_with_template (track, etr->pc_path_utf8, *tplp);
+    g_strfreev (templates);
+    g_free(template);
+}
+
+/* Set entry "column" (TM_COLUMN_TITLE etc) according to filename */
+/* TODO: make the TAG extraction more intelligent -- if possible, this
+   should be user configurable. */
+static void set_entry_from_filename (Track *track, gint column)
+{
+    ExtraTrackData *etr;
+
+    g_return_if_fail (track);
+    etr = track->userdata;
+    g_return_if_fail (etr);
+
+    if (prefs_get_int_index("tag_autoset", column) &&
+	etr->pc_path_utf8 && strlen (etr->pc_path_utf8))
+    {
+	switch (column)
+	{
+	case TM_COLUMN_TITLE:
+	    g_free (track->title);
+	    track->title = g_path_get_basename (etr->pc_path_utf8);
+	    break;
+	case TM_COLUMN_ALBUM:
+	    g_free (track->album);
+	    track->album = g_path_get_basename (etr->pc_path_utf8);
+	    break;
+	case TM_COLUMN_ARTIST:
+	    g_free (track->artist);
+	    track->artist = g_path_get_basename (etr->pc_path_utf8);
+	    break;
+	case TM_COLUMN_GENRE:
+	    g_free (track->genre);
+	    track->genre = g_path_get_basename (etr->pc_path_utf8);
+	    break;
+	case TM_COLUMN_COMPOSER:
+	    g_free (track->composer);
+	    track->composer = g_path_get_basename (etr->pc_path_utf8);
+	    break;
+	}
+    }
+}
+
+
+static void set_unset_entries_from_filename (Track *track)
+{
+    /* try to fill tags from filename */
+    if (prefs_get_int("parsetags"))
+			parse_filename (track);
+    /* fill up what is left unset */
+    if (!track->album && prefs_get_int_index("tag_autoset", TM_COLUMN_ALBUM))
+			set_entry_from_filename (track, TM_COLUMN_ALBUM);
+    if (!track->artist && prefs_get_int_index("tag_autoset", TM_COLUMN_ARTIST))
+			set_entry_from_filename (track, TM_COLUMN_ARTIST);
+    if (!track->title && prefs_get_int_index("tag_autoset", TM_COLUMN_TITLE))
+			set_entry_from_filename (track, TM_COLUMN_TITLE);
+    if (!track->genre && prefs_get_int_index("tag_autoset", TM_COLUMN_GENRE))
+			set_entry_from_filename (track, TM_COLUMN_GENRE);
+    if (!track->composer && prefs_get_int_index("tag_autoset", 
+																								TM_COLUMN_COMPOSER))
+		{
+			set_entry_from_filename (track, TM_COLUMN_COMPOSER);
+		}
+}
+
+
+/* update the track->charset info with the currently used charset */
+void update_charset_info (Track *track)
+{
+    const gchar *charset = prefs_get_string("charset");
+    ExtraTrackData *etr;
+
+    g_return_if_fail (track);
+    etr = track->userdata;
+    g_return_if_fail (etr);
+
+    C_FREE (etr->charset);
+    if (!charset || !strlen (charset))
+    {    /* use standard locale charset */
+	g_get_charset (&charset);
+    }
+    /* only set charset if it's not GTKPOD_JAPAN_AUTOMATIC */
+    if (charset && (strcmp (charset, GTKPOD_JAPAN_AUTOMATIC) != 0))
+    {
+	etr->charset = g_strdup (charset);
+    }
+}
+
+
+/* Copy "new" info read from file to an old Track structure. */
+/* Return value: TRUE: at least one item was changed. FALSE: track was
+   unchanged */
+static gboolean copy_new_info (Track *from, Track *to)
+{
+    ExtraTrackData *efrom, *eto;
+    T_item item;
+    gboolean changed = FALSE;
+
+    g_return_val_if_fail (from, FALSE);
+    g_return_val_if_fail (to, FALSE);
+    efrom = from->userdata;
+    eto = to->userdata;
+    g_return_val_if_fail (efrom, FALSE);
+    g_return_val_if_fail (eto, FALSE);
+
+    for (item=0; item<T_ITEM_NUM; ++item)
+    {
+	switch (item)
+	{
+	case T_ALBUM:
+	case T_ARTIST:
+	case T_TITLE:
+	case T_GENRE:
+	case T_COMMENT:
+	case T_COMPOSER:
+	case T_FILETYPE:
+	case T_DESCRIPTION:
+	case T_PODCASTURL:
+	case T_PODCASTRSS:
+	case T_SUBTITLE:
+	case T_TV_SHOW:
+	case T_TV_EPISODE:
+	case T_TV_NETWORK:
+	case T_THUMB_PATH:
+	case T_PC_PATH:
+	case T_ALBUMARTIST:
+	case T_SORT_ARTIST:
+	case T_SORT_TITLE:
+	case T_SORT_ALBUM:
+	case T_SORT_ALBUMARTIST:
+	case T_SORT_COMPOSER:
+	case T_SORT_TVSHOW:
+	case T_YEAR:
+	case T_TRACK_NR:
+	case T_SIZE:
+	case T_TRACKLEN:
+	case T_STARTTIME:
+	case T_STOPTIME:
+	case T_BITRATE:
+	case T_SAMPLERATE:
+	case T_BPM:
+	case T_TIME_ADDED:
+	case T_TIME_MODIFIED:
+	case T_TIME_RELEASED:
+	case T_SOUNDCHECK:
+	case T_CD_NR:
+	case T_COMPILATION:
+	case T_MEDIA_TYPE:
+	case T_SEASON_NR:
+	case T_EPISODE_NR:
+	case T_GROUPING:
+	    changed |= track_copy_item (from, to, item);
+	    break;
+	case T_CATEGORY:
+	    /* not implemented from tags */
+	    break;
+	case T_RATING:
+	case T_REMEMBER_PLAYBACK_POSITION:
+	case T_SKIP_WHEN_SHUFFLING:
+	case T_CHECKED:
+	case T_TIME_PLAYED:
+	case T_IPOD_PATH:
+	case T_ALL:
+	case T_IPOD_ID:
+	case T_TRANSFERRED:
+	case T_PLAYCOUNT:
+	case T_VOLUME:
+	case T_GAPLESS_TRACK_FLAG:
+	    /* not applicable */
+	    break;
+	case T_ITEM_NUM:
+	    g_return_val_if_reached (FALSE);
+	}
+    }
+
+    if ((eto->charset == NULL) || (strcmp (efrom->charset, eto->charset) != 0))
+    {
+	g_free (eto->charset);
+	eto->charset = g_strdup (efrom->charset);
+	changed = TRUE;
+    }
+
+    itdb_artwork_free (to->artwork);
+    to->artwork = itdb_artwork_duplicate (from->artwork);
+    if ((to->artwork_size != from->artwork_size) ||
+	(to->artwork_count != from->artwork_count) ||
+	(to->has_artwork != from->has_artwork))
+    {   /* FIXME -- artwork might have changed nevertheless */
+	changed = TRUE;
+	to->artwork_size = from->artwork_size;
+	to->artwork_count = from->artwork_count;
+	to->has_artwork = from->has_artwork;
+    }
+
+    if ((to->lyrics_flag != from->lyrics_flag) ||
+	(to->movie_flag != from->movie_flag))
+    {
+	changed = TRUE;
+	to->lyrics_flag = from->lyrics_flag;
+	to->movie_flag = from->movie_flag;
+    }
+
+    if ((to->pregap != from->pregap) ||
+	(to->postgap != from->postgap) ||
+	(to->samplecount != from->samplecount) ||
+	(to->gapless_data != from->gapless_data) ||
+	(to->gapless_track_flag != from->gapless_track_flag))
+    {
+	changed = TRUE;
+	to->pregap = from->pregap;
+	to->postgap = from->postgap;
+	to->samplecount = from->samplecount;
+	to->gapless_data = from->gapless_data;
+	to->gapless_track_flag = from->gapless_track_flag;
+    }
+
+    return changed;
+}
+
+/* Updates mserv data (rating only) of @track using filename @name to
+   look up mserv information.
+   Return TRUE if successfully updated (or disabled), FALSE if not */
+gboolean update_mserv_data_from_file (gchar *name, Track *track)
+{
+    gboolean success=TRUE;
+
+    if (!name || !track) return FALSE;
+
+    if (g_file_test (name, G_FILE_TEST_IS_DIR)) return FALSE;
+    if (!g_file_test (name, G_FILE_TEST_EXISTS))
+    {
+	gchar *buf = g_strdup_printf (_("Local filename not valid (%s)"), name);
+	display_mserv_problems (track, buf);
+	g_free (buf);
+	return FALSE;
+    }
+
+    if (prefs_get_int("mserv_use"))
+    {
+	/* try getting the user's rating from the mserv db */
+	gchar *music_root = prefs_get_string ("path_mserv_music_root");
+	gchar *trackinfo_root = prefs_get_string ("path_mserv_trackinfo_root");
+
+	/* we expect music_root and trackinfo_root to be initialized */
+	if (!music_root)
+	    music_root = g_strdup ("");
+	if (!trackinfo_root)
+	    trackinfo_root = g_strdup ("");
+	
+	success = FALSE;
+        /* printf("mroot %s troot %s fname %s\n", music_root, trackinfo_root, name); */
+
+        /* first, check if the file is in the mserv music directory */
+	if (*music_root == 0 || strstr(name, music_root))
+	{
+	    gchar *infoname = g_strdup_printf ("%s%c%s.trk",
+					   trackinfo_root,
+					   G_DIR_SEPARATOR,
+					   &(name[strlen(music_root)]));
+	    /* printf("trying %s\n", infoname); */
+	    FILE *fp = fopen (infoname, "r");
+	    if (fp)
+	    {
+		/* printf("opened\n");*/
+		gchar buff[PATH_MAX];
+		gchar *username = prefs_get_string("mserv_username");
+		guint usernamelen;
+		g_return_val_if_fail (username, (fclose (fp), FALSE));
+		usernamelen = strlen (username);
+		while (fgets(buff, PATH_MAX, fp))
+		{
+		    /* printf("username %s (%d) read %s\n",
+		     * prefs_get_string("mserv_username"), usernamelen,
+		     * buff);*/
+		    if (strncmp(buff, username, usernamelen) == 0
+			&& buff[usernamelen] == (gchar)'=')
+		    {
+			/* found it */
+			track->rating = atoi(&buff[usernamelen+1]) * ITDB_RATING_STEP;
+			/* printf("found it, = %d\n",
+			   orig_track->rating/ITDB_RATING_STEP); */
+			success = TRUE;
+			break; /* while(fgets(... */
+		    }
+		}
+		fclose(fp);
+		g_free(username);
+		if (!success)
+		{
+		    gchar *username = prefs_get_string("mserv_username");
+		    gchar *buf = g_strdup_printf (_("No information found for user '%s' in '%s'"), 
+						  username, infoname);
+		    display_mserv_problems (track, buf);
+		    g_free (buf);
+		    g_free(username);
+		}
+	    }
+	    else
+	    {
+		gchar *buf = g_strdup_printf (_("mserv data file (%s) not available for track (%s)"), infoname, name);
+		display_mserv_problems (track, buf);
+		g_free (buf);
+	    }
+	    g_free (infoname);
+	}
+	else
+	{
+	    gchar *buf = g_strdup_printf (_("Track (%s) not in mserv music root directory (%s)"), name, music_root);
+	    display_mserv_problems (track, buf);
+	    g_free (buf);
+	}
+	g_free (music_root);
+	g_free (trackinfo_root);
+    }
+
+    while (widgets_blocked && gtk_events_pending ())
+	gtk_main_iteration ();
+
+    return success;
+}
+
+
+
+/* look for a picture specified by coverart_template  */
+static void add_coverart (Track *tr)
+{
+    ExtraTrackData *etr;
+    gchar *full_template;
+    gchar **templates, **tplp;
+    gchar *dirname;
+    gchar *filename_local = NULL;
+
+    g_return_if_fail (tr);
+    etr = tr->userdata;
+    g_return_if_fail (etr);
+
+    dirname = g_path_get_dirname (etr->pc_path_utf8);
+
+    full_template = prefs_get_string("coverart_template");
+
+    templates = g_strsplit (full_template, ";", 0);
+    tplp = templates;
+    while (*tplp && !filename_local)
+    {
+	gchar *filename_utf8;
+	gchar *fname = get_string_from_template (tr, *tplp, FALSE, FALSE);
+	if (fname)
+	{
+	    if (strchr (*tplp, '.') != NULL)
+	    {   /* if template has an extension, try if it is valid */
+		filename_utf8 = g_build_filename (dirname, fname, NULL);
+		filename_local = charset_from_utf8 (filename_utf8);
+		g_free (filename_utf8);
+		if (!g_file_test (filename_local, G_FILE_TEST_EXISTS))
+		{
+		    g_free (filename_local);
+		    filename_local = NULL;
+		}
+	    }
+	    if (!filename_local)
+	    {   /* if no filename is found try out different extensions */
+		const gchar **extp = imageext;
+		while (*extp && !filename_local)
+		{
+		    gchar *ffname = g_strconcat (fname, *extp, NULL);
+		    filename_utf8 = g_build_filename (dirname, ffname, NULL);
+		    g_free (ffname);
+		    filename_local = charset_from_utf8 (filename_utf8);
+		    g_free (filename_utf8);
+		    if (!g_file_test (filename_local, G_FILE_TEST_EXISTS))
+		    {
+			g_free (filename_local);
+			filename_local = NULL;
+		    }
+		    ++extp;
+		}
+		extp = imageext;
+		while (*extp && !filename_local)
+		{   /* try uppercase version of extension */
+		    gchar *upper_ext = g_ascii_strup (*extp, -1);
+		    gchar *ffname = g_strconcat (fname, upper_ext, NULL);
+		    g_free (upper_ext);
+		    filename_utf8 = g_build_filename (dirname, ffname, NULL);
+		    g_free (ffname);
+		    filename_local = charset_from_utf8 (filename_utf8);
+		    g_free (filename_utf8);
+		    if (!g_file_test (filename_local, G_FILE_TEST_EXISTS))
+		    {
+			g_free (filename_local);
+			filename_local = NULL;
+		    }
+		    ++extp;
+		}
+	    }
+	}
+	g_free (fname);
+	++tplp;
+    }
+
+    if (filename_local)
+    {
+	gp_track_set_thumbnails (tr, filename_local);
+    }
+
+    g_strfreev (templates);
+    g_free(full_template);
+}
+
+
+
+/* Fills the supplied @orig_track with data from the file @name. If
+ * @orig_track is NULL, a new track struct is created. The entries
+ * pc_path_utf8 and pc_path_locale are not changed if an entry already
+ * exists. time_added is not modified if already set. */
+/* Returns NULL on error, a pointer to the Track otherwise */
+static Track *get_track_info_from_file (gchar *name, Track *orig_track)
+{
+    Track *track = NULL;
+    Track *nti = NULL;
+    FileType filetype;
+    gint len;
+    gchar *name_utf8 = NULL;
+
+    g_return_val_if_fail (name, NULL);
+
+    if (g_file_test (name, G_FILE_TEST_IS_DIR)) return NULL;
+
+    name_utf8 = charset_to_utf8 (name);
+
+    if (!g_file_test (name, G_FILE_TEST_EXISTS))
+    {
+	gtkpod_warning (_("The following track could not be processed (file does not exist): '%s'\n"), name_utf8);
+	g_free (name_utf8);
+	return NULL;
+    }
+
+    /* reset the auto detection charset (see explanation in charset.c) */
+    charset_reset_auto ();
+
+    /* check for filetype */
+    len = strlen (name);
+    if (len < 4) return NULL;
+
+    filetype = determine_file_type(name);
+    switch (filetype)
+    {
+    case FILE_TYPE_MP3:
+	nti = mp3_get_file_info (name);
+	/* Set mediatype to audio */
+	if (nti) nti->mediatype = ITDB_MEDIATYPE_AUDIO;
+	break;
+    case FILE_TYPE_M4A:
+    case FILE_TYPE_M4P:
+	nti = mp4_get_file_info (name);
+	/* Set mediatype to audio */
+	if (nti)
+	{
+	    nti->mediatype = ITDB_MEDIATYPE_AUDIO;
+	}
+	break;
+    case FILE_TYPE_M4B:
+	nti = mp4_get_file_info (name);
+	/* Set mediatype to audiobook */
+	if (nti)
+	{
+	    nti->mediatype = ITDB_MEDIATYPE_AUDIOBOOK;
+	}
+	break;
+    case FILE_TYPE_WAV:
+	nti = wav_get_file_info (name);
+	/* Set mediatype to audio */
+	if (nti)
+	{
+	    nti->mediatype = ITDB_MEDIATYPE_AUDIO;
+	}
+	break;
+    case FILE_TYPE_OGG:
+        nti = ogg_get_file_info (name);
+        /* Set mediatype to audio */
+        if (nti)
+        {
+            nti->mediatype = ITDB_MEDIATYPE_AUDIO;
+        }
+        break;
+    case FILE_TYPE_FLAC:
+        nti = flac_get_file_info (name);
+        /* Set mediatype to audio */
+        if (nti)
+        {
+            nti->mediatype = ITDB_MEDIATYPE_AUDIO;
+        }
+        break;
+    case FILE_TYPE_M4V:
+    case FILE_TYPE_MP4:
+	/* I don't know if .m4v and .mp4 can simply be handled like
+	   this. Let's see if someone complains. */
+	nti = mp4_get_file_info (name);
+	if (!nti) video_get_file_info (name);
+	/* Set mediatype to video */
+	if (nti)
+	{
+	    nti->mediatype = ITDB_MEDIATYPE_MOVIE;
+	    nti->movie_flag = 0x01;
+	}	
+	break;
+    case FILE_TYPE_MOV:
+    case FILE_TYPE_MPG:
+	/* for now treat all the same */
+	nti = video_get_file_info (name);
+	/* Set mediatype to video */
+	if (nti)
+	{
+	    nti->mediatype = ITDB_MEDIATYPE_MOVIE;
+	    nti->movie_flag = 0x01;
+	}
+	break;
+    case FILE_TYPE_UNKNOWN:
+	gtkpod_warning (_("The following track could not be processed (filetype unknown): '%s'\n"), name_utf8);
+	g_free (name_utf8);
+	return NULL;
+    case FILE_TYPE_IMAGE:
+    case FILE_TYPE_DIRECTORY:
+    case FILE_TYPE_M3U:
+    case FILE_TYPE_PLS:
+	break;
+    }
+
+    if (nti)
+    {
+	ExtraTrackData *enti=nti->userdata;
+	struct stat filestat;
+
+	g_return_val_if_fail (enti, NULL);
+
+	if (enti->charset == NULL)
+	{   /* Fill in currently used charset. Try if auto_charset is
+	     * set first. If not, use the currently set charset. */
+	    enti->charset = charset_get_auto ();
+	    if (enti->charset == NULL)
+		update_charset_info (nti);
+	}
+	/* set path file information */
+	enti->pc_path_utf8 = charset_to_utf8 (name);
+	enti->pc_path_locale = g_strdup (name);
+	/* set length of file */
+	stat (name, &filestat);
+	nti->size = filestat.st_size; /* get the filesize in bytes */
+	enti->mtime = filestat.st_mtime; /* get the modification date */
+	if (nti->bitrate == 0)
+	{  /* estimate bitrate */
+	    if (nti->tracklen)
+		nti->bitrate = nti->size * 8 / nti->tracklen;
+	}
+	/* Set unset strings (album...) from filename */
+	set_unset_entries_from_filename (nti);
+
+	/* Set coverart */
+	if (prefs_get_int("coverart_file"))
+	{
+	    /* APIC data takes precedence */
+	    if (!nti->artwork || !nti->artwork->thumbnails)
+		add_coverart (nti);
+	}
+
+	/* Set modification date to the files modified date */
+	nti->time_modified = enti->mtime;
+	/* Set added date to *now* (unless orig_track is present) */
+	if (orig_track)
+	{
+	    nti->time_added = orig_track->time_added;
+	}
+	else
+	{
+	    nti->time_added = time (NULL);
+	}
+
+	/* Make sure all strings are initialized -- that way we don't
+	   have to worry about it when we are handling the
+	   strings. Also, validate_entries() will fill in the utf16
+	   strings if that hasn't already been done. */
+	/* exception: sha1_hash, charset and hostname: these may be
+	 * NULL. */
+
+	gp_track_validate_entries (nti);
+
+	if (orig_track)
+	{ /* we need to copy all information over to the original
+	   * track */
+	    ExtraTrackData *eorigtr=orig_track->userdata;
+
+	    g_return_val_if_fail (eorigtr, NULL);
+
+	    eorigtr->tchanged = copy_new_info (nti, orig_track);
+
+	    track = orig_track;
+	    itdb_track_free (nti);
+	    nti = NULL;
+	}
+	else
+	{ /* just use nti */
+	    track = nti;
+	    nti = NULL;
+	}
+
+	update_mserv_data_from_file (name, track);
+    }
+    else
+    {
+	switch (filetype)
+	{
+	case FILE_TYPE_IMAGE:
+	case FILE_TYPE_M3U:
+	case FILE_TYPE_PLS:
+	    break;
+	default:
+	    gtkpod_warning (_("The following track could not be processed (filetype is known but analysis failed): '%s'\n"), name_utf8);
+	    break;
+	}
+    }
+
+    while (widgets_blocked && gtk_events_pending ())
+	gtk_main_iteration ();
+
+    g_free (name_utf8);
+
+    return track;
+}
+
+
+/*------------------------------------------------------------------*\
+ *                                                                  *
+ *      Update Track Data from File                                  *
+ *                                                                  *
+\*------------------------------------------------------------------*/
+
+
+/* reads info from file and updates the ID3 tags of
+   @selected_tracks. */
+void update_tracks (GList *selected_tracks)
+{
+    GList *gl;
+    iTunesDB *itdb = NULL;
+
+    if (selected_tracks == NULL)
+    {
+	gtkpod_statusbar_message(_("Nothing to update"));
+	return;
+    }
+
+    block_widgets ();
+    for (gl=selected_tracks; gl; gl=gl->next)
+    {
+	Track *track = gl->data;
+	g_return_if_fail (track);
+
+	/* update_track_from_file() may possibly remove tracks from
+	   the database, so we need to check if the track we are
+	   referencing to is still valid. To do so we first have to
+	   secure a valid pointer to an itdb. Since the first track in
+	   selected_tracks is always valid, we take that one. */
+	if (!itdb)
+	    itdb = track->itdb;
+	g_return_if_fail (itdb);
+	if (g_list_find (itdb->tracks, track))
+	{
+	    gchar *buf = get_track_info (track, TRUE);
+	    gtkpod_statusbar_message (_("Updating %s"), buf);
+	    g_free (buf);
+	    update_track_from_file (track->itdb, track);
+	}
+    }
+    release_widgets ();
+    /* display log of non-updated tracks */
+    display_non_updated (NULL, NULL);
+    /* display log of updated tracks */
+    display_updated (NULL, NULL);
+    /* display log of problems with mserv data */
+    display_mserv_problems (NULL, NULL);
+    /* display log of detected duplicates */
+    gp_duplicate_remove (NULL, NULL);
+    gtkpod_statusbar_message(_("Updated selected tracks with info from file."));
+}
+
+
+/*------------------------------------------------------------------*\
+ *                                                                  *
+ *      Update mserv Data from File                                 *
+ *                                                                  *
+\*------------------------------------------------------------------*/
+
+
+/* reads info from file and updates the ID3 tags of
+   @selected_tracks. */
+void mserv_from_file_tracks (GList *selected_tracks)
+{
+    GList *gl;
+
+    if (selected_tracks == NULL)
+    {
+	gtkpod_statusbar_message(_("Nothing to update"));
+	return;
+    }
+
+    block_widgets ();
+    for (gl = selected_tracks; gl; gl=gl->next)
+    {
+	ExtraTrackData *etr;
+	Track *track = gl->data;
+	gchar *buf;
+	g_return_if_fail (track);
+	etr = track->userdata;
+	g_return_if_fail (etr);
+
+	buf = get_track_info (track, TRUE);
+	gtkpod_statusbar_message (_("Retrieving mserv data %s"), buf);
+	g_free (buf);
+	if (etr->pc_path_locale && *etr->pc_path_locale)
+	    update_mserv_data_from_file (etr->pc_path_locale, track);
+	else
+	    display_mserv_problems (track, _("no filename available"));
+    }
+    release_widgets ();
+    /* display log of problems with mserv data */
+    display_mserv_problems (NULL, NULL);
+    gtkpod_statusbar_message(_("Updated selected tracks with data from mserv."));
+}
+
+
+
+/* Logs tracks (@track) that could not be updated from file for some
+   reason. Pop up a window with the log by calling with @track = NULL,
+   or remove the log by calling with @track = -1.
+   @txt (if available)w is added as an explanation as to why it was
+   impossible to update the track */
+void display_non_updated (Track *track, gchar *txt)
+{
+   gchar *buf;
+   static gint track_nr = 0;
+   static GString *str = NULL;
+
+   if ((track == NULL) && str)
+   {
+       if (prefs_get_int("show_non_updated") && str->len)
+       { /* Some tracks have not been updated. Print a notice */
+	   buf = g_strdup_printf (
+	       ngettext ("The following track could not be updated",
+			 "The following %d tracks could not be updated",
+			 track_nr), track_nr);
+	   gtkpod_confirmation
+	       (-1,                 /* gint id, */
+		FALSE,              /* gboolean modal, */
+		_("Failed Track Update"),   /* title */
+		buf,                /* label */
+		str->str,           /* scrolled text */
+		NULL, 0, NULL,          /* option 1 */
+		NULL, 0, NULL,          /* option 2 */
+		TRUE,               /* gboolean confirm_again, */
+		"show_non_updated",/* confirm_again_key,*/
+		CONF_NULL_HANDLER,  /* ConfHandler ok_handler,*/
+		NULL,               /* don't show "Apply" button */
+		NULL,               /* cancel_handler,*/
+		NULL,               /* gpointer user_data1,*/
+		NULL);              /* gpointer user_data2,*/
+	   g_free (buf);
+       }
+       display_non_updated ((void *)-1, NULL);
+   }
+
+   if (track == (void *)-1)
+   { /* clean up */
+       if (str)       g_string_free (str, TRUE);
+       str = NULL;
+       track_nr = 0;
+       gtkpod_tracks_statusbar_update();
+   }
+   else if (prefs_get_int("show_non_updated") && track)
+   {
+       /* add info about it to str */
+       buf = get_track_info (track, TRUE);
+       if (!str)
+       {
+	   track_nr = 0;
+	   str = g_string_sized_new (2000); /* used to keep record of
+					     * non-updated tracks */
+       }
+       if (txt) g_string_append_printf (str, "%s (%s)\n", buf, txt);
+       else     g_string_append_printf (str, "%s\n", buf);
+       g_free (buf);
+       ++track_nr; /* count tracks */
+   }
+}
+
+
+/* Logs tracks (@track) that could be updated from file. Pop up a window
+   with the log by calling with @track = NULL, or remove the log by
+   calling with @track = -1.
+   @txt (if available)w is added as an explanation as to why it was
+   impossible to update the track */
+void display_updated (Track *track, gchar *txt)
+{
+   gchar *buf;
+   static gint track_nr = 0;
+   static GString *str = NULL;
+
+   if (prefs_get_int("show_updated") && (track == NULL) && str)
+   {
+       if (str->len)
+       { /* Some tracks have been updated. Print a notice */
+	   buf = g_strdup_printf (
+	       ngettext ("The following track has been updated",
+			 "The following %d tracks have been updated",
+			 track_nr), track_nr);
+	   gtkpod_confirmation
+	       (-1,                 /* gint id, */
+		FALSE,              /* gboolean modal, */
+		_("Successful Track Update"),   /* title */
+		buf,                /* label */
+		str->str,           /* scrolled text */
+		NULL, 0, NULL,          /* option 1 */
+		NULL, 0, NULL,          /* option 2 */
+		TRUE,               /* gboolean confirm_again, */
+		"show_updated",/* confirm_again_key,*/
+		CONF_NULL_HANDLER,  /* ConfHandler ok_handler,*/
+		NULL,               /* don't show "Apply" button */
+		NULL,               /* cancel_handler,*/
+		NULL,               /* gpointer user_data1,*/
+		NULL);              /* gpointer user_data2,*/
+	   g_free (buf);
+       }
+       display_updated ((void *)-1, NULL);
+   }
+
+   if (track == (void *)-1)
+   { /* clean up */
+       if (str)       g_string_free (str, TRUE);
+       str = NULL;
+       track_nr = 0;
+       gtkpod_tracks_statusbar_update();
+   }
+   else if (prefs_get_int("show_updated") && track)
+   {
+       /* add info about it to str */
+       buf = get_track_info (track, TRUE);
+       if (!str)
+       {
+	   track_nr = 0;
+	   str = g_string_sized_new (2000); /* used to keep record of
+					     * non-updated tracks */
+       }
+       if (txt) g_string_append_printf (str, "%s (%s)\n", buf, txt);
+       else     g_string_append_printf (str, "%s\n", buf);
+       g_free (buf);
+       ++track_nr; /* count tracks */
+   }
+}
+
+
+/* Logs tracks (@track) that could not be updated with info from mserv
+   database for some reason. Pop up a window with the log by calling
+   with @track = NULL, or remove the log by calling with @track = -1.
+   @txt (if available) is added as an explanation as to why it was
+   impossible to retrieve mserv information */
+void display_mserv_problems (Track *track, gchar *txt)
+{
+   gchar *buf;
+   static gint track_nr = 0;
+   static GString *str = NULL;
+
+   if ((track == NULL) && str)
+   {
+       if (prefs_get_int("mserv_use") &&
+	   prefs_get_int("mserv_report_probs") && str->len)
+       { /* Some tracks have had problems. Print a notice */
+	   buf = g_strdup_printf (
+	       ngettext ("No mserv information could be retrieved for the following track",
+			 "No mserv information could be retrieved for the following %d tracks",
+			 track_nr), track_nr);
+	   gtkpod_confirmation
+	       (-1,                 /* gint id, */
+		FALSE,              /* gboolean modal, */
+		_("mserv data retrieval problem"),   /* title */
+		buf,                /* label */
+		str->str,           /* scrolled text */
+		NULL, 0, NULL,          /* option 1 */
+		NULL, 0, NULL,          /* option 2 */
+		TRUE,               /* gboolean confirm_again, */
+		"mserv_report_probs",/* confirm_again_key,*/
+		CONF_NULL_HANDLER,  /* ConfHandler ok_handler,*/
+		NULL,               /* don't show "Apply" button */
+		NULL,               /* cancel_handler,*/
+		NULL,               /* gpointer user_data1,*/
+		NULL);              /* gpointer user_data2,*/
+	   g_free (buf);
+       }
+       display_mserv_problems ((void *)-1, NULL);
+   }
+
+   if (track == (void *)-1)
+   { /* clean up */
+       if (str)       g_string_free (str, TRUE);
+       str = NULL;
+       track_nr = 0;
+       gtkpod_tracks_statusbar_update();
+   }
+   else if (prefs_get_int("mserv_use") &&
+	    prefs_get_int("mserv_report_probs") && track)
+   {
+       /* add info about it to str */
+       buf = get_track_info (track, TRUE);
+       if (!str)
+       {
+	   track_nr = 0;
+	   str = g_string_sized_new (2000); /* used to keep record */
+       }
+       if (txt) g_string_append_printf (str, "%s (%s)\n", buf, txt);
+       else     g_string_append_printf (str, "%s\n", buf);
+       g_free (buf);
+       ++track_nr; /* count tracks */
+   }
+}
+
+
+/* Update information of @track from data in original file. If the
+ * original filename is not available, information will be updated
+ * from the copy on the iPod and a warning is printed.
+
+   A list of non-updated tracks can be displayed by calling
+   display_non_updated (NULL, NULL). This list can be deleted by
+   calling display_non_updated ((void *)-1, NULL);
+
+   It is also possible that duplicates get detected in the process --
+   a list of those can be displayed by calling "gp_duplicate_remove
+   (NULL, NULL)", that list can be deleted by calling
+   "gp_duplicate_remove (NULL, (void *)-1)"*/
+void update_track_from_file (iTunesDB *itdb, Track *track)
+{
+    ExtraTrackData *oetr;
+    Track *oldtrack;
+    gchar *prefs_charset = NULL;
+    gchar *trackpath = NULL;
+    gint32 oldsize = 0;
+    gboolean charset_set;
+
+    g_return_if_fail (itdb);
+    g_return_if_fail (track);
+    oetr = track->userdata;
+    g_return_if_fail (oetr);
+    /* remember size of track on iPod */
+    if (track->transferred) oldsize = track->size;
+    else                    oldsize = 0;
+
+    /* remember if charset was set */
+    if (oetr->charset)  charset_set = TRUE;
+    else               charset_set = FALSE;
+
+    if (!prefs_get_int("update_charset") && charset_set)
+    {   /* we should use the initial charset for the update */
+	prefs_charset = prefs_get_string("charset");
+	/* use the charset used when first importing the track */
+	prefs_set_string("charset", oetr->charset);
+    }
+
+    trackpath = get_file_name_from_source (track, SOURCE_PREFER_LOCAL);
+
+    
+    if (!(oetr->pc_path_locale && *oetr->pc_path_locale))
+    { /* no path available */
+	if (trackpath)
+	{
+	    display_non_updated (track, _("no local filename available, file on the iPod will be used instead"));
+	}
+	else
+	{
+	    if (itdb->usertype & GP_ITDB_TYPE_IPOD)
+	    {
+		display_non_updated (track, _("no local filename available and copy on iPod cannot be found"));
+	    }
+	    else
+	    {
+		display_non_updated (track, _("no local filename available"));
+	    }
+	}
+    }
+    else if (!g_file_test (oetr->pc_path_locale, G_FILE_TEST_EXISTS))
+    {
+	if (trackpath)
+	{
+	    display_non_updated (track, _("local file could not be found, file on the iPod will be used instead"));
+	}
+	else
+	{
+	    if (itdb->usertype & GP_ITDB_TYPE_IPOD)
+	    {
+		display_non_updated (track, _("local file as well as copy on the iPod cannot be found"));
+	    }
+	    else
+	    {
+		display_non_updated (track, _("no local filename available"));
+	    }
+	}
+    }
+
+    if (trackpath && get_track_info_from_file (trackpath, track))
+    { /* update successful */
+	ExtraTrackData *netr = track->userdata;
+
+	/* remove track from sha1 hash and reinsert it
+	   (hash value may have changed!) */
+	gchar *oldhash = oetr->sha1_hash;
+
+	sha1_track_remove (track);
+	/* need to remove the old value manually! */
+	oetr->sha1_hash = NULL;
+	oldtrack = sha1_track_exists_insert (itdb, track);
+	if (oldtrack) { /* track exists, remove old track
+			  and register the new version */
+	    sha1_track_remove (oldtrack);
+	    gp_duplicate_remove (track, oldtrack);
+	    sha1_track_exists_insert (itdb, track);
+	}
+
+	if (itdb->usertype & GP_ITDB_TYPE_IPOD)
+	{   /* track may have to be copied to iPod on next export */
+	    gchar *name_on_ipod;
+	    gboolean transfer_again = FALSE;
+
+	    name_on_ipod = get_file_name_from_source (track, SOURCE_IPOD);
+	    if (name_on_ipod && (strcmp (name_on_ipod, trackpath) != 0))
+	    {   /* trackpath is not on the iPod */
+		if (oldhash && oetr->sha1_hash)
+		{   /* do we really have to copy the track again? */
+		    if (strcmp (oldhash, oetr->sha1_hash) != 0)
+		    {
+			transfer_again = TRUE;
+		    }
+		}
+		else
+		{   /* no hash available -- copy! */
+		    transfer_again = TRUE;
+		}
+	    }
+	    else
+	    {
+		data_changed (itdb);
+	    }
+
+	    if (transfer_again)
+	    {   /* We need to copy the track back to the iPod. That's done
+		   marking a copy of the original track for deletion and
+		   then adding the original track to the
+		   conversion/transfer list */
+		Track *new_track = gp_track_new ();
+		ExtraTrackData *new_etr = new_track->userdata;
+		g_return_if_fail (new_etr);
+
+		new_track->size = oldsize;
+		new_track->ipod_path = track->ipod_path;
+		track->ipod_path = g_strdup ("");
+		track->transferred = FALSE;
+
+		/* cancel conversion/transfer of track */
+		file_convert_cancel_track (track);
+		/* mark the track for deletion on the ipod */
+		mark_track_for_deletion (itdb, new_track);
+		/* reschedule conversion/transfer of track */
+		file_convert_add_track (track);
+
+		netr->tchanged = TRUE;
+	    }
+
+	    g_free (name_on_ipod);
+	}
+
+	/* Set this flag to true to ensure artwork is reread from file */
+	netr->tartwork_changed = TRUE;
+	
+	/* notify display model */
+	if (netr->tchanged)
+	{
+	    pm_track_changed (track);
+	    data_changed (itdb);
+	    netr->tchanged = FALSE;
+	}
+	else
+	{
+		/* Rather than depend on the track data being changed, only the artwork may have changed
+		 * hence the reason for the user updating from file
+		 */
+		coverart_track_changed (track, COVERART_CHANGE_SIGNAL);
+	}
+	
+	display_updated (track, NULL);
+        g_free (oldhash);
+    }
+    else if (trackpath)
+    { /* update not successful -- log this track for later display */
+	display_non_updated (track, _("update failed (format not supported?)"));
+    }
+
+    if (!prefs_get_int("update_charset") && charset_set)
+    {   /* reset charset */
+	prefs_set_string("charset", prefs_charset);
+    }
+
+    g_free (trackpath);
+    g_free(prefs_charset);
+
+    while (widgets_blocked && gtk_events_pending ())  gtk_main_iteration ();
+}
+
+
+/*------------------------------------------------------------------*\
+ *                                                                  *
+ *      Add File                                                    *
+ *                                                                  *
+\*------------------------------------------------------------------*/
+
+/* Append file @fname to the list of tracks.
+   @fname is in the current locale
+   @plitem: if != NULL, add track to plitem as well (unless it's the MPL)
+   descend: TRUE:  add directories recursively
+            FALSE: add contents of directories passed but don't descend
+                   into its subdirectories */
+/* @addtrackfunc: if != NULL this will be called instead of
+   "add_track_to_playlist () -- used for dropping tracks at a specific
+   position in the track view */
+gboolean add_track_by_filename (iTunesDB *itdb, gchar *fname,
+				Playlist *plitem, gboolean descend,
+				AddTrackFunc addtrackfunc, gpointer data)
+{
+  static gint count = 0; /* do a gtkpod_tracks_statusbar_update() every
+			    10 tracks */
+  Track *oldtrack;
+  gchar str[PATH_MAX];
+  gchar *basename;
+  Playlist *mpl;
+  gboolean result = TRUE;
+
+  g_return_val_if_fail (fname, FALSE);
+  g_return_val_if_fail (itdb, FALSE);
+  mpl = itdb_playlist_mpl (itdb);
+  g_return_val_if_fail (mpl, FALSE);
+
+  if (!plitem)  plitem = mpl;
+
+  if (g_file_test (fname, G_FILE_TEST_IS_DIR))
+  {
+      return add_directory_by_name (itdb, fname, plitem, descend, addtrackfunc, data);
+  }
+
+  /* check if file is a playlist */
+  switch (determine_file_type(fname))
+  {
+  case FILE_TYPE_M3U:
+  case FILE_TYPE_PLS:
+      if (add_playlist_by_filename (itdb, fname, plitem, -1,
+				    addtrackfunc, data))
+	  return TRUE;
+      return FALSE;
+  case FILE_TYPE_MP3:
+  case FILE_TYPE_M4A:
+  case FILE_TYPE_M4P:
+  case FILE_TYPE_M4B:
+  case FILE_TYPE_WAV:
+  case FILE_TYPE_M4V:
+  case FILE_TYPE_MP4:
+  case FILE_TYPE_MOV:
+  case FILE_TYPE_MPG:
+  case FILE_TYPE_OGG:
+  case FILE_TYPE_FLAC:
+  case FILE_TYPE_IMAGE:
+  case FILE_TYPE_UNKNOWN:
+  case FILE_TYPE_DIRECTORY:
+      break;
+  }
+
+  /* print a message about which file is being processed */
+  basename = g_path_get_basename (fname);
+  if (basename)
+  {
+      gchar *bn_utf8 = charset_to_utf8 (basename);
+      gtkpod_statusbar_message (_("Processing '%s'..."), bn_utf8);
+      while (widgets_blocked && gtk_events_pending ())  gtk_main_iteration ();
+      g_free (bn_utf8);
+
+      if (excludefile(basename))
+      {
+          gtkpod_warning (_("Skipping '%s' because it matches exclude masks.\n"), basename);
+	  while (widgets_blocked && gtk_events_pending ())
+	      gtk_main_iteration ();
+	  g_free (basename);
+	  return FALSE;
+      }
+  }
+  C_FREE (basename);
+
+  /* Check if there exists already a track with the same filename */
+  oldtrack = gp_track_by_filename (itdb, fname);
+  /* If a track already exists in the database, either update it or
+     just add it to the current playlist (if it's not already there) */
+  if (oldtrack)
+  {
+      if (prefs_get_int("update_existing"))
+      {   /* update the information */
+	  update_track_from_file (itdb, oldtrack);
+      }
+      /* add to current playlist if it's not already in there */
+      if (!itdb_playlist_is_mpl (plitem))
+      {
+	  if (!itdb_playlist_contains_track (plitem, oldtrack))
+	  {
+	      if (addtrackfunc)
+		  addtrackfunc (plitem, oldtrack, data);
+	      else
+		  gp_playlist_add_track (plitem, oldtrack, TRUE);
+	  }
+      }
+  }
+  else  /* oldtrack == NULL */
+  {   /* OK, the same filename does not already exist */
+      Track *track = get_track_info_from_file (fname, NULL);
+      if (track)
+      {
+          Track *added_track = NULL;
+	  ExtraTrackData *etr = track->userdata;
+	  g_return_val_if_fail (etr, FALSE);
+
+	  track->id = 0;
+	  track->transferred = FALSE;
+
+	  /* is 'fname' on the iPod? -- if yes mark as transfered, if
+	   * it's in the music directory */
+	  if (itdb->usertype & GP_ITDB_TYPE_IPOD)
+	  {
+	      const gchar *mountpoint = itdb_get_mountpoint (itdb);
+	      g_return_val_if_fail (mountpoint, FALSE);
+	      if (strstr (fname, mountpoint) == fname)
+	      {   /* Yes */
+		  /* is 'fname' in the iPod's Music directory? */
+		  gchar *music_dir = itdb_get_music_dir (mountpoint);
+		  if (music_dir)
+		  {
+		      gchar *cdir = g_strdup_printf ("%s%c", music_dir,
+						     G_DIR_SEPARATOR);
+		      if (g_strncasecmp (fname, cdir, strlen (cdir)) == 0)
+		      {   /* Yes */
+			  gchar *fname_i = fname + strlen (mountpoint);
+			  if (*fname_i == G_DIR_SEPARATOR) ++fname_i;
+			  track->transferred = TRUE;
+			  track->ipod_path = g_strdup_printf (
+			      "%c%s", G_DIR_SEPARATOR, fname_i);
+			  itdb_filename_fs2ipod (track->ipod_path);
+		      }
+		      g_free (music_dir);
+		      g_free (cdir);
+		  }
+	      }
+	  }
+
+	  if (gethostname (str, PATH_MAX-2) == 0)
+	  {
+	      str[PATH_MAX-1] = 0;
+	      etr->hostname = g_strdup (str);
+	  }
+	  /* add_track may return pointer to a different track if an
+	     identical one (SHA1 checksum) was found */
+	  added_track = gp_track_add (itdb, track);
+	  g_return_val_if_fail (added_track, FALSE);
+
+	  /* set flags to 'podcast' if adding to podcast list */
+	  if (itdb_playlist_is_podcasts (plitem))
+	      gp_track_set_flags_podcast (added_track);
+
+	  if (itdb_playlist_is_mpl (plitem))
+	  {   /* add track to master playlist if it wasn't a
+		 duplicate */
+	      if (added_track == track)
+	      {
+		  if (addtrackfunc)
+		      addtrackfunc (plitem, added_track, data);
+		  else
+		      gp_playlist_add_track (plitem, added_track, TRUE);
+	      }
+	  }
+	  else
+	  {
+#if 0 /* initially iTunes didn't add podcasts to the MPL */
+	      /* add track to master playlist if it wasn't a
+	       * duplicate and plitem is not the podcasts playlist
+	       */
+	      if (added_track == track)
+	      {
+		  if (!itdb_playlist_is_podcasts (plitem))
+		      gp_playlist_add_track (mpl, added_track, TRUE);
+	      }
+#else
+	      if (added_track == track)
+	      {
+		  gp_playlist_add_track (mpl, added_track, TRUE);
+	      }
+#endif
+	      /* add track to specified playlist -- unless adding
+	       * to podcasts list and track already exists there */
+	      if (itdb_playlist_is_podcasts (plitem) &&
+		  g_list_find (plitem->members, added_track))
+	      {
+		  gchar *buf = get_track_info (added_track, FALSE);
+		  gtkpod_warning (_("Podcast already present: '%s'\n\n"), buf);
+		  g_free (buf);
+	      }
+	      else
+	      {
+		  if (addtrackfunc)
+		      addtrackfunc (plitem, added_track, data);
+		  else
+		      gp_playlist_add_track (plitem, added_track, TRUE);
+	      }
+	  }
+
+	  /* indicate that non-transferred files exist */
+	  data_changed (itdb);
+	  ++count;
+	  if (count >= 10)  /* update every ten tracks added */
+	  {
+	      gtkpod_tracks_statusbar_update();
+	      count = 0;
+	  }
+      }
+      else
+      { /* !track */
+	  result = FALSE;
+      }
+  }
+  while (widgets_blocked && gtk_events_pending ())  gtk_main_iteration ();
+  return result;
+}
+
+
+/*------------------------------------------------------------------*\
+ *                                                                  *
+ *      Write Tags                                                  *
+ *                                                                  *
+\*------------------------------------------------------------------*/
+
+
+/* Call the correct tag writing function for the filename @name */
+static gboolean file_write_info (gchar *name, Track *track)
+{
+    gchar *buf;
+
+    g_return_val_if_fail (name, FALSE);
+    g_return_val_if_fail (track, FALSE);
+
+    switch (determine_file_type(name))
+    {
+    case FILE_TYPE_MP3:
+	return mp3_write_file_info (name, track);
+    case FILE_TYPE_M4A:
+    case FILE_TYPE_M4P:
+    case FILE_TYPE_M4B:
+	return mp4_write_file_info (name, track);
+    case FILE_TYPE_WAV:
+	return wav_write_file_info (name, track);
+    case FILE_TYPE_OGG:
+        return ogg_write_file_info (name, track);
+    case FILE_TYPE_FLAC:
+        return flac_write_file_info (name, track);
+    case FILE_TYPE_M4V:
+    case FILE_TYPE_MP4:
+    case FILE_TYPE_MOV:
+    case FILE_TYPE_MPG:
+	buf = get_track_info (track, FALSE);
+	gtkpod_warning (_("Writing to video files not yet supported (%s).\n\n"),
+			buf);
+	g_free (buf);
+	break;
+    case FILE_TYPE_M3U:
+    case FILE_TYPE_PLS:
+    case FILE_TYPE_IMAGE:
+    case FILE_TYPE_UNKNOWN:
+    case FILE_TYPE_DIRECTORY:
+	break;
+    }
+
+    return FALSE;
+}
+
+
+/* Write tags to file */
+gboolean write_tags_to_file (Track *track)
+{
+    ExtraTrackData *etr;
+    iTunesDB *itdb;
+    gchar *ipod_fullpath;
+    gchar *prefs_charset = NULL;
+    Track *oldtrack;
+    gboolean track_charset_set;
+
+    g_return_val_if_fail (track, FALSE);
+    etr = track->userdata;
+    g_return_val_if_fail (etr, FALSE);
+    itdb = track->itdb;
+    g_return_val_if_fail (itdb, FALSE);
+
+    /* if we are to use the charset used when first importing
+       the track, change the prefs settings temporarily */
+    if (etr->charset)  track_charset_set = TRUE;
+    else               track_charset_set = FALSE;
+    if (!prefs_get_int("write_charset") && track_charset_set)
+    {   /* we should use the initial charset for the update */
+	prefs_charset = prefs_get_string("charset");
+	/* use the charset used when first importing the track */
+	prefs_set_string("charset", etr->charset);
+    }
+    else
+    {   /* we should update the track->charset information */
+	update_charset_info (track);
+    }
+
+    if (etr->pc_path_locale && (strlen (etr->pc_path_locale) > 0))
+    {
+	if (file_write_info (
+		etr->pc_path_locale, track) == FALSE)
+	{
+	    gtkpod_warning (_("Couldn't change tags of file: %s\n"),
+			    etr->pc_path_locale);
+	}
+    }
+    if (!get_offline (itdb) &&
+	track->transferred &&
+	track->ipod_path &&
+	(g_utf8_strlen (track->ipod_path, -1) > 0))
+    {
+	/* need to get ipod filename */
+	ipod_fullpath = get_file_name_from_source (track, SOURCE_IPOD);
+	if (file_write_info (
+		ipod_fullpath, track) == FALSE)
+	{
+	    gtkpod_warning (_("Couldn't change tags of file: %s\n"),
+			    ipod_fullpath);
+	}
+	g_free (ipod_fullpath);
+    }
+    /* remove track from sha1 hash and reinsert it (hash value has changed!) */
+    sha1_track_remove (track);
+    C_FREE (etr->sha1_hash);  /* need to remove the old value manually! */
+    oldtrack = sha1_track_exists_insert (itdb, track);
+    if (oldtrack) { /* track exists, remove and register the new version */
+	sha1_track_remove (oldtrack);
+	gp_duplicate_remove (track, oldtrack);
+	sha1_track_exists_insert (itdb, track);
+    }
+
+    if (!prefs_get_int("write_charset") && track_charset_set)
+    {   /* reset charset */
+	prefs_set_string("charset", prefs_charset);
+    }
+    g_free (prefs_charset);
+    return TRUE;
+}
+
+
+/* Get file name from source @source */
+/* File is guaranteed to exist, otherwise NULL is returned. */
+gchar *get_file_name_from_source (Track *track, FileSource source)
+{
+    gchar *result = NULL;
+    ExtraTrackData *etr;
+
+    g_return_val_if_fail (track, NULL);
+    etr = track->userdata;
+    g_return_val_if_fail (etr, NULL);
+
+    switch (source)
+    {
+    case SOURCE_PREFER_LOCAL:
+	result = get_file_name_from_source (track, SOURCE_LOCAL);
+	if (!result)
+	{
+	    if (track->itdb && (track->itdb->usertype & GP_ITDB_TYPE_IPOD))
+	    {
+		result = get_file_name_from_source (track, SOURCE_IPOD);
+	    }
+	}
+	break;
+    case SOURCE_PREFER_IPOD:
+	result = get_file_name_from_source (track, SOURCE_IPOD);
+	if (!result)
+	    result = get_file_name_from_source (track, SOURCE_LOCAL);
+	break;
+    case SOURCE_LOCAL:
+	if (etr->pc_path_locale && (*etr->pc_path_locale))
+	{
+	    if (g_file_test (etr->pc_path_locale, G_FILE_TEST_EXISTS))
+	    {
+		result = g_strdup (etr->pc_path_locale);
+	    }
+	}
+	break;
+    case SOURCE_IPOD:
+	if(track &&  !get_offline (track->itdb))
+	{
+	    result = itdb_filename_on_ipod (track);
+	}
+	break;
+    }
+    return result;
+}
+
+
+
+
+
+
+/* ------------------------------------------------------------
+
+        Reading of offline playcount file
+
+   ------------------------------------------------------------ */
+
+/* Read the ~/.gtkpod/offline_playcount file and adjust the
+   playcounts. The tracks will first be matched by their sha1 sum, if
+   that fails, by their filename.
+   If tracks could not be matched, the user will be queried whether to
+   forget about them or write them back into the offline_playcount
+   file. */
+void parse_offline_playcount (void)
+{
+    gchar *cfgdir = prefs_get_cfgdir ();
+    gchar *offlplyc = g_strdup_printf (
+	"%s%c%s", cfgdir, G_DIR_SEPARATOR, "offline_playcount");
+
+    if (g_file_test (offlplyc, G_FILE_TEST_EXISTS))
+    {
+	FILE *file = fopen (offlplyc, "r+");
+	size_t len = 0;  /* how many bytes are written */
+	gchar *buf;
+	GString *gstr, *gstr_filenames;
+	if (!file)
+	{
+	    gtkpod_warning (_("Could not open '%s' for reading and writing.\n"),
+		       offlplyc);
+	    g_free (offlplyc);
+	    return;
+	}
+	if (flock (fileno (file), LOCK_EX) != 0)
+	{
+	    gtkpod_warning (_("Could not obtain lock on '%s'.\n"), offlplyc);
+	    fclose (file);
+	    g_free (offlplyc);
+	    return;
+	}
+	buf = g_malloc (2*PATH_MAX);
+	gstr = g_string_sized_new (PATH_MAX);
+	gstr_filenames = g_string_sized_new (PATH_MAX);
+	while (fgets (buf, 2*PATH_MAX, file))
+	{
+	    gchar *buf_utf8 = charset_to_utf8 (buf);
+	    gchar *sha1=NULL;
+	    gchar *filename=NULL;
+	    gchar *ptr1, *ptr2;
+	    /* skip strings that do not start with "PLCT:" */
+	    if (strncmp (buf, SOCKET_PLYC, strlen (SOCKET_PLYC)) != 0)
+	    {
+		gtkpod_warning (_("Malformed line in '%s': %s\n"), offlplyc, buf);
+		goto cont;
+	    }
+	    /* start of SHA1 string */
+	    ptr1 = buf + strlen (SOCKET_PLYC);
+	    /* end of SHA1 string */
+	    ptr2 = strchr (ptr1, ' ');
+	    if (ptr2 == NULL)
+	    {   /* error! */
+		gtkpod_warning (_("Malformed line in '%s': %s\n"),
+				offlplyc, buf_utf8);
+		goto cont;
+	    }
+	    if (ptr1 != ptr2)    sha1 = g_strndup (ptr1, ptr2-ptr1);
+	    /* start of filename */
+	    ptr1 = ptr2 + 1;
+	    /* end of filename string */
+	    ptr2 = strchr (ptr1, '\n');
+	    if (ptr2 == NULL)
+	    {   /* error! */
+		gtkpod_warning (_("Malformed line in '%s': %s\n"),
+				offlplyc, buf_utf8);
+		goto cont;
+	    }
+	    if (ptr1 != ptr2)
+	    {
+		filename = g_strndup (ptr1, ptr2-ptr1);
+	    }
+	    else
+	    {   /* error! */
+		gtkpod_warning (_("Malformed line in '%s': %s\n"),
+				offlplyc, buf_utf8);
+		goto cont;
+	    }
+	    if (gp_increase_playcount (sha1, filename, 1) == FALSE)
+	    {   /* didn't find the track -> store */
+		gchar *filename_utf8 = charset_to_utf8 (filename);
+/* 		if (gstr->len == 0) */
+/* 		{ */
+/* 		    gtkpod_warning (_("Couldn't find track for playcount adjustment:\n")); */
+/* 		} */
+		g_string_append (gstr_filenames, filename_utf8);
+		g_string_append (gstr_filenames, "\n");
+		g_free (filename_utf8);
+		g_string_append (gstr, buf);
+	    }
+	  cont:
+	    g_free (buf_utf8);
+	    g_free (sha1);
+	    g_free (filename);
+	}
+
+	/* rewind file pointer to beginning */
+	rewind (file);
+	if (gstr->len != 0)
+	{
+	    gint result = gtkpod_confirmation
+	    (-1,                    /* gint id, */
+	     TRUE,                  /* gboolean modal, */
+	     _("Remove offline playcounts?"), /* title */
+	     _("Some tracks played offline could not be found in the iTunesDB. Press 'OK' to remove them from the offline playcount file, 'Cancel' to keep them."),   /* label */
+	     gstr_filenames->str,   /* scrolled text */
+	     NULL, 0, NULL,         /* option 1 */
+	     NULL, 0, NULL,         /* option 2 */
+	     TRUE,                  /* confirm_again, */
+	     NULL,                  /* confirm_again_key,*/
+	     CONF_NULL_HANDLER,     /* ConfHandler ok_handler,*/
+	     NULL,                  /* don't show "Apply" button */
+	     CONF_NULL_HANDLER,     /* cancel_handler,*/
+	     NULL,                  /* gpointer user_data1,*/
+	     NULL);                 /* gpointer user_data2,*/
+
+	    if (result != GTK_RESPONSE_OK)
+	    {
+		len = fwrite (gstr->str, sizeof (gchar), gstr->len, file);
+		if (len != gstr->len)
+		{
+		    gtkpod_warning (_("Error writing to '%s'.\n"), offlplyc);
+		}
+	    }
+	}
+	ftruncate (fileno (file), len);
+	fclose (file);
+	g_string_free (gstr, TRUE);
+	g_string_free (gstr_filenames, TRUE);
+	g_free (buf);
+    }
+    g_free (cfgdir);
+    g_free (offlplyc);
+}
+
+
+/* ------------------------------------------------------------
+
+        Reading of gain tags
+
+   ------------------------------------------------------------ */
+/**
+ * Read the soundcheck value for @track.
+ *
+ * Return value: TRUE, if gain could be read
+ */
+gboolean read_soundcheck (Track *track) 
+{
+    gchar *path;
+    gchar *buf;
+    gboolean result = FALSE;
+
+    g_return_val_if_fail (track, FALSE);
+
+    path = get_file_name_from_source (track, SOURCE_PREFER_LOCAL);
+
+    if (path)
+    {
+	switch (determine_file_type (path))
+	{
+	case FILE_TYPE_MP3: 
+	    result = mp3_read_soundcheck (path, track);
+	    break;
+	case FILE_TYPE_M4A:
+	case FILE_TYPE_M4P:
+	case FILE_TYPE_M4B:
+	    result = mp4_read_soundcheck (path, track);
+	    break;
+        case FILE_TYPE_OGG: /* FIXME */
+        case FILE_TYPE_FLAC: /* FIXME */
+	case FILE_TYPE_WAV: /* FIXME */
+	case FILE_TYPE_M4V:
+	case FILE_TYPE_MP4:
+	case FILE_TYPE_MOV:
+	case FILE_TYPE_MPG:
+	case FILE_TYPE_UNKNOWN:
+	    buf = get_track_info (track, FALSE);
+	    gtkpod_warning (
+		_("Normalization failed: file type not supported (%s).\n\n"),
+		buf);
+	    g_free (buf);
+	    break;
+	case FILE_TYPE_M3U: 
+	case FILE_TYPE_PLS: 
+	case FILE_TYPE_IMAGE: 
+	case FILE_TYPE_DIRECTORY:
+	    break;
+	}
+	g_free (path);
+    }
+    else
+    {
+	buf = get_track_info (track, FALSE);
+	gtkpod_warning (
+	    _("Normalization failed: file not available (%s).\n\n"),
+	    buf);
+	g_free (buf);
+    }
+    return result;
+}
+

Added: trunk/src/file.h
===================================================================
--- trunk/src/file.h	                        (rev 0)
+++ trunk/src/file.h	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,132 @@
+/* Time-stamp: <2007-05-06 20:20:31 jcs>
+|
+|  Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+| 
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: file.h 1065 2007-05-06 14:16:17Z jcsjcs $
+*/
+
+#ifndef __FILE_H__
+#define __FILE_H__
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <gtk/gtk.h>
+#include <stdio.h>
+#include "itdb.h"
+
+
+/* values below -1 may be used in individual functions */
+typedef enum
+{
+    FILE_TYPE_UNKNOWN = 0,
+    FILE_TYPE_MP3,
+    FILE_TYPE_M4A,
+    FILE_TYPE_M4P,
+    FILE_TYPE_M4B,
+    FILE_TYPE_WAV,
+    FILE_TYPE_M4V,
+    FILE_TYPE_MP4,
+    FILE_TYPE_MOV,
+    FILE_TYPE_MPG,
+    FILE_TYPE_M3U,
+    FILE_TYPE_OGG,
+    FILE_TYPE_FLAC,
+    FILE_TYPE_PLS,
+    FILE_TYPE_IMAGE,
+    FILE_TYPE_DIRECTORY
+} FileType;
+
+
+/* Don't change the order of this enum -- when exporting playlists the
+   file requester depends on having these in order because the toggle
+   buttons are arranged that way */
+typedef enum
+{
+    SOURCE_PREFER_LOCAL = 0,
+    SOURCE_LOCAL,
+    SOURCE_IPOD,
+    SOURCE_PREFER_IPOD
+} FileSource;
+
+
+typedef void (*AddTrackFunc)(Playlist *plitem, Track *track, gpointer data);
+
+FileType determine_file_type (const gchar *path);
+gboolean add_track_by_filename (iTunesDB *itdb, gchar *name,
+				Playlist *plitem, gboolean descend,
+				AddTrackFunc addtrackfunc, gpointer data);
+gboolean add_directory_by_name (iTunesDB *itdb, gchar *name,
+				Playlist *plitem, gboolean descend,
+				AddTrackFunc addtrackfunc, gpointer data);
+Playlist *add_playlist_by_filename (iTunesDB *itdb, gchar *plfile,
+				    Playlist *plitem, gint plitem_pos,
+				    AddTrackFunc addtrackfunc,
+				    gpointer data);
+gboolean write_tags_to_file(Track *s);
+void update_track_from_file (iTunesDB *itdb, Track *track);
+void update_tracks (GList *selected_tracks);
+void mserv_from_file_tracks (GList *selected_tracks);
+void display_non_updated (Track *track, gchar *txt);
+void display_updated (Track *track, gchar *txt);
+void display_mserv_problems (Track *track, gchar *txt);
+iTunesDB *gp_import_itdb (iTunesDB *old_itdb, const gint type,
+			  const gchar *mp, const gchar *name_off,
+			  const gchar *name_loc);
+void gp_load_ipods (void);
+iTunesDB *gp_load_ipod (iTunesDB *itdb);
+gboolean gp_eject_ipod(iTunesDB *itdb);
+gboolean gp_save_itdb (iTunesDB *itdb);
+void handle_export (void);
+void data_changed (iTunesDB *itdb);
+void data_unchanged (iTunesDB *itdb);
+gboolean files_are_saved (void);
+gchar *get_file_name_from_source (Track *track, FileSource source);
+gchar* get_preferred_track_name_format(Track *s);
+void mark_track_for_deletion (iTunesDB *itdb, Track *track);
+void gp_info_deleted_tracks (iTunesDB *itdb,
+			     gdouble *size, guint32 *num);
+void update_charset_info (Track *track);
+void parse_offline_playcount (void);
+
+gboolean read_soundcheck (Track *track);
+
+/* file_export.c */
+void export_files_init (GList *tracks, GList **filenames,
+			gboolean display, gchar *message);
+void export_playlist_file_init (GList *tracks);
+GList *export_tracklist_when_necessary (iTunesDB *itdb_s,
+					iTunesDB *itdb_d,
+					gchar *data);
+GList *export_trackglist_when_necessary (iTunesDB *itdb_s,
+					 iTunesDB *itdb_d,
+					 GList *tracks);
+/* needed to adapt the prefs structure */
+extern const gchar *EXPORT_FILES_SPECIAL_CHARSET;
+extern const gchar *EXPORT_FILES_CHECK_EXISTING;
+extern const gchar *EXPORT_FILES_PATH;
+extern const gchar *EXPORT_FILES_TPL;
+#endif

Added: trunk/src/file_convert.c
===================================================================
--- trunk/src/file_convert.c	                        (rev 0)
+++ trunk/src/file_convert.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,3203 @@
+/*
+|  File conversion started by Simon Naunton <snaunton gmail.com> in 2007
+|
+|  Copyright (C) 2002-2007 Jorg Schuler <jcsjcs at users.sourceforge.net>
+|  Part of the gtkpod project.
+|
+|  URL: http://gtkpod.sourceforge.net/
+|  URL: http://www.gtkpod.org
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: file_convert.c 1813 2007-12-11 12:34:20Z jcsjcs $
+*/
+
+
+#ifdef HAVE_CONFIG_H
+#   include <config.h>
+#endif
+
+#include "display_itdb.h"
+#include "file_convert.h"
+#include "info.h"
+#include "misc.h"
+#include "misc_track.h"
+#include "prefs.h"
+#include <errno.h>
+#include <glib/gstdio.h>
+#include <signal.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+#undef DEBUG_CONV
+#ifdef DEBUG_CONV
+#   define _TO_STR(x) #x
+#   define TO_STR(x) _TO_STR(x)
+#   define debug(...) do { fprintf(stderr,  __FILE__ ":" TO_STR(__LINE__) ":" __VA_ARGS__); } while(0)
+#else
+#   define debug(...)
+#endif
+
+
+/* ----------------------------------------------------------------
+ *
+ * Functions for threaded background conversion
+ *
+ * ---------------------------------------------------------------- */
+
+/* How does it work?
+
+   If a track is added to an iTunesDB with gp_track_add(), it is
+   passed on file_convert_add_track().
+
+   This function determines if conversion is needed for the track and
+   then places the track either into the "scheduled" or "finished"
+   lists. If conversion is needed because the type of track is not
+   supported directly by the iPod, the track is added to the "failed"
+   list.
+
+   A timeout function examines the "scheduled" list and starts new
+   conversion threads as long as the maximum number of allowed threads
+   hasn't been reached and there are still tracks in the "scheduled"
+   list.
+
+   IO-Output of tracks in the processing, failed, and converted list
+   is redirected to a multi-thread log window. Once a track appears in
+   the "finished" or "failed" lists, the redirection IO-channel will
+   be closed.
+
+   The conversion threads continue processing tracks in the
+   "scheduled" list as long as there are tracks left in the
+   "scheduled" list and the maximum number of threads is not
+   exceeded. If either is condition is not met, the thread will
+   terminate after processing of the current track has
+   finished. Tracks being processed are moved to the "processing"
+   list. If the conversion was finished successfully, they are moved
+   to the "converted" list, in case of failure to the "failed" list.
+
+   Tracks that are removed from an iTunesDB with gp_track_remove() are
+   propagated to file_convert_cancel_track() and flagged "invalid" in
+   all lists. If currently being processed, the conversion process is
+   kill()ed.
+
+   If a whole iTunesDB is removed from the system, the event is
+   propagated to file_convert_cancel_itdb() and all tracks in that
+   iTunesDB are treated as explained for file_convert_cancel_track()
+   above.
+
+   Conversion of tracks is done in a FIFO fashion. Preference can be
+   given to a specific iTunesDB with file_convert_itdb_first(), which
+   should be called when the user wants write changes to an iPod or
+   eject an iPod, so that conversion of the tracks needed next are
+   processed next.
+*/
+
+
+/* Preferences keys */
+const gchar *FILE_CONVERT_CACHEDIR = "file_convert_cachedir";
+const gchar *FILE_CONVERT_MAXDIRSIZE = "file_convert_maxdirsize";
+const gchar *FILE_CONVERT_TEMPLATE = "file_convert_template";
+const gchar *FILE_CONVERT_MAX_THREADS_NUM = "file_convert_max_threads_num";
+const gchar *FILE_CONVERT_DISPLAY_LOG = "file_convert_display_log";
+const gchar *FILE_CONVERT_LOG_SIZE_X = "file_convert_log_size.x";
+const gchar *FILE_CONVERT_LOG_SIZE_Y = "file_convert_log_size.y";
+const gchar *FILE_CONVERT_BACKGROUND_TRANSFER = "file_convert_background_transfer";
+
+typedef struct _Conversion Conversion;
+typedef struct _ConvTrack ConvTrack;
+typedef struct _TransferItdb TransferItdb;
+
+static gboolean conversion_scheduler (gpointer data);
+static void conversion_update_default_sizes (Conversion *conv);
+static gboolean conversion_log_window_delete (Conversion *conv);
+static gpointer conversion_thread (gpointer data);
+static gpointer conversion_update_dirsize (gpointer data);
+static gpointer conversion_prune_dir (gpointer data);
+static void conversion_convtrack_free (ConvTrack *ctr);
+static gchar *conversion_get_fname_extension (Conversion *conv, ConvTrack *ctr);
+static gboolean conversion_setup_cachedir (Conversion *conv);
+static void conversion_log_add_pages (Conversion *conv, gint threads);
+static gboolean conversion_add_track (Conversion *conv, Track *track);
+static void conversion_prefs_changed (Conversion *conv);
+static void conversion_itdb_first (Conversion *conv, iTunesDB *itdb);
+static void conversion_cancel_itdb (Conversion *conv, iTunesDB *itdb);
+static void conversion_cancel_track (Conversion *conv, Track *track);
+static void conversion_continue (Conversion *conv);
+
+static TransferItdb *transfer_get_tri (Conversion *conv, iTunesDB *itdb);
+static void transfer_free_transfer_itdb (TransferItdb *tri);
+static gpointer transfer_thread (gpointer data);
+static GList *transfer_get_failed_tracks (Conversion *conv, iTunesDB *itdb);
+static FileTransferStatus transfer_get_status (Conversion *conv,
+					       iTunesDB *itdb,
+					       gint *to_convert_num,
+					       gint *converting_num,
+					       gint *to_transfer_num,
+					       gint *transferred_num,
+					       gint *failed_num);
+static void transfer_ack_itdb (Conversion *conv, iTunesDB *itdb);
+static void transfer_continue (Conversion *conv, iTunesDB *itdb);
+static void transfer_activate (Conversion *conv, iTunesDB *itdb, gboolean active);
+static void transfer_reset (Conversion *conv, iTunesDB *itdb);
+static void transfer_reschedule (Conversion *conv, iTunesDB *itdb);
+
+struct _Conversion
+{
+    GMutex *mutex;          /* shared lock                              */
+    GList  *scheduled;      /* tracks scheduled for conversion          */
+    GList  *processing;     /* tracks currently being converted         */
+    GList  *failed;         /* tracks with failed conversion            */
+    GList  *converted;      /* tracks successfully converted but not
+			       yet unscheduled                          */
+    GList  *finished;       /* tracks unscheduled but not yet
+			       transferred */
+    GCond  *finished_cond;  /* signals if a new track is added to the
+			       finished list                            */
+    gchar  *cachedir;       /* directory for converted files            */
+    gchar  *template;       /* name template to use for converted files */
+    gint   max_threads_num; /* maximum number of allowed threads        */
+    GList  *threads;        /* list of threads                          */
+    gint   threads_num;     /* number of threads currently running      */
+    gboolean conversion_force;    /* force a new thread to start even if
+				     the dirsize is too large           */
+    gint64 max_dirsize;     /* maximum size of cache directory in bytes */
+    gint64  dirsize;        /* current size of cache directory in bytes */
+    gboolean dirsize_in_progress; /* currently determining dirsize      */
+    GCond  *dirsize_cond;   /* signal when dirsize has been updated     */
+    gboolean prune_in_progress;   /* currently pruning directory        */
+    GCond  *prune_cond;     /* signal when dir has been pruned          */
+    gboolean force_prune_in_progress; /* do another prune right after
+					 the current process finishes   */
+    guint  timeout_id;
+    /* data for log display */
+    GtkWidget *log_window;  /* display log window                       */
+    gboolean log_window_hidden;   /* whether the window was closed      */
+    gboolean log_window_shown;    /* whether the window was closed      */
+    gint log_window_posx;   /* last x-position of log window            */
+    gint log_window_posy;   /* last x-position of log window            */
+    GtkWidget *notebook;    /* notebook                                 */
+    GList *textviews;       /* list with pages currently added          */
+    GList *pages;           /* list with pages currently added          */
+    GtkStatusbar *log_statusbar;  /* statusbar of log display           */
+    guint log_context_id;   /* context ID for statusbar                 */
+    /* data for background transfer */
+    GList *transfer_itdbs;  /* list with TransferItdbs for background
+			       transfer                                 */
+};
+
+struct _ConvTrack
+{
+    gboolean valid;         /* TRUE if orig_track is valid.             */
+    gchar *orig_file;       /* original filename of unconverted track   */
+    gchar *converted_file;  /* filename of converted track              */
+    gint32 converted_size;  /* size of converted file                   */
+    gchar *conversion_cmd;  /* command to be used for conversion        */
+    gboolean must_convert;  /* is conversion required for the iPod?     */
+    gchar *errormessage;    /* error message if any                     */
+    gchar *fname_root;      /* filename root of converted file          */
+    gchar *fname_extension; /* filename extension of converted file     */
+    GPid  pid;              /* PID of child doing the conversion        */
+    gint  stderr;           /* stderr of child doing the conversion     */
+    Track *track;           /* for reference, don't access inside threads! */
+    iTunesDB *itdb;         /* for reference, don't access inside threads! */
+    gint  threadnum;        /* number of thread working on this track   */
+    Conversion *conv;       /* pointer back to the conversion struct    */
+    GIOChannel *gio_channel;
+    guint source_id;
+    gchar *artist;
+    gchar *album;
+    gchar *track_nr;
+    gchar *title;
+    gchar *genre;
+    gchar *year;
+    gchar *comment;
+    /* needed for transfering */
+    gchar *dest_filename;
+    gchar *mountpoint;
+};
+
+
+struct _TransferItdb
+{
+    gboolean valid;                /* TRUE if still valid                  */
+    iTunesDB *itdb;                /* for reference                        */
+    Conversion *conv;              /* pointer back to conv                 */
+    gboolean transfer;             /* OK to transfer in the background?    */
+    FileTransferStatus status;     /* current status                       */
+    GThread *thread;               /* thread working on transfer           */
+    GList  *scheduled;             /* ConvTracks scheduled for transfer    */
+    GList  *processing;            /* ConvTracks currently transferring    */
+    GList  *transferred;           /* ConvTracks copied to the iPod        */
+    GList  *finished;              /* ConvTracks copied to the iPod        */
+    GList  *failed;                /* ConvTracks failed to transfer/convert*/
+};
+
+
+enum 
+{
+    CONV_DIRSIZE_INVALID = -1,      /* dirsize not valid */
+};
+
+static Conversion *conversion;
+
+
+/* Set up conversion infrastructure. Must only be called once. */
+void file_convert_init ()
+{
+    GladeXML *log_xml;
+    GtkWidget *vbox;
+
+    g_return_if_fail (conversion==NULL);
+
+    conversion = g_new0 (Conversion, 1);
+    conversion->mutex = g_mutex_new ();
+
+    conversion->finished_cond = g_cond_new ();
+    conversion->dirsize_cond = g_cond_new ();
+    conversion->prune_cond = g_cond_new ();
+    conversion_setup_cachedir (conversion);
+
+    if (!prefs_get_string_value (FILE_CONVERT_TEMPLATE, NULL))
+    {
+	prefs_set_string (FILE_CONVERT_TEMPLATE, "%A/%t_%T");
+    }
+
+    if (!prefs_get_string_value (FILE_CONVERT_DISPLAY_LOG, NULL))
+    {
+	prefs_set_int (FILE_CONVERT_DISPLAY_LOG, TRUE);
+    }
+
+    if (!prefs_get_string_value (FILE_CONVERT_BACKGROUND_TRANSFER, NULL))
+    {
+	prefs_set_int (FILE_CONVERT_BACKGROUND_TRANSFER, TRUE);
+    }
+
+    conversion->dirsize = CONV_DIRSIZE_INVALID;
+
+    /* setup log window */
+    log_xml = glade_xml_new (xml_file, "conversion_log", NULL);
+    conversion->log_window = gtkpod_xml_get_widget (log_xml, "conversion_log");
+    gtk_window_set_default_size (GTK_WINDOW (conversion->log_window),
+				 prefs_get_int (FILE_CONVERT_LOG_SIZE_X),
+				 prefs_get_int (FILE_CONVERT_LOG_SIZE_Y));
+    g_signal_connect_swapped (GTK_OBJECT (conversion->log_window), "delete-event",
+			      G_CALLBACK (conversion_log_window_delete),
+			      conversion);
+    vbox = gtkpod_xml_get_widget (log_xml, "conversion_vbox");
+    conversion->notebook = gtk_notebook_new ();
+    gtk_widget_show (conversion->notebook);
+    gtk_box_pack_start (GTK_BOX (vbox), conversion->notebook, TRUE, TRUE, 0);
+    conversion->log_window_posx = G_MININT;
+    conversion->log_window_posy = G_MININT;
+    conversion->log_statusbar = GTK_STATUSBAR (
+	gtkpod_xml_get_widget (log_xml,
+			       "conversion_statusbar"));
+    conversion->log_context_id = gtk_statusbar_get_context_id (
+	conversion->log_statusbar,
+	_("Summary status of conversion processes"));
+    conversion_log_add_pages (conversion, 1);
+
+    /* initialize values from the preferences */
+    file_convert_prefs_changed ();
+
+    /* start timeout function for the scheduler */
+    conversion->timeout_id = g_timeout_add (100,   /* every 100 ms */
+					    conversion_scheduler,
+					    conversion);
+}
+
+
+/* Shut down conversion infrastructure */
+void file_convert_shutdown ()
+{
+    g_return_if_fail (conversion);
+
+    /* nothing to do so far */
+
+    /* in other words: not sure how we can shut this down... */
+}
+
+
+/* This is called just before gtkpod closes down */
+void file_convert_update_default_sizes ()
+{
+    conversion_update_default_sizes (conversion);
+}
+
+
+/* Call this function each time the preferences have been updated */
+void file_convert_prefs_changed ()
+{
+    conversion_prefs_changed (conversion);
+}
+
+
+/* Add @track to the list of tracks to be converted if conversion is
+ * necessary.
+ *
+ * Return value: FALSE if an error occured, TRUE otherwise
+ */
+gboolean file_convert_add_track (Track *track)
+{
+    return conversion_add_track (conversion, track);
+}
+
+
+/* Reorder the scheduled list so that tracks in @itdb are converted first */
+void file_convert_itdb_first (iTunesDB *itdb)
+{
+    conversion_itdb_first (conversion, itdb);
+}
+
+
+/* Cancel conversion for all tracks of @itdb */
+void file_convert_cancel_itdb (iTunesDB *itdb)
+{
+    conversion_cancel_itdb (conversion, itdb);
+}
+
+
+/* Cancel conversion for @tracks */
+void file_convert_cancel_track (Track *track)
+{
+    conversion_cancel_track (conversion, track);
+}
+
+void file_convert_continue ()
+{
+    conversion_continue (conversion);
+}
+
+
+
+/* ----------------------------------------------------------------
+
+   from here on file_transfer_... functions
+
+   ---------------------------------------------------------------- */
+
+/* return current status of transfer process */
+FileTransferStatus file_transfer_get_status (iTunesDB *itdb,
+					     gint *to_convert_num,
+					     gint *converting_num,
+					     gint *to_transfer_num,
+					     gint *transferred_num,
+					     gint *failed_num)
+{
+    return transfer_get_status (conversion, itdb, 
+				to_convert_num, converting_num, 
+				to_transfer_num, transferred_num, failed_num);
+}
+
+/* This has to be called after all tracks have been transferred and the
+   iTunesDB has been written, otherwise the transferred tracks will be
+   removed again when calling file_convert_cancel_itdb */
+void file_transfer_ack_itdb (iTunesDB *itdb)
+{
+    transfer_ack_itdb (conversion, itdb);
+}
+
+/* Call this to force transfer to continue in case of a
+ * FILE_TRANSFER_DISK_FULL status. Of course, you should make sure
+ * additional space is available. */
+void file_transfer_continue (iTunesDB *itdb)
+{
+    transfer_continue (conversion, itdb);
+}
+
+
+/* Call this to make sure the transfer process is active independently
+   from the settings in the preferences */
+void file_transfer_activate (iTunesDB *itdb, gboolean active)
+{
+    transfer_activate (conversion, itdb, active);
+}
+
+/* Call this to set the transfer process to on/off as determined by
+ * the preferences */
+void file_transfer_reset (iTunesDB *itdb)
+{
+    transfer_reset (conversion, itdb);
+}
+
+
+/* Get a list of tracks (Track *) that failed either transfer or
+   conversion */
+GList *file_transfer_get_failed_tracks (iTunesDB *itdb)
+{
+    return transfer_get_failed_tracks (conversion, itdb);
+}
+
+
+/* Reschedule all tracks for conversion/transfer that have previously
+   failed conversion/transfer */
+void file_transfer_reschedule (iTunesDB *itdb)
+{
+    transfer_reschedule (conversion, itdb);
+}
+
+
+
+/* ----------------------------------------------------------------
+
+   from here on down only static functions
+
+   ---------------------------------------------------------------- */
+
+
+/* Update the prefs with the current size of the log window */
+static void conversion_update_default_sizes (Conversion *conv)
+{
+    gint defx, defy;
+    
+    g_return_if_fail (conv && conv->log_window);
+
+    g_mutex_lock (conv->mutex);
+
+    gtk_window_get_size (GTK_WINDOW (conv->log_window), &defx, &defy);
+    prefs_set_int(FILE_CONVERT_LOG_SIZE_X, defx);
+    prefs_set_int(FILE_CONVERT_LOG_SIZE_Y, defy);
+
+    g_mutex_unlock (conv->mutex);
+}
+
+
+
+/* used to show/hide the log window and adjust the View->menu
+   items. g_mutex_lock(conv->mutex) before calling. Used in
+   conversion_log_window_delete() and conversion_prefs_changed(). */
+static void conversion_display_hide_log_window (Conversion *conv)
+{
+    GtkWidget *mi;
+    /* show display log if it was previously hidden and should be
+       shown again */
+    mi = gtkpod_xml_get_widget (main_window_xml, "conversion_log");
+    if (prefs_get_int (FILE_CONVERT_DISPLAY_LOG))
+    {
+	if (conv->log_window_hidden && !conv->log_window_shown)
+	{
+	    gtk_widget_show (conv->log_window);
+	    if (conv->log_window_posx != G_MININT)
+	    {
+		gtk_window_move (GTK_WINDOW (conv->log_window),
+				 conv->log_window_posx,
+				 conv->log_window_posy);
+	    }
+	}
+	gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (mi), TRUE);
+	conv->log_window_shown = TRUE;
+    }
+    else
+    {
+	if (conv->log_window_shown)
+	{   /* window has previously been shown */
+	    gint posx, posy;
+	    gtk_window_get_position (GTK_WINDOW (conv->log_window),
+				     &posx, &posy);
+	    conv->log_window_posx = posx;
+	    conv->log_window_posy = posy;
+	}
+	conv->log_window_shown = FALSE;
+	conv->log_window_hidden = TRUE;
+	gtk_widget_hide (conv->log_window);
+	gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (mi), FALSE);
+    }
+}
+
+
+/* Signal when user tries to close the log window */
+static gboolean conversion_log_window_delete (Conversion *conv)
+{
+    g_return_val_if_fail (conv, TRUE);
+
+    g_mutex_lock (conv->mutex);
+ 
+    prefs_set_int (FILE_CONVERT_DISPLAY_LOG, FALSE);
+    conversion_display_hide_log_window (conv);
+
+    g_mutex_unlock (conv->mutex);
+
+    return TRUE; /* don't close window -- it will be hidden instead by
+		  * conversion_display_hid_log_window() */
+}
+
+
+/* set the labels of the notebook of the log window. If required
+ * 'g_mutex_lock (conv->mutex)' before calling this function. */
+static void conversion_log_set_status (Conversion *conv)
+{
+    GList *glpage, *glthread;
+    gchar *buf;
+
+    g_return_if_fail (conv);
+
+    /* Set tab label text to active/inactive */
+    glthread = conv->threads;
+    for (glpage=conv->pages; glpage; glpage=glpage->next)
+    {
+	GtkWidget *child = glpage->data;
+	g_return_if_fail (child);
+
+	/* in the beginning we may have more pages than thread entries */
+	if (glthread && glthread->data)
+	{
+	    gtk_notebook_set_tab_label_text (GTK_NOTEBOOK (conv->notebook),
+					     child, _("active"));
+	}
+	else
+	{
+	    gtk_notebook_set_tab_label_text (GTK_NOTEBOOK (conv->notebook),
+					     child, _("inactive"));
+	}
+
+	if (glthread)
+	{
+	    glthread = glthread->next;
+	}
+    }
+
+    /* Show a summary status */
+    gtk_statusbar_pop (conv->log_statusbar, conv->log_context_id);
+    buf = g_strdup_printf (_("Active threads: %d. Scheduled tracks: %d."),
+			   conv->threads_num,
+			   g_list_length (conv->scheduled) + g_list_length (conv->processing));
+    gtk_statusbar_push (conv->log_statusbar, conv->log_context_id, buf);
+    g_free (buf);
+}
+
+
+
+
+/* adds pages to the notebook if the number of pages is less than the
+ * number of threads. If required 'g_mutex_lock (conv->mutex)' before
+ * calling this function. */
+static void conversion_log_add_pages (Conversion *conv, gint threads)
+{
+    g_return_if_fail (conv);
+
+    while ((g_list_length (conv->textviews) == 0) ||
+	   (threads > g_list_length (conv->textviews)))
+    {
+	GtkWidget *scrolled_window;
+	GtkWidget *textview;
+
+	scrolled_window = gtk_scrolled_window_new (NULL, NULL);
+	gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
+					GTK_POLICY_AUTOMATIC,
+					GTK_POLICY_AUTOMATIC);
+	conv->pages = g_list_append (conv->pages, scrolled_window);
+	textview = gtk_text_view_new ();
+	gtk_container_add (GTK_CONTAINER (scrolled_window), textview);
+	conv->textviews = g_list_append (conv->textviews, textview);
+
+	gtk_widget_show_all (scrolled_window);
+
+	gtk_notebook_append_page (GTK_NOTEBOOK (conv->notebook),
+				  scrolled_window, NULL);
+
+	conversion_log_set_status (conv);
+    }
+}
+
+
+static void conversion_prefs_changed (Conversion *conv)
+{
+    gboolean background_transfer;
+    gdouble maxsize;
+    GList *gl;
+
+    g_return_if_fail (conv);
+
+    g_mutex_lock (conv->mutex);
+
+    if (prefs_get_double_value (FILE_CONVERT_MAXDIRSIZE, &maxsize))
+    {
+	conv->max_dirsize = 1024 * 1024 * 1024 * maxsize;
+    }
+    else
+    {   /* set default of 4 GB */
+	conv->max_dirsize = (gint64)4 * 1024 * 1024 * 1024;
+	prefs_set_double (FILE_CONVERT_MAXDIRSIZE, 4);
+    }
+
+    if (conv->max_dirsize < 0)
+    {   /* effectively disable caching */
+	conv->max_dirsize = 0;
+    }
+
+    conv->max_threads_num = prefs_get_int (FILE_CONVERT_MAX_THREADS_NUM);
+    if (conv->max_threads_num == 0)
+    {   /* set to maximum available number of processors */
+	conv->max_threads_num = sysconf (_SC_NPROCESSORS_ONLN);
+	/* paranoia mode on */
+	if (conv->max_threads_num <= 0)
+	{
+	    conv->max_threads_num = 1;
+	}
+    }
+
+    g_free (conv->template);
+    conv->template = prefs_get_string (FILE_CONVERT_TEMPLATE);
+
+    if ((conv->dirsize == CONV_DIRSIZE_INVALID) ||
+	(conv->dirsize > conv->max_dirsize))
+    {
+	GThread *thread;
+	/* Prune dir of unused files if size is too big, calculate and set
+	   the size of the directory. Do all that in the background. */
+	thread = g_thread_create_full (conversion_prune_dir,
+				       conv,        /* user data  */
+				       0,           /* stack size */
+				       FALSE,       /* joinable   */
+				       TRUE,        /* bound      */
+				       G_THREAD_PRIORITY_NORMAL,
+				       NULL);       /* error      */
+    }
+
+    background_transfer = prefs_get_int (FILE_CONVERT_BACKGROUND_TRANSFER);
+    for (gl=conv->transfer_itdbs; gl; gl=gl->next)
+    {
+	TransferItdb *tri = gl->data;
+	if (!tri)
+	{
+	    g_mutex_unlock (conv->mutex);
+	    g_return_if_reached ();
+	}
+	tri->transfer = background_transfer;
+    }
+
+    conversion_display_hide_log_window (conv);
+
+    g_mutex_unlock (conv->mutex);
+}
+
+
+
+/* Reorder the scheduled list so that tracks in @itdb are converted first */
+static void conversion_itdb_first (Conversion *conv, iTunesDB *itdb)
+{
+    GList *gl;
+    GList *gl_itdb = NULL;
+    GList *gl_other = NULL;
+
+    g_return_if_fail (conv);
+    g_return_if_fail (itdb);
+
+    g_mutex_lock (conv->mutex);
+    /* start from the end to keep the same order overall (we're
+       prepending to the list for performance reasons */
+    for (gl=g_list_last(conv->scheduled); gl; gl=gl->prev)
+    {
+	ConvTrack *ctr = gl->data;
+	if (!ctr || !ctr->track)
+	{
+	    g_mutex_unlock (conv->mutex);
+	    g_return_if_reached ();
+	}
+	g_return_if_fail (ctr);
+	g_return_if_fail (ctr->track);
+	if (ctr->track->itdb == itdb)
+	{
+	    gl_itdb = g_list_prepend (gl_itdb, ctr);
+	}
+	else
+	{
+	    gl_other = g_list_prepend (gl_other, ctr);
+	}
+    }
+    g_list_free (conv->scheduled);
+    conv->scheduled = g_list_concat (gl_other, gl_itdb);
+    g_mutex_unlock (conv->mutex);
+}
+
+
+/* adds @text to the textview on page @threadnum of the log window. If
+ * required 'g_mutex_lock (conv->mutex)' before calling this
+ * function. */
+static void conversion_log_append (Conversion *conv,
+				   const gchar *text, gint threadnum)
+{
+    GtkWidget *textview;
+    GtkTextBuffer *textbuffer;
+    GtkTextIter start, end;
+    const gchar *run, *ptr, *next;
+
+    g_return_if_fail (conv);
+
+    /* add pages if necessary */
+    conversion_log_add_pages (conv, threadnum+1);
+
+    /* get appropriate textview */
+    textview = g_list_nth_data (conv->textviews, threadnum);
+    g_return_if_fail (textview);
+
+    textbuffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview));
+    gtk_text_buffer_get_end_iter (textbuffer, &end);
+
+    run = ptr = text;
+
+    while (*ptr)
+    {
+	next = g_utf8_find_next_char (ptr, NULL);
+	if (*ptr == '\b')
+	{
+	    if (ptr > run)
+	    {
+		gtk_text_buffer_insert (textbuffer, &end, run, ptr - run);
+	    }
+	    run = next;
+	    start = end;
+	    if (gtk_text_iter_backward_char (&start))
+	    {
+		gtk_text_buffer_delete (textbuffer, &start, &end);
+	    }
+	}
+	else if(*ptr == '\r')
+	{
+	    if (ptr > run)
+	    {
+		gtk_text_buffer_insert (textbuffer, &end, run, ptr - run);
+	    }
+	    run = next;
+	    start = end;
+	    gtk_text_iter_set_line_offset (&start, 0);
+	    gtk_text_buffer_delete (textbuffer, &start, &end);
+	}
+	ptr = next;
+    }
+    if (ptr > run)
+    {
+	gtk_text_buffer_insert (textbuffer, &end, run, ptr - run);
+    }
+    gtk_text_view_scroll_to_iter (GTK_TEXT_VIEW (textview),
+				  &end, 0.0, FALSE, 0.0, 0.0); 
+
+    if (prefs_get_int (FILE_CONVERT_DISPLAY_LOG))
+    {
+	gtk_widget_show (conv->log_window);
+    }
+}
+
+
+
+/*
+ * Called by scheduler for all running processes. Lock 'conv->mutex'
+ * before calling this function.
+ */
+static void conversion_display_log (ConvTrack *ctr)
+{
+    gchar buf[PATH_MAX];
+    gsize bytes_read = 0;
+    GIOStatus status;
+    Conversion *conv;
+
+    g_return_if_fail (ctr && ctr->conv);
+    conv = ctr->conv;
+
+    do
+    {
+	status = g_io_channel_read_chars (ctr->gio_channel, buf,
+					  PATH_MAX-1, &bytes_read, NULL);
+	buf[bytes_read] = '\0';
+	if (bytes_read > 0)
+	{
+	    switch (status)
+	    {
+	    case G_IO_STATUS_ERROR :
+/*	    puts ("gio error");*/
+		break;
+	    case G_IO_STATUS_EOF :
+		conversion_log_append (conv, buf, ctr->threadnum);
+		break;
+	    case G_IO_STATUS_NORMAL :
+		conversion_log_append (conv, buf, ctr->threadnum);
+		break;
+	    case G_IO_STATUS_AGAIN :
+		break;
+	    }
+	}
+    } while (bytes_read > 0);
+
+    return;
+}
+
+
+static void conversion_cancel_mark_track (ConvTrack *ctr)
+{
+    g_return_if_fail (ctr && ctr->track);
+
+    if (ctr->valid)
+    {
+	ExtraTrackData *etr = ctr->track->userdata;
+	g_return_if_fail (etr);
+	ctr->valid = FALSE;
+	if (ctr->pid)
+	{   /* if a conversion or transfer process is running kill
+	     * the entire process group (i.e. all processes
+	     * started within the shell) */
+	    kill (-ctr->pid, SIGTERM);
+	    etr->conversion_status = FILE_CONVERT_KILLED;
+	}
+	/* if a file has already been copied remove it again */
+	if (ctr->dest_filename)
+	{
+	    g_unlink (ctr->dest_filename);
+	    g_free (ctr->dest_filename);
+	    ctr->dest_filename = NULL;
+	}
+    }
+}
+
+
+/* called by conversion_cancel_itdb to mark nodes invalid that are in
+   the specified itdb */
+static void conversion_cancel_itdb_fe (gpointer data, gpointer userdata)
+{
+    ConvTrack *ctr = data;
+    iTunesDB *itdb = userdata;
+
+    g_return_if_fail (ctr && ctr->track && ctr->track->userdata);
+
+    if (ctr->itdb == itdb)
+    {
+	conversion_cancel_mark_track (ctr);
+    }
+}
+
+/* Marks all tracks in @*ctracks as invalid. If a dest_filename
+ * exists, the file is removed. If @remove is TRUE, the element is
+ * removed from the list altogether. */
+static void conversion_cancel_itdb_sub (GList **ctracks, gboolean remove)
+{
+    GList *gl, *next;
+
+    g_return_if_fail (ctracks);
+
+    for (gl=*ctracks; gl; gl=next)
+    {
+	ConvTrack *ctr = gl->data;
+	g_return_if_fail (ctr);
+	next = gl->next;
+	conversion_cancel_mark_track (ctr);
+	if (remove)
+	{
+	    *ctracks = g_list_delete_link (*ctracks, gl);
+	    conversion_convtrack_free (ctr);
+	}
+    }
+}
+	
+
+
+/* Cancel conversion for all tracks of @itdb */
+static void conversion_cancel_itdb (Conversion *conv, iTunesDB *itdb)
+{
+    TransferItdb *itr;
+
+    g_return_if_fail (conv);
+    g_return_if_fail (itdb);
+
+    g_mutex_lock (conv->mutex);
+
+    g_list_foreach (conv->scheduled, conversion_cancel_itdb_fe, itdb);
+    g_list_foreach (conv->processing, conversion_cancel_itdb_fe, itdb);
+    g_list_foreach (conv->failed, conversion_cancel_itdb_fe, itdb);
+    g_list_foreach (conv->converted, conversion_cancel_itdb_fe, itdb);
+
+    itr = transfer_get_tri (conv, itdb);
+    conversion_cancel_itdb_sub (&itr->scheduled, TRUE);
+    conversion_cancel_itdb_sub (&itr->processing, FALSE);
+    conversion_cancel_itdb_sub (&itr->transferred, FALSE);
+    conversion_cancel_itdb_sub (&itr->finished, TRUE);
+    conversion_cancel_itdb_sub (&itr->failed, TRUE);
+    itr->valid = FALSE;
+
+    g_mutex_unlock (conv->mutex);
+}
+
+
+
+/* called by conversion_cancel_track to mark nodes invalid that refer
+   to @track (should only be one...) */
+/* Used by conversion-cancel_track_sub() to find the list element that
+   contains @track. Returns 0 if found. */
+static int conversion_cancel_track_cmp (gconstpointer a, gconstpointer b)
+{
+    const ConvTrack *ctr = a;
+    const Track *track = b;
+
+    g_return_val_if_fail (ctr, 0);
+
+    if (ctr->track == track) return 0;
+    return -1;
+}
+
+
+/* Finds @track in @ctracks and marks it as invalid. If a
+ * dest_filename exists, the file is removed. If @remove is TRUE, the
+ * element is removed from the list altogether. */
+static void conversion_cancel_track_sub (GList **ctracks,
+					 Track *track,
+					 gboolean remove)
+{
+    GList *gl;
+
+    g_return_if_fail (track && track->userdata);
+
+    gl = g_list_find_custom (*ctracks, track, conversion_cancel_track_cmp);
+    if (gl)
+    {
+	ConvTrack *ctr = gl->data;
+	g_return_if_fail (ctr);
+	if (ctr->track == track)
+	{
+	    conversion_cancel_mark_track (ctr);
+	}
+	if (remove)
+	{
+	    *ctracks = g_list_delete_link (*ctracks, gl);
+	    conversion_convtrack_free (ctr);
+	}
+    }
+}
+
+
+/* Cancel conversion for @track */
+static void conversion_cancel_track (Conversion *conv, Track *track)
+{
+    g_return_if_fail (conv);
+    g_return_if_fail (track);
+
+    g_mutex_lock (conv->mutex);
+
+    conversion_cancel_track_sub (&conv->scheduled, track, FALSE);
+    conversion_cancel_track_sub (&conv->processing, track, FALSE);
+    conversion_cancel_track_sub (&conv->failed, track, FALSE);
+    conversion_cancel_track_sub (&conv->converted, track, FALSE);
+    conversion_cancel_track_sub (&conv->finished, track, TRUE);
+    if (track->itdb)
+    {
+	TransferItdb *itr = transfer_get_tri (conv, track->itdb);
+	conversion_cancel_track_sub (&itr->scheduled, track, TRUE);
+	conversion_cancel_track_sub (&itr->processing, track, FALSE);
+	conversion_cancel_track_sub (&itr->transferred, track, FALSE);
+	conversion_cancel_track_sub (&itr->finished, track, TRUE);
+	conversion_cancel_track_sub (&itr->failed, track, TRUE);
+    }
+    g_mutex_unlock (conv->mutex);
+}
+
+
+/* Force the conversion process to continue even if the allocated
+ * disk space is used up */
+static void conversion_continue (Conversion *conv)
+{
+    g_return_if_fail (conv);
+
+    g_mutex_lock (conv->mutex);
+    if (conv->threads_num == 0)
+    {   /* make sure at least one conversion is started even if
+	   directory is full */
+	conv->conversion_force = TRUE;
+    }
+    g_mutex_unlock (conv->mutex);
+}
+
+
+/* Add @track to the list of tracks to be converted if conversion is
+ * necessary.
+ *
+ * Return value: FALSE if an error occured, TRUE otherwise
+ */
+static gboolean conversion_add_track (Conversion *conv, Track *track)
+{
+    ExtraTrackData *etr;
+    ConvTrack *ctr;
+    gchar *conversion_cmd = NULL;
+    const gchar *typestr = NULL;
+    gboolean convert=FALSE, must_convert = FALSE;
+    gboolean result = TRUE;
+
+    g_return_val_if_fail (conv, FALSE);
+    g_return_val_if_fail (track, FALSE);
+    g_return_val_if_fail (track->itdb, FALSE);
+    etr = track->userdata;
+    g_return_val_if_fail (etr, FALSE);
+
+    if ((track->itdb->usertype & GP_ITDB_TYPE_LOCAL) ||
+	(track->transferred))
+    {   /* no conversion or transfer needed */
+	return TRUE;
+    }
+
+    /* Create ConvTrack structure */
+    ctr = g_new0 (ConvTrack, 1);
+    ctr->track = track;
+    ctr->itdb = track->itdb;
+    ctr->conv = conv;
+    ctr->orig_file = g_strdup (etr->pc_path_locale);
+    ctr->converted_file = g_strdup (etr->converted_file);
+    ctr->artist    = g_strdup (track->artist);
+    ctr->album     = g_strdup (track->album);
+    ctr->track_nr  = g_strdup_printf ("%02d", track->track_nr);
+    ctr->title     = g_strdup (track->title);
+    ctr->genre     = g_strdup (track->genre);
+    ctr->year      = g_strdup (etr->year_str);
+    ctr->comment   = g_strdup (track->comment);
+    ctr->valid = TRUE;
+
+    if (!etr->pc_path_locale || (strlen (etr->pc_path_locale) == 0))
+    {
+	gchar *buf = get_track_info (track, FALSE);
+	gtkpod_warning (_("Original filename not available for '%s.'\n"), buf);
+	g_free (buf);
+
+	etr->conversion_status = FILE_CONVERT_FAILED;
+	/* add to failed list */
+	g_mutex_lock (conv->mutex);
+	conv->failed = g_list_prepend (conv->failed, ctr);
+	g_mutex_unlock (conv->mutex);
+	debug ("added track to failed %p\n", track);
+	return FALSE;
+    }
+
+    if (!g_file_test (etr->pc_path_locale, G_FILE_TEST_IS_REGULAR))
+    {
+	gchar *buf = get_track_info (track, FALSE);
+	gtkpod_warning (_("Filename '%s' is no longer valid for '%s'.\n"),
+			etr->pc_path_utf8, buf);
+	g_free (buf);
+
+	etr->conversion_status = FILE_CONVERT_FAILED;
+	/* add to failed list */
+	g_mutex_lock (conv->mutex);
+	conv->failed = g_list_prepend (conv->failed, ctr);
+	g_mutex_unlock (conv->mutex);
+	debug ("added track to failed %p\n", track);
+	return FALSE;
+    }	
+
+    /* Find the correct script for conversion */
+    switch (determine_file_type(etr->pc_path_locale))
+    {
+        case FILE_TYPE_UNKNOWN:
+        case FILE_TYPE_M4P:
+        case FILE_TYPE_M4B:
+        case FILE_TYPE_M4V:
+        case FILE_TYPE_MP4:
+        case FILE_TYPE_MOV:
+        case FILE_TYPE_MPG:
+        case FILE_TYPE_M3U:
+        case FILE_TYPE_PLS:
+        case FILE_TYPE_IMAGE:
+        case FILE_TYPE_DIRECTORY:
+	    /* we don't convert these (yet) */
+	    etr->conversion_status = FILE_CONVERT_INACTIVE;
+	    /* add to finished */
+	    g_mutex_lock (conv->mutex);
+	    conv->finished = g_list_prepend (conv->finished, ctr);
+	    g_mutex_unlock (conv->mutex);
+	    debug ("added track to finished %p\n", track);
+            return TRUE;
+        case FILE_TYPE_M4A:
+	    convert = prefs_get_int ("convert_m4a");
+            conversion_cmd = prefs_get_string ("path_conv_m4a");
+            break;
+        case FILE_TYPE_WAV:
+	    convert = prefs_get_int ("convert_wav");
+            conversion_cmd = prefs_get_string ("path_conv_wav");
+            break;
+        case FILE_TYPE_MP3:
+	    convert = prefs_get_int ("convert_mp3");
+            conversion_cmd = prefs_get_string ("path_conv_mp3");
+            break;
+        case FILE_TYPE_OGG:
+	    convert = prefs_get_int ("convert_ogg");
+	    conversion_cmd = prefs_get_string ("path_conv_ogg");
+	    must_convert = TRUE;
+	    typestr = _("Ogg Vorbis");
+            break;
+        case FILE_TYPE_FLAC:
+	    convert = prefs_get_int ("convert_flac");
+	    conversion_cmd = prefs_get_string ("path_conv_flac");
+	    must_convert = TRUE;
+	    typestr = _("FLAC");
+            break;
+    }
+
+    ctr->must_convert = must_convert;
+    ctr->conversion_cmd = conversion_cmd;
+    conversion_cmd = NULL;
+
+    if (convert)
+    {
+	gchar *template;
+
+	g_mutex_lock (conv->mutex);
+	template = g_strdup (conv->template);
+	g_mutex_unlock (conv->mutex);
+
+	ctr->fname_root = get_string_from_template (track, template, TRUE, TRUE);
+	ctr->fname_extension = conversion_get_fname_extension (NULL, ctr);
+	if (ctr->fname_extension)
+	{
+	    etr->conversion_status = FILE_CONVERT_SCHEDULED;
+	    /* add to scheduled list */
+	    g_mutex_lock (conv->mutex);
+	    conv->scheduled = g_list_prepend (conv->scheduled, ctr);
+	    g_mutex_unlock (conv->mutex);
+
+	    result = TRUE;
+	    debug ("added track %p\n", track);
+	}
+	else
+	{   /* an error has occured */
+	    if (ctr->errormessage)
+	    {
+		gtkpod_warning (ctr->errormessage);
+		g_free (ctr->errormessage);
+		ctr->errormessage = NULL;
+	    }
+
+	    if (must_convert)
+		etr->conversion_status = FILE_CONVERT_REQUIRED_FAILED;
+	    else
+		etr->conversion_status = FILE_CONVERT_FAILED;
+	    /* add to failed list */
+	    g_mutex_lock (conv->mutex);
+	    conv->failed = g_list_prepend (conv->failed, ctr);
+	    g_mutex_unlock (conv->mutex);
+	    result = FALSE;
+	    debug ("added track to failed %p\n", track);
+	}
+	g_free (template);
+    }
+    else if (must_convert)
+    {
+	gchar *buf = get_track_info (track, FALSE);
+	g_return_val_if_fail (typestr, FALSE);
+	gtkpod_warning (_("Files of type '%s' are not supported by the iPod. Please go to the Preferences to set up and turn on a suitable conversion script for '%s'.\n\n"), typestr, buf);
+	g_free (buf);
+
+	etr->conversion_status = FILE_CONVERT_REQUIRED;
+	/* add to failed list */
+	g_mutex_lock (conv->mutex);
+	conv->failed = g_list_prepend (conv->failed, ctr);
+	g_mutex_unlock (conv->mutex);
+	result = FALSE;
+	debug ("added track to failed %p\n", track);
+    }
+    else
+    {
+	etr->conversion_status = FILE_CONVERT_INACTIVE;
+	/* remove reference to any former converted file */
+	g_free (etr->converted_file);
+	etr->converted_file = NULL;
+	g_free (ctr->converted_file);
+	ctr->converted_file = NULL;
+	/* add to finished */
+	g_mutex_lock (conv->mutex);
+	conv->finished = g_list_prepend (conv->finished, ctr);
+	g_mutex_unlock (conv->mutex);
+	debug ("added track to finished %p\n", track);
+    }
+    g_free (conversion_cmd);
+    return result;
+}
+
+
+/* free the memory taken by @ctr */
+static void conversion_convtrack_free (ConvTrack *ctr)
+{
+    g_return_if_fail (ctr);
+    g_free (ctr->orig_file);
+    g_free (ctr->converted_file);
+    g_free (ctr->conversion_cmd);
+    g_free (ctr->fname_root);
+    g_free (ctr->fname_extension);
+    g_free (ctr->errormessage);
+    g_free (ctr->artist);
+    g_free (ctr->album);
+    g_free (ctr->track_nr);
+    g_free (ctr->title);
+    g_free (ctr->genre);
+    g_free (ctr->year);
+    g_free (ctr->comment);
+    if (ctr->gio_channel)
+    {
+	g_io_channel_unref (ctr->gio_channel);
+    }
+    if (ctr->pid)
+    {
+	g_spawn_close_pid (ctr->pid);
+    }
+
+    /* transfer stuff */
+    g_free (ctr->dest_filename);
+    g_free (ctr->mountpoint);
+
+    g_free (ctr);
+}
+
+
+/* return some sensible input about @ctrack. You must free the
+   returned string after use. */
+static gchar *conversion_get_track_info (Conversion *conv, ConvTrack *ctr)
+{
+    gchar *str = NULL;
+
+    if (conv) g_mutex_lock (conv->mutex);
+
+    if ((ctr->title && strlen(ctr->title)))
+    {
+	str = g_strdup (ctr->title);
+    }
+    else if ((ctr->album && strlen(ctr->album)))
+    {
+	str = g_strdup_printf ("%s_%s", ctr->track_nr, ctr->album);
+    }
+    else if ((ctr->artist && strlen(ctr->artist)))
+    {
+	str = g_strdup_printf ("%s_%s", ctr->track_nr, ctr->artist);
+    }
+    else
+    {
+	str = g_strdup (_("No information available"));
+    }
+
+    if (conv) g_mutex_unlock (conv->mutex);
+
+    return str;
+}
+
+
+
+/* Set and set up the conversion cachedir.
+ *
+ * Return value: TRUE if directory could be set up.
+ *               FALSE if an error occured.
+ */
+static gboolean conversion_setup_cachedir (Conversion *conv)
+{
+    g_return_val_if_fail (conv, FALSE);
+
+    g_mutex_lock (conv->mutex);
+
+    g_free (conv->cachedir);
+    conv->cachedir = NULL;
+    conv->cachedir = prefs_get_string (FILE_CONVERT_CACHEDIR);
+    if (!conv->cachedir)
+    {
+	gchar *cfgdir = prefs_get_cfgdir ();
+	if (cfgdir)
+	{
+	    conv->cachedir = g_build_filename (cfgdir, "conversion_cache", NULL);
+	    g_free (cfgdir);
+	}
+    }
+    if (conv->cachedir)
+    {
+	if (!g_file_test (conv->cachedir, G_FILE_TEST_IS_DIR))
+	{
+	    if ((g_mkdir (conv->cachedir, 0777)) == -1)
+	    {
+		gtkpod_warning (_("Could not create '%s'. Filetype conversion will not work.\n"));
+		g_free (conv->cachedir);
+		conv->cachedir = NULL;
+	    }
+	}
+    }
+
+    if (conv->cachedir)
+    {
+	prefs_set_string (FILE_CONVERT_CACHEDIR, conv->cachedir);
+    }
+
+    g_mutex_unlock (conv->mutex);
+
+    if (conv->cachedir)
+	return TRUE;
+    else
+	return FALSE;
+}
+
+
+
+/* called in conversion_scheduler to g_spawn_close_pid() and unref the
+   io-channel after the conversion has finished/has failed/has been
+   killed. If output is buffered in the io-channel it's appended to
+   the log before closing up the channel. */
+static void conversion_free_resources (ConvTrack *ctr)
+{
+    g_return_if_fail (ctr);
+
+    /* Free resources */
+    if (ctr->pid)
+    {
+	g_spawn_close_pid (ctr->pid);
+	ctr->pid = 0;
+    }
+    if (ctr->gio_channel)
+    {
+	conversion_display_log (ctr);
+	g_io_channel_unref (ctr->gio_channel);
+	ctr->gio_channel = NULL;
+    }
+}
+
+
+/* the scheduler code without the locking mechanism -- has to be
+   called with conv->mutex locked */
+static gboolean conversion_scheduler_unlocked (Conversion *conv)
+{
+    GList *gli, *nextgli;
+
+    g_return_val_if_fail (conv, TRUE);
+
+    if (!conv->cachedir)
+    {
+	/* Cachedir is not available. Not good! Remove the timeout function. */
+	g_return_val_if_reached (FALSE);
+    }
+
+    if (conv->dirsize == CONV_DIRSIZE_INVALID)
+    {   /* dirsize has not been set up. Wait until that has been done. */
+	return TRUE;
+    }
+
+    if (conv->scheduled)
+    {
+	if ((conv->threads_num < conv->max_threads_num) &&
+	    ((conv->dirsize <= conv->max_dirsize) || conv->conversion_force))
+	{
+	    GList *gl;
+	    GThread *thread;
+
+	    thread = g_thread_create_full (conversion_thread,
+					   conv,   /* user data  */
+					   0,      /* stack size */
+					   FALSE,  /* joinable   */
+					   TRUE,   /* bound      */
+					   G_THREAD_PRIORITY_LOW,
+					   NULL);  /* error      */
+
+	    /* Add thread to thread list. Use first available slot */
+	    gl = g_list_find (conv->threads, NULL);
+	    if (gl)
+	    {   /* found empty slot */
+		gl->data = thread;
+	    }
+	    else
+	    {   /* no empty slot available --> add to end */
+		conv->threads = g_list_append (conv->threads, thread);
+	    }
+
+	    ++conv->threads_num;
+	}
+    }
+    else
+    {
+	conv->conversion_force = FALSE;
+    }
+
+    if (conv->processing)
+    {
+	GList *gl;
+	for (gl=conv->processing; gl; gl=gl->next)
+	{
+	    ConvTrack *ctr = gl->data;
+	    g_return_val_if_fail (ctr, TRUE);
+	    if (ctr->valid && ctr->gio_channel)
+	    {
+		conversion_display_log (ctr);
+	    }
+	}
+    }
+
+    if (conv->failed)
+    {
+	GList *gl;
+	for (gl=conv->failed; gl; gl=gl->next)
+	{
+	    ConvTrack *ctr = gl->data;
+	    g_return_val_if_fail (ctr, TRUE);
+
+	    /* free resources (pid, flush io-channel) */
+	    conversion_free_resources (ctr);
+
+	    if (ctr->valid)
+	    {
+		ExtraTrackData *etr;
+		if (ctr->errormessage)
+		{
+		    gtkpod_warning (ctr->errormessage);
+		    g_free (ctr->errormessage);
+		    ctr->errormessage = NULL;
+		}
+		g_return_val_if_fail (ctr->track && ctr->track->userdata, TRUE);
+		etr = ctr->track->userdata;
+		if (ctr->must_convert)
+		{
+		    if (etr->conversion_status != FILE_CONVERT_REQUIRED)
+		    {
+			etr->conversion_status = FILE_CONVERT_REQUIRED_FAILED;
+		    }
+		}
+		else
+		{
+		    etr->conversion_status = FILE_CONVERT_FAILED;
+		}
+		/* Add to finished so we can find it in case user
+		   waits for next converted file */
+		conv->finished = g_list_prepend (conv->finished, ctr);
+	    }
+	    else
+	    {   /* track is not valid any more */
+		conversion_convtrack_free (ctr);
+	    }
+	}
+	g_list_free (conv->failed);
+	conv->failed = NULL;
+    }
+
+    if (conv->converted)
+    {
+	GList *gl;
+	for (gl=conv->converted; gl; gl=gl->next)
+	{
+	    ConvTrack *ctr = gl->data;
+	    g_return_val_if_fail (ctr, TRUE);
+
+	    /* free resources (pid / flush io-channel) */
+	    conversion_free_resources (ctr);
+
+	    if (ctr->valid)
+	    {
+		GList *trackgl;
+		g_return_val_if_fail (ctr->track, TRUE);
+		GList *tracks = gp_itdb_find_same_tracks_in_itdbs (ctr->track);
+		for (trackgl=tracks; trackgl; trackgl=trackgl->next)
+		{
+		    ExtraTrackData *etr;
+		    Track *tr = trackgl->data;
+		    g_return_val_if_fail (tr && tr->itdb && tr->userdata,
+					  TRUE);
+		    etr = tr->userdata;
+
+		    /* spread information to local databases for
+		       future reference */
+		    if (tr->itdb->usertype & GP_ITDB_TYPE_LOCAL)
+		    {
+			g_free (etr->converted_file);
+			etr->converted_file = g_strdup (ctr->converted_file);
+			pm_track_changed (tr);
+			data_changed (tr->itdb);
+		    }
+
+		    /* don't forget to copy conversion data to the
+		       track itself */
+		    if (tr == ctr->track)
+		    {
+			g_free (etr->converted_file);
+			etr->converted_file = g_strdup (ctr->converted_file);
+			etr->conversion_status = FILE_CONVERT_CONVERTED;
+			tr->size = ctr->converted_size;
+			pm_track_changed (tr);
+			data_changed (tr->itdb);
+		    }
+		}
+		g_list_free (tracks);
+		/* add ctr to finished */
+		conv->finished = g_list_prepend (conv->finished, ctr);
+	    }
+	    else
+	    {   /* track is not valid any more */
+		conversion_convtrack_free (ctr);
+	    }
+	}
+	g_list_free (conv->converted);
+	conv->converted = NULL;
+    }
+
+    if (conv->finished)
+    {
+	GList *gl;
+	for (gl=conv->finished; gl; gl=gl->next)
+	{
+	    ConvTrack *ctr = gl->data;
+	    g_return_val_if_fail (ctr, TRUE);
+	    if (ctr->valid)
+	    {
+		TransferItdb *tri;
+		ExtraTrackData *etr;
+		Track *tr = ctr->track;
+		g_return_val_if_fail (tr && tr->itdb && tr->userdata, TRUE);
+		etr = tr->userdata;
+		/* broadcast finished track */
+		g_cond_broadcast (conv->finished_cond);
+
+		tri = transfer_get_tri (conv, tr->itdb);
+		g_return_val_if_fail (tri, TRUE);
+		/* Provide mountpoint */
+		ctr->mountpoint = g_strdup (itdb_get_mountpoint (ctr->itdb));
+
+		switch (etr->conversion_status)
+		{
+		case FILE_CONVERT_INACTIVE:
+		case FILE_CONVERT_CONVERTED:
+		    tri->scheduled =
+			g_list_prepend (tri->scheduled, ctr);
+		    break;
+		case FILE_CONVERT_FAILED:
+		case FILE_CONVERT_REQUIRED_FAILED:
+		case FILE_CONVERT_REQUIRED:
+		    tri->failed = g_list_prepend (tri->failed, ctr);
+		    break;
+		case FILE_CONVERT_KILLED:
+		case FILE_CONVERT_SCHEDULED:
+		    fprintf (stderr, "Programming error, conversion type %d not expected in conversion_scheduler()\n", etr->conversion_status);
+		    conversion_convtrack_free (ctr);
+		    break;
+		}
+	    }
+	    else
+	    {   /* track is not valid any more */
+		conversion_convtrack_free (ctr);
+	    }
+	}
+	g_list_free (conv->finished);
+	conv->finished = NULL;
+    }
+
+    for (gli=conv->transfer_itdbs; gli; gli=nextgli)
+    {
+	TransferItdb *tri = gli->data;
+	nextgli = gli->next;
+
+	g_return_val_if_fail (tri, TRUE);
+	if (tri->scheduled)
+	{
+	    if ((tri->thread == NULL) && (tri->transfer == TRUE) &&
+		(tri->status != FILE_TRANSFER_DISK_FULL))
+	    {   /* start new thread */
+		tri->thread = g_thread_create_full (transfer_thread,
+						    tri,    /* user data  */
+						    0,      /* stack size */
+						    FALSE,  /* joinable   */
+						    TRUE,   /* bound      */
+						    G_THREAD_PRIORITY_LOW,
+						    NULL);  /* error      */
+	    }
+	}
+
+	if (tri->transferred)
+	{
+	    GList *gl;
+	    for (gl=tri->transferred; gl; gl=gl->next)
+	    {
+		ConvTrack *ctr = gl->data;
+		GError *error;
+		g_return_val_if_fail (ctr, TRUE);
+
+		if (tri->valid && ctr->valid)
+		{
+		    if (itdb_cp_finalize (ctr->track,
+					  NULL,
+					  ctr->dest_filename, &error))
+		    {   /* everything's fine */
+			tri->finished = g_list_prepend (tri->finished, ctr);
+			/* otherwise new free space status from iPod
+			   is never read and free space keeps
+			   increasing while we copy more and more
+			   files to the iPod */
+			space_data_update ();
+			debug ("transfer finalized: %s (%d)\n",
+			       conversion_get_track_info (NULL, ctr),
+			       ctr->track->transferred);
+		    }
+		    else
+		    {   /* error!? */
+			tri->failed = g_list_prepend (tri->failed, ctr);
+			gchar *buf = conversion_get_track_info (NULL, ctr);
+			gtkpod_warning (_("Transfer of '%s' failed. %s\n\n"),
+					buf,
+					error? error->message:"");
+			g_free (buf);
+			if (error)
+			{
+			    g_error_free (error);
+			}
+		    }
+		    pm_track_changed (ctr->track);
+		    data_changed (ctr->itdb);
+		}
+		else
+		{   /* track is not valid any more */
+		    conversion_convtrack_free (ctr);
+		}
+	    }
+	    g_list_free (tri->transferred);
+	    tri->transferred = NULL;
+	}
+
+	if (tri->failed)
+	{
+	    GList *gl;
+	    for (gl=tri->failed; gl; gl=gl->next)
+	    {
+		ConvTrack *ctr = gl->data;
+		g_return_val_if_fail (ctr, TRUE);
+
+		if (tri->valid && ctr->valid)
+		{
+		    if (ctr->errormessage)
+		    {
+			gtkpod_warning (ctr->errormessage);
+			g_free (ctr->errormessage);
+			ctr->errormessage = NULL;
+		    }
+		    g_free (ctr->dest_filename);
+		    ctr->dest_filename = NULL;
+		    tri->finished = g_list_prepend (tri->finished, ctr);
+		}
+		else
+		{   /* track is not valid any more */
+		    conversion_convtrack_free (ctr);
+		}
+	    }
+	    g_list_free (tri->failed);
+	    tri->failed = NULL;
+	}
+
+
+	/* remove TransferItdb completely if invalid and all tracks
+	 * have been removed */
+	if (!tri->valid)
+	{
+	    if (!!tri->scheduled && !tri->processing && !tri->transferred &&
+		!tri->finished && !tri->failed && !tri->thread)
+	    {
+		transfer_free_transfer_itdb (tri);
+		conv->transfer_itdbs =
+		    g_list_delete_link (conv->transfer_itdbs, gli);
+	    }
+	}
+    }
+
+
+    /* update the log window */
+    if (conv->log_window_shown)
+    {
+	conversion_log_set_status (conv);
+    }
+
+    return TRUE;
+}
+
+
+/* timeout function, add new threads if unscheduled tracks are in the
+   queue and maximum number of threads hasn't been reached */
+static gboolean conversion_scheduler (gpointer data)
+{
+    Conversion *conv = data;
+    gboolean result;
+    g_return_val_if_fail (data, FALSE);
+
+/*     debug ("conversion_scheduler enter\n"); */
+
+    gdk_threads_enter();
+    g_mutex_lock (conv->mutex);
+
+    result = conversion_scheduler_unlocked (conv);
+
+    g_mutex_unlock (conv->mutex);
+    gdk_threads_leave();
+
+/*    debug ("conversion_scheduler exit\n");*/
+
+    return result;
+}
+
+
+/* Calculate the size of the directory */
+static gpointer conversion_update_dirsize (gpointer data)
+{
+    Conversion *conv = data;
+    gchar *dir;
+    gint64 size = 0;
+
+    g_return_val_if_fail (conv, NULL);
+
+    debug ("%p update_dirsize enter\n", g_thread_self ());
+
+    g_mutex_lock (conv->mutex);
+    if (conv->dirsize_in_progress)
+    {   /* another thread is already working on the directory
+	   size. We'll wait until it has finished and just return. */
+	g_cond_wait (conv->dirsize_cond, conv->mutex);
+	g_mutex_unlock (conv->mutex);
+	debug ("%p update_dirsize concurrent exit\n", g_thread_self ());
+	return NULL;
+    }
+    conv->dirsize_in_progress = TRUE;
+    dir = g_strdup (conv->cachedir);
+    g_mutex_unlock (conv->mutex);
+
+    if (dir)
+    {
+	debug ("%p update_dirsize getting size of dir (%s)\n",
+	       g_thread_self (), dir);
+
+	size = get_size_of_directory (dir);
+	g_free (dir);
+	dir = NULL;
+    }
+
+    g_mutex_lock (conv->mutex);
+    /* Even in case of an error get_size_of_directory() will return
+       0. This means setting the dirsize here will not block the
+       conversion process even if there is a problem determining the
+       size of the directory */
+    conv->dirsize = size;
+    /* We're finished doing the directory upgrade. Unset the flag and
+       broadcast to all threads waiting to wake them up. */
+    conv->dirsize_in_progress = FALSE;
+    g_cond_broadcast (conv->dirsize_cond);
+    g_mutex_unlock (conv->mutex);
+
+    debug ("%p update_dirsize exit\n", g_thread_self ());
+    return NULL;
+}
+
+
+struct conversion_prune_file
+{
+    gchar *filename;
+    struct stat statbuf;
+};
+
+
+/* make a list of all existing files */
+static GList *conversion_prune_dir_collect_files (const gchar *dir)
+{
+    GDir *gdir;
+    const gchar *fname;
+    GList *files = NULL;
+
+    g_return_val_if_fail (dir, NULL);
+
+    gdir = g_dir_open (dir, 0, NULL);
+    if (!gdir)
+    {
+	/* do something */
+	return files;
+    }
+
+    while ((fname = g_dir_read_name (gdir)))
+    {
+	gchar *fullname = g_build_filename (dir, fname, NULL);
+
+	if (g_file_test (fullname, G_FILE_TEST_IS_DIR))
+	{
+	    files = g_list_concat (files, 
+				   conversion_prune_dir_collect_files (fullname));
+	}
+	else if (g_file_test (fullname, G_FILE_TEST_IS_REGULAR))
+	{
+	    struct conversion_prune_file *cpf;
+	    cpf = g_new0 (struct conversion_prune_file, 1);
+	    if (g_stat (fullname, &cpf->statbuf) == 0)
+	    {   /* OK, add */
+		cpf->filename = fullname;
+		fullname = NULL;
+		files = g_list_prepend (files, cpf);
+	    }
+	    else
+	    {   /* error -- ignore this file */
+		g_free (cpf);
+	    }
+	}
+	g_free (fullname);
+    }
+
+    g_dir_close (gdir);
+
+    return files;
+}
+	
+/* used to sort the list of unneeded files so that the oldest ones
+   come first */
+static gint conversion_prune_compfunc (gconstpointer a, gconstpointer b)
+{
+    const struct conversion_prune_file *cpf_a = a;
+    const struct conversion_prune_file *cpf_b = b;
+
+    return cpf_a->statbuf.st_mtime - cpf_b->statbuf.st_mtime;
+}
+
+/* free struct conversion_prune_file structure data, called from
+   g_list_foreach */
+static void conversion_prune_freefunc (gpointer data, gpointer user_data)
+{
+    struct conversion_prune_file *cpf = data;
+    g_return_if_fail (cpf);
+    g_free (cpf->filename);
+    g_free (cpf);
+}
+
+
+/* Add tracks still needed to hash. Called by conversion_prune_dir() */
+static void conversion_prune_needed_add (GHashTable *hash_needed_files,
+					 GList *ctracks)
+{
+    GList *gl;
+
+    g_return_if_fail (hash_needed_files);
+
+    for (gl=ctracks; gl; gl=gl->next)
+    {
+	ConvTrack *ctr = gl->data;
+	g_return_if_fail (ctr);
+	if (ctr->valid && ctr->converted_file)
+	{
+	    g_hash_table_insert (hash_needed_files,
+				 g_strdup (ctr->converted_file), ctr);
+	}
+    }
+}
+
+
+/* Prune the directory of unused files */
+static gpointer conversion_prune_dir (gpointer data)
+{
+    Conversion *conv = data;
+    gchar *dir;
+    gint64 dirsize;
+    gint64 maxsize;
+
+    g_return_val_if_fail (conv, NULL);
+
+    debug ("%p prune_dir enter\n", g_thread_self ());
+
+    g_mutex_lock (conv->mutex);
+    if (conv->prune_in_progress)
+    {   /* another thread is already working on the directory
+	   prune. We'll wait until it has finished and just return. */
+	g_cond_wait (conv->prune_cond, conv->mutex);
+	g_mutex_unlock (conv->mutex);
+	return NULL;
+    }
+    conv->prune_in_progress = TRUE;
+    dir = g_strdup (conv->cachedir);
+    g_mutex_unlock (conv->mutex);
+
+    if (dir)
+    {
+	GHashTable *hash_needed_files;
+	GList *gl;
+	GList *files = NULL;
+
+	debug ("%p prune_dir creating list of available files\n", g_thread_self ());
+
+	/* make a list of all available files */
+	files = conversion_prune_dir_collect_files (dir);
+
+	debug ("%p prune_dir creating hash_needed_files\n", g_thread_self ());
+
+	/* make a hash of all the files still needed */
+	hash_needed_files = g_hash_table_new_full (g_str_hash, g_str_equal,
+						   g_free, NULL);
+	g_mutex_lock (conv->mutex);
+
+	/* add needed files to hash */
+	conversion_prune_needed_add (hash_needed_files, conv->scheduled);
+	conversion_prune_needed_add (hash_needed_files, conv->processing);
+	conversion_prune_needed_add (hash_needed_files, conv->converted);
+	conversion_prune_needed_add (hash_needed_files, conv->finished);
+	for (gl=conv->transfer_itdbs; gl; gl=gl->next)
+	{
+	    TransferItdb *tri = gl->data;
+	    g_return_val_if_fail (tri, (conv->prune_in_progress = FALSE,
+					g_cond_broadcast (conv->prune_cond),
+					g_mutex_unlock(conv->mutex),
+					NULL));
+	    conversion_prune_needed_add (hash_needed_files, tri->scheduled);
+	    conversion_prune_needed_add (hash_needed_files, tri->processing);
+	    conversion_prune_needed_add (hash_needed_files, tri->failed);
+	}
+
+	g_mutex_unlock (conv->mutex);
+
+	/* sort the list so that the oldest files are first */
+	files = g_list_sort (files, conversion_prune_compfunc);
+
+	/* get an up-to-date count of the directory size */
+	conversion_update_dirsize (conv);
+
+	g_mutex_lock (conv->mutex);
+	dirsize = conv->dirsize;
+	maxsize = conv->max_dirsize;
+	g_mutex_unlock (conv->mutex);
+
+	debug ("%p prune_dir removing files (%lld/%lld)\n",
+	       g_thread_self (), (long long int)dirsize, (long long int)maxsize);
+
+	/* remove files until dirsize is smaller than maxsize */
+	/* ... */
+	for (gl=files; gl && (dirsize > maxsize); gl=gl->next)
+	{
+	    struct conversion_prune_file *cpf = gl->data;
+	    g_return_val_if_fail (cpf, (conv->prune_in_progress = FALSE,
+					g_cond_broadcast (conv->prune_cond),
+					NULL));
+	    g_return_val_if_fail (cpf->filename,
+				  (conv->prune_in_progress = FALSE,
+				   g_cond_broadcast (conv->prune_cond),
+				   NULL));
+	    if (g_hash_table_lookup (hash_needed_files, cpf->filename) == NULL)
+	    {   /* file is not among those remove */
+		if (g_remove (cpf->filename) == 0)
+		{
+		    dirsize -= cpf->statbuf.st_size;
+		}
+	    }
+	}
+
+	debug ("%p prune_dir removed files (%lld/%lld)\n",
+	       g_thread_self (), (long long int)dirsize, (long long int)maxsize);
+
+	/* free all data */
+	g_list_foreach (files, conversion_prune_freefunc, NULL);
+	g_list_free (files);
+	g_hash_table_destroy (hash_needed_files);
+	g_free (dir);
+	dir = NULL;
+    }
+
+    g_mutex_lock (conv->mutex);
+    conv->prune_in_progress = FALSE;
+    g_cond_broadcast (conv->prune_cond);
+    g_mutex_unlock (conv->mutex);
+
+    debug ("%p prune_dir exit\n", g_thread_self ());
+
+    return NULL;
+}
+
+
+/* Get filename extension used by @ctr->conversion_cmd. If @conv==NULL,
+   don't do locking.
+
+   Return value: filename extension used by @ctr->conversion_cmd or
+   NULL if an error occured. In case of an error, the error message is
+   stored in ctr->errormessage */
+static gchar *conversion_get_fname_extension (Conversion *conv, ConvTrack *ctr)
+{
+    gchar **argv;
+    gboolean result;
+    gchar *fname_extension = NULL;
+    gchar *std_out = NULL;
+    gint exit_status = 0;
+    GError *error = NULL;
+
+    g_return_val_if_fail (ctr, NULL);
+
+    /* get filename extension */
+    if (conv) g_mutex_lock (conv->mutex);
+    argv = build_argv_from_strings (ctr->conversion_cmd, "-x", NULL);
+    if (conv) g_mutex_unlock (conv->mutex);
+
+    result = g_spawn_sync (NULL,                /* working dir */
+			   argv,                /* argv        */
+			   NULL,                /* envp        */
+			   G_SPAWN_SEARCH_PATH, /* flags: use user's path */
+			   NULL,                /* child_setup function   */
+			   NULL,                /* user data              */
+			   &std_out,
+			   NULL,
+			   &exit_status,
+			   &error);
+
+    if (result == FALSE)
+    {
+	if (conv) g_mutex_lock (conv->mutex);
+	if (ctr->valid)
+	{
+	    gchar *buf = conversion_get_track_info (NULL, ctr);
+	    ctr->errormessage =
+		g_strdup_printf (_("Conversion of '%s' failed: '%s'.\n\n"),
+				 buf,
+				 error->message);
+	    g_free (buf);
+	}
+	if (conv) g_mutex_unlock (conv->mutex);
+	g_error_free (error);
+    }
+    else if (WEXITSTATUS (exit_status) != 0)
+    {
+	if (conv) g_mutex_lock (conv->mutex);
+	if (ctr->valid)
+	{
+	    gchar *buf = conversion_get_track_info (NULL, ctr);
+	    ctr->errormessage =
+		g_strdup_printf (_("Conversion of '%s' failed: '%s %s' returned exit status %d.\n\n"),
+				 buf,
+				 argv[0], argv[1],
+				 WEXITSTATUS (exit_status));
+	    g_free (buf);
+	}
+	if (conv) g_mutex_unlock (conv->mutex);
+	result = FALSE;
+    }
+
+    /* retrieve filename extension */
+    if (std_out && (strlen (std_out) > 0))
+    {
+	gint len = strlen (std_out);
+	fname_extension = std_out;
+	std_out = NULL;
+	if (fname_extension[len-1] == '\n')
+	{
+	    fname_extension[len-1] = 0;
+	}
+    }
+
+    if (!fname_extension || (strlen (fname_extension) == 0))
+    {   /* no a valid filename extension */
+	if (conv) g_mutex_lock (conv->mutex);
+	if (ctr->valid)
+	{
+	    gchar *buf = conversion_get_track_info (NULL, ctr);
+	    ctr->errormessage =
+		g_strdup_printf (_("Conversion of '%s' failed: '\"%s\" %s' did not return filename extension as expected.\n\n"),
+				 buf,
+				 argv[0], argv[1]);
+	    g_free (buf);
+	}
+	if (conv) g_mutex_unlock (conv->mutex);
+	result = FALSE;
+    }
+
+    g_strfreev (argv);
+    argv = NULL;
+
+    if (result == FALSE)
+    {
+	g_free (std_out);
+	g_free (fname_extension);
+	fname_extension = NULL;;
+    }
+
+    return fname_extension;
+}
+
+
+/* Sets a valid filename.
+
+   Return value: TRUE if everything went fine. In this case
+   ctr->converted_filename contains the filename to use. If that file
+   already exists no conversion is necessary.
+   FALSE is returned if some error occured, in which case
+   ctr->errormessage may be set. */
+static gboolean conversion_set_valid_filename (Conversion *conv, ConvTrack *ctr)
+{
+    gboolean result = TRUE;
+
+    g_return_val_if_fail (conv, FALSE);
+    g_return_val_if_fail (ctr, FALSE);
+
+    g_mutex_lock (conv->mutex);
+    if (ctr->valid)
+    {
+	gint i;
+	gchar *rootdir;
+	gchar *basename;
+	gchar *fname = NULL;
+
+	/* Check if converted_filename already exists. If yes, only
+	   keep it if the file is newer than the original file and the
+	   filename extension matches the intended
+	   conversion. Otherwise remove it and set a new filename */
+	if (ctr->converted_file)
+	{
+	    gboolean delete = FALSE;
+	    if (g_file_test (ctr->converted_file, G_FILE_TEST_IS_REGULAR))
+	    {
+		struct stat conv_stat, orig_stat;
+		if (g_str_has_suffix (ctr->converted_file, ctr->fname_extension))
+		{
+		    if (stat (ctr->converted_file, &conv_stat) == 0)
+		    {
+			if (stat (ctr->orig_file, &orig_stat) == 0)
+			{
+			    if (conv_stat.st_mtime > orig_stat.st_mtime)
+			    {   /* converted file is newer than
+				 * original file */
+				g_mutex_unlock (conv->mutex);
+				return TRUE;
+			    }
+			    else
+			    {   /* converted file is older than original file */
+				delete = TRUE;
+			    }
+			}
+			else
+			{   /* error reading original file */
+			    char *buf = conversion_get_track_info (NULL, ctr);
+			    ctr->errormessage =
+				g_strdup_printf (_("Conversion of '%s' failed: Could not access original file '%s' (%s).\n\n"),
+						 buf,
+						 ctr->orig_file,
+						 strerror (errno));
+			    g_free (buf);
+			    g_mutex_unlock (conv->mutex);
+			    return FALSE;
+			}
+		    }
+		}
+		else
+		{
+		    delete = TRUE;
+		}
+	    }
+	    if (delete)
+	    {
+		g_remove (ctr->converted_file);
+	    }
+	    g_free (ctr->converted_file);
+	    ctr->converted_file = NULL;
+	}
+
+	if (!conv->cachedir)
+	{
+	    g_mutex_unlock (conv->mutex);
+	    g_return_val_if_reached (FALSE);
+	}
+
+	basename = g_build_filename (conv->cachedir, ctr->fname_root, NULL);
+
+	g_mutex_unlock (conv->mutex);
+
+	i=0;
+	do
+	{
+	    g_free (fname);
+	    fname = g_strdup_printf ("%s-%p-%d.%s",
+				     basename,
+				     g_thread_self (),
+				     i,
+				     ctr->fname_extension);
+	    ++i;
+	} while (g_file_test (fname, G_FILE_TEST_EXISTS));
+
+	rootdir = g_path_get_dirname (fname);
+
+	g_mutex_lock (conv->mutex);
+	result = mkdirhier (rootdir, TRUE);
+	if (result == FALSE)
+	{
+	    if (ctr->valid)
+	    {
+		gchar *buf = conversion_get_track_info (NULL, ctr);
+		ctr->errormessage =
+		    g_strdup_printf (_("Conversion of '%s' failed: Could not create directory '%s'.\n\n"),
+				     buf,
+				     rootdir);
+		g_free (buf);
+	    }
+	}
+	else
+	{
+	    ctr->converted_file = fname;
+	    fname = NULL;
+	}
+	g_free (rootdir);
+	g_free (fname);
+    }
+    g_mutex_unlock (conv->mutex);
+
+    return result;
+}
+
+
+/* Used to set the process group ID of the spawned shell, so that we
+   can kill the shell as well as all its children in case of an
+   abort of the conversion.
+   For some reason this does not work with setpgid(child_pid, 0) just
+   after the g_spawn_async_with_pipes() and fails with "No such
+   process" */
+static void pgid_setup (gpointer user_data)
+{
+    /* this will not work nicely with windows for the reason alone
+       that on windows this function is called in the parent process,
+       whereas this has to be called in the child process as is done
+       in LINUX */
+    setpgid (0, 0);
+}
+
+
+/* Convert @ctr.
+ *
+ * Return value: TRUE if everything went well, FALSE otherwise.
+ */
+static gboolean conversion_convert_track (Conversion *conv, ConvTrack *ctr)
+{
+    gboolean result = FALSE;
+
+    g_return_val_if_fail (conv, FALSE);
+    g_return_val_if_fail (ctr, FALSE);
+
+    /* set valid output filename */
+    if (!conversion_set_valid_filename (conv, ctr))
+    {   /* some error occured */
+	return FALSE;
+    }
+
+    g_mutex_lock (conv->mutex);
+    if (ctr->converted_file && ctr->valid)
+    {
+	if (g_file_test (ctr->converted_file, G_FILE_TEST_EXISTS))
+	{   /* a valid converted file already exists. */
+	    result = TRUE;
+	}
+	else
+	{   /* start conversion */
+	    gchar **argv;
+	    GError *error = NULL;
+	    GPid child_pid;
+
+	    argv = build_argv_from_strings (ctr->conversion_cmd,
+					    "-a", ctr->artist,
+					    "-A", ctr->album,
+					    "-T", ctr->track_nr,
+					    "-t", ctr->title,
+					    "-g", ctr->genre,
+					    "-y", ctr->year,
+					    "-c", ctr->comment,
+					    "-f", ctr->converted_file,
+					    ctr->orig_file,
+					    NULL);
+
+	    result = g_spawn_async_with_pipes (
+		                  NULL,         /* working dir    */
+				  argv,         /* command line   */
+				  NULL,         /* envp           */
+				  G_SPAWN_SEARCH_PATH |
+				  G_SPAWN_DO_NOT_REAP_CHILD,
+				  pgid_setup,   /* setup func     */
+				  NULL,         /* user data      */
+				  &ctr->pid,    /* child's PID    */
+				  NULL,         /* child's stdin  */
+				  NULL,         /* child's stdout */
+				  &ctr->stderr, /* child's stderr */
+				  &error);
+
+	    child_pid = ctr->pid;
+
+	    g_strfreev (argv);
+	    argv = NULL;
+
+	    if (result == FALSE)
+	    {
+		if (ctr->valid)
+		{
+		    gchar *buf = conversion_get_track_info (NULL, ctr);
+		    ctr->errormessage =
+			g_strdup_printf (_("Conversion of '%s' failed: '%s'.\n\n"),
+					 buf,
+					 error->message);
+		    g_free (buf);
+		}
+		g_error_free (error);
+	    }
+	    else
+	    {
+		gint status;
+
+		/* set up i/o channel to main thread */
+		ctr->gio_channel = g_io_channel_unix_new (ctr->stderr);
+		g_io_channel_set_flags (ctr->gio_channel,
+					G_IO_FLAG_NONBLOCK, NULL);
+		g_io_channel_set_close_on_unref (ctr->gio_channel, TRUE);
+
+		g_mutex_unlock (conv->mutex);
+
+		waitpid (child_pid, &status, 0);
+
+		g_mutex_lock (conv->mutex);
+
+		ctr->pid = 0;
+
+		if (WIFEXITED(status) && (WEXITSTATUS(status) != 0))
+		{   /* script exited normally but with an error */
+		    if (ctr->valid)
+		    {
+			gchar *buf = conversion_get_track_info (NULL, ctr);
+			ctr->errormessage =
+			    g_strdup_printf (_("Conversion of '%s' failed: '%s' returned exit status %d.\n\n"),
+					     buf,
+					     ctr->conversion_cmd,
+					     WEXITSTATUS (status));
+			g_free (buf);
+		    }
+		    if (g_file_test (ctr->converted_file, G_FILE_TEST_EXISTS))
+		    {
+			g_remove (ctr->converted_file);
+		    }
+		    g_free (ctr->converted_file);
+		    ctr->converted_file = NULL;
+		    result = FALSE;
+		}
+		else if (WIFSIGNALED(status))
+		{   /* script was terminated by a signal (killed) */
+		    if (g_file_test (ctr->converted_file, G_FILE_TEST_EXISTS))
+		    {
+			g_remove (ctr->converted_file);
+		    }
+		    g_free (ctr->converted_file);
+		    ctr->converted_file = NULL;
+		    result = FALSE;
+		}
+	    }
+	}
+    }
+
+    if (result == TRUE)
+    {   /* determine size of new file */
+	struct stat statbuf;
+	if (g_stat (ctr->converted_file, &statbuf) == 0)
+	{
+	    ctr->converted_size = statbuf.st_size;
+	}
+	else
+	{   /* an error occured after all */
+	    gchar *buf = conversion_get_track_info (NULL, ctr);
+	    ctr->errormessage = 
+		g_strdup_printf (_("Conversion of '%s' failed: could not stat the converted file '%s'.\n\n"),
+				 buf,
+				 ctr->converted_file);
+	    g_free (buf);
+	    g_free (ctr->converted_file);
+	    ctr->converted_file = NULL;
+	    result = FALSE;
+	}
+    }
+
+    g_mutex_unlock (conv->mutex);
+
+    return result;
+}
+
+
+/* Work through the conv->scheduled list and convert the next waiting
+   track.
+   As long as there is a track in conv->scheduled, the conversion runs
+   through at least once. The dirsize and number of threads is only
+   checked _after_ each conversion.
+   The next track processed is always the last one in the list -- new
+   tracks should be prepended.
+*/
+static gpointer conversion_thread (gpointer data)
+{
+    Conversion *conv = data;
+    GList *gl;
+
+    g_return_val_if_fail (conv, NULL);
+
+    g_mutex_lock (conv->mutex);
+
+    debug ("%p thread entered\n", g_thread_self ());
+
+    if (conv->scheduled)
+    {
+	do
+	{
+	    gboolean conversion_ok;
+	    ConvTrack *ctr;
+
+	    debug ("%p thread deep\n", g_thread_self ());
+
+	    /* remove first scheduled entry and add it to processing */
+	    gl = g_list_last (conv->scheduled);
+	    g_return_val_if_fail (gl, (g_mutex_unlock(conv->mutex), NULL));
+	    ctr = gl->data;
+	    conv->scheduled = g_list_remove_link (conv->scheduled, gl);
+	    g_return_val_if_fail (ctr, (g_mutex_unlock(conv->mutex), NULL));
+	    if (ctr->valid)
+	    {   /* attach to processing queue */
+		conv->processing = g_list_concat (gl, conv->processing);
+		/* indicate thread number processing this track */
+		ctr->threadnum = g_list_index (conv->threads, g_thread_self());
+		gl = NULL; /* gl is not guaranteed to remain the same
+			      for a given ctr -- make sure we don't
+			      use it by accident */
+	    }
+	    else
+	    {   /* this node is not valid any more */
+		conversion_convtrack_free (ctr);
+		g_list_free (gl);
+		continue;
+	    }
+
+	    conv->conversion_force = FALSE;
+
+	    g_mutex_unlock (conv->mutex);
+
+	    debug ("%p thread converting\n", g_thread_self ());
+
+	    /* convert */
+	    conversion_ok = conversion_convert_track (conv, ctr);
+
+	    debug ("%p thread conversion finished (%d:%s)\n",
+		   g_thread_self (),
+		   conversion_ok,
+		   ctr->converted_file);
+
+	    g_mutex_lock (conv->mutex);
+
+	    /* remove from processing queue */
+	    gl = g_list_find (conv->processing, ctr);
+	    g_return_val_if_fail (gl, (g_mutex_unlock(conv->mutex), NULL));
+	    conv->processing = g_list_remove_link (conv->processing, gl);
+
+	    if (ctr->valid)
+	    {   /* track is still valid */
+		if (conversion_ok)
+		{   /* add to converted */
+		    conv->converted = g_list_concat (gl, conv->converted);
+		}
+		else
+		{   /* add to failed */
+		    conv->failed = g_list_concat (gl, conv->failed);
+		}
+	    }
+	    else
+	    {   /* track is no longer valid -> remove converted file
+		 * and drop the entry */
+		/* remove (converted_file) */
+		g_list_free (gl);
+		conversion_convtrack_free (ctr);
+	    }
+
+	    g_mutex_unlock (conv->mutex);
+
+	    /* clean up directory and recalculate dirsize */
+	    conversion_prune_dir (conv);
+
+	    g_mutex_lock (conv->mutex);
+
+	} while (((conv->dirsize <= conv->max_dirsize) || conv->conversion_force) &&
+		 (conv->threads_num <= conv->max_threads_num) &&
+		 (conv->scheduled != NULL));
+    }
+
+    /* remove thread from thread list */
+    gl = g_list_find (conv->threads, g_thread_self());
+    if (gl)
+    {
+	gl->data = NULL;
+    }
+    else
+    {
+	fprintf (stderr, "***** programming error -- g_thread_self not found in threads list\n");
+    }
+
+    /* reset force flag if we weren't cancelled because of too many
+       threads */
+    if (conv->threads_num <= conv->max_threads_num)
+	conv->conversion_force = FALSE;
+
+    /* reduce count of running threads */
+    --conv->threads_num;
+
+    g_mutex_unlock (conv->mutex);
+
+    debug ("%p thread exit\n", g_thread_self ());
+
+    return NULL;
+}
+
+
+/* ------------------------------------------------------------
+ *
+ * Background-transfer specific code
+ *
+ * ------------------------------------------------------------*/
+
+
+/* Count the number of ConvTracks in @list that belong to @itdb */
+static gint transfer_get_status_count (iTunesDB *itdb, GList *list)
+{
+    GList *gl;
+    gint count = 0;
+    for (gl=list; gl; gl=gl->next)
+    {
+	ConvTrack *ctr = gl->data;
+	g_return_val_if_fail (ctr, 0);
+	if (ctr->valid && (ctr->itdb == itdb))
+	{
+	    ++count;
+	}
+    }
+    return count;
+}
+
+
+/* return the status of the current transfer process or -1 when an
+ * assertion fails. */
+static FileTransferStatus transfer_get_status (Conversion *conv,
+					       iTunesDB *itdb,
+					       gint *to_convert_num,
+					       gint *converting_num,
+					       gint *to_transfer_num,
+					       gint *transferred_num,
+					       gint *failed_num)
+{
+    TransferItdb *tri;
+    FileTransferStatus status;
+
+    g_return_val_if_fail (conv && itdb, -1);
+
+    g_mutex_lock (conv->mutex);
+
+    tri = transfer_get_tri (conv, itdb);
+    g_return_val_if_fail (tri, (g_mutex_unlock (conv->mutex), -1));
+    status = tri->status;
+
+    if (to_convert_num)
+    {
+	*to_convert_num =
+	    transfer_get_status_count (itdb, conv->scheduled) +
+	    transfer_get_status_count (itdb, conv->processing);
+    }
+
+    if (converting_num)
+    {
+	*converting_num = transfer_get_status_count (itdb, conv->processing);
+    }
+
+    if (to_transfer_num)
+    {
+	*to_transfer_num =
+	    transfer_get_status_count (itdb, conv->converted) +
+	    transfer_get_status_count (itdb, conv->finished) +
+	    transfer_get_status_count (itdb, tri->scheduled) +
+	    transfer_get_status_count (itdb, tri->processing);
+    }
+
+    if (transferred_num || failed_num)
+    {
+	GList *gl;
+	gint transferred = 0;
+	gint failed = 0;
+
+	for (gl=tri->finished; gl; gl=gl->next)
+	{
+	    ConvTrack *ctr = gl->data;
+	    g_return_val_if_fail (ctr, (g_mutex_unlock (conv->mutex), -1));
+
+	    if (ctr->valid)
+	    {
+		if (ctr->track->transferred) ++transferred;
+		else                         ++failed;
+	    }
+	}
+
+	if (transferred_num)
+	{
+	    *transferred_num = transferred +
+		transfer_get_status_count (itdb, tri->transferred);
+	}
+
+	if (failed_num)
+	{
+	    *failed_num = failed +
+		transfer_get_status_count (itdb, conv->failed) +
+		transfer_get_status_count (itdb, tri->failed);
+	}
+    }
+
+    g_mutex_unlock (conv->mutex);
+
+    return status;
+}
+
+/* removes all transferred tracks of @itdb to make sure the files will
+   not be removed from the iPod when file_convert_cancel is
+   called. This function will wait until all tracks in the
+   'transferred' list have been finalized and put into 'finished'. */
+static void transfer_ack_itdb (Conversion *conv, iTunesDB *itdb)
+{
+    GList *gl;
+    TransferItdb *tri;
+
+    g_return_if_fail (conv && itdb);
+
+    g_mutex_lock (conv->mutex);
+
+    tri = transfer_get_tri (conv, itdb);
+    if (!tri)
+    {
+	g_mutex_unlock (conv->mutex);
+	g_return_if_reached ();
+    }
+
+    if (tri->transferred)
+    {   /* finalize the tracks by calling the scheduler directly */
+	conversion_scheduler_unlocked (conv);
+    }
+
+    for (gl=tri->finished; gl; gl=gl->next)
+    {
+	ConvTrack *ctr = gl->data;
+	if (!ctr)
+	{
+	    g_mutex_unlock (conv->mutex);
+	    g_return_if_reached ();
+	}
+	conversion_convtrack_free (ctr);
+    }
+    g_list_free (tri->finished);
+    tri->finished = NULL;
+
+    g_mutex_unlock (conv->mutex);
+}
+
+
+/* Get a list of all failed tracks. Examine etr->conversion_status to
+   see whether the conversion or transfer has failed. In the latter
+   conversion_status is either FILE_CONVERT_INACTIVE or
+   FILE_CONVERT_CONVERTED. You must g_list_free() the returned list
+   after use. */
+static GList *transfer_get_failed_tracks (Conversion *conv, iTunesDB *itdb)
+{
+    TransferItdb *tri;
+    GList *gl;
+    GList *tracks = NULL;
+
+    g_return_val_if_fail (conv && itdb, NULL);
+
+    g_mutex_lock (conv->mutex);
+
+    tri = transfer_get_tri (conv, itdb);
+    g_return_val_if_fail (tri, (g_mutex_unlock (conv->mutex), NULL));
+
+    /* Make sure all failed tracks are forwarded to tri->finished */
+    conversion_scheduler_unlocked (conv);
+
+    for (gl=tri->finished; gl; gl=gl->next)
+    {
+	ConvTrack *ctr = gl->data;
+	g_return_val_if_fail (ctr, (g_mutex_unlock (conv->mutex), NULL));
+
+	if (ctr->valid)
+	{
+	    if (!ctr->dest_filename)
+	    {
+		tracks = g_list_prepend (tracks, ctr->track);
+	    }
+	}
+    }
+
+    g_mutex_unlock (conv->mutex);
+
+    return tracks;
+}
+
+
+static void transfer_reschedule (Conversion *conv, iTunesDB *itdb)
+{
+    TransferItdb *tri;
+    GList *gl, *next;
+    GList *tracks = NULL;
+
+    g_return_if_fail (conv && itdb);
+
+    g_mutex_lock (conv->mutex);
+
+    tri = transfer_get_tri (conv, itdb);
+    if (!tri)
+    {
+	g_mutex_unlock (conv->mutex);
+	g_return_if_reached ();
+    }
+
+    if (conv->failed || tri->failed)
+    {   /* move the tracks over to tri->finished by calling the
+	   scheduler directly */
+	conversion_scheduler_unlocked (conv);
+    }
+
+    for (gl=tri->finished; gl; gl=next)
+    {
+	ConvTrack *ctr = gl->data;
+	next = gl->next;
+	if (!ctr)
+	{
+	    g_mutex_unlock (conv->mutex);
+	    g_return_if_reached ();
+	}
+
+	if (ctr->valid)
+	{
+	    if (!ctr->dest_filename)
+	    {
+		ExtraTrackData *etr;
+		if (!ctr->track || !ctr->track->userdata)
+		{
+		    g_mutex_unlock (conv->mutex);
+		    g_return_if_reached ();
+		}
+		etr = ctr->track->userdata;
+		switch (etr->conversion_status)
+		{
+		case FILE_CONVERT_INACTIVE:
+		case FILE_CONVERT_CONVERTED:
+		    /* This track failed during transfer */
+		    tri->finished = g_list_remove_link (tri->finished, gl);
+		    tri->scheduled = g_list_concat (gl, tri->scheduled);
+		    break;
+		default:
+		    /* This track failed during conversion */
+		    tri->finished = g_list_delete_link (tri->finished, gl);
+		    tracks = g_list_prepend (tracks, ctr->track);
+		    conversion_convtrack_free (ctr);
+		    break;
+		}
+	    }
+	}
+    }
+
+    g_mutex_unlock (conv->mutex);
+
+    /* reschedule all failed conversion tracks */
+    for (gl=tracks; gl; gl=gl->next)
+    {
+	conversion_add_track (conv, gl->data);
+    }
+
+    g_list_free (tracks);
+}
+
+
+/* reset the FILE_TRANSFER_DISK_FULL status to force the continuation
+   of the transfering process even if the disk was previously full. At
+   the same time the conversion process is forced to restart even if
+   the disk space was already used up. */
+static void transfer_continue (Conversion *conv, iTunesDB *itdb)
+{
+    TransferItdb *tri;
+
+    g_return_if_fail (conv && itdb);
+
+    g_mutex_lock (conv->mutex);
+
+    tri = transfer_get_tri (conv, itdb);
+    if (!tri)
+    {
+	g_mutex_unlock (conv->mutex);
+	g_return_if_reached ();
+    }
+
+    /* signal to continue transfer even if disk was full previously */
+    if (tri->status == FILE_TRANSFER_DISK_FULL)
+    {
+	tri->status = FILE_TRANSFER_IDLE;
+    }
+
+    /* make sure at least one thread is started even if the
+     * dirsize is too large */
+    if (conv->threads_num == 0)
+	conv->conversion_force = TRUE;
+
+    g_mutex_unlock (conv->mutex);
+}    
+
+
+/* set the tri->transfer flag to TRUE */
+static void transfer_activate (Conversion *conv, iTunesDB *itdb, gboolean active)
+{
+    TransferItdb *tri;
+
+    g_return_if_fail (conv && itdb);
+
+    g_mutex_lock (conv->mutex);
+
+    tri = transfer_get_tri (conv, itdb);
+    if (!tri)
+    {
+	g_mutex_unlock (conv->mutex);
+	g_return_if_reached ();
+    }
+
+    /* signal to continue transfer even if disk was full previously */
+    tri->transfer = active;
+
+    g_mutex_unlock (conv->mutex);
+}
+
+
+/* set the tri->transfer flag to whatever the preferences settings are */
+static void transfer_reset (Conversion *conv, iTunesDB *itdb)
+{
+    TransferItdb *tri;
+
+    g_return_if_fail (conv && itdb);
+
+    g_mutex_lock (conv->mutex);
+
+    tri = transfer_get_tri (conv, itdb);
+    if (!tri)
+    {
+	g_mutex_unlock (conv->mutex);
+	g_return_if_reached ();
+    }
+
+    /* signal to continue transfer even if disk was full previously */
+    tri->transfer = prefs_get_int (FILE_CONVERT_BACKGROUND_TRANSFER);
+
+    g_mutex_unlock (conv->mutex);
+}
+
+
+/* You must free the GLists before calling this function. */
+static void transfer_free_transfer_itdb (TransferItdb *tri)
+{
+    g_return_if_fail (tri);
+    g_return_if_fail (!tri->scheduled && !tri->processing &&
+		      !tri->transferred && !tri->finished &&
+		      !tri->failed);
+    g_return_if_fail (tri->thread);
+
+    g_free (tri);
+}
+
+
+/* Add a TransferItdb entry for @itdb. conv->mutex must be locked. */
+static TransferItdb *transfer_add_itdb (Conversion *conv, iTunesDB *itdb)
+{
+    TransferItdb *tri;
+
+    g_return_val_if_fail (conv && itdb, NULL);
+
+    tri = g_new0 (TransferItdb, 1);
+    tri->transfer = prefs_get_int (FILE_CONVERT_BACKGROUND_TRANSFER);
+    tri->status = FILE_TRANSFER_IDLE;
+    tri->valid = TRUE;
+    tri->conv = conv;
+    tri->itdb = itdb;
+    conv->transfer_itdbs = g_list_prepend (conv->transfer_itdbs, tri);
+
+    return tri;
+}
+
+
+static int transfer_get_tri_cmp (gconstpointer a, gconstpointer b)
+{
+    const TransferItdb *tri = a;
+    const iTunesDB *itdb = b;
+
+    g_return_val_if_fail (tri, 0);
+
+    if (tri->itdb == itdb) return 0;
+    return -1;
+}
+
+
+/* Return a pointer to the TransferItdb belonging to @itdb. You must
+ * lock conv->mutex yourself. If no entry exists, one is created. If
+ * the TransferItdb is invalid, a new one is created. */
+static TransferItdb *transfer_get_tri (Conversion *conv, iTunesDB *itdb)
+{
+    GList *link;
+
+    g_return_val_if_fail (conv && itdb, NULL);
+
+    link = g_list_find_custom (conv->transfer_itdbs, itdb, transfer_get_tri_cmp);
+
+    if (link)
+    {
+	TransferItdb *tri = link->data;
+	g_return_val_if_fail (tri, NULL);
+	/* only return if valid */
+	if (tri->valid)  return tri;
+    }
+
+    /* no entry exists -- let's create one */
+    return transfer_add_itdb (conv, itdb);
+}
+
+
+/* force at least one new call to conversion_prune_dir */
+static gpointer transfer_force_prune_dir (gpointer data)
+{
+    Conversion *conv = data;
+
+    g_mutex_lock (conv->mutex);
+
+    if (conv->prune_in_progress)
+    {   /* wait until current prune process is finished before calling
+	   conversion_prune_dir() again */
+	if (conv->force_prune_in_progress)
+	{   /* we already have another process waiting  */
+	    g_mutex_unlock (conv->mutex);
+	    return NULL;
+	}
+	conv->force_prune_in_progress = TRUE;
+	g_cond_wait (conv->prune_cond, conv->mutex);
+	conv->force_prune_in_progress = FALSE;
+    }
+
+    g_mutex_unlock (conv->mutex);
+
+    return conversion_prune_dir (conv);
+}
+
+
+/* return value:
+   FILE_TRANSFER_DISK_FULL: file could not be copied because the iPod
+   is full. tri->status is set as well.
+   FILE_TRANSFER_ERROR: another error occurred
+   FILE_TRANSFER_ACTIVE: copy went fine.
+*/
+static FileTransferStatus transfer_transfer_track (TransferItdb *tri,
+						   ConvTrack *ctr)
+{
+    FileTransferStatus result = FILE_TRANSFER_ERROR;
+    gboolean copy_success;
+    const gchar *source_file = NULL;
+    gchar *dest_file = NULL;
+    gchar *mountpoint = NULL;
+    Conversion *conv;
+    GError *error = NULL;
+
+    g_return_val_if_fail (tri && tri->conv, result);
+    g_return_val_if_fail (ctr, result);
+
+    conv = tri->conv;
+
+    g_mutex_lock (conv->mutex);
+
+    if (ctr->converted_file)
+    {
+	source_file = ctr->converted_file;
+    }
+    else
+    {
+	source_file = ctr->orig_file;
+    }
+
+    mountpoint = g_strdup (ctr->mountpoint);
+
+    g_mutex_unlock (conv->mutex);
+
+    g_return_val_if_fail (source_file && mountpoint, FALSE);
+
+    dest_file = itdb_cp_get_dest_filename (NULL, mountpoint, source_file, &error);
+
+    /* an error occurred */
+    if (!dest_file)
+    {
+	g_mutex_lock (conv->mutex);
+	if (error)
+	{
+	    ctr->errormessage = g_strdup_printf ("%s\n", error->message);
+	    g_error_free (error);
+	}
+	g_mutex_unlock (conv->mutex);
+	return result;
+    }
+
+    g_mutex_unlock (conv->mutex);
+
+    copy_success = itdb_cp (source_file, dest_file, &error);
+
+    g_mutex_lock (conv->mutex);
+
+    if (!copy_success)
+    {
+	if (error && (error->code == G_FILE_ERROR_NOSPC))
+	{   /* no space left on device */
+	    tri->status = FILE_TRANSFER_DISK_FULL;
+	    result = FILE_TRANSFER_DISK_FULL;
+	}
+	else
+	{
+	    if (ctr->valid)
+	    {
+		gchar *buf = conversion_get_track_info (NULL, ctr);
+		ctr->errormessage =
+		    g_strdup_printf (_("Transfer of '%s' failed. %s\n\n"),
+				     buf,
+				     error? error->message:"");
+		g_free (buf);
+	    }
+	}
+	if (error)
+	{
+	    g_error_free (error);
+	    error = NULL;
+	}
+    }
+    else
+    {   /* copy was successful */
+	debug ("%p copied\n", tri->itdb);
+	if (ctr->valid)
+	{
+	    ctr->dest_filename = dest_file;
+	    dest_file = NULL;
+	    result = FILE_TRANSFER_ACTIVE;
+	}
+    }
+
+    g_mutex_unlock (conv->mutex);
+
+    if (dest_file)
+    {   /* unsuccessful -- remove destination file if exists */
+	if (g_file_test (dest_file, G_FILE_TEST_EXISTS))
+	{
+	    g_remove (dest_file);
+	}
+    }
+
+    g_free (dest_file);
+    g_free (mountpoint);
+
+    return result;
+}
+	    
+
+
+
+
+static gpointer transfer_thread (gpointer data)
+{
+    TransferItdb *tri = data;
+    Conversion *conv;
+
+    g_return_val_if_fail (tri && tri->conv, NULL);
+    conv = tri->conv;
+
+    g_mutex_lock (conv->mutex);
+
+    debug ("%p transfer thread enter\n", tri->itdb);
+
+    while (tri->scheduled && (tri->transfer == TRUE) &&
+	   (tri->status != FILE_TRANSFER_DISK_FULL))
+    {
+	GList *gl;
+	ConvTrack *ctr;
+	FileTransferStatus status;
+
+	/* reset transfer force flag */
+	tri->status = FILE_TRANSFER_ACTIVE;
+
+	/* remove first scheduled entry and add it to processing */
+	gl = g_list_last (tri->scheduled);
+	g_return_val_if_fail (gl, (g_mutex_unlock(conv->mutex), NULL));
+
+	ctr = gl->data;
+	tri->scheduled = g_list_remove_link (tri->scheduled, gl);
+	g_return_val_if_fail (ctr, (g_mutex_unlock(conv->mutex), NULL));
+	if (tri->valid && ctr->valid)
+	{   /* attach to processing queue */
+	    tri->processing = g_list_concat (gl, tri->processing);
+	    /* indicate thread number processing this track */
+	    gl = NULL; /* gl is not guaranteed to remain the same
+			  for a given ctr -- make sure we don't
+			  use it by accident */
+	}
+	else
+	{   /* this node is not valid any more */
+	    conversion_convtrack_free (ctr);
+	    g_list_free (gl);
+	    continue;
+	}
+
+	g_mutex_unlock (conv->mutex);
+
+	debug ("%p thread transfer\n", ctr->itdb);
+
+	status = transfer_transfer_track (tri, ctr);
+
+	debug ("%p thread transfer finished (%d:%s)\n",
+	       ctr->itdb,
+	       status,
+	       ctr->dest_filename);
+
+	g_mutex_lock (conv->mutex);
+	
+	/* remove from processing queue */
+	gl = g_list_find (tri->processing, ctr);
+	g_return_val_if_fail (gl, (g_mutex_unlock(conv->mutex), NULL));
+	tri->processing = g_list_remove_link (tri->processing, gl);
+
+	if (ctr->valid)
+	{   /* track is still valid */
+	    if (status == FILE_TRANSFER_ACTIVE)
+	    {   /* add to converted */
+		tri->transferred = g_list_concat (gl, tri->transferred);
+	    }
+	    else if (status == FILE_TRANSFER_DISK_FULL)
+	    {   /* reschedule */
+		tri->scheduled = g_list_concat (tri->scheduled, gl);
+	    }
+	    else /* status == -1 */
+	    {   /* add to failed */
+		tri->failed = g_list_concat (gl, tri->failed);
+	    }
+	}
+	else
+	{   /* track is no longer valid -> remove the copied file and
+	     * drop the track */
+	    g_list_free (gl);
+	    if (ctr->dest_filename)
+	    {
+		g_unlink (ctr->dest_filename);
+	    }
+	    conversion_convtrack_free (ctr);
+	}
+
+	if (conv->dirsize > conv->max_dirsize)
+	{   /* we just transferred a track -- there should be space
+	       available again -> force a directory prune */
+	    g_thread_create_full (transfer_force_prune_dir,
+				  conv,        /* user data  */
+				  0,           /* stack size */
+				  FALSE,       /* joinable   */
+				  TRUE,        /* bound      */
+				  G_THREAD_PRIORITY_NORMAL,
+				  NULL);       /* error      */
+	}
+	
+    }
+
+    tri->thread = NULL;
+    if (tri->status != FILE_TRANSFER_DISK_FULL)
+	tri->status = FILE_TRANSFER_IDLE;
+
+    g_mutex_unlock (conv->mutex);
+
+    debug ("%p transfer thread exit\n", tri->itdb);
+
+    return NULL;
+}

Added: trunk/src/file_convert.h
===================================================================
--- trunk/src/file_convert.h	                        (rev 0)
+++ trunk/src/file_convert.h	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,89 @@
+/*
+|  File conversion started by Simon Naunton <snaunton gmail.com> in 2007
+|
+|  Copyright (C) 2002-2007 Jorg Schuler <jcsjcs at users.sourceforge.net>
+|  Part of the gtkpod project.
+|
+|  URL: http://gtkpod.sourceforge.net/
+|  URL: http://www.gtkpod.org
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: file_convert.h 1065 2007-05-06 14:16:17Z jcsjcs $
+*/
+
+
+#ifndef __FILE_CONVERT_H_
+#define __FILE_CONVERT_H_
+
+#ifdef HAVE_CONFIG_H
+#   include <config.h>
+#endif
+
+#include <itdb.h>
+
+extern const gchar *FILE_CONVERT_CACHEDIR;
+extern const gchar *FILE_CONVERT_MAXDIRSIZE;
+extern const gchar *FILE_CONVERT_TEMPLATE;
+extern const gchar *FILE_CONVERT_MAX_THREADS_NUM;
+extern const gchar *FILE_CONVERT_DISPLAY_LOG;
+extern const gchar *FILE_CONVERT_BACKGROUND_TRANSFER;
+
+typedef enum
+{
+    FILE_CONVERT_INACTIVE = 0,
+    FILE_CONVERT_REQUIRED,
+    FILE_CONVERT_SCHEDULED,
+    FILE_CONVERT_FAILED,
+    FILE_CONVERT_REQUIRED_FAILED,
+    FILE_CONVERT_KILLED,
+    FILE_CONVERT_CONVERTED
+} FileConvertStatus;
+
+typedef enum
+{
+    FILE_TRANSFER_ERROR = -1,
+    FILE_TRANSFER_IDLE = 0,
+    FILE_TRANSFER_ACTIVE,
+    FILE_TRANSFER_DISK_FULL
+} FileTransferStatus;
+
+void file_convert_init (void);
+void file_convert_shutdown (void);
+void file_convert_prefs_changed (void);
+void file_convert_update_default_sizes (void);
+gboolean file_convert_add_track (Track *track);
+void file_convert_itdb_first (iTunesDB *itdb);
+void file_convert_continue (void);
+void file_convert_cancel_itdb (iTunesDB *itdb);
+void file_convert_cancel_track (Track *track);
+
+GList *file_transfer_get_failed_tracks (iTunesDB *itdb);
+FileTransferStatus file_transfer_get_status (iTunesDB *itdb,
+					     gint *to_convert_num,
+					     gint *converting_num,
+					     gint *to_transfer_num,
+					     gint *transferred_num,
+					     gint *failed_num);
+void file_transfer_ack_itdb (iTunesDB *itdb);
+void file_transfer_continue (iTunesDB *itdb);
+void file_transfer_activate (iTunesDB *itdb, gboolean active);
+void file_transfer_reset (iTunesDB *itdb);
+void file_transfer_reschedule (iTunesDB *itdb);
+#endif

Added: trunk/src/file_export.c
===================================================================
--- trunk/src/file_export.c	                        (rev 0)
+++ trunk/src/file_export.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,1170 @@
+/* Time-stamp: <2007-02-24 13:22:58 jcs>
+|
+|  Copyright (C) 2002 Corey Donohoe <atmos at atmos.org>
+|  Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+| 
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+| 
+|  iTunes and iPod are trademarks of Apple
+| 
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: file_export.c 1824 2007-12-13 10:51:04Z dforsi $
+*/
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "charset.h"
+#include "file.h"
+#include "info.h"
+#include "sha1.h"
+#include "misc.h"
+#include "misc_track.h"
+#include "prefs.h"
+#include <errno.h>
+#include <limits.h>
+#include <math.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+/* Structure to keep all necessary information */
+struct fcd
+{
+    GList *tracks;     /* tracks to be written */
+    GtkWidget *fc;     /* file chooser */
+    GList **filenames; /* pointer to GList to append the filenames used */
+    GladeXML *win_xml; /* Glade xml reference */
+    Track *track;      /* current track to export */
+};
+
+
+
+/*------------------------------------------------------------------
+
+  Code to export tracks
+
+  ------------------------------------------------------------------*/
+
+/* Strings for prefs settings */
+/* use original charset or specified one? */
+const gchar *EXPORT_FILES_SPECIAL_CHARSET="export_files_special_charset";
+/* whether we check for existing files on export or not */
+const gchar *EXPORT_FILES_CHECK_EXISTING="export_files_check_existing";
+const gchar *EXPORT_FILES_PATH="export_files_path";
+const gchar *EXPORT_FILES_TPL="export_files_template";
+/* Default prefs settings */
+const gchar *EXPORT_FILES_TPL_DFLT="%o;%a - %t.mp3;%t.wav";
+
+
+/**
+ * READ_WRITE_BLOCKSIZE - how many bytes we read per fread/fwrite call
+ */
+#define READ_WRITE_BLOCKSIZE 65536
+
+
+#ifdef G_THREADS_ENABLED
+/* Thread specific */
+static  GMutex *mutex = NULL;
+static GCond  *cond = NULL;
+static gboolean mutex_data = FALSE;
+#endif
+
+
+
+/**
+ * copy_file_fd_sync - given two open file descriptors, read from one
+ * 	and write the data to the other, fsync() before returning.
+ * @from - the file descriptor we're reading from
+ * @to - the file descriptor we're writing to
+ * Returns TRUE on write success, FALSE on write failure
+ */
+static gboolean
+copy_file_fd_sync (FILE *from, FILE *to)
+{
+    gboolean result = FALSE;
+    gchar data[READ_WRITE_BLOCKSIZE];
+
+    if((from) && (to))
+    {
+	int read_bytes = 0, write_bytes = 0;
+	
+	do
+	{
+	    if((read_bytes = 
+		    fread(data, sizeof(char), READ_WRITE_BLOCKSIZE, from)))
+	    {
+		if((write_bytes = 
+			 fwrite(data, sizeof(char), read_bytes, to)))
+		{
+		    result = TRUE;
+		}
+		else
+		{
+		    if((ferror(to) != 0))
+		    {
+/*			fprintf(stderr, "%d is errno writing\n", errno);*/
+			result = FALSE;
+		    }
+		    break;
+		}
+	    }
+	    else
+	    {
+		if(!feof(from))
+		    result = FALSE;
+		else 
+		    result = TRUE;
+		break;
+
+	    }
+	    
+	} while(!(feof(from)));
+    }
+    if (!result)
+	result = fsync (fileno (to));
+    return(result);
+}
+
+
+/* Return TRUE if the file @dest exists and is of same size as @from */
+static gboolean
+file_is_ok(gchar *from, gchar *dest)
+{
+    struct stat st_from, st_dest;
+
+    if(stat(dest, &st_dest) == -1)    	      return FALSE;
+    if(stat(from, &st_from) == -1)            return FALSE;
+
+    if(st_from.st_size == st_dest.st_size)    return TRUE;
+
+    return FALSE;
+}
+
+
+/**
+ * copy_file - copy the filename on disk named file, to
+ * the destination file dest.  Both names are FULL pathnames to the file
+ * @file - the filename to copy 
+ * @dest - the filename we copy to
+ * Returns TRUE on successful copying
+ */
+static gboolean 
+copy_file(gchar *file, gchar *dest)
+{
+    gboolean result = FALSE;
+    FILE *from = NULL, *to = NULL;
+    gboolean check_existing;
+
+    prefs_get_int_value (EXPORT_FILES_CHECK_EXISTING, &check_existing);
+    
+    if(check_existing && file_is_ok(file, dest))
+    {
+	gchar *buf = g_strdup_printf (_("Skipping existing file with same length: '%s'\n"), dest);
+	gtkpod_warning (buf);
+	g_free (buf);
+    	return TRUE;
+    }
+
+    if (g_file_test (dest, G_FILE_TEST_EXISTS))
+    {
+	gchar *buf = g_strdup_printf (_("Overwriting existing file: '%s'\n"), dest);
+	gtkpod_warning (buf);
+	g_free (buf);
+    }
+	
+    if((from = fopen(file, "r")))
+    {
+	if((to = fopen(dest, "w")))
+	{
+	    result = copy_file_fd_sync (from, to);
+	    fclose(to);
+	}
+	else
+	{
+	    switch(errno)
+	    {
+		case EPERM:
+		    gtkpod_warning (_("Error copying '%s' to '%s': Permission Error (%s)\n"), file, dest, g_strerror (errno));
+		default:
+		    gtkpod_warning (_("Error copying '%s' to '%s' (%s)\n"), file, dest, g_strerror (errno));
+		    break;
+	    }
+	}
+	fclose(from);
+    }
+    else
+    {
+	gtkpod_warning (_("Could not open '%s' for reading.\n"), file);
+    }
+    return(result);
+}
+
+
+
+
+/* This function is called when the user presses the abort button
+ * during flush_tracks() */
+static void write_tracks_abort (gboolean *abort)
+{
+    *abort = TRUE;
+}
+
+
+
+/**
+ * get_preferred_filename - useful for generating the preferred
+ * @param Track the track
+ * @return the file filename (including directories) for this Track
+ * based on the users preferences.  The returned char* must be freed
+ * by the caller.
+ */
+static gchar *
+track_get_export_filename (Track *track)
+{
+    gchar *res_utf8, *res_cs = NULL;
+    gchar *template;
+    gboolean special_charset;
+
+    g_return_val_if_fail (track, NULL);
+
+    prefs_get_string_value (EXPORT_FILES_TPL, &template);
+    res_utf8 = get_string_from_full_template (track, template, TRUE);
+    C_FREE (template);
+
+    prefs_get_int_value (EXPORT_FILES_SPECIAL_CHARSET, &special_charset);
+
+    /* convert it to the charset */
+    if (special_charset)
+    {   /* use the specified charset */
+	res_cs = charset_from_utf8 (res_utf8);
+    }
+    else
+    {   /* use the charset stored in track->charset */
+	res_cs = charset_track_charset_from_utf8 (track, res_utf8);
+    }
+    g_free (res_utf8);
+    return res_cs;
+}
+
+
+/**
+ * write_track_to_dir - copy the Track* to the desired output file
+ * @s - The Track reference we're manipulating
+ * Returns - TRUE on success, FALSE on failure
+ */
+static gboolean write_track (struct fcd *fcd)
+{
+    gboolean result = FALSE;
+    gchar *dest_file = track_get_export_filename (fcd->track);
+
+    g_return_val_if_fail (fcd, FALSE);
+    g_return_val_if_fail (fcd->track, FALSE);
+    g_return_val_if_fail (fcd->track->itdb, FALSE);
+    
+    if(dest_file)
+    {
+	gchar *from_file = NULL;
+	if (fcd->track->itdb->usertype & GP_ITDB_TYPE_IPOD)
+	{
+	    from_file = get_file_name_from_source (fcd->track,
+						   SOURCE_IPOD);
+	}
+	else if (fcd->track->itdb->usertype & GP_ITDB_TYPE_LOCAL)
+	{
+	    from_file = get_file_name_from_source (fcd->track,
+						   SOURCE_LOCAL);
+	}
+	else
+	{
+	    g_return_val_if_reached (FALSE);
+	}
+	if (from_file)
+	{
+	    gchar *filename, *dest_dir;
+	    prefs_get_string_value (EXPORT_FILES_PATH, &dest_dir);
+	    filename = g_build_filename (dest_dir, dest_file, NULL);
+
+	    if (mkdirhierfile(filename))
+	    {
+		if(copy_file(from_file, filename))
+		{
+		    result = TRUE;
+		    if (fcd->filenames)
+		    {   /* append filename to list */
+			*fcd->filenames = g_list_append (*fcd->filenames,
+							 filename);
+			filename = NULL;
+		    }
+		}
+	    }
+	    g_free(from_file);
+	    g_free(dest_dir);
+	    g_free(filename);
+	}
+	else
+	{
+	    gchar *buf = get_track_info (fcd->track, FALSE);
+	    gtkpod_warning (_("Could find file for '%s' on the iPod\n"),
+			    buf);
+	    g_free (buf);
+	}
+	g_free(dest_file);
+    }
+    return(result);
+}
+
+#ifdef G_THREADS_ENABLED
+/* Threaded write_track */
+static gpointer th_write_track (gpointer fcd)
+{
+    gboolean result = FALSE;
+
+    result = write_track (fcd);
+
+    g_mutex_lock (mutex);
+    mutex_data = TRUE;   /* signal that thread will end */
+    g_cond_signal (cond);
+    g_mutex_unlock (mutex);
+
+    return GINT_TO_POINTER(result);
+}
+#endif
+
+
+/******************************************************************
+   export_files_write - copy the specified tracks to the selected
+   directory.
+ ******************************************************************/
+static void export_files_write (struct fcd *fcd)
+{
+    GList *l = NULL;
+    gint n;
+    static gboolean abort;
+    gdouble total = 0;
+#ifdef G_THREADS_ENABLED
+    GThread *thread = NULL;
+    GTimeVal gtime;
+    if (!mutex) mutex = g_mutex_new ();
+    if (!cond) cond = g_cond_new ();
+#endif
+
+    g_return_if_fail (fcd && fcd->fc);
+
+    block_widgets ();
+
+    abort = FALSE;
+    n = g_list_length (fcd->tracks);
+    /* calculate total length to be copied */
+    for(l = fcd->tracks; l && !abort; l = l->next)
+    {
+	Track *s = (Track*)l->data;
+	total += s->size;
+    }
+
+    if(n != 0)
+    {
+	/* create the dialog window */
+	GtkWidget *dialog, *progress_bar, *label, *image, *hbox;
+	gchar *progtext = NULL;
+	gint count = 0;     /* number of tracks copied */
+	gdouble copied = 0;  /* number of bytes copied */
+	gdouble fraction;    /* fraction copied (copied/total) */
+	gboolean result = TRUE;
+	time_t diff, start, fullsecs, hrs, mins, secs;
+
+	dialog = gtk_dialog_new_with_buttons (_("Information"),
+					      GTK_WINDOW (gtkpod_window),
+					      GTK_DIALOG_DESTROY_WITH_PARENT,
+					      GTK_STOCK_CANCEL,
+					      GTK_RESPONSE_NONE,
+					      NULL);
+
+	/* emulate gtk_message_dialog_new */
+	image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_INFO,
+					  GTK_ICON_SIZE_DIALOG);
+	label = gtk_label_new (
+	    _("Press button to abort."));
+
+	gtk_misc_set_alignment (GTK_MISC (image), 0.5, 0.0);
+	gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
+	gtk_label_set_selectable (GTK_LABEL (label), TRUE);
+
+	/* hbox to put the image+label in */
+	hbox = gtk_hbox_new (FALSE, 6);
+	gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0);
+	gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+
+	/* Create the progress bar */
+	progress_bar = gtk_progress_bar_new ();
+	progtext = g_strdup (_("copying..."));
+	gtk_progress_bar_set_text(GTK_PROGRESS_BAR (progress_bar), progtext);
+	g_free (progtext);
+
+	/* Indicate that user wants to abort */
+	g_signal_connect_swapped (GTK_OBJECT (dialog), "response",
+				  G_CALLBACK (write_tracks_abort),
+				  &abort);
+
+	/* Add the image/label + progress bar to dialog */
+	gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
+			    hbox, FALSE, FALSE, 0);
+	gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
+			    progress_bar, FALSE, FALSE, 0);
+	gtk_widget_show_all (dialog);
+
+	while (widgets_blocked && gtk_events_pending ())  gtk_main_iteration ();
+	start = time(NULL);
+	for(l = fcd->tracks; l && !abort; l = l->next)
+	{
+	    gboolean resultWrite = TRUE;
+	    Track *tr = (Track*)l->data;
+
+	    fcd->track = tr;
+	    copied += tr->size;
+#ifdef G_THREADS_ENABLED
+	    mutex_data = FALSE;
+	    thread = g_thread_create (th_write_track, fcd, TRUE, NULL);
+	    if (thread)
+	    {
+		g_mutex_lock (mutex);
+		do
+		{
+		    while (widgets_blocked && gtk_events_pending ())
+			gtk_main_iteration ();
+		    /* wait a maximum of 20 ms */
+		    g_get_current_time (&gtime);
+		    g_time_val_add (&gtime, 20000);
+		    g_cond_timed_wait (cond, mutex, &gtime);
+		} while(!mutex_data);
+		g_mutex_unlock (mutex);
+		resultWrite = (gboolean)GPOINTER_TO_INT(g_thread_join (thread));
+		result &= resultWrite;
+	    }
+	    else {
+		g_warning ("Thread creation failed, falling back to default.\n");
+		resultWrite = write_track (fcd);
+		result &= resultWrite;
+	    }
+#else
+	    resultWrite = write_track (fcd);
+	    result &= resultWrite;
+	    while (widgets_blocked && gtk_events_pending ())
+		gtk_main_iteration ();
+#endif
+	    if (!resultWrite)
+	    {
+		gtkpod_warning (_("Failed to write '%s-%s'\n"), tr->artist, tr->title);	
+	    }
+
+	    ++count;
+	    if (count == 1) /* we need longer timeout */
+	    {
+		gtkpod_statusbar_timeout (3*STATUSBAR_TIMEOUT);
+	    }
+	        
+	    if (count == n)  /* we need to reset timeout */
+	    {
+		gtkpod_statusbar_timeout (0);
+	    }
+	    gtkpod_statusbar_message (ngettext ("Copied %d of %d track.",
+						"Copied %d of %d tracks.", n),
+				      count, n);
+
+	    fraction = copied/total;
+
+	    gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR (progress_bar),
+					  fraction);
+	    diff = time(NULL) - start;
+	    fullsecs = (diff/fraction)-diff+5;
+	    hrs  = fullsecs / 3600;
+	    mins = (fullsecs % 3600) / 60;
+	    secs = ((fullsecs % 60) / 5) * 5;
+	    /* don't bounce up too quickly (>10% change only) */
+/*	      left = ((mins < left) || (100*mins >= 110*left)) ? mins : left;*/
+	    progtext = g_strdup_printf (
+		_("%d%% (%d:%02d:%02d left)"),
+		(int)(100*fraction), (int)hrs, (int)mins, (int)secs);
+	    gtk_progress_bar_set_text(GTK_PROGRESS_BAR (progress_bar),
+				      progtext);
+	    g_free (progtext);
+	    while (widgets_blocked && gtk_events_pending ())  gtk_main_iteration ();
+	}
+	gtk_widget_destroy (dialog);
+	if (!result || abort)
+	    gtkpod_statusbar_message (_("Some tracks were not copied."));
+    }
+    release_widgets ();
+}
+
+
+/******************************************************************
+   export_files_retrieve_options - retrieve options and store
+   them in the prefs.
+ ******************************************************************/
+static void export_files_store_option_settings (struct fcd *fcd)
+{
+    g_return_if_fail (fcd && fcd->win_xml && fcd->fc);
+
+    option_get_toggle_button (fcd->win_xml,
+			      EXPORT_FILES_SPECIAL_CHARSET);
+    option_get_toggle_button (fcd->win_xml,
+			      EXPORT_FILES_CHECK_EXISTING);
+    option_get_string (fcd->win_xml, EXPORT_FILES_TPL, NULL);
+    option_get_filename (GTK_FILE_CHOOSER (fcd->fc),
+			 EXPORT_FILES_PATH, NULL);
+}
+
+
+/******************************************************************
+   export_files_init - Export files off of your ipod to an arbitrary
+   directory, specified by the file chooser dialog
+
+   @tracks    - GList with data of type (Track*) we want to write 
+   @filenames - a pointer to a GList where to store the filenames used
+                to write the tracks (or NULL)
+   @display   - TRUE: display a list of tracks to be exported
+   @message   - message to be displayed above the display of tracks
+
+ ******************************************************************/
+void export_files_init (GList *tracks, GList **filenames,
+			gboolean display, gchar *message)
+{
+    gint response;
+    GtkWidget *win, *options, *message_box; 
+    struct fcd *fcd;
+    GtkWidget *fc;
+    GladeXML *export_files_xml;
+    iTunesDB *itdb = NULL;
+
+    if (tracks)
+    {
+	Track *tr = tracks->data;
+	g_return_if_fail (tr);
+	itdb = tr->itdb;
+	g_return_if_fail (itdb);
+    }
+
+    /* no export possible if in offline mode */
+    if (tracks && get_offline (itdb))
+    {
+	Track *tr = tracks->data;
+	g_return_if_fail (tr);
+	if (itdb->usertype & GP_ITDB_TYPE_IPOD)
+	{
+	    GtkWidget *dialog = gtk_message_dialog_new (
+		GTK_WINDOW (gtkpod_window),
+		GTK_DIALOG_DESTROY_WITH_PARENT,
+		GTK_MESSAGE_WARNING,
+		GTK_BUTTONS_OK,
+		_("Export from iPod database not possible in offline mode."));
+	    gtk_dialog_run (GTK_DIALOG (dialog));
+	    gtk_widget_destroy (dialog);
+	    return;
+	}
+    }
+
+    fc = gtk_file_chooser_dialog_new (
+	_("Select Export Destination Directory"),
+	NULL,
+	GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+	GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+	GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
+	NULL);
+
+    export_files_xml = glade_xml_new (xml_file, "export_files_options", NULL);
+    win = gtkpod_xml_get_widget (export_files_xml, "export_files_options");
+    options = gtkpod_xml_get_widget (export_files_xml, "options_frame");
+    message_box = gtkpod_xml_get_widget (export_files_xml, "message_box");
+
+    /* Information needed to clean up later */
+    fcd = g_malloc0 (sizeof (struct fcd));
+    fcd->tracks = g_list_copy (tracks);
+    fcd->win_xml = export_files_xml;
+    fcd->filenames = filenames;
+    fcd->fc = fc;
+
+    /* according to GTK FAQ: move a widget to a new parent */
+    gtk_widget_ref (options);
+    gtk_container_remove (GTK_CONTAINER (win), options);
+    /* set extra options */
+    gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER (fc),
+				       options);
+    gtk_widget_unref (options);
+
+    gtk_widget_destroy (win);
+
+
+    /* set message text */
+    if (display)
+    {
+	GList *gl;
+	GtkWidget *label = gtkpod_xml_get_widget (export_files_xml,
+						 "message");
+	GtkWidget *tv = gtkpod_xml_get_widget (export_files_xml,
+					      "textview");
+	GtkTextBuffer *tb = gtk_text_view_get_buffer (GTK_TEXT_VIEW(tv));
+	if (message)  gtk_label_set_text (GTK_LABEL (label), message);
+	else          gtk_widget_hide (label);
+	if (!tb)
+	{   /* set up textbuffer */
+	    tb = gtk_text_buffer_new (NULL);
+	    gtk_text_view_set_buffer (GTK_TEXT_VIEW (tv), tb);
+	    gtk_text_view_set_editable (GTK_TEXT_VIEW (tv), FALSE);
+	    gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW(tv), FALSE);
+	}
+	for (gl=tracks; gl; gl=gl->next)
+	{
+	    GtkTextIter ti;
+	    gchar *text;
+	    Track *tr = gl->data;
+	    g_return_if_fail (tr);
+
+	    text = get_track_info (tr, FALSE);
+	    /* append info to the end, incl. newline */
+	    gtk_text_buffer_get_end_iter (tb, &ti);
+	    gtk_text_buffer_insert (tb, &ti, text, -1);
+	    gtk_text_buffer_get_end_iter (tb, &ti);
+	    gtk_text_buffer_insert (tb, &ti, "\n", -1);
+	    g_free (text);
+	}
+    }
+    else
+    {
+	gtk_widget_hide (message_box);
+    }
+
+    /* set last folder */
+    option_set_folder (GTK_FILE_CHOOSER (fc),
+		       EXPORT_FILES_PATH);
+    /* set toggle button "charset" */
+    option_set_toggle_button (export_files_xml, EXPORT_FILES_SPECIAL_CHARSET, FALSE);
+    /* set toggle button "check for existing files" */
+    option_set_toggle_button (export_files_xml, EXPORT_FILES_CHECK_EXISTING, TRUE);
+
+    /* set last template */
+    option_set_string (export_files_xml, EXPORT_FILES_TPL, EXPORT_FILES_TPL_DFLT);
+
+    response = gtk_dialog_run (GTK_DIALOG (fc));
+
+    switch (response)
+    {
+    case GTK_RESPONSE_ACCEPT:
+	export_files_store_option_settings (fcd);
+	export_files_write (fcd);
+	break;
+    case GTK_RESPONSE_CANCEL:
+	break;
+    default:
+	break;
+    }
+
+    g_list_free (fcd->tracks);
+    g_free (fcd);
+    gtk_widget_destroy (GTK_WIDGET (fc));
+}
+
+
+/*------------------------------------------------------------------
+
+  Code for DND: export when dragging from the iPod to the local
+  database.
+
+  ------------------------------------------------------------------*/
+
+/* If tracks are dragged from the iPod to the local database, the
+   tracks need to be copied from the iPod to the harddisk. This
+   function will ask where to copy them to, and add the tracks to the
+   MPL of @itdb_d.
+   A list of tracks that needs to be processed by the drag is
+   returned.
+
+   If tracks are not dragged from the iPod to the local database, a
+   copy of @tracks is returned.
+
+   The returned GList must be g_list_free()'ed after it is no longer
+   used. */
+GList *export_trackglist_when_necessary (iTunesDB *itdb_s,
+					 iTunesDB *itdb_d,
+					 GList *tracks)
+{
+    GList *gl;
+    GList *existing_tracks = NULL;
+    GList *new_tracks = NULL;
+    GList *added_tracks = NULL;
+
+    g_return_val_if_fail (itdb_s, NULL);
+    g_return_val_if_fail (itdb_d, NULL);
+    g_return_val_if_fail (gtkpod_window, NULL);
+
+    if (!((itdb_s->usertype & GP_ITDB_TYPE_IPOD) &&
+	  (itdb_d->usertype & GP_ITDB_TYPE_LOCAL)))
+    {   /* drag is not from iPod to local database -> return copy of
+	 * @tracks */
+	return g_list_copy (tracks);
+    }
+
+    /* drag is from iPod to local database */
+
+    /* no drag possible if in offline mode */
+    if (get_offline (itdb_s))
+    {
+	GtkWidget *dialog = gtk_message_dialog_new (
+	    GTK_WINDOW (gtkpod_window),
+	    GTK_DIALOG_DESTROY_WITH_PARENT,
+	    GTK_MESSAGE_WARNING,
+	    GTK_BUTTONS_OK,
+	    _("Drag from iPod database not possible in offline mode."));
+	gtk_dialog_run (GTK_DIALOG (dialog));
+	gtk_widget_destroy (dialog);
+	return NULL;
+    }
+
+    /* make a list of tracks that already exist in itdb_d and of those
+       that do not yet exist */
+    for (gl=tracks; gl; gl=gl->next)
+    {
+	Track *otr;
+	Track *tr = gl->data;
+	g_return_val_if_fail (tr, NULL);
+
+	otr = sha1_track_exists (itdb_d, tr);
+
+	if (otr)
+	{
+	    existing_tracks = g_list_append (existing_tracks, otr);
+	}
+	else
+	{
+	    new_tracks = g_list_append (new_tracks, tr);
+	}
+    }
+
+    /* if new tracks exist, copy them from the iPod to the harddisk */
+    if (new_tracks)
+    {
+	GList *filenames = NULL;
+	Playlist *mpl = itdb_playlist_mpl (itdb_d);
+	g_return_val_if_fail (mpl, NULL);
+
+	export_files_init (new_tracks, &filenames, TRUE,
+			   _("The following tracks have to be copied to your harddisk"));
+	/* add copied tracks to MPL of @itdb_d */
+	while (new_tracks && filenames)
+	{
+	    Track *dtr, *added_track;
+	    ExtraTrackData *edtr;
+	    Track *tr = new_tracks->data;
+	    gchar *filename = filenames->data;
+	    g_return_val_if_fail (tr, NULL);
+	    g_return_val_if_fail (filename, NULL);
+
+	    /* duplicate track */
+	    dtr = itdb_track_duplicate (tr);
+	    edtr = dtr->userdata;
+	    g_return_val_if_fail (edtr, NULL);
+
+	    /* set filename */
+	    g_free (edtr->pc_path_utf8);
+	    g_free (edtr->pc_path_locale);
+	    edtr->pc_path_utf8 = charset_to_utf8 (filename);
+	    edtr->pc_path_locale = filename;
+
+	    /* free ipod path */
+	    g_free (dtr->ipod_path);
+	    dtr->ipod_path = g_strdup ("");
+
+	    /* add track to itdb_d */
+	    added_track = gp_track_add (itdb_d, dtr);
+	    /* this cannot happen because we checked that the track is
+	       not in itdb_d before! */
+	    g_return_val_if_fail (added_track == dtr, NULL);
+	    /* add track to MPL */
+	    gp_playlist_add_track (mpl, dtr, TRUE);
+
+	    /* add track to added_tracks */
+	    added_tracks = g_list_append (added_tracks, dtr);
+
+	    /* remove the links from the GLists */
+	    new_tracks = g_list_delete_link (new_tracks, new_tracks);
+	    filenames = g_list_delete_link (filenames, filenames);
+	}
+
+	if (filenames)
+	{
+	    GList *gl;
+	    gtkpod_warning (_("Some tracks were not copied to your harddisk. Only the copied tracks will be included in the current drag and drop operation.\n\n"));
+	    for (gl=filenames; gl; gl=gl->next)
+	    {
+		g_free (gl->data);
+	    }
+	    g_list_free (filenames);
+	    filenames = NULL;
+	}
+	/* new_tracks must always be shorter than filenames! */
+	g_return_val_if_fail (!new_tracks, NULL);
+    }
+
+    /* return a list containing the existing tracks and the added
+       tracks */
+    return g_list_concat (existing_tracks, added_tracks);
+}
+
+
+
+
+/* same as export_trackglist_when_necessary() but the tracks are
+   represented as pointers in ASCII format. This function parses the
+   tracks in @data and calls export_trackglist_when_necessary() */
+GList *export_tracklist_when_necessary (iTunesDB *itdb_s,
+					iTunesDB *itdb_d,
+					gchar *data)
+{
+    GList *result;
+    Track *tr;
+    GList *tracks = NULL;
+    gchar *datap = data;
+
+    g_return_val_if_fail (itdb_s, NULL);
+    g_return_val_if_fail (itdb_d, NULL);
+    g_return_val_if_fail (data, NULL);
+
+    /* parse tracks and create GList */
+    while (parse_tracks_from_string (&datap, &tr))
+    {
+	tracks = g_list_append (tracks, tr);
+    }
+
+    result = export_trackglist_when_necessary (itdb_s, itdb_d, tracks);
+
+    g_list_free (tracks);
+ 
+    return result;
+}
+
+
+
+/*------------------------------------------------------------------
+
+  Code to export a playlist file
+
+  ------------------------------------------------------------------*/
+
+
+/* Options for the export playlist file file chooser */
+typedef enum
+{
+    EXPORT_PLAYLIST_FILE_TYPE_M3U = 0,
+    EXPORT_PLAYLIST_FILE_TYPE_PLS
+} ExportPlaylistFileType;
+
+/* Strings for the widgets involved */
+const gchar *ExportPlaylistFileTypeW[] = {
+    "type_m3u", "type_pls", NULL };
+/* order must be identical to 'FileSource' enum in file.h */
+const gchar *ExportPlaylistFileSourceW[] = {
+    "source_prefer_local", "source_local", "source_ipod", NULL };
+
+/* Strings for prefs settings */
+const gchar *EXPORT_PLAYLIST_FILE_TYPE="export_playlist_file_type";
+const gchar *EXPORT_PLAYLIST_FILE_SOURCE="export_playlist_file_source";
+const gchar *EXPORT_PLAYLIST_FILE_PATH="export_playlist_file_path";
+const gchar *EXPORT_PLAYLIST_FILE_TPL="export_playlist_file_template";
+
+/* Default prefs settings */
+const gchar *EXPORT_PLAYLIST_FILE_TPL_DFLT="%a - %t";
+
+
+/******************************************************************
+   export_playlist_file_cleanup - free memory taken up by the fcd
+   structure.
+ ******************************************************************/
+static void export_playlist_file_cleanup (struct fcd *fcd)
+{
+    g_return_if_fail (fcd);
+    g_list_free (fcd->tracks);
+    g_free (fcd);
+    release_widgets ();
+}
+
+
+/******************************************************************
+   export_playlist_file_retrieve_options - retrieve options and store
+   them in the prefs.
+ ******************************************************************/
+static void export_playlist_file_retrieve_options (struct fcd *fcd)
+{
+    g_return_if_fail (fcd && fcd->fc);
+
+    option_get_radio_button (fcd->win_xml,
+			     EXPORT_PLAYLIST_FILE_TYPE,
+			     ExportPlaylistFileTypeW);
+    option_get_radio_button (fcd->win_xml,
+			     EXPORT_PLAYLIST_FILE_SOURCE,
+			     ExportPlaylistFileSourceW);
+    option_get_string (fcd->win_xml, EXPORT_PLAYLIST_FILE_TPL, NULL);
+    option_get_folder (GTK_FILE_CHOOSER (fcd->fc),
+		       EXPORT_PLAYLIST_FILE_PATH, NULL);
+}
+
+
+/******************************************************************
+   export_playlist_file_write - write out a playlist file (filename is
+   retrieved from the file chooser dialog, options are retrieved from
+   the prefs system
+ ******************************************************************/
+static void export_playlist_file_write (struct fcd *fcd)
+{
+    guint num;
+    gint type, source;
+    gchar *template, *fname;
+    FILE *file;
+
+    g_return_if_fail (fcd && fcd->fc);
+
+    num = g_list_length (fcd->tracks);
+
+    type = prefs_get_int (EXPORT_PLAYLIST_FILE_TYPE);
+    source = prefs_get_int (EXPORT_PLAYLIST_FILE_SOURCE);
+    template = prefs_get_string (EXPORT_PLAYLIST_FILE_TPL);
+    if (!template)
+	template = g_strdup (EXPORT_PLAYLIST_FILE_TPL_DFLT);
+
+    fname = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(fcd->fc));
+
+    file = fopen (fname, "w");
+
+    if (file)
+    {
+	guint i,n;
+
+	switch (type)
+	{
+	case EXPORT_PLAYLIST_FILE_TYPE_M3U:
+	    fprintf (file, "#EXTM3U\n");
+	    break;
+	case EXPORT_PLAYLIST_FILE_TYPE_PLS:
+	    fprintf (file, "[playlist]\n");
+	    break;
+	}
+
+	for (n=0,i=0; i<num; ++i)
+	{
+	    Track *track = g_list_nth_data (fcd->tracks, i);
+	    gchar *infotext_utf8 = get_string_from_full_template (
+		track, template, FALSE);
+	    gchar *filename = get_file_name_from_source (track,
+							 source);
+	    gchar *infotext;
+
+	    if (infotext_utf8)
+	    {
+		infotext = charset_from_utf8 (infotext_utf8);
+		C_FREE (infotext_utf8);
+	    }
+	    else
+	    {
+		infotext = g_strdup ("");
+	    }
+
+	    if (filename)
+	    {
+		++n;  /* number of verified tracks */
+
+		switch (type)
+		{
+		case EXPORT_PLAYLIST_FILE_TYPE_M3U:
+		    fprintf (file, "#EXTINF:%d,%s\n",
+			     (track->tracklen+990)/1000, infotext);
+		    fprintf (file, "%s\n", filename);
+		    break;
+		case EXPORT_PLAYLIST_FILE_TYPE_PLS:
+		    fprintf (file, "File%d=%s\n", n, filename);
+		    fprintf (file, "Title%d=%s\n", n, infotext);
+		    fprintf (file, "Length%d=%d\n", n,
+			     (track->tracklen+990)/1000);
+		    break;
+		}
+	    }
+	    else
+	    {
+		gtkpod_warning (_("No valid filename for: %s\n\n"), infotext);
+	    }
+	    g_free (infotext);
+	    g_free (filename);
+	}
+	switch (type)
+	{
+	case EXPORT_PLAYLIST_FILE_TYPE_M3U:
+	    break;
+	case EXPORT_PLAYLIST_FILE_TYPE_PLS:
+	    fprintf (file, "NumberOfEntries=%d\n", n);
+	    fprintf (file, "Version=2\n");
+	    break;
+	}
+	fclose (file);
+	gtkpod_statusbar_message  (
+	    ngettext ("Created playlist with one track.",
+		      "Created playlist with %d tracks.", n), n);
+    }
+    else
+    {
+	gtkpod_warning (_("Could not open '%s' for writing (%s).\n\n"),
+			fname, g_strerror (errno));
+    }
+    g_free (template);
+    g_free (fname);
+}
+    
+
+
+/******************************************************************
+   export_playlist_file_response - handle the response codes
+   accordingly.
+ ******************************************************************/
+static void export_playlist_file_response (GtkDialog *fc,
+					   gint response,
+					   struct fcd *fcd)
+{
+/*     printf ("received response code: %d\n", response); */
+    switch (response)
+    {
+    case RESPONSE_APPLY:
+	export_playlist_file_retrieve_options (fcd);
+	break;
+    case GTK_RESPONSE_ACCEPT:
+	export_playlist_file_retrieve_options (fcd);
+	export_playlist_file_write (fcd);
+	export_playlist_file_cleanup (fcd);
+	gtk_widget_destroy (GTK_WIDGET (fc));
+	break;
+    case GTK_RESPONSE_CANCEL:
+	export_playlist_file_cleanup (fcd);
+	gtk_widget_destroy (GTK_WIDGET (fc));
+	break;
+    case GTK_RESPONSE_DELETE_EVENT:
+	export_playlist_file_cleanup (fcd);
+	break;
+    default:
+	fprintf (stderr, "Programming error: export_playlist_file_response(): unknown response '%d'\n", response);
+	break;
+    }
+}
+
+
+/******************************************************************
+   export_playlist_file_init - Create a playlist file to a location
+   specified by the file selection dialog.
+   @tracks: GList with tracks to be in playlist file.
+ ******************************************************************/
+void export_playlist_file_init (GList *tracks)
+{
+    GtkWidget *win; 
+    GtkWidget *options; 
+    struct fcd *fcd = g_malloc0 (sizeof (struct fcd));
+    GtkWidget *fc = gtk_file_chooser_dialog_new (
+	_("Create Playlist File"),
+	NULL,
+	GTK_FILE_CHOOSER_ACTION_SAVE,
+	GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+	GTK_STOCK_APPLY, RESPONSE_APPLY,
+	GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
+	NULL);
+    GladeXML *export_playlist_xml;
+    
+    export_playlist_xml = glade_xml_new (xml_file, "export_playlist_file_options", NULL);
+    win = gtkpod_xml_get_widget (export_playlist_xml, "export_playlist_file_options");
+
+    options = gtkpod_xml_get_widget (export_playlist_xml, "options_frame");
+
+    fcd->win_xml = export_playlist_xml;
+
+    /* Information needed to clean up later */
+    fcd->tracks = g_list_copy (tracks);
+    fcd->fc = fc;
+
+    /* according to GTK FAQ: move a widget to a new parent */
+    gtk_widget_ref (options);
+    gtk_container_remove (GTK_CONTAINER (win), options);
+    /* set extra options */
+    gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER (fc),
+				       options);
+    gtk_widget_unref (options);
+
+    gtk_widget_destroy (win);
+
+    /* set last folder */
+    option_set_folder (GTK_FILE_CHOOSER (fc),
+		       EXPORT_PLAYLIST_FILE_PATH);
+    /* set last type */
+    option_set_radio_button (export_playlist_xml, EXPORT_PLAYLIST_FILE_TYPE,
+			     ExportPlaylistFileTypeW, 0);
+    /* set last source */
+    option_set_radio_button (export_playlist_xml, EXPORT_PLAYLIST_FILE_SOURCE,
+			     ExportPlaylistFileSourceW, 0);
+    /* set last template */
+    option_set_string (export_playlist_xml, EXPORT_PLAYLIST_FILE_TPL,
+		       EXPORT_PLAYLIST_FILE_TPL_DFLT);
+
+    /* catch response codes */
+    g_signal_connect (fc, "response",
+		      G_CALLBACK (export_playlist_file_response),
+		      fcd);
+
+    gtk_widget_show (fc);
+    block_widgets ();
+}
+
+
+/*
+Playlists examples:
+
+	Simple M3U playlist:  
+	 
+	
+	C:\My Music\Pink Floyd\1979---The_Wall_CD1\1.In_The_Flesh.mp3  
+	C:\My Music\Pink Floyd\1979---The_Wall_CD1\10.One_Of_My_Turns.mp3  
+	
+
+	Extended M3U playlist:  
+	
+
+	#EXTM3U  
+	#EXTINF:199,Pink Floyd - In The Flesh  
+	R:\Music\Pink Floyd\1979---The_Wall_CD1\1.In_The_Flesh.mp3  
+	#EXTINF:217,Pink Floyd - One Of My Turns  
+	R:\Music\Pink Floyd\1979---The_Wall_CD1\10.One_Of_My_Turns.mp3  
+	
+
+	PLS playlist:  
+	 
+	
+	[playlist]  
+	File1=C:\My Music\Pink Floyd\1979---The_Wall_CD1\1.In_The_Flesh.mp3  
+	Title1=Pink Floyd - In The Flesh  
+	Length1=199  
+	File2=C:\My Music\Pink Floyd\1979---The_Wall_CD1\10.One_Of_My_Turns.mp3  
+	Title2=Pink Floyd - One Of My Turns  
+	Length2=217  
+	NumberOfEntries=2  
+	Version=2  
+*/

Added: trunk/src/file_itunesdb.c
===================================================================
--- trunk/src/file_itunesdb.c	                        (rev 0)
+++ trunk/src/file_itunesdb.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,2189 @@
+/*
+|  Copyright (C) 2002-2007 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: file_itunesdb.c 1824 2007-12-13 10:51:04Z dforsi $
+*/
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <ctype.h>
+#include <string.h>
+#include <glib/gstdio.h>
+#include "charset.h"
+#include "display.h"
+#include "file.h"
+#include "itdb.h"
+#include "info.h"
+#include "sha1.h"
+#include "misc.h"
+#include "misc_track.h"
+#include "prefs.h"
+#include "syncdir.h"
+#include "tools.h"
+#include "ipod_init.h"
+#include "file_convert.h"
+#include "display_coverart.h"
+#include "display_photo.h"
+
+#define _TO_STR(x) #x
+#define TO_STR(x) _TO_STR(x)
+#define debug(s) printf(__FILE__":" TO_STR(__LINE__) ":" s)
+#define debugx(s,...) printf(__FILE__":" TO_STR(__LINE__) ":" s,__VA_ARGS__)
+
+/*------------------------------------------------------------------*\
+ *                                                                  *
+ *      Handle Import of iTunesDB                                   *
+ *                                                                  *
+\*------------------------------------------------------------------*/
+
+/* only used when reading extended info from file */
+/* see definition of ExtraTrackData in display_itdb.h for explanations */
+struct track_extended_info
+{
+    guint ipod_id;
+    gchar *pc_path_locale;
+    gchar *pc_path_utf8;
+    time_t mtime;
+    gchar *thumb_path_locale;
+    gchar *thumb_path_utf8;
+    gchar *converted_file;
+    gchar *sha1_hash;
+    gchar *charset;
+    gchar *hostname;
+    gchar *ipod_path;
+    guint64 local_itdb_id;
+    guint64 local_track_dbid;
+    gboolean transferred;
+};
+
+typedef struct {
+    GMutex *mutex;           /* mutex for this struct          */
+    gboolean abort;          /* TRUE = abort                   */
+    GCond  *finished_cond;   /* used to signal end of thread   */
+    gboolean finished;       /* background thread has finished */
+    Track *track;            /* Current track                  */
+    const gchar *filename;   /* Filename to copy/remove        */
+    /* Widgets for progress dialog */
+    GtkWidget *dialog;
+    GtkWidget *textlabel;
+    GtkProgressBar *progressbar;
+} TransferData;
+
+
+/* Used to keep the "extended information" until the iTunesDB is loaded */
+static GHashTable *extendedinfohash = NULL;
+static GHashTable *extendedinfohash_sha1 = NULL;
+static GList *extendeddeletion = NULL;
+static float extendedinfoversion = 0.0;
+
+/* Some declarations */
+static gboolean gp_write_itdb (iTunesDB *itdb);
+
+
+/* fills in extended info if available */
+/* num/total are used to give updates in case the sha1 checksums have
+   to be matched against the files which is very time consuming */
+void fill_in_extended_info (Track *track, gint32 total, gint32 num)
+{
+  gint ipod_id=0;
+  ExtraTrackData *etr;
+  struct track_extended_info *sei=NULL;
+
+  g_return_if_fail (track);
+  etr = track->userdata;
+  g_return_if_fail (etr);
+
+  if (extendedinfohash && track->id)
+  {
+      /* copy id to gint value -- needed for the hash table functions */
+      ipod_id = track->id;
+      sei = g_hash_table_lookup (extendedinfohash, &ipod_id);
+  }
+  if (!sei && extendedinfohash_sha1)
+  {
+      gtkpod_statusbar_message (
+	  _("Matching SHA1 checksum for file %d/%d"),
+	  num, total);
+      while (widgets_blocked && gtk_events_pending ())
+	  gtk_main_iteration ();
+
+      if (!etr->sha1_hash)
+      {
+	  gchar *filename = get_file_name_from_source (track, SOURCE_IPOD);
+	  etr->sha1_hash = sha1_hash_on_filename (filename, FALSE);
+	  g_free (filename);
+      }
+      if (etr->sha1_hash)
+      {
+	  sei = g_hash_table_lookup (extendedinfohash_sha1, etr->sha1_hash);
+      }
+  }
+  if (sei) /* found info for this id! */
+  {
+      if (sei->pc_path_locale && !etr->pc_path_locale)
+      {
+	  etr->pc_path_locale = g_strdup (sei->pc_path_locale);
+	  etr->mtime = sei->mtime;
+      }
+      if (sei->pc_path_utf8 && !etr->pc_path_utf8)
+	  etr->pc_path_utf8 = g_strdup (sei->pc_path_utf8);
+      if (sei->thumb_path_locale && !etr->thumb_path_locale)
+	  etr->thumb_path_locale = g_strdup (sei->thumb_path_locale);
+      if (sei->thumb_path_utf8 && !etr->thumb_path_utf8)
+	  etr->thumb_path_utf8 = g_strdup (sei->thumb_path_utf8);
+      if (sei->sha1_hash && !etr->sha1_hash)
+	  etr->sha1_hash = g_strdup (sei->sha1_hash);
+      if (sei->charset && !etr->charset)
+	  etr->charset = g_strdup (sei->charset);
+      if (sei->hostname && !etr->hostname)
+	  etr->hostname = g_strdup (sei->hostname);
+      if (sei->converted_file && !etr->converted_file)
+	  etr->converted_file = g_strdup (sei->converted_file);
+      etr->local_itdb_id = sei->local_itdb_id;
+      etr->local_track_dbid = sei->local_track_dbid;
+      track->transferred = sei->transferred;
+      /* don't remove the sha1-hash -- there may be duplicates... */
+      if (extendedinfohash)
+	  g_hash_table_remove (extendedinfohash, &ipod_id);
+  }
+}
+
+
+/* Used to free the memory of hash data */
+static void hash_delete (gpointer data)
+{
+    struct track_extended_info *sei = data;
+
+    if (sei)
+    {
+	g_free (sei->pc_path_locale);
+	g_free (sei->pc_path_utf8);
+	g_free (sei->thumb_path_locale);
+	g_free (sei->thumb_path_utf8);
+	g_free (sei->sha1_hash);
+	g_free (sei->charset);
+	g_free (sei->hostname);
+	g_free (sei->converted_file);
+	g_free (sei->ipod_path);
+	g_free (sei);
+    }
+}
+
+static void destroy_extendedinfohash (void)
+{
+    if (extendedinfohash)
+    {
+	g_hash_table_destroy (extendedinfohash);
+	extendedinfohash = NULL;
+    }
+    if (extendedinfohash_sha1)
+    {
+	g_hash_table_destroy (extendedinfohash_sha1);
+	extendedinfohash_sha1 = NULL;
+    }
+    if (extendeddeletion)
+    {
+	g_list_foreach (extendeddeletion, (GFunc)itdb_track_free, NULL);
+	g_list_free (extendeddeletion);
+	extendeddeletion = NULL;
+    }
+    extendedinfoversion = 0.0;
+}
+
+/* Read extended info from "name" and check if "itunes" is the
+   corresponding iTunesDB (using the itunes_hash value in "name").
+   The data is stored in a hash table with the ipod_id as key.  This
+   hash table is used by fill_in_extended_info() (called from
+   gp_import_itdb()) to fill in missing information */
+/* Return TRUE on success, FALSE otherwise */
+static gboolean read_extended_info (gchar *name, gchar *itunes)
+{
+    gchar *sha1, buf[PATH_MAX];
+    gboolean success = TRUE;
+    gboolean expect_hash, hash_matched=FALSE;
+    gint len;
+    struct track_extended_info *sei = NULL;
+    FILE *fp;
+
+
+    fp = fopen (name, "r");
+    if (!fp)
+    {
+	gtkpod_warning (_("Could not open \"%s\" for reading extended info.\n"),
+			name);
+	return FALSE;
+    }
+    sha1 = sha1_hash_on_filename (itunes, FALSE);
+    if (!sha1)
+    {
+	gtkpod_warning (_("Could not create hash value from itunesdb\n"));
+	fclose (fp);
+	return FALSE;
+    }
+    /* Create hash table */
+    destroy_extendedinfohash ();
+    expect_hash = TRUE; /* next we expect the hash value (checksum) */
+    while (success && fgets (buf, PATH_MAX, fp))
+    {
+	gchar *line, *arg, *bufp;
+
+	/* allow comments */
+	if ((buf[0] == ';') || (buf[0] == '#')) continue;
+	arg = strchr (buf, '=');
+	if (!arg || (arg == buf))
+	{
+	    gtkpod_warning (_("Error while reading extended info: %s\n"), buf);
+	    continue;
+	}
+	/* skip whitespace (isblank() is a GNU extension... */
+	bufp = buf;
+	while ((*bufp == ' ') || (*bufp == 0x09)) ++bufp;
+	line = g_strndup (buf, arg-bufp);
+	++arg;
+	len = strlen (arg); /* remove newline */
+	if((len>0) && (arg[len-1] == 0x0a))  arg[len-1] = 0;
+	if (expect_hash)
+	{
+	    if(g_ascii_strcasecmp (line, "itunesdb_hash") == 0)
+	    {
+		if (strcmp (arg, sha1) != 0)
+		{
+		    hash_matched = FALSE;
+		    gtkpod_warning (_("iTunesDB '%s' does not match checksum in extended information file '%s'\ngtkpod will try to match the information using SHA1 checksums. This may take a long time.\n\n"), itunes, name);
+		    while (widgets_blocked && gtk_events_pending ())
+			gtk_main_iteration ();
+		}
+		else
+		{
+		    hash_matched = TRUE;
+		}
+		expect_hash = FALSE;
+	    }
+	    else
+	    {
+		gtkpod_warning (_("%s:\nExpected \"itunesdb_hash=\" but got:\"%s\"\n"), name, buf);
+		success = FALSE;
+		g_free (line);
+		break;
+	    }
+	}
+	else if(g_ascii_strcasecmp (line, "id") == 0)
+	{ /* found new id */
+	    if (sei)
+	    {
+		if (sei->ipod_id != 0)
+		{ /* normal extended information */
+		    if (hash_matched)
+		    {
+			if (!extendedinfohash)
+			{
+			    extendedinfohash = g_hash_table_new_full (
+				g_int_hash,g_int_equal, NULL,hash_delete);
+			}
+			g_hash_table_insert (extendedinfohash,
+					     &sei->ipod_id, sei);
+		    }
+		    else if (sei->sha1_hash)
+		    {
+			if (!extendedinfohash_sha1)
+			{
+			    extendedinfohash_sha1 = g_hash_table_new_full (
+				g_str_hash,g_str_equal, NULL,hash_delete);
+			}
+			g_hash_table_insert (extendedinfohash_sha1,
+					     sei->sha1_hash, sei);
+		    }
+		    else
+		    {
+			hash_delete ((gpointer)sei);
+		    }
+		}
+		else
+		{ /* this is a deleted track that hasn't yet been
+		     removed from the iPod's hard drive */
+		    Track *track = gp_track_new ();
+		    track->ipod_path = g_strdup (sei->ipod_path);
+		    extendeddeletion = g_list_append (extendeddeletion,
+						      track);
+		    hash_delete ((gpointer)sei); /* free sei */
+		}
+		sei = NULL;
+	    }
+	    if (strcmp (arg, "xxx") != 0)
+	    {
+		sei = g_malloc0 (sizeof (struct track_extended_info));
+		sei->ipod_id = atoi (arg);
+	    }
+	}
+	else if (g_ascii_strcasecmp (line, "version") == 0)
+	{ /* found version */
+	    extendedinfoversion = g_ascii_strtod (arg, NULL);
+	}
+	else if (sei == NULL)
+	{
+	    gtkpod_warning (_("%s:\nFormat error: %s\n"), name, buf);
+	    success = FALSE;
+	    g_free (line);
+	    break;
+	}
+	else if (g_ascii_strcasecmp (line, "hostname") == 0)
+	    sei->hostname = g_strdup (arg);
+	else if (g_ascii_strcasecmp (line, "converted_file") == 0)
+	    sei->converted_file = g_strdup (arg);
+	else if (g_ascii_strcasecmp (line, "filename_locale") == 0)
+	    sei->pc_path_locale = g_strdup (arg);
+	else if (g_ascii_strcasecmp (line, "filename_utf8") == 0)
+	    sei->pc_path_utf8 = g_strdup (arg);
+	else if (g_ascii_strcasecmp (line, "thumbnail_locale") == 0)
+	    sei->thumb_path_locale = g_strdup (arg);
+	else if (g_ascii_strcasecmp (line, "thumbnail_utf8") == 0)
+	    sei->thumb_path_utf8 = g_strdup (arg);
+	else if ((g_ascii_strcasecmp (line, "md5_hash") == 0) ||
+		 (g_ascii_strcasecmp (line, "sha1_hash") == 0))
+	{   /* only accept hash value if version is >= 0.53 or
+	       PATH_MAX is 4096 -- in 0.53 I changed the MD5 hash
+	       routine to using blocks of 4096 Bytes in
+	       length. Before it was PATH_MAX, which might be
+	       different on different architectures. */
+	    if ((extendedinfoversion >= 0.53) || (PATH_MAX == 4096))
+		sei->sha1_hash = g_strdup (arg);
+	}
+	else if (g_ascii_strcasecmp (line, "charset") == 0)
+	    sei->charset = g_strdup (arg);
+	else if (g_ascii_strcasecmp (line, "transferred") == 0)
+	    sei->transferred = atoi (arg);
+	else if (g_ascii_strcasecmp (line, "filename_ipod") == 0)
+	    sei->ipod_path = g_strdup (arg);
+	else if (g_ascii_strcasecmp (line, "pc_mtime") == 0)
+	    sei->mtime = (time_t)g_ascii_strtoull (arg, NULL, 10);
+	else if (g_ascii_strcasecmp (line, "local_itdb_id") == 0)
+	    sei->local_itdb_id = (guint64)g_ascii_strtoull (arg, NULL, 10);
+	else if (g_ascii_strcasecmp (line, "local_track_dbid") == 0)
+	    sei->local_track_dbid = (guint64)g_ascii_strtoull (arg, NULL, 10);
+	g_free (line);
+    }
+    g_free (sha1);
+    fclose (fp);
+    if (success && !hash_matched && !extendedinfohash_sha1)
+    {
+	gtkpod_warning (_("No SHA1 checksums on individual tracks are available.\n\nTo avoid this situation in the future either switch on duplicate detection (will provide SHA1 checksums) or avoid using the iPod with programs other than gtkpod.\n\n"), itunes, name);
+	success = FALSE;
+    }
+    if (!success) destroy_extendedinfohash ();
+    return success;
+}
+
+
+/* Import an iTunesDB and return an iTunesDB structure.
+ * If @old_itdb is set, it will be merged into the newly imported
+ * one. @old_itdb will not be changed.
+ * @type: GP_ITDB_TYPE_LOCAL/IPOD (bitwise flags!)
+ * @mp: mount point of iPod (if reading an iPod iTunesDB)
+ * @name_off: name of the iTunesDB in offline mode
+ * @name_loc: name of iTunesDB (if reading a local file browser) */
+/* Return value: a new iTunesDB structure or NULL in case of an error */
+iTunesDB *gp_import_itdb (iTunesDB *old_itdb, const gint type,
+			  const gchar *mp, const gchar *name_off,
+			  const gchar *name_loc)
+{
+    gchar *cfgdir = prefs_get_cfgdir ();
+    GList *gl;
+    Playlist *pod_pl;
+    ExtraiTunesDBData *eitdb;
+    iTunesDB *itdb = NULL;
+    GError *error = NULL;
+    gint32 total, num;
+    gboolean offline;
+
+
+    g_return_val_if_fail (!(type & GP_ITDB_TYPE_LOCAL) || name_loc, NULL);
+    g_return_val_if_fail (!(type & GP_ITDB_TYPE_IPOD) || 
+			  (mp && name_off), NULL);
+    g_return_val_if_fail (cfgdir, NULL);
+
+    if (old_itdb)
+	offline = get_offline (old_itdb);
+    else
+	offline = FALSE;
+
+
+    block_widgets ();
+    if (offline || (type & GP_ITDB_TYPE_LOCAL))
+    { /* offline or local database - requires extended info */
+	gchar *name_ext;
+	gchar *name_db;
+
+	if (type & GP_ITDB_TYPE_LOCAL)
+	{
+	    name_ext = g_strdup_printf ("%s.ext", name_loc);
+	    name_db = g_strdup (name_loc);
+	}
+	else
+	{
+	    name_ext = g_strdup_printf ("%s.ext", name_off);
+	    name_db = g_strdup (name_off);
+	}
+
+	if (g_file_test (name_db, G_FILE_TEST_EXISTS))
+	{
+	    if (prefs_get_int("write_extended_info"))
+	    {
+		if (!read_extended_info (name_ext, name_db))
+		{
+		    gtkpod_warning (_("Extended info will not be used. If you have non-transferred tracks,\nthese will be lost.\n"));
+		}
+	    }
+	    itdb = itdb_parse_file (name_db, &error);
+	    if (itdb && !error)
+	    {
+		if (type & GP_ITDB_TYPE_IPOD)
+		    gtkpod_statusbar_message(
+			_("Offline iPod database successfully imported"));
+		else
+		    gtkpod_statusbar_message(
+			_("Local database successfully imported"));
+	    }
+	    else
+	    {
+		if (error)
+		{
+		    if (type & GP_ITDB_TYPE_IPOD)
+			gtkpod_warning (
+			    _("Offline iPod database import failed: '%s'\n\n"),
+			    error->message);
+		    else
+			gtkpod_warning (
+			    _("Local database import failed: '%s'\n\n"),
+			    error->message);
+		}
+		else
+		{
+		    if (type & GP_ITDB_TYPE_IPOD)
+			gtkpod_warning (
+			    _("Offline iPod database import failed: \n\n"));
+		    else
+			gtkpod_warning (
+			    _("Local database import failed: \n\n"));
+		}
+	    }
+	}
+	else
+	{
+	    gtkpod_warning (
+		_("'%s' does not exist. Import aborted.\n\n"),
+		name_db);
+	}
+	g_free (name_ext);
+	g_free (name_db);
+	g_free (cfgdir);
+    }
+    else
+    { /* GP_ITDB_TYPE_IPOD _and_ iPod is connected */
+	gchar *name_ext=NULL, *name_db=NULL;
+
+	gchar *itunes_dir = itdb_get_itunes_dir (mp);
+	if (itunes_dir)
+	{
+	    name_ext = itdb_get_path (itunes_dir, "iTunesDB.ext");
+	    name_db  = itdb_get_path (itunes_dir, "iTunesDB");
+	}
+	if (name_db)
+	{
+	    if (prefs_get_int("write_extended_info"))
+	    {
+		if (!read_extended_info (name_ext, name_db))
+		{
+		    gtkpod_warning (_("Extended info will not be used.\n"));
+		}
+	    }
+	    itdb = itdb_parse (mp, &error);
+	    if(itdb && !error)
+	    {
+		gtkpod_statusbar_message (
+		    _("iPod Database Successfully Imported"));
+	    }
+	    else
+	    {
+		if (error)
+		{
+		    gtkpod_warning (
+			_("iPod Database Import Failed: '%s'\n\n"),
+			error->message);
+		}
+		else
+		{
+		    gtkpod_warning (
+			_("iPod Database Import Failed.\n\n"));
+		}
+	    }
+	}
+	else
+	{
+	    gchar *name = g_build_filename (
+		mp,
+		"iPod_Control","iTunes","iTunesDB",NULL);
+	    gtkpod_warning (_("'%s' (or similar) does not exist. Import aborted.\n\n"),
+			    name);
+	    g_free (name);
+	}
+	g_free (name_ext);
+	g_free (name_db);
+	g_free (itunes_dir);
+    }
+
+    if (!itdb)
+    {
+	release_widgets ();
+	return NULL;
+    }
+
+    /* add Extra*Data */
+    gp_itdb_add_extra_full (itdb);
+
+    eitdb = itdb->userdata;
+    g_return_val_if_fail (eitdb, (release_widgets(), NULL));
+
+    eitdb->offline = offline;
+
+    /* fill in additional info */
+    itdb->usertype = type;
+    if (type & GP_ITDB_TYPE_IPOD)
+    {
+	if (offline)
+	{
+	    itdb_set_mountpoint (itdb, mp);
+	    g_free (itdb->filename);
+	    itdb->filename = NULL;
+	}
+	eitdb->offline_filename = g_strdup (name_off);
+    }
+
+    total = g_list_length (itdb->tracks);
+    num = 1;
+    /* validate all tracks and fill in extended info */
+    for (gl=itdb->tracks; gl; gl=gl->next)
+    {
+	Track *track = gl->data;
+   
+	ExtraTrackData *etr;
+	g_return_val_if_fail (track, (release_widgets(), NULL));
+	etr = track->userdata;
+	g_return_val_if_fail (etr, (release_widgets(), NULL));
+	fill_in_extended_info (track, total, num);
+	gp_track_validate_entries (track);
+	/* properly set value for has_artwork */
+	if ((track->has_artwork == 0x00) ||
+	    ((track->has_artwork == 0x02) &&
+	     (extendedinfoversion > 0.0) && (extendedinfoversion <= 0.99)))
+	{   /* if has_artwork is not set (0x00), or it has been
+	       (potentially wrongly) set to 0x02 by gtkpod V0.99 or
+	       smaller, determine the correct(?) value */
+	    if (track->artwork->thumbnails)
+		track->has_artwork = 0x01;
+	    else
+		track->has_artwork = 0x02;
+	}
+
+	/* set mediatype to audio if unset (important only for iPod Video) */
+	if (track->mediatype == 0)
+	    track->mediatype = 0x00000001;
+	/* restore deleted thumbnails */
+	if ((track->artwork->thumbnails == NULL) &&
+	    (strlen (etr->thumb_path_locale) != 0))
+	{
+	    /* !! gp_track_set_thumbnails() writes on
+	       etr->thumb_path_locale, so we need to g_strdup()
+	       first !! */
+	    gchar *filename = g_strdup (etr->thumb_path_locale);
+	    gp_track_set_thumbnails (track, filename);
+	    g_free (filename);
+	}
+
+	/* add to filename hash */
+	gp_itdb_pc_path_hash_add_track (track);
+
+	++num;
+    }
+    /* take over the pending deletion information */
+    while (extendeddeletion)
+    {
+	Track *track = extendeddeletion->data;
+	g_return_val_if_fail (track, (release_widgets(), NULL));
+	mark_track_for_deletion (itdb, track);
+	extendeddeletion = g_list_delete_link (extendeddeletion,
+					       extendeddeletion);
+    }
+
+    /* delete hash information (if present) */
+    destroy_extendedinfohash ();
+
+    /* find duplicates and create sha1 hash*/
+    gp_sha1_hash_tracks_itdb (itdb);
+
+    /* mark the data as unchanged */
+    data_unchanged (itdb);
+    /* set mark that this itdb struct contains an imported iTunesDB */
+    eitdb->itdb_imported = TRUE;
+
+    if (old_itdb)
+    {
+	/* this table holds pairs of old_itdb-tracks/new_itdb/tracks */
+	ExtraiTunesDBData *old_eitdb = old_itdb->userdata;
+	GHashTable *track_hash = g_hash_table_new (g_direct_hash,
+						   g_direct_equal);
+	Playlist *mpl = itdb_playlist_mpl (itdb);
+	g_return_val_if_fail (mpl, (release_widgets(), NULL));
+	g_return_val_if_fail (old_eitdb, (release_widgets(), NULL));
+
+	/* add tracks from @old_itdb to new itdb */
+	for (gl=old_itdb->tracks; gl; gl=gl->next)
+	{
+	    Track *duptr, *addtr;
+	    Track *track = gl->data;
+	    g_return_val_if_fail (track, (release_widgets(), NULL));
+	    duptr = itdb_track_duplicate (track);
+	    /* add to database -- if duplicate detection is on and the
+	       same track already exists in the database, the already
+	       existing track is returned and @duptr is freed */
+	    addtr = gp_track_add (itdb, duptr);
+	    g_hash_table_insert (track_hash, track, addtr);
+	    if (addtr == duptr)
+	    {   /* Add to MPL */
+		itdb_playlist_add_track (mpl, addtr, -1);
+	    }
+	}
+	/* add playlists */
+	gl = old_itdb->playlists;
+	while (gl && gl->next)
+	{
+	    GList *glm;
+	    Playlist *duppl;
+	    Playlist *pl = gl->next->data; /* skip MPL */
+	    g_return_val_if_fail (pl, (release_widgets(), NULL));
+	    duppl = itdb_playlist_duplicate (pl);
+	    /* switch members */
+	    for (glm=duppl->members; glm; glm=glm->next)
+	    {
+		Track *newtr;
+		g_return_val_if_fail (glm->data, (release_widgets(), NULL));
+		newtr = g_hash_table_lookup (track_hash, glm->data);
+		g_return_val_if_fail (newtr, (release_widgets(), NULL));
+		glm->data = newtr;
+	    }
+	    /* if it's the podcasts list, don't add the list again if
+	       it already exists, but only the members. */
+	    if (itdb_playlist_is_podcasts (duppl) &&
+		itdb_playlist_podcasts (itdb))
+	    {
+		Playlist *podcasts = itdb_playlist_podcasts (itdb);
+		for (glm=duppl->members; glm; glm=glm->next)
+		{
+		    g_return_val_if_fail (glm->data, (release_widgets(), NULL));
+		    itdb_playlist_add_track (podcasts, glm->data, -1);
+		}
+		itdb_playlist_free (duppl);
+	    }
+	    else
+	    {
+		itdb_playlist_add (itdb, duppl, -1);
+	    }
+	    gl = gl->next;
+	}
+	g_hash_table_destroy (track_hash);
+	/* copy data_changed flag */
+	eitdb->data_changed = old_eitdb->data_changed;
+    }
+
+    /* Repair old iTunesDB where we didn't add podcasts to the MPL */
+    pod_pl = itdb_playlist_podcasts (itdb);
+    if (pod_pl)
+    {
+	Playlist *mpl = itdb_playlist_mpl (itdb);
+	for (gl=pod_pl->members; gl; gl=gl->next)
+	{
+	    Track *tr = gl->data;
+	    g_return_val_if_fail (tr, NULL);
+	    if (!itdb_playlist_contains_track (mpl, tr))
+	    {   /* track contained in Podcasts playlist but not in MPL
+		   -> add to MPL */
+		itdb_playlist_add_track (mpl, tr, -1);
+	    }
+	}
+    }
+
+    release_widgets();
+
+    return itdb;
+}
+
+/* attempts to import all iPod databases */
+void gp_load_ipods (void)
+{
+    struct itdbs_head *itdbs_head;
+    GList *gl;
+
+    g_return_if_fail (gtkpod_window);
+    itdbs_head = g_object_get_data (G_OBJECT (gtkpod_window),
+				    "itdbs_head");
+    g_return_if_fail (itdbs_head);
+
+    for (gl=itdbs_head->itdbs; gl; gl=gl->next)
+    {
+	iTunesDB *itdb = gl->data;
+	ExtraiTunesDBData *eitdb;
+	g_return_if_fail (itdb);
+	eitdb = itdb->userdata;
+	g_return_if_fail (eitdb);
+	if ((itdb->usertype & GP_ITDB_TYPE_IPOD) && !eitdb->itdb_imported)
+	{
+	    gp_load_ipod (itdb);
+	}
+    }
+}
+
+
+/* 
+ * Merges @old_itdb with a newly imported one, then replaces @old_itdb
+ * in the itdbs-list and the display.
+ *
+ * old_itdb->usertype, ->mountpoint, ->filename,
+ * ->eitdb->offline_filename must be set according to usertype and
+ * will be used to read the new itdb
+ *
+ * Return value: pointer to the new repository
+ */
+static iTunesDB *gp_merge_itdb (iTunesDB *old_itdb)
+{
+    ExtraiTunesDBData *old_eitdb;
+    iTunesDB *new_itdb;
+
+    g_return_val_if_fail (old_itdb, NULL);
+    old_eitdb = old_itdb->userdata;
+    g_return_val_if_fail (old_eitdb, NULL);
+
+    if (old_itdb->usertype & GP_ITDB_TYPE_LOCAL)
+    {
+	g_return_val_if_fail (old_itdb->filename, NULL);
+
+	new_itdb = gp_import_itdb (old_itdb, old_itdb->usertype,
+				   NULL, NULL, old_itdb->filename);
+    }
+    else if (old_itdb->usertype & GP_ITDB_TYPE_IPOD)
+    {
+	const gchar *mountpoint = itdb_get_mountpoint (old_itdb);
+	g_return_val_if_fail (mountpoint, NULL);
+	g_return_val_if_fail (old_eitdb->offline_filename, NULL);
+
+	new_itdb = gp_import_itdb (old_itdb, old_itdb->usertype,
+				   mountpoint,
+				   old_eitdb->offline_filename,
+				   NULL);
+    }
+    else
+	g_return_val_if_reached (NULL);
+
+    if (new_itdb)
+    {
+	gp_replace_itdb (old_itdb, new_itdb);
+	/* take care of autosync... */
+	sync_all_playlists (new_itdb);
+
+	/* update all live SPLs */
+	itdb_spl_update_live (new_itdb);
+    }
+
+    gtkpod_tracks_statusbar_update ();
+
+    return new_itdb;
+}
+
+
+/**
+ * gp_load_ipod: loads the contents of an iPod into @itdb. If data
+ * already exists in @itdb, data is merged.
+ *
+ * If new countrate and rating information is available, this
+ * information is adjusted within the local databases as well if the
+ * track can be identified in the local databases.
+ *
+ * @itdb: repository to load iPod contents into. mountpoint must be
+ * set, and the iPod must not be loaded already
+ * (eitdb->itdb_imported).
+ *
+ * Return value: the new repository holding the contents of the iPod.
+ */
+iTunesDB *gp_load_ipod (iTunesDB *itdb)
+{
+    ExtraiTunesDBData *eitdb;
+    iTunesDB *new_itdb = NULL;
+    gchar *mountpoint;
+    gchar *itunesdb;
+    gboolean ok_to_load = TRUE;
+
+    g_return_val_if_fail (itdb, NULL);
+    g_return_val_if_fail (itdb->usertype & GP_ITDB_TYPE_IPOD, NULL);
+    eitdb = itdb->userdata;
+    g_return_val_if_fail (eitdb, NULL);
+    g_return_val_if_fail (eitdb->itdb_imported == FALSE, NULL);
+
+
+    mountpoint = get_itdb_prefs_string (itdb, KEY_MOUNTPOINT);
+    call_script ("gtkpod.load", mountpoint, NULL);
+
+    /* read preferences keys from the iPod if available */
+    load_ipod_prefs (itdb, mountpoint);
+
+    itdb_device_set_mountpoint (itdb->device, mountpoint);
+
+    itunesdb = itdb_get_itunesdb_path (mountpoint);
+    if (!itunesdb)
+    {
+	gchar *str = g_strdup_printf (_("Could not find iPod directory structure at '%s'.\nIf you are sure that the iPod is properly mounted at '%s', gtkpod can create the directory structure for you.\n\nDo you want to create the directory structure now?\n"), mountpoint, mountpoint);
+	GtkWidget *dialog = gtk_message_dialog_new (
+	    GTK_WINDOW (gtkpod_window),
+	    GTK_DIALOG_DESTROY_WITH_PARENT,
+	    GTK_MESSAGE_WARNING,
+	    GTK_BUTTONS_YES_NO,
+	    str);
+	gint result = gtk_dialog_run (GTK_DIALOG (dialog));
+	gtk_widget_destroy (dialog);
+	g_free (str);
+
+	if (result == GTK_RESPONSE_YES)
+	{
+	    ok_to_load = gp_ipod_init (itdb);
+	}
+	else
+	{
+	    ok_to_load = FALSE;
+	}
+    }
+    g_free (itunesdb);
+    g_free (mountpoint);
+
+    if (ok_to_load)
+    {
+	gchar *prefs_model = get_itdb_prefs_string (itdb, KEY_IPOD_MODEL);
+	gchar *ipod_model = itdb_device_get_sysinfo (itdb->device, "ModelNumStr");
+	if (!prefs_model && ipod_model)
+	{   /* let's believe what the iPod says */
+	    set_itdb_prefs_string (itdb, KEY_IPOD_MODEL, ipod_model);
+	}
+	else if (prefs_model && !ipod_model)
+	{   /* verify with the user if the model is correct --
+	     * incorrect mdoel information can result in loss of
+	     * Artwork */
+	    gp_ipod_init_set_model (itdb, prefs_model);
+	    /* write out new SysInfo file -- otherwise libpod won't
+	       use it. Ignore error for now. */
+	    itdb_device_write_sysinfo (itdb->device, NULL);
+	}
+	else if (!prefs_model && !ipod_model)
+	{
+	    /* ask the user to set the model information */
+	    gp_ipod_init_set_model (itdb, NULL);
+	    /* write out new SysInfo file -- otherwise libpod won't
+	       use it. Ignore error for now. */
+	    itdb_device_write_sysinfo (itdb->device, NULL);
+	}
+	else
+	{   /* prefs_model && ipod_model are set */
+	    const gchar *prefs_ptr = prefs_model;
+	    const gchar *ipod_ptr = ipod_model;
+	    /* Normalize model number */
+	    if (isalpha (prefs_model[0]))  ++prefs_ptr;
+	    if (isalpha (ipod_model[0]))   ++ipod_ptr;
+	    if (strcmp (prefs_ptr, ipod_ptr) != 0)
+	    {   /* Model number is different -- confirm */
+		gp_ipod_init_set_model (itdb, ipod_model);
+		/* write out new SysInfo file -- otherwise libpod won't
+		   use it. Ignore error for now. */
+		itdb_device_write_sysinfo (itdb->device, NULL);
+	    }
+	}
+	g_free (prefs_model);
+	g_free (ipod_model);
+
+	new_itdb = gp_merge_itdb (itdb);
+
+	if (new_itdb)
+	{
+	    GList *gl;
+	    gchar *new_model = itdb_device_get_sysinfo (new_itdb->device,
+							"ModelNumStr");
+
+	    if (!new_model)
+	    {   /* Something went wrong with setting the ipod model
+		 * above */
+		prefs_model = get_itdb_prefs_string (new_itdb, KEY_IPOD_MODEL);
+		if (prefs_model)
+		{
+		    itdb_device_set_sysinfo (new_itdb->device, "ModelNumStr",
+					     prefs_model);
+		}
+		else
+		{   /* ask again... */
+		    gp_ipod_init_set_model (new_itdb, NULL);
+		}
+		g_free (prefs_model);
+	    }
+	    g_free (new_model);
+
+	    /* adjust rating and playcount in local databases */
+	    for (gl=new_itdb->tracks; gl; gl=gl->next)
+	    {
+		Track *itr = gl->data;
+		g_return_val_if_fail (itr, new_itdb);
+		if ((itr->recent_playcount != 0) ||
+		    (itr->app_rating != itr->rating))
+		{
+		    GList *gl;
+		    GList *tracks = gp_itdb_find_same_tracks_in_local_itdbs (itr);
+		    for (gl=tracks; gl; gl=gl->next)
+		    {
+			Track *ltr = gl->data;
+			g_return_val_if_fail (ltr, new_itdb);
+
+			if (itr->recent_playcount != 0)
+			{
+			    ltr->playcount += itr->recent_playcount;
+			    ltr->recent_playcount += itr->recent_playcount;
+			}
+			if (itr->rating != itr->app_rating)
+			{
+			    ltr->app_rating = ltr->rating;
+			    ltr->rating = itr->rating;
+			}
+			pm_track_changed (ltr);
+			data_changed (ltr->itdb);
+		    }
+		    g_list_free (tracks);
+		}
+	    }
+	}
+    }
+    
+    /* All successfully loaded so try loading the photo database */
+    gphoto_load_photodb (new_itdb);
+    return new_itdb;
+}
+
+
+/**
+ * gp_eject_ipod: store @itdb and call ~/.gtkpod/gtkpod.eject with the
+ * mountpoint as parameter. Then @itdb is deleted and replaced with an
+ * empty version. eitdb->ejected is set.
+ *
+ * @itdb: must be an iPod itdb (eject does not make sense otherwise)
+ *
+ * Return value: TRUE if saving was successful, FALSE otherwise.
+ */
+gboolean gp_eject_ipod (iTunesDB *itdb)
+{
+
+    g_return_val_if_fail (itdb, FALSE);
+    g_return_val_if_fail (itdb->usertype & GP_ITDB_TYPE_IPOD, FALSE);
+
+    if (gp_save_itdb (itdb))
+    {
+	gint index;
+	gchar *mountpoint;
+
+	mountpoint = get_itdb_prefs_string (itdb, KEY_MOUNTPOINT);
+
+	/* save prefs relevant for this iPod to the iPod */
+	save_ipod_prefs (itdb, mountpoint);
+
+	call_script ("gtkpod.eject", mountpoint, FALSE);
+	g_free (mountpoint);
+
+	index = get_itdb_index (itdb);
+
+	if (itdb->usertype & GP_ITDB_TYPE_AUTOMATIC)
+	{   /* remove itdb from display */
+	    remove_itdb_prefs (itdb);
+	    gp_itdb_remove (itdb);
+	    gp_itdb_free (itdb);
+	}
+	else
+	{   /* switch to an empty itdb */
+	    iTunesDB *new_itdb = setup_itdb_n (index);
+	    if (new_itdb)
+	    {
+		ExtraiTunesDBData *new_eitdb;
+
+		new_eitdb = new_itdb->userdata;
+		g_return_val_if_fail (new_eitdb, TRUE);
+
+		gp_replace_itdb (itdb, new_itdb);
+
+		new_eitdb->ipod_ejected = TRUE;
+	    }
+	}
+	return TRUE;
+    }
+    return FALSE;
+}
+
+
+/**
+ * gp_save_itdb: Save a repository after updating smart playlists. If
+ * the repository is an iPod, contacts, notes and calendar are also
+ * updated.
+ *
+ * @itdb: repository to save
+ *
+ * return value: TRUE on succes, FALSE when an error occurred.
+ */
+gboolean gp_save_itdb (iTunesDB *itdb)
+{
+    Playlist *pl;
+    gboolean success;
+    g_return_val_if_fail (itdb, FALSE);
+
+    if (itdb->usertype & GP_ITDB_TYPE_IPOD)
+    {  /* handle conversions for this repository with priority */
+	file_convert_itdb_first (itdb);
+    }
+
+    /* update smart playlists before writing */
+    itdb_spl_update_live (itdb);
+    pl = pm_get_selected_playlist ();
+    if (pl && (pl->itdb == itdb) &&
+	pl->is_spl && pl->splpref.liveupdate)
+    {   /* Update display if necessary */
+	st_redisplay (0);
+    }
+
+    success = gp_write_itdb (itdb);
+
+    if (itdb->usertype & GP_ITDB_TYPE_IPOD)
+    {
+	if (get_itdb_prefs_int (itdb, "concal_autosync"))
+	{
+	    tools_sync_all (itdb);
+	}
+    }
+
+    return success;
+}
+
+
+
+/*------------------------------------------------------------------*\
+ *                                                                  *
+ *      Functions concerning deletion of tracks                      *
+ *                                                                  *
+\*------------------------------------------------------------------*/
+
+/* Fills in @size with the size in bytes taken on the iPod or the
+ * local harddisk with files to be deleted, @num with the number of
+ * tracks to be deleted. */ 
+void gp_info_deleted_tracks (iTunesDB *itdb,
+			     gdouble *size, guint32 *num)
+{
+    ExtraiTunesDBData *eitdb;
+    GList *gl;
+
+    if (size) *size = 0;
+    if (num)  *num = 0;
+
+    g_return_if_fail (itdb);
+    eitdb = itdb->userdata;
+    g_return_if_fail (eitdb);
+
+    for (gl=eitdb->pending_deletion; gl; gl=gl->next)
+    {
+	ExtraTrackData *etr;
+	Track *tr = gl->data;
+	g_return_if_fail (tr);
+	etr = tr->userdata;
+	g_return_if_fail (tr);
+
+	if (size)  *size += tr->size;
+	if (num)   *num += 1;
+    }
+}
+
+
+/* Adds @track to the list of tracks to be deleted. The following
+   information is required: 
+   - userdata with ExtraTrackData
+   - size of track to be deleted
+   - either track->ipod_path or etr->pc_path_local */
+void mark_track_for_deletion (iTunesDB *itdb, Track *track)
+{
+    ExtraiTunesDBData *eitdb;
+    g_return_if_fail (itdb && itdb->userdata && track);
+    g_return_if_fail (track->itdb == NULL);
+    eitdb = itdb->userdata;
+
+    eitdb->pending_deletion = g_list_append (eitdb->pending_deletion,
+					     track);
+}
+
+
+
+/*------------------------------------------------------------------*\
+ *                                                                  *
+ *      Handle Export of iTunesDB                                   *
+ *                                                                  *
+\*------------------------------------------------------------------*/
+
+
+/* Writes extended info (sha1 hash, PC-filename...) of @itdb into file
+ * @itdb->filename+".ext". @itdb->filename will also be used to
+ * calculate the sha1 checksum of the corresponding iTunesDB */
+static gboolean write_extended_info (iTunesDB *itdb)
+{
+  ExtraiTunesDBData *eitdb;
+  FILE *fp;
+  gchar *sha1;
+  GList *gl;
+  gchar *name;
+
+  g_return_val_if_fail (itdb, FALSE);
+  g_return_val_if_fail (itdb->filename, FALSE);
+  eitdb = itdb->userdata;
+  g_return_val_if_fail (eitdb, FALSE);
+
+  space_data_update ();
+
+  name = g_strdup_printf ("%s.ext", itdb->filename);
+  fp = fopen (name, "w");
+  if (!fp)
+  {
+      gtkpod_warning (_("Could not open \"%s\" for writing extended info.\n"),
+		      name);
+      g_free (name);
+      return FALSE;
+  }
+  g_free (name);
+  name = NULL;
+  sha1 = sha1_hash_on_filename (itdb->filename, FALSE);
+  if (sha1)
+  {
+      fprintf(fp, "itunesdb_hash=%s\n", sha1);
+      g_free (sha1);
+  }
+  else
+  {
+      gtkpod_warning (_("Aborted writing of extended info.\n"));
+      fclose (fp);
+      return FALSE;
+  }
+  fprintf (fp, "version=%s\n", VERSION);
+  for (gl=itdb->tracks; gl; gl=gl->next)
+  {
+      Track *track = gl->data;
+      ExtraTrackData *etr;
+      g_return_val_if_fail (track, (fclose (fp), FALSE));
+      etr = track->userdata;
+      g_return_val_if_fail (etr, (fclose (fp), FALSE));
+      fprintf (fp, "id=%d\n", track->id);
+      if (etr->hostname)
+	  fprintf (fp, "hostname=%s\n", etr->hostname);
+      if (etr->converted_file)
+	  fprintf (fp, "converted_file=%s\n", etr->converted_file);
+      if (etr->pc_path_locale && *etr->pc_path_locale)
+	  fprintf (fp, "filename_locale=%s\n", etr->pc_path_locale);
+      if (etr->pc_path_utf8 && *etr->pc_path_utf8)
+	  fprintf (fp, "filename_utf8=%s\n", etr->pc_path_utf8);
+      if (etr->thumb_path_locale && *etr->thumb_path_locale)
+	  fprintf (fp, "thumbnail_locale=%s\n", etr->thumb_path_locale);
+      if (etr->thumb_path_utf8 && *etr->thumb_path_utf8)
+	  fprintf (fp, "thumbnail_utf8=%s\n", etr->thumb_path_utf8);
+      /* this is just for convenience for people looking for a track
+	 on the ipod away from gktpod/itunes etc. */
+      if (strlen (track->ipod_path) != 0)
+	  fprintf (fp, "filename_ipod=%s\n", track->ipod_path);
+      if (etr->sha1_hash && *etr->sha1_hash)
+	  fprintf (fp, "sha1_hash=%s\n", etr->sha1_hash);
+      if (etr->charset && *etr->charset)
+	  fprintf (fp, "charset=%s\n", etr->charset);
+      if (etr->mtime)
+	  fprintf (fp, "pc_mtime=%llu\n", (unsigned long long)etr->mtime);
+      if (etr->local_itdb_id)
+	  fprintf (fp, "local_itdb_id=%" G_GUINT64_FORMAT "\n",
+		   etr->local_itdb_id);
+      if (etr->local_track_dbid)
+	  fprintf (fp, "local_track_dbid=%" G_GUINT64_FORMAT "\n",
+		   etr->local_track_dbid);
+      fprintf (fp, "transferred=%d\n", track->transferred);
+      while (widgets_blocked && gtk_events_pending ())  gtk_main_iteration ();
+  }
+  if (get_offline(itdb))
+  { /* we are offline and also need to export the list of tracks that
+       are to be deleted */
+      for(gl = eitdb->pending_deletion; gl; gl = gl->next)
+      {
+	  Track *track = gl->data;
+	  g_return_val_if_fail (track, (fclose (fp), FALSE));
+	  
+	  fprintf (fp, "id=000\n");  /* our sign for tracks pending
+					deletion */
+	  fprintf (fp, "filename_ipod=%s\n", track->ipod_path);
+	  while (widgets_blocked && gtk_events_pending ())
+	      gtk_main_iteration ();
+      }
+  }
+  fprintf (fp, "id=xxx\n");
+  fclose (fp);
+  return TRUE;
+}
+
+
+TransferData *transfer_data_new (void)
+{
+    TransferData *transfer_data;
+    transfer_data = g_new0 (TransferData, 1);
+    transfer_data->mutex = g_mutex_new ();
+    transfer_data->finished_cond = g_cond_new ();
+    return transfer_data;
+}
+
+void transfer_data_free (TransferData *transfer_data)
+{
+    if (transfer_data->mutex)
+	g_mutex_free (transfer_data->mutex);
+    if (transfer_data->finished_cond)
+	g_cond_free (transfer_data->finished_cond);
+    g_free (transfer_data);
+}
+
+/* Threaded remove file */
+/* returns: int result (of remove()) */
+static gpointer th_remove (gpointer userdata)
+{
+    TransferData *td = userdata;
+    gint result;
+
+    result = g_remove (td->filename);
+    g_mutex_lock (td->mutex);
+    td->finished = TRUE; /* signal that thread will end */
+    g_cond_signal (td->finished_cond);
+    g_mutex_unlock (td->mutex);
+    return GINT_TO_POINTER(result);
+}
+
+/* This function is called when the user presses the abort button
+ * during transfer_tracks() or delete_tracks() */
+static void file_dialog_abort (TransferData *transfer_data)
+{
+    g_return_if_fail (transfer_data);
+
+    g_mutex_lock (transfer_data->mutex);
+
+    transfer_data->abort = TRUE;
+
+    g_mutex_unlock (transfer_data->mutex);
+}
+
+/* This function is called when the user closes the window */
+static gboolean file_dialog_delete (TransferData *transfer_data)
+{
+    file_dialog_abort (transfer_data);
+    return TRUE; /* don't close the window -- let our own code take care of this */
+}
+
+
+/* check if iPod directory stucture is present */
+static gboolean ipod_dirs_present (const gchar *mountpoint)
+{
+    gchar *file;
+    gchar *dir;
+    gboolean result = TRUE;
+
+    g_return_val_if_fail (mountpoint, FALSE);
+
+    dir = itdb_get_music_dir (mountpoint);
+    if (!dir)
+	return FALSE;
+
+    file = itdb_get_path (dir, "F00");
+    if (!file || !g_file_test(file, G_FILE_TEST_IS_DIR))
+	result = FALSE;
+    g_free (file);
+    g_free (dir);
+
+    dir = itdb_get_itunes_dir (mountpoint);
+    if(!dir || !g_file_test(dir, G_FILE_TEST_IS_DIR))
+      result = FALSE;
+    g_free(dir);
+
+    return result;
+}
+
+static GtkWidget *create_transfer_information_dialog (TransferData *td)
+{
+    GladeXML *dialog_xml;
+    GtkWidget *dialog, *widget;
+
+    dialog_xml = glade_xml_new (xml_file, "file_transfer_information_dialog", NULL);
+    glade_xml_signal_autoconnect (dialog_xml);
+
+    dialog = gtkpod_xml_get_widget (dialog_xml, "file_transfer_information_dialog");
+    g_return_val_if_fail (dialog, NULL);
+
+    /* the window itself */
+    td->dialog = dialog;
+
+    /* text label */
+    td->textlabel = gtkpod_xml_get_widget (dialog_xml, "textlabel");
+
+    /* progress bar */
+    td->progressbar = GTK_PROGRESS_BAR (
+	gtkpod_xml_get_widget (dialog_xml, "progressbar"));
+
+    /* Indicate that user wants to abort */
+    widget = gtkpod_xml_get_widget (dialog_xml, "abortbutton");
+    g_signal_connect_swapped (GTK_OBJECT (widget), "clicked",
+			      G_CALLBACK (file_dialog_abort),
+			      td);
+
+    /* User tried to close the window */
+    g_signal_connect_swapped (GTK_OBJECT (dialog), "delete-event",
+			      G_CALLBACK (file_dialog_delete),
+			      td);
+
+    return dialog;
+}
+
+
+static void set_progressbar (GtkProgressBar *progressbar,
+			     time_t start, gint n, gint count, gint init_count)
+{
+    gchar *progtext;
+    const gchar *progtext_old;
+    gdouble fraction, fraction_old;
+
+    g_return_if_fail (progressbar);
+
+    if (n==0)
+    {
+	fraction = 1;
+    }
+    else
+    {
+	fraction = (gdouble)count/n;
+    }
+
+    if (count-init_count == 0)
+    {
+	progtext = g_strdup_printf (_("%d%%"), (gint)(fraction*100));
+    }
+    else
+    {
+	time_t diff, fullsecs, hrs, mins, secs;
+
+	diff = time(NULL) - start;
+	fullsecs = (diff*(n-init_count)/(count-init_count))-diff+5;
+	hrs  = fullsecs / 3600;
+	mins = (fullsecs % 3600) / 60;
+	secs = ((fullsecs % 60) / 5) * 5;
+	/* don't bounce up too quickly (>10% change only) */
+	/* left = ((mins < left) || (100*mins >= 110*left)) ? mins : left;*/
+	progtext = g_strdup_printf (
+	    _("%d%% (%d/%d  %d:%02d:%02d left)"),
+	    (gint)(fraction*100), count, n, (gint)hrs, (gint)mins, (gint)secs);
+    }
+
+    progtext_old = gtk_progress_bar_get_text (progressbar);
+    if (!progtext_old || (strcmp (progtext_old, progtext) != 0))
+    {   /* only update progressbar text if it has changed */
+	gtk_progress_bar_set_text(progressbar, progtext);
+    }
+
+    fraction_old = gtk_progress_bar_get_fraction (progressbar);
+    if (fraction_old != fraction)
+    {   /* only update progressbar fraction if it has changed */
+	gtk_progress_bar_set_fraction(progressbar, fraction);
+    }
+
+    g_free (progtext);
+}
+
+
+/* Removes all tracks that were marked for deletion from the iPod or
+   the local harddisk (for itdb->usertype == GP_ITDB_TYPE_LOCAL) */
+/* Returns TRUE on success, FALSE if some error occurred and not all
+   files were removed */
+static gboolean delete_files (iTunesDB *itdb, TransferData *td)
+{
+  gboolean result = TRUE;
+  gint n, count;
+  time_t start;
+  ExtraiTunesDBData *eitdb;
+  GThread *thread = NULL;
+
+  g_return_val_if_fail (td, FALSE);
+
+  g_return_val_if_fail (itdb, FALSE);
+  eitdb = itdb->userdata;
+  g_return_val_if_fail (eitdb, FALSE);
+
+  if (!eitdb->pending_deletion)
+  {
+      return TRUE;
+  }
+
+  if (itdb->usertype & GP_ITDB_TYPE_IPOD)
+  {
+      g_return_val_if_fail (itdb_get_mountpoint (itdb), FALSE);
+  }
+
+  /* stop file transfer while we're deleting to avoid time-consuming
+     interference with slow access harddisks */
+  file_transfer_activate (itdb, FALSE);
+
+  gtk_label_set_text (GTK_LABEL (td->textlabel), _("Status: Deleting File"));
+
+  n = g_list_length (eitdb->pending_deletion);
+  count = 0; /* number of tracks removed */
+  start = time (NULL); /* start time for progress bar */
+
+  /* lets clean up those pending deletions */
+  while (!td->abort && eitdb->pending_deletion)
+  {
+      gchar *filename = NULL;
+      Track *track = eitdb->pending_deletion->data;
+      g_return_val_if_fail (track, FALSE);
+
+      track->itdb = itdb;
+      if (itdb->usertype & GP_ITDB_TYPE_IPOD)
+      {
+	  filename = get_file_name_from_source (track, SOURCE_IPOD);
+      }
+      if (itdb->usertype & GP_ITDB_TYPE_LOCAL)
+      {
+	  filename = get_file_name_from_source (track, SOURCE_LOCAL);
+      }
+      track->itdb = NULL;
+
+      if(filename)
+      {
+	  gint rmres;
+
+	  td->finished = FALSE;
+	  td->filename = filename;
+
+	  g_mutex_lock (td->mutex);
+
+	  thread = g_thread_create (th_remove, td, TRUE, NULL);
+
+	  do
+	  {
+	      GTimeVal gtime;
+
+	      set_progressbar (td->progressbar, start, n, count, 0);
+
+	      g_mutex_unlock (td->mutex);
+
+	      while (widgets_blocked && gtk_events_pending ())
+		  gtk_main_iteration ();
+
+	      g_mutex_lock (td->mutex);
+
+	      /* wait a maximum of 20 ms or until cond is signaled */
+	      g_get_current_time (&gtime);
+	      g_time_val_add (&gtime, 20000);
+	      g_cond_timed_wait (td->finished_cond,
+				 td->mutex, &gtime);
+	  } while(!td->finished);
+
+	  g_mutex_unlock (td->mutex);
+
+	  rmres = GPOINTER_TO_INT(g_thread_join (thread));
+
+	  if (rmres == -1)
+	  {
+	      gtkpod_warning (_("Could not remove the following file: '%s'\n\n"),
+			      filename);
+
+	      while (widgets_blocked && gtk_events_pending ())
+		  gtk_main_iteration ();
+	  }
+
+	  g_free (filename);
+      }
+      ++count;
+      itdb_track_free (track);
+      eitdb->pending_deletion = g_list_delete_link (
+	  eitdb->pending_deletion, eitdb->pending_deletion);
+  }
+
+  set_progressbar (td->progressbar, start, n, count, 0);
+
+  while (widgets_blocked && gtk_events_pending ())
+      gtk_main_iteration ();
+
+  if (td->abort) result = FALSE;
+
+  file_transfer_reset (itdb);
+
+  return result;
+}
+
+
+/* Reschedule tracks that failed during transfer. This is a hack as
+ * the @itdb could have been removed in the meanwhile. The clean
+ * solution would be to integrate the error display into the
+ * file_convert.c framework */
+static void transfer_reschedule (gpointer user_data1, gpointer user_data2)
+{
+    struct itdbs_head *ihead = gp_get_itdbs_head (gtkpod_window);
+    iTunesDB *itdb = user_data1;
+    GList *gl;
+
+    g_return_if_fail (itdb && ihead);
+
+    for (gl=ihead->itdbs; gl; gl=gl->next)
+    {
+	iTunesDB *it = gl->data;
+	g_return_if_fail (it);
+	if (it == itdb)
+	{   /* itdb is still valid --> reschedule tracks */
+	    file_transfer_reschedule (itdb);
+	    break;
+	}
+    }
+}
+
+
+
+/* Show an error message that not all tracks were transferred */
+static void transfer_tracks_show_failed (iTunesDB *itdb, TransferData *td)
+{
+    GString *string_transfer, *string_convert, *string;
+    gint failed_transfer, failed_conversion;
+    GList *tracks, *gl;
+
+    g_return_if_fail (itdb && td);
+
+    gtk_widget_hide (td->dialog);
+
+    string_transfer = g_string_sized_new (1000);
+    string_convert = g_string_sized_new (1000);
+    string = g_string_sized_new (1000);
+    failed_transfer = 0;
+    failed_conversion = 0;
+
+    tracks = file_transfer_get_failed_tracks (itdb);
+    /* since failed_num is not 0, tracks cannot be empty */
+    g_return_if_fail (tracks);
+    /* Add information about failed tracks to the respective
+       string */
+    for (gl=tracks; gl; gl=gl->next)
+    {
+	ExtraTrackData *etr;
+	gchar *buf;
+	Track *tr = gl->data;
+	g_return_if_fail (tr && tr->userdata);
+
+	etr = tr->userdata;
+
+	buf = get_track_info (tr, FALSE);
+
+	switch (etr->conversion_status)
+	{
+	case FILE_CONVERT_INACTIVE:
+	case FILE_CONVERT_CONVERTED:	 
+   /* This track was converted successfully (or did not
+	     * neeed conversion) and failed during transfer */
+	    ++failed_transfer;
+	    g_string_append_printf (string_transfer, "%s\n", buf);
+	    break;
+	default:
+	    /* These tracks failed during conversion */
+	    ++failed_conversion;
+	    g_string_append_printf (string_convert, "%s\n", buf);
+	    break;
+	}
+	g_free (buf);
+    }
+
+    if (failed_conversion != 0)
+    {
+	g_string_append (string,
+			 ngettext ("The following track could not be converted successfully:\n\n",
+				   "The following tracks could not be converted successfully:\n\n",
+				   failed_conversion));
+	g_string_append (string, string_convert->str);
+	g_string_append (string, "\n\n");
+    }
+
+    if (failed_transfer != 0)
+    {
+	g_string_append (string,
+			 ngettext ("The following track could not be transferred successfully:\n\n",
+				   "The following tracks could not be transferred successfully:\n\n",
+				   failed_transfer));
+	g_string_append (string, string_transfer->str);
+	g_string_append (string, "\n\n");
+    }
+
+    gtkpod_confirmation (CONF_ID_TRANSFER,    /* ID     */
+			 FALSE,               /* modal, */
+			 _("Warning"),        /* title  */
+			 _("The iPod could not be ejected. Please fix the problems mentioned below and then eject the iPod again. Pressing 'OK' will re-schedule the failed tracks for conversion and transfer."),
+			 string->str,         /* text to be displayed */
+			 NULL, 0, NULL,       /* option 1 */
+			 NULL, 0, NULL,       /* option 2 */
+			 TRUE,                /* gboolean confirm_again, */
+			 NULL,                /* confirm_again_key, */
+			 transfer_reschedule, /* ConfHandler ok_handler,*/
+			 NULL,                /* don't show "Apply" */
+			 CONF_NULL_HANDLER,   /* cancel_handler,*/
+			 itdb,                /* gpointer user_data1,*/
+			 NULL);               /* gpointer user_data2,*/
+
+    g_string_free (string_transfer, TRUE);
+    g_string_free (string_convert, TRUE);
+    g_string_free (string, TRUE);
+}
+
+
+
+/* Initiates and waits for transfer of tracks to the iPod */
+static gboolean transfer_tracks (iTunesDB *itdb, TransferData *td)
+{
+    gint to_convert_num, converting_num, to_transfer_num;
+    gint transferred_num, failed_num, transferred_init;
+    gboolean result = TRUE;
+    FileTransferStatus status;
+    ExtraiTunesDBData *eitdb;
+    time_t start;
+
+    g_return_val_if_fail (itdb && td, FALSE);
+    eitdb = itdb->userdata;
+    g_return_val_if_fail (eitdb, FALSE);
+
+    /* make sure background transfer is running */
+    file_transfer_activate (itdb, TRUE);
+    file_transfer_continue (itdb);
+    /* reschedule previously failed tracks */
+    file_transfer_reschedule (itdb);
+
+    /* find out how many tracks have already been processed */
+    file_transfer_get_status (itdb,
+			      NULL, NULL, NULL, &transferred_num, &failed_num);
+    transferred_init = transferred_num + failed_num;
+
+    start = time (NULL);
+
+    do
+    {
+	gchar *buf;
+	const gchar *buf_old;
+
+	status = file_transfer_get_status (itdb,
+					   &to_convert_num, &converting_num,
+					   &to_transfer_num, &transferred_num,
+					   &failed_num);
+
+	set_progressbar (td->progressbar, start,
+			 to_convert_num+to_transfer_num+failed_num+transferred_num,
+			 transferred_num+failed_num,
+			 transferred_init);
+
+	if (to_transfer_num > 0)
+	{
+	    buf = g_strdup_printf (_("Status: Copying track"));
+	}
+	else
+	{
+	    if ((to_convert_num + converting_num) > 0)
+	    {
+		buf = g_strdup_printf (_("Status: Waiting for conversion to complete"));
+	    }
+	    else
+	    {
+		buf = g_strdup_printf (_("Status: Finished transfer"));
+	    }
+	}
+
+/*	buf = g_strdup_printf (_("Status: %d. To convert: %d. To transfer: %d\n"
+				 "Transferred: %d. Failed: %d"),
+			       status, to_convert_num, to_transfer_num,
+			       transferred_num, failed_num);*/
+	buf_old = gtk_label_get_text (GTK_LABEL(td->textlabel));
+	if (!buf_old || (strcmp (buf_old, buf) != 0))
+	{   /* only set label if it has changed */
+	    gtk_label_set_text (GTK_LABEL(td->textlabel), buf);
+	}
+	g_free (buf);
+
+	if ((to_convert_num != 0) && (converting_num == 0))
+	{   /* Force the conversion to continue. Not sure if this scenario
+	     * is likely to happen, but better be safe then sorry */
+	    file_convert_continue ();
+	}
+
+	while (widgets_blocked && gtk_events_pending ())
+	    gtk_main_iteration ();
+
+	/* sleep 20 ms */
+	g_usleep (20*1000);
+    } while (!td->abort &&
+	     (status != FILE_TRANSFER_DISK_FULL) &&
+	     (to_convert_num + to_transfer_num) > 0);
+
+    /* reset background transfer to value in prefs */
+    file_transfer_reset (itdb);
+
+    if (td->abort)
+    {
+	result = FALSE;
+    }
+    else if (status == FILE_TRANSFER_DISK_FULL)
+    {
+	gchar *buf;
+	GtkWidget *dialog;
+
+	gtk_widget_hide (td->dialog);
+
+	buf = g_strdup_printf (ngettext (
+				   "One track could not be transferred because your iPod is full. Either delete some tracks or otherwise create space on the iPod before ejecting the iPod again.",
+				   "%d tracks could not be transferred because your iPod is full. Either delete some tracks or otherwise create space on the iPod before ejecting the iPod again.", to_transfer_num),
+			       to_transfer_num);
+
+	dialog = gtk_message_dialog_new (
+	    GTK_WINDOW (gtkpod_window),
+	    GTK_DIALOG_DESTROY_WITH_PARENT,
+	    GTK_MESSAGE_WARNING,
+	    GTK_BUTTONS_OK,
+	    buf);
+	gtk_dialog_run (GTK_DIALOG (dialog));
+	gtk_widget_destroy (dialog);
+	g_free (buf);
+	result = FALSE;
+    }
+    else if (failed_num != 0)    /* one error message is enough -> else{... */
+    {
+	transfer_tracks_show_failed (itdb, td);
+	result = FALSE;
+    }
+
+    if (result == TRUE)
+    {
+	/* remove transferred tracks from list so they won't be removed
+	   when deleting the itdb */
+	file_transfer_ack_itdb (itdb);
+    }
+
+    return result;
+}
+
+
+
+static gboolean gp_write_itdb (iTunesDB *itdb)
+{
+  gchar *cfgdir;
+  gboolean success = TRUE;
+  ExtraiTunesDBData *eitdb;
+  GtkWidget *dialog;
+  Playlist *mpl;
+  TransferData *transferdata;
+
+  g_return_val_if_fail (itdb, FALSE);
+  eitdb = itdb->userdata;
+  g_return_val_if_fail (eitdb, FALSE);
+
+  cfgdir = prefs_get_cfgdir ();
+  g_return_val_if_fail (cfgdir, FALSE);
+
+  mpl = itdb_playlist_mpl (itdb);
+  g_return_val_if_fail (mpl, FALSE);
+
+  if (!eitdb->itdb_imported)
+  {   /* No iTunesDB was read but user wants to export current
+         data. If an iTunesDB is present on the iPod or in cfgdir,
+	 this is most likely an error. We should tell the user */
+      gchar *tunes = NULL;
+      /* First check if we can find an existing iTunesDB. */
+      if (itdb->usertype & GP_ITDB_TYPE_LOCAL)
+      {
+	  tunes = g_strdup (itdb->filename);
+      }
+      else if (itdb->usertype & GP_ITDB_TYPE_IPOD)
+      {
+	  if (get_offline (itdb))
+	  {
+	      tunes = g_strdup (eitdb->offline_filename);
+	  }
+	  else
+	  {
+	      const gchar *mountpoint = itdb_get_mountpoint (itdb);
+	      g_return_val_if_fail (mountpoint, FALSE);
+	      tunes = itdb_get_itunesdb_path (mountpoint);
+	  }
+      }
+      else
+      {
+	  g_free (cfgdir);
+	  g_return_val_if_reached (FALSE);
+      }
+      if (g_file_test (tunes, G_FILE_TEST_EXISTS))
+      {
+	  gchar *str = g_strdup_printf (_("You did not import the existing iTunesDB ('%s'). This is most likely incorrect and will result in the loss of the existing database.\n\nPress 'OK' if you want to proceed anyhow or 'Cancel' to skip storing. If you cancel, you can import the existing database before calling this function again.\n"), tunes);
+	  GtkWidget *dialog = gtk_message_dialog_new (
+	      GTK_WINDOW (gtkpod_window),
+	      GTK_DIALOG_DESTROY_WITH_PARENT,
+	      GTK_MESSAGE_WARNING,
+	      GTK_BUTTONS_OK_CANCEL,
+	      str);
+	  gint result = gtk_dialog_run (GTK_DIALOG (dialog));
+	  gtk_widget_destroy (dialog);
+	  g_free (str);
+	  if (result == GTK_RESPONSE_CANCEL)
+	  {
+	      g_free (cfgdir);
+	      return FALSE;
+	  }
+      }
+  }
+
+  block_widgets ();
+
+  transferdata = transfer_data_new ();
+  dialog = create_transfer_information_dialog (transferdata);
+  gtk_widget_show (dialog);
+
+  if((itdb->usertype & GP_ITDB_TYPE_IPOD) && !get_offline (itdb))
+  {
+      const gchar *mountpoint = itdb_get_mountpoint (itdb);
+      g_return_val_if_fail (mountpoint, FALSE);
+      /* check if iPod directories are present */
+      if (!ipod_dirs_present (mountpoint))
+      {   /* no -- create them */
+	  gp_ipod_init (itdb);
+	  /* if still not present abort */
+	  if (!ipod_dirs_present (mountpoint))
+	  {
+	      gtkpod_warning (_("iPod directory structure must be present before synching to the iPod can be performed.\n"));
+	      success = FALSE;
+	  }
+      }
+      if (success)
+      {   /* remove deleted files */
+	  success = delete_files (itdb, transferdata);
+	  if (!success)
+	  {
+	      gtkpod_warning (_("Some tracks could not be deleted from the iPod. Export aborted!"));
+	  }
+      }
+      if (success)
+      {
+	  /* write tracks to iPod */
+	  success = transfer_tracks (itdb, transferdata);
+      }
+  }
+
+  if (itdb->usertype & GP_ITDB_TYPE_LOCAL)
+  {
+      success = delete_files (itdb, transferdata);
+  }
+
+  if (success)
+  {
+      gchar *buf;
+      buf = g_strdup_printf (_("Now writing database '%s'. Please wait..."), mpl->name);
+      gtk_label_set_text (GTK_LABEL (transferdata->textlabel), buf);
+      g_free (buf);
+
+      while (widgets_blocked && gtk_events_pending ())
+	  gtk_main_iteration ();
+  }
+
+  if (success && !get_offline (itdb) &&
+      (itdb->usertype & GP_ITDB_TYPE_IPOD))
+  {   /* write to the iPod */
+      GError *error = NULL;
+      if (!itdb_write (itdb, &error))
+      {   /* an error occurred */
+	  success = FALSE;
+	  if (error && error->message)
+	      gtkpod_warning ("%s\n\n", error->message);
+	  else
+	      g_warning ("error->message == NULL!\n");
+	  g_error_free (error);
+	  error = NULL;
+      }
+
+      if (success)
+      {   /* write shuffle data */
+	  if (!itdb_shuffle_write (itdb, &error))
+	  {   /* an error occurred */
+	      success = FALSE;
+	      if (error && error->message)
+		  gtkpod_warning ("%s\n\n", error->message);
+	      else
+		  g_warning ("error->message == NULL!\n");
+	      g_error_free (error);
+	      error = NULL;
+	  }
+      }
+      if (success)
+      {
+	  if (prefs_get_int("write_extended_info"))
+	  {   /* write extended information */
+	      success = write_extended_info (itdb);
+	  }
+	  else
+	  {   /* delete extended information if present */
+	      gchar *ext = g_strdup_printf ("%s.ext", itdb->filename);
+	      if (g_file_test (ext, G_FILE_TEST_EXISTS))
+	      {
+		  if (remove (ext) != 0)
+		  {
+		      gtkpod_statusbar_message (_("Extended information file not deleted: '%s\'"), ext);
+		  }
+	      }
+	  }
+      }
+      if (success && cfgdir)
+      {   /* copy to cfgdir */
+	  GError *error = NULL;
+	  if (!itdb_cp (itdb->filename, eitdb->offline_filename, &error))
+	  {
+	      success = FALSE;
+	      if (error && error->message)
+		  gtkpod_warning ("%s\n\n", error->message);
+	      else
+		  g_warning ("error->message == NULL!\n");
+	      g_error_free (error);
+	      error = NULL;
+	  }
+	  if (prefs_get_int("write_extended_info"))
+	  {
+	      gchar *from, *to;
+	      from = g_strdup_printf ("%s.ext", itdb->filename);
+	      to = g_strdup_printf ("%s.ext", eitdb->offline_filename);
+	      if (!itdb_cp (from, to, &error))
+	      {
+		  success = FALSE;
+		  if (error && error->message)
+		      gtkpod_warning ("%s\n\n", error->message);
+		  else
+		      g_warning ("error->message == NULL!\n");
+		  g_error_free (error);
+	      }
+	      g_free (from);
+	      g_free (to);
+	  }
+      }
+  }
+
+  if (success && get_offline (itdb) &&
+      (itdb->usertype & GP_ITDB_TYPE_IPOD))
+  {   /* write to cfgdir */
+      GError *error = NULL;
+      if (!itdb_write_file (itdb, eitdb->offline_filename, &error))
+      {   /* an error occurred */
+	  success = FALSE;
+	  if (error && error->message)
+	      gtkpod_warning ("%s\n\n", error->message);
+	  else
+	      g_warning ("error->message == NULL!\n");
+	  g_error_free (error);
+	  error = NULL;
+      }
+      if (success && prefs_get_int("write_extended_info"))
+      {   /* write extended information */
+	  success = write_extended_info (itdb);
+      }
+  }
+
+
+  if (success && (itdb->usertype & GP_ITDB_TYPE_LOCAL))
+  {   /* write to cfgdir */
+      GError *error = NULL;
+      if (!itdb_write_file (itdb, NULL, &error))
+      {   /* an error occurred */
+	  success = FALSE;
+	  if (error && error->message)
+	      gtkpod_warning ("%s\n\n", error->message);
+	  else
+	      g_warning ("error->message == NULL!\n");
+	  g_error_free (error);
+	  error = NULL;
+      }
+      if (success)
+      {   /* write extended information */
+	  success = write_extended_info (itdb);
+      }
+  }
+  
+  /* If the ipod supports photos and the photo_data_changed
+   * flag has been set to true then wrtie the photo database
+   */
+  if (success &&  
+		  (itdb->usertype & GP_ITDB_TYPE_IPOD) &&
+		  gphoto_ipod_supports_photos (itdb) &&
+		  eitdb->photodb != NULL &&
+		  eitdb->photo_data_changed == TRUE)
+  {
+	  GError *error = NULL;
+	  if (!itdb_photodb_write (eitdb->photodb, &error))
+	  {
+		  success = FALSE;
+		  if (error && error->message)
+			  gtkpod_warning ("%s\n\n", error->message);
+		  else
+			  g_warning ("error->message == NULL!\n");
+	  
+		  g_error_free (error);
+		  error = NULL;
+	  }
+  }
+
+  /* indicate that files and/or database is saved */
+  if (success)
+  {
+      data_unchanged (itdb);
+      if (itdb->usertype & GP_ITDB_TYPE_IPOD)
+      {
+	  gtkpod_statusbar_message(_("%s: Database saved"), mpl->name);
+      }
+      else
+      {
+	  gtkpod_statusbar_message(_("%s: Changes saved"), mpl->name);
+      }
+  }
+
+  g_free (cfgdir);
+
+  gtk_widget_destroy (dialog);
+  transfer_data_free (transferdata);
+
+  release_widgets ();
+
+  return success;
+}
+
+
+
+/* used to handle export of database */
+/* ATTENTION: directly used as callback in gtkpod.glade -- if you
+   change the arguments of this function make sure you define a
+   separate callback for gtkpod.glade */
+void handle_export (void)
+{
+    GList *gl;
+    gboolean success = TRUE;
+    struct itdbs_head *itdbs_head;
+
+    g_return_if_fail (gtkpod_window);
+
+    itdbs_head = g_object_get_data (G_OBJECT (gtkpod_window),
+				    "itdbs_head");
+    g_return_if_fail (itdbs_head);
+
+    block_widgets (); /* block user input */
+
+    /* read offline playcounts -- in case we added some tracks we can
+       now handle */
+    parse_offline_playcount ();
+
+    for (gl=itdbs_head->itdbs; gl; gl=gl->next)
+    {
+	ExtraiTunesDBData *eitdb;
+	iTunesDB *itdb = gl->data;
+	g_return_if_fail (itdb);
+	eitdb = itdb->userdata;
+	g_return_if_fail (eitdb);
+
+	if (eitdb->data_changed)
+	{
+	    success &= gp_save_itdb (itdb);
+	}
+    }
+
+    release_widgets ();
+}
+
+
+
+
+/* indicate that data was changed and update the free space indicator,
+ * as well as the changed indicator in the playlist view */
+void data_changed (iTunesDB *itdb)
+{
+    ExtraiTunesDBData *eitdb;
+    g_return_if_fail (itdb);
+    eitdb = itdb->userdata;
+    g_return_if_fail (eitdb);
+
+    eitdb->data_changed = TRUE;
+    pm_itdb_name_changed (itdb);
+    space_data_update ();
+}
+
+
+/* indicate that data was changed and update the free space indicator,
+ * as well as the changed indicator in the playlist view */
+void data_unchanged (iTunesDB *itdb)
+{
+    ExtraiTunesDBData *eitdb;
+    g_return_if_fail (itdb);
+    eitdb = itdb->userdata;
+    g_return_if_fail (eitdb);
+
+    eitdb->data_changed = FALSE;
+    if (eitdb->photo_data_changed == TRUE)
+    	eitdb->photo_data_changed = FALSE;
+    
+    pm_itdb_name_changed (itdb);
+    space_data_update ();
+}
+
+
+/* Check if all files are saved (i.e. none of the itdbs has the
+ * data_changed flag set */
+gboolean files_are_saved (void)
+{
+    struct itdbs_head *itdbs_head;
+    gboolean changed = FALSE;
+    GList *gl;
+
+    g_return_val_if_fail (gtkpod_window, TRUE);
+    itdbs_head = g_object_get_data (G_OBJECT (gtkpod_window),
+				    "itdbs_head");
+    g_return_val_if_fail (itdbs_head, TRUE);
+    for (gl=itdbs_head->itdbs; gl; gl=gl->next)
+    {
+	iTunesDB *itdb = gl->data;
+	ExtraiTunesDBData *eitdb;
+	g_return_val_if_fail (itdb, !changed);
+	eitdb = itdb->userdata;
+	g_return_val_if_fail (eitdb, !changed);
+/* printf ("itdb: %p, changed: %d, imported: %d\n",
+   itdb, eitdb->data_changed, eitdb->itdb_imported);*/
+	changed |= eitdb->data_changed;
+    }
+    return !changed;
+}

Added: trunk/src/fileselection.c
===================================================================
--- trunk/src/fileselection.c	                        (rev 0)
+++ trunk/src/fileselection.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,1162 @@
+/* Time-stamp: <2007-06-25 00:56:37 jcs>
+|
+|  Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users.sourceforge.net>
+|  Part of the gtkpod project.
+|
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: fileselection.c 1588 2007-06-24 16:02:51Z jcsjcs $
+*/
+
+/***********************************************************************
+ * Functions for file chooser dialogs provided by:
+ *
+ *  Fri May 27 22:13:20 2005
+ *  Copyright  2005  James Liggett
+ *  Email jrliggett at cox.net
+ ***********************************************************************/
+ 
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <dirent.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <string.h>
+#include <glib/gi18n-lib.h>
+#include "charset.h"
+#include "display.h"
+#include "file.h"
+#include "prefs.h"
+#include "info.h"
+#include "misc.h"
+#include "misc_track.h"
+#include "fileselection.h"
+#include "display_coverart.h"
+
+/* 
+ * Data global to this module only
+ */
+
+static Playlist *db_active_pl = NULL;    /* playlist for dirbrowser */
+
+static void error_dialog (const gchar *str)
+{
+    GtkWidget *dialog;
+
+    g_return_if_fail (str);
+
+    dialog = gtk_message_dialog_new (GTK_WINDOW (gtkpod_window),
+				     GTK_DIALOG_DESTROY_WITH_PARENT,
+				     GTK_MESSAGE_WARNING,
+				     GTK_BUTTONS_OK,
+				     str);
+    gtk_dialog_run (GTK_DIALOG (dialog));
+    gtk_widget_destroy (dialog);
+}
+
+
+/* OK button */
+static void add_files_ok(GtkFileChooser* filechooser, Playlist *playlist)
+{
+    GSList* names;   /* List of selected names */
+    GSList* gsl;     /* Current node in list */
+    gboolean result = TRUE;  /* Result of file adding */
+	
+    /* If we don't have a playlist to add to, don't add anything */
+    g_return_if_fail (playlist);
+	
+    block_widgets ();
+
+    names = gtk_file_chooser_get_filenames (filechooser);
+
+    if (names)
+    {
+	gchar *dirname = gtk_file_chooser_get_current_folder (filechooser);
+	prefs_set_string ("last_dir_browsed", dirname);
+	g_free (dirname);
+    }
+
+    block_widgets ();
+
+    /* Get the filenames and add them */
+    for (gsl=names; gsl; gsl=gsl->next)
+    {
+	result &= add_track_by_filename(playlist->itdb,
+					gsl->data,
+					playlist,
+					prefs_get_int ("add_recursively"),
+					NULL, NULL);
+	g_free (gsl->data);
+    }
+    g_slist_free (names);
+    names = NULL;
+
+    release_widgets ();
+
+    /* clear log of non-updated tracks */
+    display_non_updated ((void *)-1, NULL);
+  
+    /* display log of updated tracks */
+    display_updated (NULL, NULL);
+  
+    /* display log of detected duplicates */
+    gp_duplicate_remove (NULL, NULL);
+	
+    /* Were all files successfully added? */
+    if (result == TRUE)
+	gtkpod_statusbar_message (_("Successfully added files"));
+    else
+	gtkpod_statusbar_message (_("Some files were not added successfully"));
+	    
+    release_widgets ();
+}
+
+/* 
+ * Add Files Dialog
+ */
+/* ATTENTION: directly used as callback in gtkpod.glade -- if you
+   change the arguments of this function make sure you define a
+   separate callback for gtkpod.glade */
+void create_add_files_callback (void)
+{
+    Playlist *pl;
+
+    pl = pm_get_selected_playlist ();
+
+    create_add_files_dialog (pl);
+}
+
+
+/* Open a modal file selection dialog for adding individual files */
+void create_add_files_dialog (Playlist *pl)
+{
+    GtkWidget* fc;  /* The file chooser dialog */
+    gint response;  /* The response of the filechooser */
+    gchar *last_dir, *str;
+    iTunesDB *itdb;
+    ExtraiTunesDBData *eitdb;
+    Playlist *mpl;
+
+    if (!pl)
+    {
+	error_dialog (_("Please select a playlist or repository before adding tracks."));
+	return;
+    }
+
+    itdb = pl->itdb;
+    g_return_if_fail (itdb);
+    eitdb = itdb->userdata;
+    g_return_if_fail (eitdb);
+
+    if (!eitdb->itdb_imported)
+    {
+	error_dialog (_("Please load the iPod before adding tracks."));
+	return;
+    }
+
+    mpl = itdb_playlist_mpl (itdb);
+    g_return_if_fail (mpl);
+
+    /* Create window title */
+    if (mpl == pl)
+    {
+	str = g_strdup_printf (_("Add files to '%s'"), mpl->name);
+    }
+    else
+    {
+	str = g_strdup_printf (_("Add files to '%s/%s'"), mpl->name, pl->name);
+    }
+    /* Create the file chooser */
+    fc = gtk_file_chooser_dialog_new (str,
+				      NULL,
+				      GTK_FILE_CHOOSER_ACTION_OPEN,
+				      GTK_STOCK_CANCEL,
+				      GTK_RESPONSE_CANCEL,
+				      GTK_STOCK_OPEN,
+				      GTK_RESPONSE_ACCEPT,
+				      NULL);
+    g_free (str);
+
+    /* allow multiple selection of files */
+    gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (fc), TRUE);
+
+    /* set same directory as last time */
+    last_dir = prefs_get_string ("last_dir_browsed");
+    if (last_dir)
+    {
+	gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (fc),
+					     last_dir);
+	g_free (last_dir);
+    }
+
+    /* Run the dialog */
+    response = gtk_dialog_run (GTK_DIALOG(fc));
+
+    /* Handle the response */
+    switch (response)
+    {
+    case GTK_RESPONSE_ACCEPT:
+	add_files_ok (GTK_FILE_CHOOSER (fc), pl);
+	break;
+    case GTK_RESPONSE_CANCEL:
+	break;
+    default:	/* Fall through */
+	break;
+    }
+    gtk_widget_destroy (fc);
+}
+
+
+/* OK Button */
+static void add_playlists_ok (GtkFileChooser* filechooser, iTunesDB *itdb)
+{
+    GSList* names;  /* List of selected names */
+    GSList* gsl;
+	
+    /* Get the names of the playlist(s) and add them */
+	
+    g_return_if_fail (itdb);
+	
+    names = gtk_file_chooser_get_filenames(filechooser);
+
+    if (names)
+    {
+	gchar *dirname = gtk_file_chooser_get_current_folder (filechooser);
+	prefs_set_string ("last_dir_browsed", dirname);
+	g_free (dirname);
+    }
+
+    block_widgets ();
+
+    for (gsl=names; gsl; gsl=gsl->next)
+    {
+	add_playlist_by_filename (itdb,
+				  gsl->data, NULL, 
+				  -1, NULL, NULL);
+	g_free (gsl->data);
+    }
+    g_slist_free (names);
+    names = NULL;
+
+    release_widgets ();
+
+    /* clear log of non-updated tracks */
+    display_non_updated ((void *)-1, NULL);
+  
+    /* display log of updated tracks */
+    display_updated (NULL, NULL);
+  
+    /* display log of detected duplicates */
+    gp_duplicate_remove (NULL, NULL);
+	
+    gtkpod_tracks_statusbar_update();
+}
+
+
+/*
+ * Add Playlist Dialog
+ */
+/* ATTENTION: directly used as callback in gtkpod.glade -- if you
+   change the arguments of this function make sure you define a
+   separate callback for gtkpod.glade */
+void create_add_playlists_callback (void)
+{
+    iTunesDB *itdb;
+
+    itdb = gp_get_selected_itdb ();
+
+    create_add_playlists_dialog (itdb);
+}
+
+
+/* Open a modal file selection dialog for adding playlist files */
+void create_add_playlists_dialog (iTunesDB *itdb)
+{
+    GtkWidget* fc ; /* The file chooser dialog */
+    gint response;  /* The response of the filechooser */
+    gchar *last_dir, *str;
+    ExtraiTunesDBData *eitdb;
+    Playlist *mpl;
+
+    if (!itdb)
+    {
+	error_dialog (_("Please select a playlist or repository before adding tracks."));
+	return;
+    }
+
+    eitdb = itdb->userdata;
+    g_return_if_fail (eitdb);
+
+    if (!eitdb->itdb_imported)
+    {
+	error_dialog (_("Please load the iPod before adding tracks."));
+	return;
+    }
+
+    mpl = itdb_playlist_mpl (itdb);
+    g_return_if_fail (mpl);
+
+    /* Create window title */
+    str = g_strdup_printf (_("Add playlist files to '%s'"), mpl->name);
+
+    /* Create the file chooser */
+    fc = gtk_file_chooser_dialog_new (str,
+				      NULL, 
+				      GTK_FILE_CHOOSER_ACTION_OPEN,
+				      GTK_STOCK_CANCEL,
+				      GTK_RESPONSE_CANCEL,
+				      GTK_STOCK_OPEN,
+				      GTK_RESPONSE_ACCEPT,
+				      NULL);
+    g_free (str);
+	
+    /* allow multiple selection of files */
+    gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (fc), TRUE);
+
+    /* set same directory as last time */
+    last_dir = prefs_get_string ("last_dir_browsed");
+    if (last_dir)
+    {
+	gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (fc),
+					     last_dir);
+	g_free (last_dir);
+    }
+
+    /* Run the dialog */
+    response = gtk_dialog_run (GTK_DIALOG(fc));
+	
+    /* Handle the response */
+    switch (response)
+    {
+    case GTK_RESPONSE_ACCEPT:
+	add_playlists_ok(GTK_FILE_CHOOSER (fc), itdb);
+	break;
+    case GTK_RESPONSE_CANCEL:
+	break;
+    default:	/* Fall through */
+	break;
+    }	
+    gtk_widget_destroy(fc);
+}
+
+
+
+
+/* 
+ * Add Cover Art
+ */
+gchar *fileselection_get_cover_filename (void)
+{
+    GtkWidget* fc;  /* The file chooser dialog */
+    gint response;  /* The response of the filechooser */
+    gchar *filename = NULL; /* The chosen file */
+    gchar *last_dir, *new_dir;
+
+    /* Create the file chooser, and handle the response */
+    fc = gtk_file_chooser_dialog_new (_("Set Cover"),
+				      NULL,
+				      GTK_FILE_CHOOSER_ACTION_OPEN,
+				      GTK_STOCK_CANCEL,
+				      GTK_RESPONSE_CANCEL,
+				      GTK_STOCK_OPEN,
+				      GTK_RESPONSE_ACCEPT,
+				      NULL);
+
+    gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (fc), FALSE);
+
+    last_dir = prefs_get_string ("last_dir_browsed");
+    if (last_dir)
+    {
+	gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (fc),
+					     last_dir);
+	g_free (last_dir);
+    }
+
+    response = gtk_dialog_run(GTK_DIALOG(fc));
+
+    switch (response)
+    {
+    case GTK_RESPONSE_ACCEPT:
+	new_dir = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (fc));
+	prefs_set_string ("last_dir_browsed", new_dir);
+	g_free (new_dir);
+	filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (fc));
+	break;
+    case GTK_RESPONSE_CANCEL:
+	break;
+    default:	/* Fall through */
+	break;
+    }		
+    gtk_widget_destroy(fc);
+    return filename;
+}
+
+
+/* BY JCS */
+
+/* Get a file or directory
+ *
+ * @title:    title for the file selection dialog
+ * @cur_file: initial file to be selected. If NULL, then use
+ *            last_dir_browse.
+ * @action:
+ *   GTK_FILE_CHOOSER_ACTION_OPEN   Indicates open mode. The file chooser
+ *                                  will only let the user pick an
+ *                                  existing file.
+ *   GTK_FILE_CHOOSER_ACTION_SAVE   Indicates save mode. The file
+ *                                  chooser will let the user pick an
+ *                                  existing file, or type in a new
+ *                                  filename.
+ *   GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER
+ *                                  Indicates an Open mode for
+ *                                  selecting folders. The file
+ *                                  chooser will let the user pick an
+ *                                  existing folder.
+ *   GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER
+ *                                  Indicates a mode for creating a
+ *                                  new folder. The file chooser will
+ *                                  let the user name an existing or
+ *                                  new folder.
+ */
+gchar *fileselection_get_file_or_dir (const gchar *title,
+				      const gchar *cur_file,
+				      GtkFileChooserAction action)
+{
+    GtkWidget* fc;  /* The file chooser dialog */
+    gint response;  /* The response of the filechooser */
+    gchar *new_file = NULL; /* The chosen file */
+
+    g_return_val_if_fail (title, NULL);
+
+    /* Create the file chooser, and handle the response */
+    fc = gtk_file_chooser_dialog_new (
+	title,
+	NULL,
+	action,
+	GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+	GTK_STOCK_OK,GTK_RESPONSE_ACCEPT,
+	NULL);
+
+    gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (fc), FALSE);
+
+    if (cur_file)
+    {
+	/* Sanity checks: must exist and be absolute */
+	if (g_path_is_absolute (cur_file))
+	    gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (fc),
+					   cur_file);
+	else
+	    cur_file = NULL;
+    }
+    if (cur_file == NULL)
+    {
+	gchar *filename = prefs_get_string ("last_dir_browsed");
+	if (filename)
+	{
+	    gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (fc),
+						 filename);
+	    g_free (filename);
+	}
+    }
+
+    response = gtk_dialog_run(GTK_DIALOG(fc));
+
+    switch (response)
+    {
+    case GTK_RESPONSE_ACCEPT:
+	new_file = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (fc));
+	break;
+    case GTK_RESPONSE_CANCEL:
+	break;
+    default:	/* Fall through */
+	break;
+    }		
+    gtk_widget_destroy(fc);
+    return new_file;
+}
+
+
+
+/* BY JCS */
+
+/* Used by the prefs system (prefs_windows.c, repository.c) when a
+ * script should be selected. Takes into account that command line
+ * arguments can be present
+ *
+ * @opath: the current path to the script including command line
+ *         arguments. May be NULL.
+ * @fallback: default dir in case @opath is not set.
+ * @title: title of the file selection window.
+ * @additional_text: additional explanotary text to be displayed
+ *
+ * Return value: The new script including command line arguments. NULL
+ * if the selection was aborted.
+ */
+gchar *fileselection_select_script (const gchar *opath,
+				    const gchar *fallback,
+				    const gchar *title,
+				    const gchar *additional_text)
+{
+    gchar *npath=NULL;
+    gchar *buf, *fbuf;
+    const gchar *opathp;
+    GtkFileChooser *fc;
+    gint response;  /* The response of the filechooser */
+
+    fc = GTK_FILE_CHOOSER (gtk_file_chooser_dialog_new (
+			       title,
+			       NULL,
+			       GTK_FILE_CHOOSER_ACTION_OPEN,
+			       GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+			       GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
+			       NULL));
+
+    /* find first whitespace separating path from command line
+     * arguments */
+
+    if (opath)
+	opathp = strchr (opath, ' ');
+    else
+	opathp = NULL;
+
+    if (opathp)
+	buf = g_strndup (opath, opathp-opath);
+    else
+	buf = g_strdup (opath);
+
+    /* get full path -- if the file cannot be found it can't be
+     * selected in the filechooser */
+    if (buf)
+    {
+	fbuf = g_find_program_in_path (buf);
+	g_free (buf);
+    }
+    else
+    {
+	fbuf = NULL;
+    }
+
+    if (!fbuf)
+    {   /* set default */
+	fbuf = g_strdup (fallback);
+    }
+
+    if (fbuf && *fbuf)
+    {
+	gchar *fbuf_utf8 = g_filename_from_utf8 (fbuf, -1, NULL, NULL, NULL);
+	if (g_file_test (fbuf, G_FILE_TEST_IS_DIR))
+	{
+	    gtk_file_chooser_set_current_folder (fc, fbuf_utf8);
+	}
+	else
+	{
+	    gtk_file_chooser_set_filename (fc, fbuf_utf8);
+	}
+	g_free (fbuf_utf8);
+    }
+    g_free (fbuf);
+
+    response = gtk_dialog_run(GTK_DIALOG(fc));
+
+    switch (response)
+    {
+    case GTK_RESPONSE_ACCEPT:
+	buf = gtk_file_chooser_get_filename (fc);
+	/* attach command line arguments if present */
+	if (opathp)
+	    npath = g_strdup_printf ("%s%s", buf, opathp);
+	else
+	    npath = g_strdup (buf);
+	g_free (buf);
+	break;
+    case GTK_RESPONSE_CANCEL:
+	break;
+    default:	/* Fall through */
+	break;
+    }
+    gtk_widget_destroy(GTK_WIDGET (fc));
+
+    return npath;
+}
+
+
+
+
+
+/*
+|  Changed by Jorg Schuler <jcsjcs at users.sourceforge.net> to compile
+|  "standalone" with the gtkpod project 2002/11/24
+|  (http://gtkpod.sourceforge.net)
+|  Modified for UTF8 string handling under GKT2 (Jan 2003).
+|
+|  last version before moving over to fileselection.c:
+|  dirbrowser.c,v 1.30 2005/04/29 04:01:17 jcsjcs Exp
+*/
+
+/*  XMMS - Cross-platform multimedia player
+ *  Copyright (C) 1998-2002  Peter Alm, Mikael Alm, Olle Hallnas,
+ *                           Thomas Nilsson and 4Front Technologies
+ *  Copyright (C) 1999-2002  Haavard Kvaalen
+ *
+ *  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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+
+/* XPM */
+static char *db_folder[] =
+{
+	"16 16 16 1",
+	" 	c None",
+	".	c #f4f7e4",
+	"X	c #dee4b5",
+	"o	c #e1e7b9",
+	"O	c #c6cba4",
+	"+	c #dce2b8",
+	"@	c #e9e9ec",
+	"#	c #d3d8ae",
+	"$	c #d8daca",
+	"%	c #b2b2b5",
+	"&	c #767862",
+	"*	c #e3e6c3",
+	"=	c #1b1b1a",
+	"-	c #939684",
+	";	c #555555",
+	":	c #000000",
+	"                ",
+	"                ",
+	"  ::::          ",
+	" :.@@O:         ",
+	":-&&&&&:::::    ",
+	":.@@@@@*$O#O=   ",
+	":@*+XXXX+##O:   ",
+	":.*#oooXXXXX:   ",
+	":@+XoXXXXXX#:   ",
+	":@*ooXXXXXX#:   ",
+	":@**XXXXXXX#:   ",
+	":@*XXXXXXXX%:   ",
+	":$.*OOOOOO%-:   ",
+	" ;:::::::::::   ",
+	"                ",
+	"                "};
+
+/* Icon by Jakub Steiner <jimmac at ximian.com> */
+
+/* XPM */
+static char *db_ofolder[] =
+{
+	"16 16 16 1",
+	" 	c None",
+	".	c #a9ad93",
+	"X	c #60634d",
+	"o	c #dee4b5",
+	"O	c #9ca085",
+	"+	c #0c0d04",
+	"@	c #2f2f31",
+	"#	c #3b3d2c",
+	"$	c #c8cda2",
+	"%	c #e6e6e9",
+	"&	c #b3b5a5",
+	"*	c #80826d",
+	"=	c #292a1c",
+	"-	c #fefef6",
+	";	c #8f937b",
+	":	c #000000",
+	"                ",
+	"                ",
+	"  ::::          ",
+	" :-%%&:         ",
+	":-;;;OX:::::    ",
+	":-;;;;O;O;&.:   ",
+	":-*X##@@@@@=#:  ",
+	":%*+-%%ooooooO: ",
+	":%X;%ooooooo.*: ",
+	":.+-%oooooooO:  ",
+	":*O-oooooooo*:  ",
+	":O-oooooooo.:   ",
+	":*-%$$$$$$OX:   ",
+	" :::::::::::    ",
+	"                ",
+	"                "};
+
+#define NODE_SPACING 4
+
+static GdkPixmap *db_folder_pixmap = NULL, *db_ofolder_pixmap;
+static GdkBitmap *db_folder_mask, *db_ofolder_mask;
+static GtkWidget *dirbrowser = NULL;
+
+static GtkWidget *xmms_create_dir_browser(const gchar *title,
+					  const gchar *current_path,
+					  GtkSelectionMode mode,
+					  void (*handler) (gchar *));
+
+struct dirnode
+{
+    unsigned int scanned : 1;
+    char *path;
+    char *dir;
+};
+
+
+/* ------------------------------------------------------------ *
+ * functions added for gtkpod                                   *
+ * ------------------------------------------------------------ */
+
+/* Callback after one directory has been added */
+static void add_dir_selected (gchar *dir)
+{
+    g_return_if_fail (db_active_pl);
+
+    if (dir)
+    {
+	add_directory_by_name (db_active_pl->itdb, dir, db_active_pl,
+			       prefs_get_int ("add_recursively"),
+			       NULL, NULL);
+	prefs_set_string ("last_dir_browsed", dir);
+	gtkpod_tracks_statusbar_update ();
+    }
+    else
+    {
+	/* clear log of non-updated tracks */
+	display_non_updated ((void *)-1, NULL);
+	/* display log of updated tracks */
+	display_updated (NULL, NULL);
+	/* display log of detected duplicates */
+	gp_duplicate_remove (NULL, NULL);
+    }
+}
+
+
+/* ATTENTION: directly used as callback in gtkpod.glade -- if you
+   change the arguments of this function make sure you define a
+   separate callback for gtkpod.glade */
+void dirbrowser_create_callback (void)
+{
+    Playlist *pl;
+
+    pl = pm_get_selected_playlist ();
+
+    dirbrowser_create (pl);
+}
+
+
+
+
+
+void dirbrowser_create (Playlist *pl)
+{
+    gchar *cur_dir, *str;
+    iTunesDB *itdb;
+    ExtraiTunesDBData *eitdb;
+    Playlist *mpl;
+
+    /* we only allow one modal dirbrowser */
+    g_return_if_fail (dirbrowser==NULL);
+
+
+    if (!pl)
+    {
+	error_dialog (_("Please select a playlist or repository before adding tracks."));
+	return;
+    }
+
+    itdb = pl->itdb;
+    g_return_if_fail (itdb);
+    eitdb = itdb->userdata;
+    g_return_if_fail (eitdb);
+
+    if (!eitdb->itdb_imported)
+    {
+	error_dialog (_("Please load the iPod before adding tracks."));
+	return;
+    }
+
+    /* FIXME: I don't like global variables */
+    db_active_pl = pl;
+
+    mpl = itdb_playlist_mpl (itdb);
+    g_return_if_fail (mpl);
+
+    /* Create window title */
+    if (mpl == pl)
+    {
+	str = g_strdup_printf (_("Add directories to '%s'"), mpl->name);
+    }
+    else
+    {
+	str = g_strdup_printf (_("Add directories to '%s/%s'"), mpl->name, pl->name);
+    }
+
+    cur_dir = prefs_get_string ("last_dir_browsed");
+    dirbrowser = xmms_create_dir_browser (str,
+					  cur_dir,
+					  GTK_SELECTION_MULTIPLE,
+					  add_dir_selected);
+    g_free (cur_dir);
+    g_free (str);
+    gtk_window_set_modal (GTK_WINDOW (dirbrowser), TRUE);
+    gtk_widget_show (dirbrowser);
+}
+
+/* called when dirbrowser gets destroyed with the window-close button */
+static void dirbrowser_destroyed (GtkWidget *w, gpointer userdata)
+{
+    g_return_if_fail (dirbrowser);
+
+    dirbrowser = NULL;
+}
+
+
+/* called when the file selector is closed */
+static void add_dir_close (GtkWidget *w1, GtkWidget *w2)
+{
+    gint x,y;
+
+    g_return_if_fail (dirbrowser);
+
+    gtk_window_get_size (GTK_WINDOW (dirbrowser), &x, &y);
+    /* store size for next time */
+    prefs_set_int("size_dirbr.x", x);
+    prefs_set_int("size_dirbr.y", y);
+    gtk_widget_destroy(dirbrowser);
+    /* dirbrowser = NULL; -- will be done by the dirbrowser_destroy()
+       as part of the callback */
+}
+
+
+/* ------------------------------------------------------------ *
+ * end of added functions                                       *
+ * ------------------------------------------------------------ */
+
+static gboolean check_for_subdir(char *path)
+{
+	DIR *dir;
+	struct dirent *dirent;
+	struct stat statbuf;
+	char *npath;
+
+	if ((dir = opendir(path)) != NULL)
+	{
+		while ((dirent = readdir(dir)) != NULL)
+		{
+			if (dirent->d_name[0] == '.')
+				continue;
+
+			npath = g_strconcat(path, dirent->d_name, NULL);
+			if (stat(npath, &statbuf) != -1 &&
+			    S_ISDIR(statbuf.st_mode))
+			{
+				g_free(npath);
+				closedir(dir);
+				return TRUE;
+			}
+			g_free(npath);
+		}
+		closedir(dir);
+	}
+	return FALSE;
+}
+
+static void destroy_cb(gpointer data)
+{
+	struct dirnode *node = data;
+
+	g_free(node->path);
+	g_free(node->dir);
+	g_free(node);
+}
+
+static void add_dir(GtkCTree *tree, GtkCTreeNode *pnode, char* parent, char *dir)
+{
+	struct stat statbuf;
+	char *path;
+	gchar *dir_utf8;
+
+	/* Don't show hidden dirs, nor . and .. */
+	if (dir[0] == '.')
+		return;
+
+	path = g_strconcat(parent, dir, NULL);
+	if (stat(path, &statbuf) != -1 && S_ISDIR(statbuf.st_mode))
+	{
+		gboolean has_subdir;
+		char *text = "";
+		GtkCTreeNode *node;
+		struct dirnode *dirnode = g_malloc0(sizeof (struct dirnode));
+		dirnode->path = g_strconcat(path, "/", NULL);
+		dirnode->dir = g_strdup (dir);
+ 		has_subdir = check_for_subdir(dirnode->path);
+		dir_utf8 = charset_to_utf8 (dir);
+		node = gtk_ctree_insert_node(tree, pnode, NULL, &dir_utf8,
+					     NODE_SPACING, db_folder_pixmap,
+					     db_folder_mask, db_ofolder_pixmap,
+					     db_ofolder_mask, !has_subdir, FALSE);
+		g_free (dir_utf8);
+		gtk_ctree_node_set_row_data_full(tree, node, dirnode,
+						 destroy_cb);
+		if (has_subdir)
+			gtk_ctree_insert_node(tree, node, NULL, &text,
+					      NODE_SPACING, NULL, NULL,
+					      NULL, NULL, FALSE, FALSE);
+	}
+	g_free(path);
+}
+
+static void expand_cb(GtkWidget *widget, GtkCTreeNode *parent_node)
+{
+	struct dirent *dirent;
+	GtkCTree *tree = GTK_CTREE(widget);
+	struct dirnode *parent_dirnode;
+
+	parent_dirnode = gtk_ctree_node_get_row_data(tree, parent_node);
+	if (!parent_dirnode->scanned)
+	{
+		DIR *dir;
+
+		gtk_clist_freeze(GTK_CLIST(widget));
+		gtk_ctree_remove_node(tree,
+				      GTK_CTREE_ROW(parent_node)->children);
+		if ((dir = opendir(parent_dirnode->path)) != NULL)
+		{
+			while ((dirent = readdir(dir)) != NULL)
+			{
+				add_dir(tree, parent_node,
+					parent_dirnode->path, dirent->d_name);
+			}
+			closedir(dir);
+			gtk_ctree_sort_node(tree, parent_node);
+		}
+		gtk_clist_thaw(GTK_CLIST(widget));
+		parent_dirnode->scanned = TRUE;
+	}
+}
+
+static void select_row_cb(GtkWidget *widget, int row, int column, GdkEventButton *bevent, gpointer data)
+{
+	struct dirnode *dirnode;
+	GtkCTreeNode *node;
+	void (*handler) (char *);
+
+	if (bevent && (bevent->type == GDK_2BUTTON_PRESS))
+	{
+		node = gtk_ctree_node_nth(GTK_CTREE(widget), row);
+		dirnode = gtk_ctree_node_get_row_data(GTK_CTREE(widget), node);
+		handler = gtk_object_get_user_data(GTK_OBJECT(widget));
+		if (handler)
+			handler(dirnode->path);
+		if (handler) handler(NULL); /* call once with "NULL" to
+					       indicate "end" */
+	}
+}
+
+static void show_cb(GtkWidget *widget, gpointer data)
+{
+	GtkCTree *tree = GTK_CTREE(data);
+	GtkCTreeNode *node = gtk_object_get_data(GTK_OBJECT(tree),
+						 "selected_node");
+
+	if (node)
+		gtk_ctree_node_moveto(tree, node, -1, 0.6, 0);
+}
+
+static void ok_clicked(GtkWidget *widget, GtkWidget *tree)
+{
+	GtkCTreeNode *node;
+	struct dirnode *dirnode;
+	GList *list_node;
+	GtkWidget *window;
+	void (*handler) (char *) = NULL;
+
+	window = gtk_object_get_user_data(GTK_OBJECT(widget));
+	list_node = GTK_CLIST(tree)->selection;
+	while (list_node)
+	{
+		node = list_node->data;
+		dirnode = gtk_ctree_node_get_row_data(GTK_CTREE(tree), node);
+		handler = gtk_object_get_user_data(GTK_OBJECT(tree));
+		if (handler)
+			handler(dirnode->path);
+		list_node = g_list_next(list_node);
+	}
+	if (handler) handler(NULL); /* call once with "NULL" to
+				       indicate "end" */
+	gtk_widget_hide(window);
+	add_dir_close (widget, tree);
+}
+
+static GtkWidget *xmms_create_dir_browser (const char *title,
+					   const char *current_path,
+					   GtkSelectionMode mode,
+					   void (*handler) (char *))
+{
+    GtkWidget *window, *scroll_win, *tree, *vbox, *bbox, *ok, *cancel, *sep;
+    char *root_text = "/", *text = "";
+    GtkCTreeNode *root_node, *node, *selected_node = NULL;
+    GtkCTree *ctree;
+    struct dirnode *dirnode;
+    gint x,y;
+
+    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+    x = prefs_get_int("size_dirbr.x");
+    y = prefs_get_int("size_dirbr.y");
+    gtk_window_set_default_size(GTK_WINDOW(window), x, y);
+    gtk_window_set_title(GTK_WINDOW(window), title);
+    gtk_container_border_width(GTK_CONTAINER(window), 10);
+
+    vbox = gtk_vbox_new(FALSE, 10);
+    gtk_container_add(GTK_CONTAINER(window), vbox);
+
+    scroll_win = gtk_scrolled_window_new(NULL, NULL);
+    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_win),
+				   GTK_POLICY_AUTOMATIC,
+				   GTK_POLICY_AUTOMATIC);
+    gtk_box_pack_start(GTK_BOX(vbox), scroll_win, TRUE, TRUE, 0);
+    gtk_widget_show(scroll_win);
+
+    gtk_widget_realize(window);
+    if (!db_folder_pixmap)
+    {
+	db_folder_pixmap = gdk_pixmap_create_from_xpm_d(window->window,
+							&db_folder_mask,
+							NULL, db_folder);
+	db_ofolder_pixmap = gdk_pixmap_create_from_xpm_d(window->window,
+							 &db_ofolder_mask,
+							 NULL, db_ofolder);
+    }
+
+    tree = gtk_ctree_new(1, 0);
+    ctree = GTK_CTREE(tree);
+    gtk_clist_set_column_auto_resize(GTK_CLIST(tree), 0, TRUE);
+    gtk_clist_set_selection_mode(GTK_CLIST(tree), mode);
+    gtk_ctree_set_line_style(ctree, GTK_CTREE_LINES_DOTTED);
+    gtk_signal_connect(GTK_OBJECT(tree), "tree_expand",
+		       GTK_SIGNAL_FUNC(expand_cb), NULL);
+    gtk_signal_connect(GTK_OBJECT(tree), "select_row",
+		       GTK_SIGNAL_FUNC(select_row_cb), NULL);
+    gtk_signal_connect(GTK_OBJECT(window), "show",
+		       GTK_SIGNAL_FUNC(show_cb), tree);
+    gtk_container_add(GTK_CONTAINER(scroll_win), tree);
+    gtk_object_set_user_data(GTK_OBJECT(tree), handler);
+
+    root_node = gtk_ctree_insert_node(ctree, NULL, NULL,
+				      &root_text, NODE_SPACING,
+				      db_folder_pixmap, db_folder_mask,
+				      db_ofolder_pixmap, db_ofolder_mask,
+				      FALSE, FALSE);
+    dirnode = g_malloc0(sizeof (struct dirnode));
+    dirnode->path = g_strdup("/");
+    gtk_ctree_node_set_row_data_full(ctree, root_node,
+				     dirnode, destroy_cb);
+    node = gtk_ctree_insert_node(ctree, root_node, NULL,
+				 &text, 4, NULL, NULL, NULL,
+				 NULL, TRUE, TRUE);
+    gtk_ctree_expand(ctree, root_node);
+    gtk_widget_show(tree);
+
+    sep = gtk_hseparator_new();
+    gtk_box_pack_start(GTK_BOX(vbox), sep, FALSE, FALSE, 0);
+    gtk_widget_show(sep);
+
+    bbox = gtk_hbutton_box_new();
+    gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END);
+    gtk_button_box_set_spacing(GTK_BUTTON_BOX(bbox), 5);
+
+    ok = gtk_button_new_with_label(_("Ok"));
+    gtk_object_set_user_data(GTK_OBJECT(ok), window);
+    GTK_WIDGET_SET_FLAGS(ok, GTK_CAN_DEFAULT);
+    gtk_window_set_default(GTK_WINDOW(window), ok);
+    gtk_box_pack_start(GTK_BOX(bbox), ok, TRUE, TRUE, 0);
+    gtk_signal_connect(GTK_OBJECT(ok), "clicked",
+		       GTK_SIGNAL_FUNC(ok_clicked), tree);
+    gtk_widget_show(ok);
+
+    cancel = gtk_button_new_with_label(_("Cancel"));
+    GTK_WIDGET_SET_FLAGS(cancel, GTK_CAN_DEFAULT);
+    gtk_box_pack_start(GTK_BOX(bbox), cancel, TRUE, TRUE, 0);
+    gtk_signal_connect_object(GTK_OBJECT(cancel), "clicked",
+			      GTK_SIGNAL_FUNC(add_dir_close),
+			      GTK_OBJECT(window));
+    gtk_widget_show(cancel);
+
+    gtk_signal_connect(GTK_OBJECT(window), "destroy",
+		       GTK_SIGNAL_FUNC(dirbrowser_destroyed),
+		       NULL);
+
+    gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
+    gtk_widget_show(bbox);
+    gtk_widget_show(vbox);
+
+    if (current_path && *current_path)
+    {
+	char **dir;
+	int i;
+
+	dir = g_strsplit(current_path, "/", 0);
+	node = root_node;
+	for (i = 0; dir[i] != NULL; i++)
+	{
+	    if (dir[i][0] == '\0')
+		continue;
+
+	    for (node = GTK_CTREE_ROW(node)->children; node != NULL;
+		 node = GTK_CTREE_ROW(node)->sibling)
+	    {
+		struct dirnode *dn;
+		dn = gtk_ctree_node_get_row_data(GTK_CTREE(tree), node);
+		if (!strcmp(dir[i], dn->dir))
+		    break;
+	    }
+	    if (!node)
+		break;
+	    if (!GTK_CTREE_ROW(node)->is_leaf && dir[i+1] && *dir[i+1])
+		gtk_ctree_expand(ctree, node);
+	    else
+	    {
+		selected_node = node;
+		break;
+	    }
+	}
+	g_strfreev(dir);
+    }
+
+    if (!selected_node)
+	selected_node = root_node;
+
+    gtk_ctree_select(ctree, selected_node);
+    gtk_object_set_data(GTK_OBJECT(tree), "selected_node", selected_node);
+
+    return window;
+}

Added: trunk/src/fileselection.h
===================================================================
--- trunk/src/fileselection.h	                        (rev 0)
+++ trunk/src/fileselection.h	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,57 @@
+/* Time-stamp: <2007-06-25 00:53:20 jcs>
+|
+|  Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: fileselection.h 1588 2007-06-24 16:02:51Z jcsjcs $
+*/
+
+/***************************************************************************
+ *            fileselection.h
+ *	Contains callback functions for file chooser dialogs
+ *
+ *  Fri May 27 13:36:16 2005
+ *  Copyright  2005  James Liggett
+ *  Email jrliggett at cox.net
+ ****************************************************************************/
+ 
+#ifndef _FILESELECTION_H
+#define _FILESELECTION_H
+
+#include "prefs.h"
+
+void create_add_files_dialog (Playlist *pl);
+void create_add_playlists_dialog (iTunesDB *itdb);
+gchar *fileselection_get_cover_filename(void);
+gchar *fileselection_get_file_or_dir (const gchar *title,
+				      const gchar *cur_file,
+				      GtkFileChooserAction action);
+gchar *fileselection_select_script (const gchar *opath,
+				    const gchar *fallback,
+				    const gchar *title,
+				    const gchar *additional_text);
+
+/* dirbrowser */
+void dirbrowser_create (Playlist *pl);
+#endif

Added: trunk/src/flacfile.c
===================================================================
--- trunk/src/flacfile.c	                        (rev 0)
+++ trunk/src/flacfile.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,174 @@
+/*
+|  Copyright (C) 2007 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+|
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  Gtkpod 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.
+|
+|  Gtkpod 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 gtkpod; if not, write to the Free Software
+|  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: flacfile.c 1671 2007-08-06 14:46:46Z jcsjcs $
+*/
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "charset.h"
+#include "itdb.h"
+#include "misc.h"
+#include "flacfile.h"
+#include "mp3file.h"
+
+/* Info on how to implement new file formats: see mp3file.c for more info */
+
+#ifdef HAVE_FLAC
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <inttypes.h>
+#include <stdlib.h>
+#include <string.h>
+#include <FLAC/metadata.h>
+#include "prefs.h"
+
+Track *flac_get_file_info (gchar *flacFileName)
+{
+    Track *track = NULL;
+    FLAC__StreamMetadata stream_data;
+    FLAC__StreamMetadata *tags;
+
+    if(!FLAC__metadata_get_streaminfo (flacFileName, &stream_data))
+    {
+        gchar *filename = NULL;
+        filename = charset_to_utf8 (flacFileName);
+
+	gtkpod_warning (_("'%s' does not appear to be an FLAC audio file.\n"),
+	                filename);
+        g_free (filename);
+    }
+    else
+    {
+	gboolean flac_metadata_ok = FALSE;
+
+        track = gp_track_new ();
+
+        if (prefs_get_int("readtags")) 
+        {
+            if (!FLAC__metadata_get_tags (flacFileName, &tags)) 
+            {
+                gchar *filename = NULL;
+                filename = charset_to_utf8 (flacFileName);
+                gtkpod_warning (_("Error retrieving tags for '%s'.\n"),
+	                        filename);
+                g_free (filename);
+                /* FIXME: should NULL be returned if no tags? */
+            }
+            else {
+                gint i;
+
+		if (tags->data.vorbis_comment.num_comments > 0)
+		{
+		    flac_metadata_ok = TRUE;
+		}
+
+                for (i = 0 ; i < tags->data.vorbis_comment.num_comments ; i++) 
+                {
+                    gchar *tag = (gchar*)tags->data.vorbis_comment.comments[i].entry;
+
+                    if (g_ascii_strncasecmp("ARTIST=", tag, 7) == 0) {
+                        track->artist = charset_to_utf8 (tag + 7);
+                    }
+                    if (g_ascii_strncasecmp("ALBUM=", tag, 6) == 0) {
+                        track->album = charset_to_utf8 (tag + 6);
+                    }
+                    if (g_ascii_strncasecmp("TITLE=", tag, 6) == 0) {
+                        track->title = charset_to_utf8 (tag + 6);
+                    }
+                    if (g_ascii_strncasecmp("GENRE=", tag, 6) == 0) {
+                        track->genre = charset_to_utf8 (tag + 6);
+                    }
+                    if (g_ascii_strncasecmp("YEAR=", tag, 5) == 0) {
+                        track->year = atoi (tag + 5);
+                    }
+                    if (g_ascii_strncasecmp("TRACKNUMBER=", tag, 12) == 0) {
+                        track->track_nr = atoi (tag + 12);
+                    }
+                    if (g_ascii_strncasecmp("COMPOSER=", tag, 9) == 0) {
+                        track->composer = charset_to_utf8 (tag + 9);
+                    }
+                    if (g_ascii_strncasecmp("COMMENT=", tag, 8) == 0) {
+                        track->comment = charset_to_utf8 (tag + 8);
+                    }
+                    if (g_ascii_strncasecmp("TRACKS=", tag, 7) == 0) {
+                        track->tracks = atoi (tag  + 7);
+                    }
+                    if (g_ascii_strncasecmp("CNDR=", tag, 5) == 0) {
+                        track->cd_nr = atoi (tag + 5);
+                    }
+                    if (g_ascii_strncasecmp("CDS=", tag, 4) == 0) {
+                        track->cds = atoi (tag  + 4);
+		    }
+		    /* I'm not sure if "BPM=" is correct */ 
+                    if (g_ascii_strncasecmp("BPM=", tag, 4) == 0) {
+                        track->BPM = atoi (tag  + 4);
+                    }
+                }
+            }
+
+            FLAC__metadata_object_delete (tags);
+
+	    if (!flac_metadata_ok)
+	    {   /* fall back on ID3 */
+		id3_read_tags (flacFileName, track);
+	    }
+	}
+
+	g_free (track->description);
+	track->description = g_strdup ("FLAC audio file");
+
+        track->bitrate = stream_data.data.stream_info.bits_per_sample/1000;
+        track->samplerate = stream_data.data.stream_info.sample_rate;
+        track->tracklen = stream_data.data.stream_info.total_samples / (stream_data.data.stream_info.sample_rate / 1000);
+    }
+
+    return track;
+}
+
+gboolean flac_write_file_info (gchar *flacFileName, Track *track)
+{
+    gboolean result = FALSE;
+    gtkpod_warning ("Not supported yet\n"); /* FIXME: */
+    return result;
+}
+
+#else
+/* We don't support FLAC without the FLAC library */
+Track *flac_get_file_info (gchar *name)
+{
+    gtkpod_warning (_("Import of '%s' failed: FLAC not supported without the FLAC library. You must compile the gtkpod source together with the FLAC library.\n"), name);
+    return NULL;
+}
+
+gboolean flac_write_file_info (gchar *filename, Track *track)
+{
+    gtkpod_warning (_("FLAC metadata update for '%s' failed: FLAC not supported without the FLAC library. You must compile the gtkpod source together with the FLAC library.\n"), filename);
+    return FALSE;
+}
+#endif

Added: trunk/src/flacfile.h
===================================================================
--- trunk/src/flacfile.h	                        (rev 0)
+++ trunk/src/flacfile.h	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,36 @@
+/* Time-stamp: <2005-01-07 23:51:33 jcs>
+|
+|  Copyright (C) 2002-2003 Jorg Schuler <jcsjcs at users.sourceforge.net>
+|  Part of the gtkpod project.
+|
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: flacfile.h 954 2007-01-16 09:45:00Z jcsjcs $
+*/
+
+#ifndef FLACFILEH_INCLUDED
+#define FLACFILEH_INCLUDED 1
+
+#include "itdb.h"
+
+gboolean flac_write_file_info (gchar *filename, Track *track);
+Track *flac_get_file_info (gchar *flacFileName);
+#endif

Added: trunk/src/getopt.c
===================================================================
--- trunk/src/getopt.c	                        (rev 0)
+++ trunk/src/getopt.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,1055 @@
+/* Getopt for GNU.
+   NOTE: getopt is now part of the C library, so if you don't know what
+   "Keep this file name-space clean" means, talk to drepper at gnu.org
+   before changing it!
+   Copyright (C) 1987,88,89,90,91,92,93,94,95,96,98,99,2000,2001
+   	Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>.
+   Ditto for AIX 3.2 and <stdlib.h>.  */
+#ifndef _NO_PROTO
+# define _NO_PROTO
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if !defined __STDC__ || !__STDC__
+/* This is a separate conditional since some stdc systems
+   reject `defined (const)'.  */
+# ifndef const
+#  define const
+# endif
+#endif
+
+#include <stdio.h>
+
+/* Comment out all this code if we are using the GNU C Library, and are not
+   actually compiling the library itself.  This code is part of the GNU C
+   Library, but also included in many other GNU distributions.  Compiling
+   and linking in this code is a waste when using the GNU C library
+   (especially if it is a shared library).  Rather than having every GNU
+   program understand `configure --with-gnu-libc' and omit the object files,
+   it is simpler to just do this in the source for each such file.  */
+
+#define GETOPT_INTERFACE_VERSION 2
+#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2
+# include <gnu-versions.h>
+# if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION
+#  define ELIDE_CODE
+# endif
+#endif
+
+#ifndef ELIDE_CODE
+
+
+/* This needs to come after some library #include
+   to get __GNU_LIBRARY__ defined.  */
+#ifdef	__GNU_LIBRARY__
+/* Don't include stdlib.h for non-GNU C libraries because some of them
+   contain conflicting prototypes for getopt.  */
+# include <stdlib.h>
+# include <unistd.h>
+#endif	/* GNU C library.  */
+
+#ifdef VMS
+# include <unixlib.h>
+# if HAVE_STRING_H - 0
+#  include <string.h>
+# endif
+#endif
+
+#ifndef _
+/* This is for other GNU distributions with internationalized messages.  */
+# if defined HAVE_LIBINTL_H || defined _LIBC
+#  include <libintl.h>
+#  ifndef _
+#   define _(msgid)	gettext (msgid)
+#  endif
+# else
+#  define _(msgid)	(msgid)
+# endif
+#endif
+
+/* This version of `getopt' appears to the caller like standard Unix `getopt'
+   but it behaves differently for the user, since it allows the user
+   to intersperse the options with the other arguments.
+
+   As `getopt' works, it permutes the elements of ARGV so that,
+   when it is done, all the options precede everything else.  Thus
+   all application programs are extended to handle flexible argument order.
+
+   Setting the environment variable POSIXLY_CORRECT disables permutation.
+   Then the behavior is completely standard.
+
+   GNU application programs can use a third alternative mode in which
+   they can distinguish the relative order of options and other arguments.  */
+
+#include "getopt.h"
+
+/* For communication from `getopt' to the caller.
+   When `getopt' finds an option that takes an argument,
+   the argument value is returned here.
+   Also, when `ordering' is RETURN_IN_ORDER,
+   each non-option ARGV-element is returned here.  */
+
+char *optarg;
+
+/* Index in ARGV of the next element to be scanned.
+   This is used for communication to and from the caller
+   and for communication between successive calls to `getopt'.
+
+   On entry to `getopt', zero means this is the first call; initialize.
+
+   When `getopt' returns -1, this is the index of the first of the
+   non-option elements that the caller should itself scan.
+
+   Otherwise, `optind' communicates from one call to the next
+   how much of ARGV has been scanned so far.  */
+
+/* 1003.2 says this must be 1 before any call.  */
+int optind = 1;
+
+/* Formerly, initialization of getopt depended on optind==0, which
+   causes problems with re-calling getopt as programs generally don't
+   know that. */
+
+int __getopt_initialized;
+
+/* The next char to be scanned in the option-element
+   in which the last option character we returned was found.
+   This allows us to pick up the scan where we left off.
+
+   If this is zero, or a null string, it means resume the scan
+   by advancing to the next ARGV-element.  */
+
+static char *nextchar;
+
+/* Callers store zero here to inhibit the error message
+   for unrecognized options.  */
+
+int opterr = 1;
+
+/* Set to an option character which was unrecognized.
+   This must be initialized on some systems to avoid linking in the
+   system's own getopt implementation.  */
+
+int optopt = '?';
+
+/* Describe how to deal with options that follow non-option ARGV-elements.
+
+   If the caller did not specify anything,
+   the default is REQUIRE_ORDER if the environment variable
+   POSIXLY_CORRECT is defined, PERMUTE otherwise.
+
+   REQUIRE_ORDER means don't recognize them as options;
+   stop option processing when the first non-option is seen.
+   This is what Unix does.
+   This mode of operation is selected by either setting the environment
+   variable POSIXLY_CORRECT, or using `+' as the first character
+   of the list of option characters.
+
+   PERMUTE is the default.  We permute the contents of ARGV as we scan,
+   so that eventually all the non-options are at the end.  This allows options
+   to be given in any order, even with programs that were not written to
+   expect this.
+
+   RETURN_IN_ORDER is an option available to programs that were written
+   to expect options and other ARGV-elements in any order and that care about
+   the ordering of the two.  We describe each non-option ARGV-element
+   as if it were the argument of an option with character code 1.
+   Using `-' as the first character of the list of option characters
+   selects this mode of operation.
+
+   The special argument `--' forces an end of option-scanning regardless
+   of the value of `ordering'.  In the case of RETURN_IN_ORDER, only
+   `--' can cause `getopt' to return -1 with `optind' != ARGC.  */
+
+static enum
+{
+  REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
+} ordering;
+
+/* Value of POSIXLY_CORRECT environment variable.  */
+static char *posixly_correct;
+
+#ifdef	__GNU_LIBRARY__
+/* We want to avoid inclusion of string.h with non-GNU libraries
+   because there are many ways it can cause trouble.
+   On some systems, it contains special magic macros that don't work
+   in GCC.  */
+# include <string.h>
+# define my_index	strchr
+#else
+
+# if HAVE_STRING_H
+#  include <string.h>
+# else
+#  include <strings.h>
+# endif
+
+/* Avoid depending on library functions or files
+   whose names are inconsistent.  */
+
+#ifndef getenv
+extern char *getenv ();
+#endif
+
+static char *
+my_index (str, chr)
+     const char *str;
+     int chr;
+{
+  while (*str)
+    {
+      if (*str == chr)
+	return (char *) str;
+      str++;
+    }
+  return 0;
+}
+
+/* If using GCC, we can safely declare strlen this way.
+   If not using GCC, it is ok not to declare it.  */
+#ifdef __GNUC__
+/* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h.
+   That was relevant to code that was here before.  */
+# if (!defined __STDC__ || !__STDC__) && !defined strlen
+/* gcc with -traditional declares the built-in strlen to return int,
+   and has done so at least since version 2.4.5. -- rms.  */
+extern int strlen (const char *);
+# endif /* not __STDC__ */
+#endif /* __GNUC__ */
+
+#endif /* not __GNU_LIBRARY__ */
+
+/* Handle permutation of arguments.  */
+
+/* Describe the part of ARGV that contains non-options that have
+   been skipped.  `first_nonopt' is the index in ARGV of the first of them;
+   `last_nonopt' is the index after the last of them.  */
+
+static int first_nonopt;
+static int last_nonopt;
+
+#ifdef _LIBC
+/* Stored original parameters.
+   XXX This is no good solution.  We should rather copy the args so
+   that we can compare them later.  But we must not use malloc(3).  */
+extern int __libc_argc;
+extern char **__libc_argv;
+
+/* Bash 2.0 gives us an environment variable containing flags
+   indicating ARGV elements that should not be considered arguments.  */
+
+# ifdef USE_NONOPTION_FLAGS
+/* Defined in getopt_init.c  */
+extern char *__getopt_nonoption_flags;
+
+static int nonoption_flags_max_len;
+static int nonoption_flags_len;
+# endif
+
+# ifdef USE_NONOPTION_FLAGS
+#  define SWAP_FLAGS(ch1, ch2) \
+  if (nonoption_flags_len > 0)						      \
+    {									      \
+      char __tmp = __getopt_nonoption_flags[ch1];			      \
+      __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2];	      \
+      __getopt_nonoption_flags[ch2] = __tmp;				      \
+    }
+# else
+#  define SWAP_FLAGS(ch1, ch2)
+# endif
+#else	/* !_LIBC */
+# define SWAP_FLAGS(ch1, ch2)
+#endif	/* _LIBC */
+
+/* Exchange two adjacent subsequences of ARGV.
+   One subsequence is elements [first_nonopt,last_nonopt)
+   which contains all the non-options that have been skipped so far.
+   The other is elements [last_nonopt,optind), which contains all
+   the options processed since those non-options were skipped.
+
+   `first_nonopt' and `last_nonopt' are relocated so that they describe
+   the new indices of the non-options in ARGV after they are moved.  */
+
+#if defined __STDC__ && __STDC__
+static void exchange (char **);
+#endif
+
+static void
+exchange (argv)
+     char **argv;
+{
+  int bottom = first_nonopt;
+  int middle = last_nonopt;
+  int top = optind;
+  char *tem;
+
+  /* Exchange the shorter segment with the far end of the longer segment.
+     That puts the shorter segment into the right place.
+     It leaves the longer segment in the right place overall,
+     but it consists of two parts that need to be swapped next.  */
+
+#if defined _LIBC && defined USE_NONOPTION_FLAGS
+  /* First make sure the handling of the `__getopt_nonoption_flags'
+     string can work normally.  Our top argument must be in the range
+     of the string.  */
+  if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len)
+    {
+      /* We must extend the array.  The user plays games with us and
+	 presents new arguments.  */
+      char *new_str = malloc (top + 1);
+      if (new_str == NULL)
+	nonoption_flags_len = nonoption_flags_max_len = 0;
+      else
+	{
+	  memset (__mempcpy (new_str, __getopt_nonoption_flags,
+			     nonoption_flags_max_len),
+		  '\0', top + 1 - nonoption_flags_max_len);
+	  nonoption_flags_max_len = top + 1;
+	  __getopt_nonoption_flags = new_str;
+	}
+    }
+#endif
+
+  while (top > middle && middle > bottom)
+    {
+      if (top - middle > middle - bottom)
+	{
+	  /* Bottom segment is the short one.  */
+	  int len = middle - bottom;
+	  register int i;
+
+	  /* Swap it with the top part of the top segment.  */
+	  for (i = 0; i < len; i++)
+	    {
+	      tem = argv[bottom + i];
+	      argv[bottom + i] = argv[top - (middle - bottom) + i];
+	      argv[top - (middle - bottom) + i] = tem;
+	      SWAP_FLAGS (bottom + i, top - (middle - bottom) + i);
+	    }
+	  /* Exclude the moved bottom segment from further swapping.  */
+	  top -= len;
+	}
+      else
+	{
+	  /* Top segment is the short one.  */
+	  int len = top - middle;
+	  register int i;
+
+	  /* Swap it with the bottom part of the bottom segment.  */
+	  for (i = 0; i < len; i++)
+	    {
+	      tem = argv[bottom + i];
+	      argv[bottom + i] = argv[middle + i];
+	      argv[middle + i] = tem;
+	      SWAP_FLAGS (bottom + i, middle + i);
+	    }
+	  /* Exclude the moved top segment from further swapping.  */
+	  bottom += len;
+	}
+    }
+
+  /* Update records for the slots the non-options now occupy.  */
+
+  first_nonopt += (optind - last_nonopt);
+  last_nonopt = optind;
+}
+
+/* Initialize the internal data when the first call is made.  */
+
+#if defined __STDC__ && __STDC__
+static const char *_getopt_initialize (int, char *const *, const char *);
+#endif
+static const char *
+_getopt_initialize (argc, argv, optstring)
+     int argc;
+     char *const *argv;
+     const char *optstring;
+{
+  /* Start processing options with ARGV-element 1 (since ARGV-element 0
+     is the program name); the sequence of previously skipped
+     non-option ARGV-elements is empty.  */
+
+  first_nonopt = last_nonopt = optind;
+
+  nextchar = NULL;
+
+  posixly_correct = getenv ("POSIXLY_CORRECT");
+
+  /* Determine how to handle the ordering of options and nonoptions.  */
+
+  if (optstring[0] == '-')
+    {
+      ordering = RETURN_IN_ORDER;
+      ++optstring;
+    }
+  else if (optstring[0] == '+')
+    {
+      ordering = REQUIRE_ORDER;
+      ++optstring;
+    }
+  else if (posixly_correct != NULL)
+    ordering = REQUIRE_ORDER;
+  else
+    ordering = PERMUTE;
+
+#if defined _LIBC && defined USE_NONOPTION_FLAGS
+  if (posixly_correct == NULL
+      && argc == __libc_argc && argv == __libc_argv)
+    {
+      if (nonoption_flags_max_len == 0)
+	{
+	  if (__getopt_nonoption_flags == NULL
+	      || __getopt_nonoption_flags[0] == '\0')
+	    nonoption_flags_max_len = -1;
+	  else
+	    {
+	      const char *orig_str = __getopt_nonoption_flags;
+	      int len = nonoption_flags_max_len = strlen (orig_str);
+	      if (nonoption_flags_max_len < argc)
+		nonoption_flags_max_len = argc;
+	      __getopt_nonoption_flags =
+		(char *) malloc (nonoption_flags_max_len);
+	      if (__getopt_nonoption_flags == NULL)
+		nonoption_flags_max_len = -1;
+	      else
+		memset (__mempcpy (__getopt_nonoption_flags, orig_str, len),
+			'\0', nonoption_flags_max_len - len);
+	    }
+	}
+      nonoption_flags_len = nonoption_flags_max_len;
+    }
+  else
+    nonoption_flags_len = 0;
+#endif
+
+  return optstring;
+}
+
+/* Scan elements of ARGV (whose length is ARGC) for option characters
+   given in OPTSTRING.
+
+   If an element of ARGV starts with '-', and is not exactly "-" or "--",
+   then it is an option element.  The characters of this element
+   (aside from the initial '-') are option characters.  If `getopt'
+   is called repeatedly, it returns successively each of the option characters
+   from each of the option elements.
+
+   If `getopt' finds another option character, it returns that character,
+   updating `optind' and `nextchar' so that the next call to `getopt' can
+   resume the scan with the following option character or ARGV-element.
+
+   If there are no more option characters, `getopt' returns -1.
+   Then `optind' is the index in ARGV of the first ARGV-element
+   that is not an option.  (The ARGV-elements have been permuted
+   so that those that are not options now come last.)
+
+   OPTSTRING is a string containing the legitimate option characters.
+   If an option character is seen that is not listed in OPTSTRING,
+   return '?' after printing an error message.  If you set `opterr' to
+   zero, the error message is suppressed but we still return '?'.
+
+   If a char in OPTSTRING is followed by a colon, that means it wants an arg,
+   so the following text in the same ARGV-element, or the text of the following
+   ARGV-element, is returned in `optarg'.  Two colons mean an option that
+   wants an optional arg; if there is text in the current ARGV-element,
+   it is returned in `optarg', otherwise `optarg' is set to zero.
+
+   If OPTSTRING starts with `-' or `+', it requests different methods of
+   handling the non-option ARGV-elements.
+   See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
+
+   Long-named options begin with `--' instead of `-'.
+   Their names may be abbreviated as long as the abbreviation is unique
+   or is an exact match for some defined option.  If they have an
+   argument, it follows the option name in the same ARGV-element, separated
+   from the option name by a `=', or else the in next ARGV-element.
+   When `getopt' finds a long-named option, it returns 0 if that option's
+   `flag' field is nonzero, the value of the option's `val' field
+   if the `flag' field is zero.
+
+   The elements of ARGV aren't really const, because we permute them.
+   But we pretend they're const in the prototype to be compatible
+   with other systems.
+
+   LONGOPTS is a vector of `struct option' terminated by an
+   element containing a name which is zero.
+
+   LONGIND returns the index in LONGOPT of the long-named option found.
+   It is only valid when a long-named option has been found by the most
+   recent call.
+
+   If LONG_ONLY is nonzero, '-' as well as '--' can introduce
+   long-named options.  */
+
+int
+_getopt_internal (argc, argv, optstring, longopts, longind, long_only)
+     int argc;
+     char *const *argv;
+     const char *optstring;
+     const struct option *longopts;
+     int *longind;
+     int long_only;
+{
+  int print_errors = opterr;
+  if (optstring[0] == ':')
+    print_errors = 0;
+
+  if (argc < 1)
+    return -1;
+
+  optarg = NULL;
+
+  if (optind == 0 || !__getopt_initialized)
+    {
+      if (optind == 0)
+	optind = 1;	/* Don't scan ARGV[0], the program name.  */
+      optstring = _getopt_initialize (argc, argv, optstring);
+      __getopt_initialized = 1;
+    }
+
+  /* Test whether ARGV[optind] points to a non-option argument.
+     Either it does not have option syntax, or there is an environment flag
+     from the shell indicating it is not an option.  The later information
+     is only used when the used in the GNU libc.  */
+#if defined _LIBC && defined USE_NONOPTION_FLAGS
+# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0'	      \
+		      || (optind < nonoption_flags_len			      \
+			  && __getopt_nonoption_flags[optind] == '1'))
+#else
+# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0')
+#endif
+
+  if (nextchar == NULL || *nextchar == '\0')
+    {
+      /* Advance to the next ARGV-element.  */
+
+      /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been
+	 moved back by the user (who may also have changed the arguments).  */
+      if (last_nonopt > optind)
+	last_nonopt = optind;
+      if (first_nonopt > optind)
+	first_nonopt = optind;
+
+      if (ordering == PERMUTE)
+	{
+	  /* If we have just processed some options following some non-options,
+	     exchange them so that the options come first.  */
+
+	  if (first_nonopt != last_nonopt && last_nonopt != optind)
+	    exchange ((char **) argv);
+	  else if (last_nonopt != optind)
+	    first_nonopt = optind;
+
+	  /* Skip any additional non-options
+	     and extend the range of non-options previously skipped.  */
+
+	  while (optind < argc && NONOPTION_P)
+	    optind++;
+	  last_nonopt = optind;
+	}
+
+      /* The special ARGV-element `--' means premature end of options.
+	 Skip it like a null option,
+	 then exchange with previous non-options as if it were an option,
+	 then skip everything else like a non-option.  */
+
+      if (optind != argc && !strcmp (argv[optind], "--"))
+	{
+	  optind++;
+
+	  if (first_nonopt != last_nonopt && last_nonopt != optind)
+	    exchange ((char **) argv);
+	  else if (first_nonopt == last_nonopt)
+	    first_nonopt = optind;
+	  last_nonopt = argc;
+
+	  optind = argc;
+	}
+
+      /* If we have done all the ARGV-elements, stop the scan
+	 and back over any non-options that we skipped and permuted.  */
+
+      if (optind == argc)
+	{
+	  /* Set the next-arg-index to point at the non-options
+	     that we previously skipped, so the caller will digest them.  */
+	  if (first_nonopt != last_nonopt)
+	    optind = first_nonopt;
+	  return -1;
+	}
+
+      /* If we have come to a non-option and did not permute it,
+	 either stop the scan or describe it to the caller and pass it by.  */
+
+      if (NONOPTION_P)
+	{
+	  if (ordering == REQUIRE_ORDER)
+	    return -1;
+	  optarg = argv[optind++];
+	  return 1;
+	}
+
+      /* We have found another option-ARGV-element.
+	 Skip the initial punctuation.  */
+
+      nextchar = (argv[optind] + 1
+		  + (longopts != NULL && argv[optind][1] == '-'));
+    }
+
+  /* Decode the current option-ARGV-element.  */
+
+  /* Check whether the ARGV-element is a long option.
+
+     If long_only and the ARGV-element has the form "-f", where f is
+     a valid short option, don't consider it an abbreviated form of
+     a long option that starts with f.  Otherwise there would be no
+     way to give the -f short option.
+
+     On the other hand, if there's a long option "fubar" and
+     the ARGV-element is "-fu", do consider that an abbreviation of
+     the long option, just like "--fu", and not "-f" with arg "u".
+
+     This distinction seems to be the most useful approach.  */
+
+  if (longopts != NULL
+      && (argv[optind][1] == '-'
+	  || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1])))))
+    {
+      char *nameend;
+      const struct option *p;
+      const struct option *pfound = NULL;
+      int exact = 0;
+      int ambig = 0;
+      int indfound = -1;
+      int option_index;
+
+      for (nameend = nextchar; *nameend && *nameend != '='; nameend++)
+	/* Do nothing.  */ ;
+
+      /* Test all long options for either exact match
+	 or abbreviated matches.  */
+      for (p = longopts, option_index = 0; p->name; p++, option_index++)
+	if (!strncmp (p->name, nextchar, nameend - nextchar))
+	  {
+	    if ((unsigned int) (nameend - nextchar)
+		== (unsigned int) strlen (p->name))
+	      {
+		/* Exact match found.  */
+		pfound = p;
+		indfound = option_index;
+		exact = 1;
+		break;
+	      }
+	    else if (pfound == NULL)
+	      {
+		/* First nonexact match found.  */
+		pfound = p;
+		indfound = option_index;
+	      }
+	    else if (long_only
+		     || pfound->has_arg != p->has_arg
+		     || pfound->flag != p->flag
+		     || pfound->val != p->val)
+	      /* Second or later nonexact match found.  */
+	      ambig = 1;
+	  }
+
+      if (ambig && !exact)
+	{
+	  if (print_errors)
+	    fprintf (stderr, _("%s: option `%s' is ambiguous\n"),
+		     argv[0], argv[optind]);
+	  nextchar += strlen (nextchar);
+	  optind++;
+	  optopt = 0;
+	  return '?';
+	}
+
+      if (pfound != NULL)
+	{
+	  option_index = indfound;
+	  optind++;
+	  if (*nameend)
+	    {
+	      /* Don't test has_arg with >, because some C compilers don't
+		 allow it to be used on enums.  */
+	      if (pfound->has_arg)
+		optarg = nameend + 1;
+	      else
+		{
+		  if (print_errors)
+		    {
+		      if (argv[optind - 1][1] == '-')
+			/* --option */
+			fprintf (stderr,
+				 _("%s: option `--%s' doesn't allow an argument\n"),
+				 argv[0], pfound->name);
+		      else
+			/* +option or -option */
+			fprintf (stderr,
+				 _("%s: option `%c%s' doesn't allow an argument\n"),
+				 argv[0], argv[optind - 1][0], pfound->name);
+		    }
+
+		  nextchar += strlen (nextchar);
+
+		  optopt = pfound->val;
+		  return '?';
+		}
+	    }
+	  else if (pfound->has_arg == 1)
+	    {
+	      if (optind < argc)
+		optarg = argv[optind++];
+	      else
+		{
+		  if (print_errors)
+		    fprintf (stderr,
+			   _("%s: option `%s' requires an argument\n"),
+			   argv[0], argv[optind - 1]);
+		  nextchar += strlen (nextchar);
+		  optopt = pfound->val;
+		  return optstring[0] == ':' ? ':' : '?';
+		}
+	    }
+	  nextchar += strlen (nextchar);
+	  if (longind != NULL)
+	    *longind = option_index;
+	  if (pfound->flag)
+	    {
+	      *(pfound->flag) = pfound->val;
+	      return 0;
+	    }
+	  return pfound->val;
+	}
+
+      /* Can't find it as a long option.  If this is not getopt_long_only,
+	 or the option starts with '--' or is not a valid short
+	 option, then it's an error.
+	 Otherwise interpret it as a short option.  */
+      if (!long_only || argv[optind][1] == '-'
+	  || my_index (optstring, *nextchar) == NULL)
+	{
+	  if (print_errors)
+	    {
+	      if (argv[optind][1] == '-')
+		/* --option */
+		fprintf (stderr, _("%s: unrecognized option `--%s'\n"),
+			 argv[0], nextchar);
+	      else
+		/* +option or -option */
+		fprintf (stderr, _("%s: unrecognized option `%c%s'\n"),
+			 argv[0], argv[optind][0], nextchar);
+	    }
+	  nextchar = (char *) "";
+	  optind++;
+	  optopt = 0;
+	  return '?';
+	}
+    }
+
+  /* Look at and handle the next short option-character.  */
+
+  {
+    char c = *nextchar++;
+    char *temp = my_index (optstring, c);
+
+    /* Increment `optind' when we start to process its last character.  */
+    if (*nextchar == '\0')
+      ++optind;
+
+    if (temp == NULL || c == ':')
+      {
+	if (print_errors)
+	  {
+	    if (posixly_correct)
+	      /* 1003.2 specifies the format of this message.  */
+	      fprintf (stderr, _("%s: illegal option -- %c\n"),
+		       argv[0], c);
+	    else
+	      fprintf (stderr, _("%s: invalid option -- %c\n"),
+		       argv[0], c);
+	  }
+	optopt = c;
+	return '?';
+      }
+    /* Convenience. Treat POSIX -W foo same as long option --foo */
+    if (temp[0] == 'W' && temp[1] == ';')
+      {
+	char *nameend;
+	const struct option *p;
+	const struct option *pfound = NULL;
+	int exact = 0;
+	int ambig = 0;
+	int indfound = 0;
+	int option_index;
+
+	/* This is an option that requires an argument.  */
+	if (*nextchar != '\0')
+	  {
+	    optarg = nextchar;
+	    /* If we end this ARGV-element by taking the rest as an arg,
+	       we must advance to the next element now.  */
+	    optind++;
+	  }
+	else if (optind == argc)
+	  {
+	    if (print_errors)
+	      {
+		/* 1003.2 specifies the format of this message.  */
+		fprintf (stderr, _("%s: option requires an argument -- %c\n"),
+			 argv[0], c);
+	      }
+	    optopt = c;
+	    if (optstring[0] == ':')
+	      c = ':';
+	    else
+	      c = '?';
+	    return c;
+	  }
+	else
+	  /* We already incremented `optind' once;
+	     increment it again when taking next ARGV-elt as argument.  */
+	  optarg = argv[optind++];
+
+	/* optarg is now the argument, see if it's in the
+	   table of longopts.  */
+
+	for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++)
+	  /* Do nothing.  */ ;
+
+	/* Test all long options for either exact match
+	   or abbreviated matches.  */
+	for (p = longopts, option_index = 0; p->name; p++, option_index++)
+	  if (!strncmp (p->name, nextchar, nameend - nextchar))
+	    {
+	      if ((unsigned int) (nameend - nextchar) == strlen (p->name))
+		{
+		  /* Exact match found.  */
+		  pfound = p;
+		  indfound = option_index;
+		  exact = 1;
+		  break;
+		}
+	      else if (pfound == NULL)
+		{
+		  /* First nonexact match found.  */
+		  pfound = p;
+		  indfound = option_index;
+		}
+	      else
+		/* Second or later nonexact match found.  */
+		ambig = 1;
+	    }
+	if (ambig && !exact)
+	  {
+	    if (print_errors)
+	      fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"),
+		       argv[0], argv[optind]);
+	    nextchar += strlen (nextchar);
+	    optind++;
+	    return '?';
+	  }
+	if (pfound != NULL)
+	  {
+	    option_index = indfound;
+	    if (*nameend)
+	      {
+		/* Don't test has_arg with >, because some C compilers don't
+		   allow it to be used on enums.  */
+		if (pfound->has_arg)
+		  optarg = nameend + 1;
+		else
+		  {
+		    if (print_errors)
+		      fprintf (stderr, _("\
+%s: option `-W %s' doesn't allow an argument\n"),
+			       argv[0], pfound->name);
+
+		    nextchar += strlen (nextchar);
+		    return '?';
+		  }
+	      }
+	    else if (pfound->has_arg == 1)
+	      {
+		if (optind < argc)
+		  optarg = argv[optind++];
+		else
+		  {
+		    if (print_errors)
+		      fprintf (stderr,
+			       _("%s: option `%s' requires an argument\n"),
+			       argv[0], argv[optind - 1]);
+		    nextchar += strlen (nextchar);
+		    return optstring[0] == ':' ? ':' : '?';
+		  }
+	      }
+	    nextchar += strlen (nextchar);
+	    if (longind != NULL)
+	      *longind = option_index;
+	    if (pfound->flag)
+	      {
+		*(pfound->flag) = pfound->val;
+		return 0;
+	      }
+	    return pfound->val;
+	  }
+	  nextchar = NULL;
+	  return 'W';	/* Let the application handle it.   */
+      }
+    if (temp[1] == ':')
+      {
+	if (temp[2] == ':')
+	  {
+	    /* This is an option that accepts an argument optionally.  */
+	    if (*nextchar != '\0')
+	      {
+		optarg = nextchar;
+		optind++;
+	      }
+	    else
+	      optarg = NULL;
+	    nextchar = NULL;
+	  }
+	else
+	  {
+	    /* This is an option that requires an argument.  */
+	    if (*nextchar != '\0')
+	      {
+		optarg = nextchar;
+		/* If we end this ARGV-element by taking the rest as an arg,
+		   we must advance to the next element now.  */
+		optind++;
+	      }
+	    else if (optind == argc)
+	      {
+		if (print_errors)
+		  {
+		    /* 1003.2 specifies the format of this message.  */
+		    fprintf (stderr,
+			     _("%s: option requires an argument -- %c\n"),
+			     argv[0], c);
+		  }
+		optopt = c;
+		if (optstring[0] == ':')
+		  c = ':';
+		else
+		  c = '?';
+	      }
+	    else
+	      /* We already incremented `optind' once;
+		 increment it again when taking next ARGV-elt as argument.  */
+	      optarg = argv[optind++];
+	    nextchar = NULL;
+	  }
+      }
+    return c;
+  }
+}
+
+int
+getopt (argc, argv, optstring)
+     int argc;
+     char *const *argv;
+     const char *optstring;
+{
+  return _getopt_internal (argc, argv, optstring,
+			   (const struct option *) 0,
+			   (int *) 0,
+			   0);
+}
+
+#endif	/* Not ELIDE_CODE.  */
+
+#ifdef TEST
+
+/* Compile with -DTEST to make an executable for use in testing
+   the above definition of `getopt'.  */
+
+int
+main (argc, argv)
+     int argc;
+     char **argv;
+{
+  int c;
+  int digit_optind = 0;
+
+  while (1)
+    {
+      int this_option_optind = optind ? optind : 1;
+
+      c = getopt (argc, argv, "abc:d:0123456789");
+      if (c == -1)
+	break;
+
+      switch (c)
+	{
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':
+	  if (digit_optind != 0 && digit_optind != this_option_optind)
+	    printf ("digits occur in two different argv-elements.\n");
+	  digit_optind = this_option_optind;
+	  printf ("option %c\n", c);
+	  break;
+
+	case 'a':
+	  printf ("option a\n");
+	  break;
+
+	case 'b':
+	  printf ("option b\n");
+	  break;
+
+	case 'c':
+	  printf ("option c with value `%s'\n", optarg);
+	  break;
+
+	case '?':
+	  break;
+
+	default:
+	  printf ("?? getopt returned character code 0%o ??\n", c);
+	}
+    }
+
+  if (optind < argc)
+    {
+      printf ("non-option ARGV-elements: ");
+      while (optind < argc)
+	printf ("%s ", argv[optind++]);
+      printf ("\n");
+    }
+
+  exit (0);
+}
+
+#endif /* TEST */

Added: trunk/src/getopt.h
===================================================================
--- trunk/src/getopt.h	                        (rev 0)
+++ trunk/src/getopt.h	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,180 @@
+/* Declarations for getopt.
+   Copyright (C) 1989-1994, 1996-1999, 2001 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#ifndef _GETOPT_H
+
+#ifndef __need_getopt
+# define _GETOPT_H 1
+#endif
+
+/* If __GNU_LIBRARY__ is not already defined, either we are being used
+   standalone, or this is the first header included in the source file.
+   If we are being used with glibc, we need to include <features.h>, but
+   that does not exist if we are standalone.  So: if __GNU_LIBRARY__ is
+   not defined, include <ctype.h>, which will pull in <features.h> for us
+   if it's from glibc.  (Why ctype.h?  It's guaranteed to exist and it
+   doesn't flood the namespace with stuff the way some other headers do.)  */
+#if !defined __GNU_LIBRARY__
+# include <ctype.h>
+#endif
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+/* For communication from `getopt' to the caller.
+   When `getopt' finds an option that takes an argument,
+   the argument value is returned here.
+   Also, when `ordering' is RETURN_IN_ORDER,
+   each non-option ARGV-element is returned here.  */
+
+extern char *optarg;
+
+/* Index in ARGV of the next element to be scanned.
+   This is used for communication to and from the caller
+   and for communication between successive calls to `getopt'.
+
+   On entry to `getopt', zero means this is the first call; initialize.
+
+   When `getopt' returns -1, this is the index of the first of the
+   non-option elements that the caller should itself scan.
+
+   Otherwise, `optind' communicates from one call to the next
+   how much of ARGV has been scanned so far.  */
+
+extern int optind;
+
+/* Callers store zero here to inhibit the error message `getopt' prints
+   for unrecognized options.  */
+
+extern int opterr;
+
+/* Set to an option character which was unrecognized.  */
+
+extern int optopt;
+
+#ifndef __need_getopt
+/* Describe the long-named options requested by the application.
+   The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
+   of `struct option' terminated by an element containing a name which is
+   zero.
+
+   The field `has_arg' is:
+   no_argument		(or 0) if the option does not take an argument,
+   required_argument	(or 1) if the option requires an argument,
+   optional_argument 	(or 2) if the option takes an optional argument.
+
+   If the field `flag' is not NULL, it points to a variable that is set
+   to the value given in the field `val' when the option is found, but
+   left unchanged if the option is not found.
+
+   To have a long-named option do something other than set an `int' to
+   a compiled-in constant, such as set a value from `optarg', set the
+   option's `flag' field to zero and its `val' field to a nonzero
+   value (the equivalent single-letter option character, if there is
+   one).  For long options that have a zero `flag' field, `getopt'
+   returns the contents of the `val' field.  */
+
+struct option
+{
+# if (defined __STDC__ && __STDC__) || defined __cplusplus
+  const char *name;
+# else
+  char *name;
+# endif
+  /* has_arg can't be an enum because some compilers complain about
+     type mismatches in all the code that assumes it is an int.  */
+  int has_arg;
+  int *flag;
+  int val;
+};
+
+/* Names for the values of the `has_arg' field of `struct option'.  */
+
+# define no_argument		0
+# define required_argument	1
+# define optional_argument	2
+#endif	/* need getopt */
+
+
+/* Get definitions and prototypes for functions to process the
+   arguments in ARGV (ARGC of them, minus the program name) for
+   options given in OPTS.
+
+   Return the option character from OPTS just read.  Return -1 when
+   there are no more options.  For unrecognized options, or options
+   missing arguments, `optopt' is set to the option letter, and '?' is
+   returned.
+
+   The OPTS string is a list of characters which are recognized option
+   letters, optionally followed by colons, specifying that that letter
+   takes an argument, to be placed in `optarg'.
+
+   If a letter in OPTS is followed by two colons, its argument is
+   optional.  This behavior is specific to the GNU `getopt'.
+
+   The argument `--' causes premature termination of argument
+   scanning, explicitly telling `getopt' that there are no more
+   options.
+
+   If OPTS begins with `--', then non-option arguments are treated as
+   arguments to the option '\0'.  This behavior is specific to the GNU
+   `getopt'.  */
+
+#if (defined __STDC__ && __STDC__) || defined __cplusplus
+# ifdef __GNU_LIBRARY__
+/* Many other libraries have conflicting prototypes for getopt, with
+   differences in the consts, in stdlib.h.  To avoid compilation
+   errors, only prototype getopt for the GNU C library.  */
+extern int getopt (int __argc, char *const *__argv, const char *__shortopts);
+# else /* not __GNU_LIBRARY__ */
+extern int getopt ();
+# endif /* __GNU_LIBRARY__ */
+
+# ifndef __need_getopt
+extern int getopt_long (int __argc, char *const *__argv, const char *__shortopts,
+		        const struct option *__longopts, int *__longind);
+extern int getopt_long_only (int __argc, char *const *__argv,
+			     const char *__shortopts,
+		             const struct option *__longopts, int *__longind);
+
+/* Internal only.  Users should not call this directly.  */
+extern int _getopt_internal (int __argc, char *const *__argv,
+			     const char *__shortopts,
+		             const struct option *__longopts, int *__longind,
+			     int __long_only);
+# endif
+#else /* not __STDC__ */
+extern int getopt ();
+# ifndef __need_getopt
+extern int getopt_long ();
+extern int getopt_long_only ();
+
+extern int _getopt_internal ();
+# endif
+#endif /* __STDC__ */
+
+#ifdef	__cplusplus
+}
+#endif
+
+/* Make sure we later can get all the definitions and declarations.  */
+#undef __need_getopt
+
+#endif /* getopt.h */

Added: trunk/src/getopt1.c
===================================================================
--- trunk/src/getopt1.c	                        (rev 0)
+++ trunk/src/getopt1.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,188 @@
+/* getopt_long and getopt_long_only entry points for GNU getopt.
+   Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98
+     Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "getopt.h"
+
+#if !defined __STDC__ || !__STDC__
+/* This is a separate conditional since some stdc systems
+   reject `defined (const)'.  */
+#ifndef const
+#define const
+#endif
+#endif
+
+#include <stdio.h>
+
+/* Comment out all this code if we are using the GNU C Library, and are not
+   actually compiling the library itself.  This code is part of the GNU C
+   Library, but also included in many other GNU distributions.  Compiling
+   and linking in this code is a waste when using the GNU C library
+   (especially if it is a shared library).  Rather than having every GNU
+   program understand `configure --with-gnu-libc' and omit the object files,
+   it is simpler to just do this in the source for each such file.  */
+
+#define GETOPT_INTERFACE_VERSION 2
+#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2
+#include <gnu-versions.h>
+#if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION
+#define ELIDE_CODE
+#endif
+#endif
+
+#ifndef ELIDE_CODE
+
+
+/* This needs to come after some library #include
+   to get __GNU_LIBRARY__ defined.  */
+#ifdef __GNU_LIBRARY__
+#include <stdlib.h>
+#endif
+
+#ifndef	NULL
+#define NULL 0
+#endif
+
+int
+getopt_long (argc, argv, options, long_options, opt_index)
+     int argc;
+     char *const *argv;
+     const char *options;
+     const struct option *long_options;
+     int *opt_index;
+{
+  return _getopt_internal (argc, argv, options, long_options, opt_index, 0);
+}
+
+/* Like getopt_long, but '-' as well as '--' can indicate a long option.
+   If an option that starts with '-' (not '--') doesn't match a long option,
+   but does match a short option, it is parsed as a short option
+   instead.  */
+
+int
+getopt_long_only (argc, argv, options, long_options, opt_index)
+     int argc;
+     char *const *argv;
+     const char *options;
+     const struct option *long_options;
+     int *opt_index;
+{
+  return _getopt_internal (argc, argv, options, long_options, opt_index, 1);
+}
+
+
+#endif	/* Not ELIDE_CODE.  */
+
+#ifdef TEST
+
+#include <stdio.h>
+
+int
+main (argc, argv)
+     int argc;
+     char **argv;
+{
+  int c;
+  int digit_optind = 0;
+
+  while (1)
+    {
+      int this_option_optind = optind ? optind : 1;
+      int option_index = 0;
+      static struct option long_options[] =
+      {
+	{"add", 1, 0, 0},
+	{"append", 0, 0, 0},
+	{"delete", 1, 0, 0},
+	{"verbose", 0, 0, 0},
+	{"create", 0, 0, 0},
+	{"file", 1, 0, 0},
+	{0, 0, 0, 0}
+      };
+
+      c = getopt_long (argc, argv, "abc:d:0123456789",
+		       long_options, &option_index);
+      if (c == -1)
+	break;
+
+      switch (c)
+	{
+	case 0:
+	  printf ("option %s", long_options[option_index].name);
+	  if (optarg)
+	    printf (" with arg %s", optarg);
+	  printf ("\n");
+	  break;
+
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':
+	  if (digit_optind != 0 && digit_optind != this_option_optind)
+	    printf ("digits occur in two different argv-elements.\n");
+	  digit_optind = this_option_optind;
+	  printf ("option %c\n", c);
+	  break;
+
+	case 'a':
+	  printf ("option a\n");
+	  break;
+
+	case 'b':
+	  printf ("option b\n");
+	  break;
+
+	case 'c':
+	  printf ("option c with value `%s'\n", optarg);
+	  break;
+
+	case 'd':
+	  printf ("option d with value `%s'\n", optarg);
+	  break;
+
+	case '?':
+	  break;
+
+	default:
+	  printf ("?? getopt returned character code 0%o ??\n", c);
+	}
+    }
+
+  if (optind < argc)
+    {
+      printf ("non-option ARGV-elements: ");
+      while (optind < argc)
+	printf ("%s ", argv[optind++]);
+      printf ("\n");
+    }
+
+  exit (0);
+}
+
+#endif /* TEST */

Added: trunk/src/info.c
===================================================================
--- trunk/src/info.c	                        (rev 0)
+++ trunk/src/info.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,901 @@
+/*
+|  Copyright (C) 2002-2007 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+| 
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+| 
+|  iTunes and iPod are trademarks of Apple
+| 
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: info.c 1550 2007-06-17 14:14:38Z jcsjcs $
+*/
+
+/* This file provides functions for the info window as well as for the
+ * statusbar handling */
+
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <gtk/gtk.h>
+#include "info.h"
+#include "misc.h"
+#include "misc_track.h"
+#include "prefs.h"
+
+/* pointer to info window */
+static GtkWidget *info_window = NULL;
+
+GladeXML *info_xml; 
+
+/* stuff for statusbar */
+static GtkWidget *gtkpod_statusbar = NULL;
+static GtkWidget *gtkpod_tracks_statusbar = NULL;
+static GtkWidget *gtkpod_space_statusbar = NULL;
+static guint statusbar_timeout_id = 0;
+static guint statusbar_timeout = STATUSBAR_TIMEOUT;
+
+#define SPACE_TIMEOUT 1000
+/* lock for size related variables (used by child and parent) */
+static GMutex *space_mutex = NULL;
+static GThread *space_thread = NULL;
+static gboolean space_uptodate = FALSE;
+static gchar *space_mp = NULL;      /* thread save access through mutex */
+static iTunesDB *space_itdb = NULL; /* semi thread save access
+				     * (space_itdb will not be changed
+				     * while locked) */
+static gdouble space_ipod_free = 0; /* thread save access through mutex */
+static gdouble space_ipod_used = 0; /* thread save access through mutex */
+
+
+static gdouble get_ipod_free_space(void);
+#if 0
+static gdouble get_ipod_used_space(void);
+#endif
+
+/* fill in tracks, playtime and filesize from track list @tl */
+static void fill_in_info (GList *tl, guint32 *tracks,
+			  guint32 *playtime, gdouble *filesize)
+{
+    GList *gl;
+
+    g_return_if_fail (tracks);
+    g_return_if_fail (playtime);
+    g_return_if_fail (filesize);
+
+    *tracks = 0;
+    *playtime = 0;
+    *filesize = 0;
+
+    for (gl=tl; gl; gl=gl->next)
+    {
+	Track *s = gl->data;
+	*tracks += 1;
+	*playtime += s->tracklen/1000;
+	*filesize += s->size;
+    }
+}
+
+static void fill_label_uint (gchar *w_name, guint32 nr)
+{    
+    GtkWidget *w;
+
+    g_return_if_fail (info_window);
+    g_return_if_fail (w_name);
+    w = gtkpod_xml_get_widget (info_xml, w_name);
+    if (w)
+    {
+	gchar *str = g_strdup_printf ("%u", nr);
+	gtk_label_set_text (GTK_LABEL (w), str);
+	g_free (str);
+    }
+}
+
+static void fill_label_time (gchar *w_name, guint32 secs)
+{    
+    GtkWidget *w;
+
+    g_return_if_fail (info_window);
+    g_return_if_fail (w_name);
+    w = gtkpod_xml_get_widget (info_xml, w_name);
+    if (w)
+    {
+	gchar *str = g_strdup_printf ("%u:%02u:%02u",
+				      secs / 3600,
+				      (secs % 3600) / 60,
+				      secs % 60);
+	gtk_label_set_text (GTK_LABEL (w), str);
+	g_free (str);
+    }
+}
+
+static void fill_label_size (gchar *w_name, gdouble size)
+{    
+    GtkWidget *w;
+
+    g_return_if_fail (info_window);
+    g_return_if_fail (w_name);
+    w = gtkpod_xml_get_widget (info_xml, w_name);
+    if (w)
+    {
+	gchar *str = get_filesize_as_string (size);
+	gtk_label_set_text (GTK_LABEL (w), str);
+	g_free (str);
+    }
+}
+
+static void fill_label_string (gchar *w_name, const char *str)
+{    
+    GtkWidget *w;
+
+    g_return_if_fail (info_window);
+    g_return_if_fail (w_name);
+    w = gtkpod_xml_get_widget (info_xml, w_name);
+    if (w)
+    {
+	gtk_label_set_text (GTK_LABEL (w), str);
+    }
+}
+
+
+
+/* open info window */
+void info_open_window (void)
+{
+    if (info_window)
+    {   /* info window already open -- raise to the top */
+	gdk_window_raise (info_window->window);
+	return;
+    }
+    
+    info_xml = glade_xml_new (xml_file, "gtkpod_info", NULL);
+    glade_xml_signal_autoconnect (info_xml);
+    info_window = gtkpod_xml_get_widget (info_xml, "gtkpod_info");
+    
+    if (info_window)
+    {
+	gint defx, defy;
+	defx = prefs_get_int("size_info.x");
+  defy = prefs_get_int("size_info.y");
+	gtk_window_set_default_size (GTK_WINDOW (info_window), defx, defy);
+	prefs_set_int("info_window", TRUE); /* notify prefs */
+	info_update ();
+	gtk_widget_show (info_window);
+	/* set the menu item for the info window correctly */
+	display_set_info_window_menu ();
+    }
+}
+
+/* close info window */
+void info_close_window (void)
+{
+    GtkWidget *win;
+
+    if (!info_window) return; /* not open */
+
+    info_update_default_sizes ();
+    win = info_window;
+    info_window = NULL;
+    gtk_widget_destroy (win);
+     prefs_set_int("info_window", FALSE); /* notify prefs */
+    /* set the menu item for the info window correctly */
+    display_set_info_window_menu ();
+}
+
+/* save current window size */
+void info_update_default_sizes (void)
+{
+    if (info_window)
+    {
+	gint defx, defy;
+	gtk_window_get_size (GTK_WINDOW (info_window), &defx, &defy);
+	prefs_set_int("size_info.x", defx);
+	prefs_set_int("size_info.y", defy);
+    }
+}
+
+/* update all sections of info window */
+void info_update (void)
+{
+    if (!info_window) return; /* not open */
+    info_update_track_view ();
+    info_update_playlist_view ();
+    info_update_totals_view ();
+}
+
+static void info_update_track_view_displayed (void)
+{
+    guint32 tracks, playtime; /* playtime in secs */
+    gdouble  filesize;        /* in bytes */
+    GList *displayed;
+
+    g_return_if_fail (info_window);
+    displayed = display_get_selected_members (prefs_get_int("sort_tab_num")-1);
+    fill_in_info (displayed, &tracks, &playtime, &filesize);
+    fill_label_uint ("tracks_displayed", tracks);
+    fill_label_time ("playtime_displayed", playtime);
+    fill_label_size ("filesize_displayed", filesize);
+}
+
+void info_update_track_view_selected (void)
+{
+    guint32 tracks, playtime; /* playtime in secs */
+    gdouble  filesize;        /* in bytes */
+    GList *selected;
+
+    if (!info_window) return; /* not open */
+    selected = display_get_selection (prefs_get_int("sort_tab_num"));
+    fill_in_info (selected, &tracks, &playtime, &filesize);
+    g_list_free (selected);
+    fill_label_uint ("tracks_selected", tracks);
+    fill_label_time ("playtime_selected", playtime);
+    fill_label_size ("filesize_selected", filesize);
+}
+
+/* update track view section */
+void info_update_track_view (void)
+{
+    if (!info_window) return; /* not open */
+    info_update_track_view_displayed ();
+    info_update_track_view_selected ();
+}
+
+/* update playlist view section */
+void info_update_playlist_view (void)
+{
+    guint32 tracks, playtime; /* playtime in secs */
+    gdouble  filesize;        /* in bytes */
+    GList   *tl;
+
+    if (!info_window) return; /* not open */
+    tl = display_get_selected_members (-1);
+    fill_in_info (tl, &tracks, &playtime, &filesize);
+    fill_label_uint ("playlist_tracks", tracks);
+    fill_label_time ("playlist_playtime", playtime);
+    fill_label_size ("playlist_filesize", filesize);
+}
+
+
+/* Get the local itdb */
+static iTunesDB *get_itdb_local (void)
+{
+    struct itdbs_head *itdbs_head;
+    GList *gl;
+
+    g_return_val_if_fail (gtkpod_window, NULL);
+    itdbs_head = g_object_get_data (G_OBJECT (gtkpod_window),
+				    "itdbs_head");
+    if (!itdbs_head) return NULL;
+    for (gl=itdbs_head->itdbs; gl; gl=gl->next)
+    {
+	iTunesDB *itdb = gl->data;
+	g_return_val_if_fail (itdb, NULL);
+	if (itdb->usertype & GP_ITDB_TYPE_LOCAL)
+	    return itdb;
+    }
+    return NULL;
+}
+
+
+/* Get the iPod itdb */
+/* FIXME: This function must be expanded if support for several iPods
+   is implemented */
+static iTunesDB *get_itdb_ipod (void)
+{
+    struct itdbs_head *itdbs_head;
+    GList *gl;
+
+    g_return_val_if_fail (gtkpod_window, NULL);
+    itdbs_head = g_object_get_data (G_OBJECT (gtkpod_window),
+				    "itdbs_head");
+    if (!itdbs_head) return NULL;
+    for (gl=itdbs_head->itdbs; gl; gl=gl->next)
+    {
+	iTunesDB *itdb = gl->data;
+	g_return_val_if_fail (itdb, NULL);
+	if (itdb->usertype & GP_ITDB_TYPE_IPOD)
+	    return itdb;
+    }
+    return NULL;
+}
+
+
+/* update "totals" view section */
+void info_update_totals_view (void)
+{
+    guint32 tracks=0, playtime=0; /* playtime in secs */
+    gdouble  filesize=0;          /* in bytes */
+    Playlist *pl;
+    iTunesDB *itdb;
+
+    if (!info_window) return; /* not open */
+    
+    itdb = get_itdb_ipod ();
+    if (itdb)
+    {
+	pl = itdb_playlist_mpl (itdb);
+	g_return_if_fail (pl);
+	fill_in_info (pl->members, &tracks, &playtime, &filesize);
+	fill_label_uint ("total_playlists_ipod",
+			 itdb_playlists_number (itdb)-1);
+	fill_label_uint ("total_tracks_ipod", tracks);
+	fill_label_time ("total_playtime_ipod", playtime);
+	fill_label_size ("total_filesize_ipod", filesize);
+    }
+    itdb = get_itdb_local ();
+    if (itdb)
+    {
+	pl = itdb_playlist_mpl (itdb);
+	g_return_if_fail (pl);
+	fill_in_info (pl->members, &tracks, &playtime, &filesize);
+	fill_label_uint ("total_playlists_local",
+			 itdb_playlists_number (itdb)-1);
+	fill_label_uint ("total_tracks_local", tracks);
+	fill_label_time ("total_playtime_local", playtime);
+	fill_label_size ("total_filesize_local", filesize);
+    }
+    info_update_totals_view_space ();
+}
+
+/* update "free space" section of totals view */
+void info_update_totals_view_space (void)
+{
+    gdouble nt_filesize, del_filesize;
+    guint32 nt_tracks, del_tracks;
+    iTunesDB *itdb;
+
+    if (!info_window) return;
+    itdb = get_itdb_ipod ();
+    if (itdb)
+    {
+	gp_info_nontransferred_tracks (itdb, &nt_filesize, &nt_tracks);
+	fill_label_uint ("non_transferred_tracks", nt_tracks);
+	fill_label_size ("non_transferred_filesize", nt_filesize);
+	gp_info_deleted_tracks (itdb, &del_filesize, &del_tracks);
+	fill_label_uint ("deleted_tracks", del_tracks);
+	fill_label_size ("deleted_filesize", del_filesize);
+	if (!get_offline (itdb))
+	{
+	    if (ipod_connected ())
+	    {
+		gdouble free_space = get_ipod_free_space()
+		    + del_filesize - nt_filesize;
+		fill_label_size ("free_space", free_space);
+	    }
+	    else
+	    {
+		fill_label_string ("free_space", _("n/c"));
+	    }
+	}
+	else
+	{
+	    fill_label_string ("free_space", _("offline"));
+	}
+    }
+}
+
+
+/*------------------------------------------------------------------*\
+ *                                                                  *
+ *                   Functions for Statusbar                        *
+ *                                                                  *
+\*------------------------------------------------------------------*/
+
+void
+gtkpod_statusbar_init(void)
+{
+    gtkpod_statusbar = gtkpod_xml_get_widget (main_window_xml, "gtkpod_status");
+    statusbar_timeout = STATUSBAR_TIMEOUT;
+}
+
+static gint
+gtkpod_statusbar_clear(gpointer data)
+{
+    if(gtkpod_statusbar)
+    {
+	gtk_statusbar_pop(GTK_STATUSBAR(gtkpod_statusbar), 1);
+    }
+    statusbar_timeout_id = 0; /* indicate that timeout handler is
+				 clear (0 cannot be a handler id) */
+    return FALSE;
+}
+
+
+static void
+gtkpod_statusbar_reset_timeout (void)
+{
+    if (statusbar_timeout_id != 0) /* remove last timeout, if still present */
+	gtk_timeout_remove (statusbar_timeout_id);
+    statusbar_timeout_id = gtk_timeout_add (statusbar_timeout,
+					    (GtkFunction) gtkpod_statusbar_clear,
+					    NULL);
+}
+
+void
+gtkpod_statusbar_timeout (guint timeout)
+{
+    if (timeout == 0)
+	statusbar_timeout = STATUSBAR_TIMEOUT;
+    else
+	statusbar_timeout = timeout;
+
+    gtkpod_statusbar_reset_timeout ();
+}
+
+
+void
+gtkpod_statusbar_message(const gchar *message, ...)
+{
+    if(gtkpod_statusbar)
+    {
+	va_list arg;
+	gchar *text;
+	guint context = 1;
+
+	va_start (arg, message);
+	text = g_strdup_vprintf (message, arg);
+	va_end (arg);
+
+	gtk_statusbar_pop(GTK_STATUSBAR(gtkpod_statusbar), context);
+	gtk_statusbar_push(GTK_STATUSBAR(gtkpod_statusbar), context,  text);
+
+	g_free (text);
+
+	gtkpod_statusbar_reset_timeout ();
+    }
+}
+
+void
+gtkpod_tracks_statusbar_init()
+{
+    gtkpod_tracks_statusbar =
+	gtkpod_xml_get_widget (main_window_xml, "tracks_statusbar");
+    gtkpod_tracks_statusbar_update();
+}
+
+void 
+gtkpod_tracks_statusbar_update(void)
+{
+    if(gtkpod_tracks_statusbar)
+    {
+	gchar *buf;
+	Playlist *pl;
+	pl = pm_get_selected_playlist ();
+	/* select of which iTunesDB data should be displayed */
+	if (pl)
+	{
+	    iTunesDB *itdb = pl->itdb;
+	    g_return_if_fail (itdb);
+
+	    buf = g_strdup_printf (_(" P:%d T:%d/%d"),
+				   itdb_playlists_number (itdb) - 1,
+				   tm_get_nr_of_tracks (),
+				   itdb_tracks_number (itdb));
+	}
+	else
+	{
+	    buf = g_strdup ("");
+	}
+	/* gets called before itdbs are setup up -> fail silently */
+/*	g_return_if_fail (itdb);*/
+	
+	gtk_statusbar_pop(GTK_STATUSBAR(gtkpod_tracks_statusbar), 1);
+	gtk_statusbar_push(GTK_STATUSBAR(gtkpod_tracks_statusbar), 1,  buf);
+	g_free (buf);
+    }
+    /* Update info window */
+    info_update ();
+}
+
+/*------------------------------------------------------------------*\
+ *                                                                  *
+ *                       free space stuff                           *
+ *                                                                  *
+\*------------------------------------------------------------------*/
+
+
+/* Since the mount point is used by two separate threads, it can only
+   be accessed securely by using a locking mechanism. Therefore we
+   keep a copy of the mount point here. Access must only be done
+   after locking. */
+void space_set_ipod_itdb (iTunesDB *itdb)
+{
+    const gchar *mp = NULL;
+
+    if (itdb)
+    {
+	ExtraiTunesDBData *eitdb = itdb->userdata;
+	g_return_if_fail (eitdb);
+
+	if (!eitdb->ipod_ejected)
+	{
+	    mp = itdb_get_mountpoint (itdb);
+	}
+    }
+
+    if (space_mutex)  g_mutex_lock (space_mutex);
+
+    space_itdb = itdb;
+
+    /* update the free space data if mount point changed */
+    if (!space_mp || !mp || (strcmp (space_mp, mp) != 0))
+    {
+	g_free (space_mp);
+	space_mp = g_strdup (mp);
+
+	space_data_update ();
+    }
+
+    if (space_mutex)   g_mutex_unlock (space_mutex);
+
+}
+
+/* retrieve the currently set ipod itdb -- needed in case the itdb is
+   deleted */
+iTunesDB *space_get_ipod_itdb (void)
+{
+    return space_itdb;
+}
+
+
+
+/* iPod space has to be reread */
+void space_data_update (void)
+{
+    space_uptodate = FALSE;
+}
+
+
+/* Is the iPod connected? If space_ipod_used and space_ipod_free are
+   both zero, we assume the iPod is not connected */
+gboolean ipod_connected (void)
+{
+    gboolean result;
+    g_return_val_if_fail (space_mutex!=NULL, FALSE);
+    g_mutex_lock (space_mutex);
+    if ((space_ipod_used == 0) && (space_ipod_free == 0)) result = FALSE;
+    else                                                  result = TRUE;
+    g_mutex_unlock (space_mutex);
+    return result;
+}
+
+
+
+/* we'll use statvfs to determine free space on the iPod where
+   available, df otherwise */
+#ifdef HAVE_STATVFS
+#include <sys/types.h>
+#include <sys/statvfs.h>
+/* update space_ipod_free and space_ipod_used */
+static void th_space_update (void)
+{
+    gchar *mp=NULL;
+    struct statvfs stat;
+    int	status;
+
+    g_mutex_lock (space_mutex);
+
+    /* don't read info when in offline mode */
+    if (space_itdb && !get_offline (space_itdb))
+    {
+	mp = g_strdup (space_mp);
+    }
+    if (mp)
+    {
+	status = statvfs (mp, &stat);
+	if (status != 0) {
+	    /* XXX: why would this fail - what to do here??? */
+	    goto done;
+	}
+	space_ipod_free = (gdouble)stat.f_bavail * stat.f_frsize;
+	space_ipod_used = ((gdouble)stat.f_blocks * stat.f_frsize) -
+	    space_ipod_free;
+	space_uptodate = TRUE;
+	
+    } else { /* mp == NULL */
+ 
+	/* this is set even if offline mode */
+	space_ipod_free = 0;
+	space_ipod_used = 0;
+	space_uptodate = FALSE;  /* this way we will detect when the
+				    iPod is connected */
+    }
+
+done:  
+    g_mutex_unlock (space_mutex);
+    g_free (mp);
+}
+
+#else
+static gchar*
+get_drive_stats_from_df(const gchar *mp)
+{
+    FILE *fp;
+    gchar buf[PATH_MAX+1];
+    gchar bufc[PATH_MAX+1];
+    gchar *bufp;
+    gchar *result = NULL;
+    guint bytes_read = 0;
+
+#if 0
+    GTimeVal gtv1, gtv2;
+    long micros;
+    g_get_current_time (&gtv1);
+#endif
+
+    if (g_file_test (mp, G_FILE_TEST_EXISTS))
+    {
+	gchar *df_str = getenv ("GTKPOD_DF_COMMAND");
+	if (df_str == NULL) df_str = "df -k -P";
+	if (strlen (df_str))
+	{
+	    snprintf(bufc, PATH_MAX, "%s \"%s\"", df_str, mp);
+	    fp = popen(bufc, "r");
+	    if(fp)
+	    {
+		if((bytes_read = fread(buf, 1, PATH_MAX, fp)) > 0)
+		{
+		    if((bufp = strchr (buf, '\n')))
+		    {
+			int i = 0;
+			int j = 0;
+			gchar buf2[PATH_MAX+3];
+
+			++bufp; /* skip '\n' */
+			while((bufp - buf + i < bytes_read) &&
+			      (j < PATH_MAX))
+			{
+			    while(!g_ascii_isspace(bufp[i]) &&
+				  (j<PATH_MAX))
+			    {
+				buf2[j++] = bufp[i++];
+			    }
+			    buf2[j++] = ' ';
+			    while((bufp - buf + i < bytes_read) &&
+				  g_ascii_isspace(bufp[i]))
+			    {
+				i++;
+			    }
+			}
+			buf2[j] = '\0';
+			result = g_strdup_printf("%s", buf2);
+		    }
+		}
+		pclose(fp);	
+	    }
+	}
+    }
+#if 0
+    g_get_current_time (&gtv2);
+    micros = (gtv2.tv_sec-gtv1.tv_sec)*10000000 + (gtv2.tv_usec-gtv1.tv_usec);
+    printf ("df: %ld usec\n", micros);
+#endif
+    return(result);
+}
+
+
+/* update space_ipod_free and space_ipod_used */
+static void th_space_update (void)
+{
+    gchar *mp=NULL, *line=NULL;
+    gchar **tokens = NULL;
+
+    /* don't read info when in offline mode */
+    if (!prefs_get_offline ())
+    {
+	g_mutex_lock (space_mutex);
+	mp = g_strdup (space_mp);
+	g_mutex_unlock (space_mutex);
+
+	line = get_drive_stats_from_df (mp);
+    }
+
+    g_mutex_lock (space_mutex);
+
+    if (line) tokens = g_strsplit(line, " ", 5);
+    if (tokens && tokens[0] && tokens[1] && tokens[2] && tokens[3])
+    {
+	space_ipod_free = g_strtod (tokens[3], NULL) * 1024;
+	space_ipod_used = g_strtod (tokens[2], NULL) * 1024;
+	space_uptodate = TRUE;
+    }
+    else
+    {
+	/* this is set even if offline mode */
+	space_ipod_free = 0;
+	space_ipod_used = 0;
+	space_uptodate = FALSE;  /* this way we will detect when the
+				    iPod is connected */
+    }
+    g_mutex_unlock (space_mutex);
+    g_free (mp);
+    g_strfreev(tokens);
+}
+#endif
+
+
+/* keep space_ipod_free/used updated in regular intervals */
+static gpointer th_space_thread (gpointer gp)
+{
+    struct timespec req;
+
+    req.tv_sec = SPACE_TIMEOUT / 1000;
+    req.tv_nsec = (SPACE_TIMEOUT % 1000) * 1000000;
+
+    for (;;)
+    {
+	nanosleep (&req, NULL);
+	if (!space_uptodate)   th_space_update ();
+    }
+    /* To make gcc happy (never reached) */
+    return (gpointer)NULL;
+}
+
+
+/* in Bytes */
+static gdouble get_ipod_free_space(void)
+{
+    gdouble result;
+    g_mutex_lock (space_mutex);
+    result = space_ipod_free;
+    g_mutex_unlock (space_mutex);
+    return result;
+}
+
+#if 0
+/* in Bytes */
+static gdouble get_ipod_used_space(void)
+{
+    gdouble result;
+    g_mutex_lock (space_mutex);
+    result = space_ipod_used;
+    g_mutex_unlock (space_mutex);
+    return result;
+}
+#endif
+
+
+/* @size: size in B */
+gchar*
+get_filesize_as_string(gdouble size)
+{
+    guint i = 0;
+    gchar *result = NULL;
+    gchar *sizes[] = { _("B"), _("kB"), _("MB"), _("GB"), _("TB"), NULL };
+
+    while((fabs(size) > 1024) && (i<4))
+    {
+	size /= 1024;
+	++i;
+    }
+    if (i>0)
+    {
+	if (fabs(size) < 10)
+	    result = g_strdup_printf("%0.2f %s", size, sizes[i]);
+	else if (fabs(size) < 100)
+	    result = g_strdup_printf("%0.1f %s", size, sizes[i]);
+	else
+	    result = g_strdup_printf("%0.0f %s", size, sizes[i]);
+    }
+    else
+    {   /* Bytes do not have decimal places */
+	result = g_strdup_printf ("%0.0f %s", size, sizes[i]);
+    }
+    return result;
+}
+
+static guint
+gtkpod_space_statusbar_update(void)
+{
+    if(space_itdb && gtkpod_space_statusbar)
+    {
+	gchar *buf = NULL;
+	gchar *str = NULL;
+
+	if (!get_offline (space_itdb))
+	{
+	    if (ipod_connected ())
+	    {
+		gdouble left, pending, deleted;
+
+		gp_info_deleted_tracks (space_itdb, &deleted, NULL);
+		gp_info_nontransferred_tracks (space_itdb, &pending, NULL);
+		left = get_ipod_free_space() + deleted;
+		if((left-pending) > 0)
+		{
+		    str = get_filesize_as_string(left - pending);
+		    buf = g_strdup_printf (_(" %s Free"), str);
+		}
+		else
+		{
+		    str = get_filesize_as_string(pending - left);
+		    buf = g_strdup_printf (_(" %s Pending"), str);
+		}
+	    }
+	    else
+	    {
+		buf = g_strdup (_(" disconnected"));
+	    }
+	}
+	else
+	{
+	    buf = g_strdup (_("offline"));
+	}
+	gtk_statusbar_pop(GTK_STATUSBAR(gtkpod_space_statusbar), 1);
+	gtk_statusbar_push(GTK_STATUSBAR(gtkpod_space_statusbar), 1,  buf);
+	g_free (buf);
+	g_free (str);
+    }
+    info_update_totals_view_space ();
+    return TRUE;
+}
+
+void
+gtkpod_space_statusbar_init(void)
+{
+    gtkpod_space_statusbar = gtkpod_xml_get_widget (main_window_xml, "space_statusbar");
+
+    if (!space_mutex)
+    {
+	space_mutex = g_mutex_new ();
+	if (!space_mp)
+	{
+	    iTunesDB *itdb = gp_get_ipod_itdb ();
+
+	    if (itdb)
+	    {
+		space_mp = get_itdb_prefs_string (itdb, KEY_MOUNTPOINT);
+		th_space_update ();  /* make sure we have current data */
+	    }
+	}
+	space_thread = g_thread_create (th_space_thread,
+					    NULL, FALSE, NULL);
+    }
+    gtkpod_space_statusbar_update();
+    gtk_timeout_add(1000, (GtkFunction) gtkpod_space_statusbar_update, NULL);
+}
+
+
+
+/*------------------------------------------------------------------*\
+ *                                                                  *
+ *              Frequently used error messages                      *
+ *                                                                  *
+\*------------------------------------------------------------------*/
+
+void message_sb_no_itdb_selected ()
+{
+    gtkpod_statusbar_message (_("No database or playlist selected"));
+}
+
+void message_sb_no_tracks_selected ()
+{
+    gtkpod_statusbar_message (_("No tracks selected"));
+}
+
+void message_sb_no_playlist_selected ()
+{
+    gtkpod_statusbar_message (_("No playlist selected"));
+}
+
+void message_sb_no_ipod_itdb_selected ()
+{
+    gtkpod_statusbar_message (_("No iPod or iPod playlist selected"));
+}
+

Added: trunk/src/info.h
===================================================================
--- trunk/src/info.h	                        (rev 0)
+++ trunk/src/info.h	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,71 @@
+/*
+|  Copyright (C) 2002-2007 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+| 
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+| 
+|  iTunes and iPod are trademarks of Apple
+| 
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: info.h 1065 2007-05-06 14:16:17Z jcsjcs $
+*/
+
+#ifndef __INFO_H__
+#define __INFO_H__
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+ 
+#include <glib.h>
+#include "itdb.h"
+
+/* info window */
+void info_open_window (void);
+void info_close_window (void);
+void info_update_default_sizes (void);
+void info_update (void);
+void info_update_track_view (void);
+void info_update_track_view_selected (void);
+void info_update_playlist_view (void);
+void info_update_totals_view (void);
+void info_update_totals_view_space (void);
+
+/* statusbar stuff */
+#define STATUSBAR_TIMEOUT 4200
+void gtkpod_statusbar_init(void);
+void gtkpod_statusbar_message(const gchar *message, ...);
+void gtkpod_statusbar_timeout (guint timeout);
+void gtkpod_space_statusbar_init(void);
+void gtkpod_tracks_statusbar_init(void);
+void gtkpod_tracks_statusbar_update(void);
+
+/* space stuff */
+void space_set_ipod_itdb (iTunesDB *itdb);
+iTunesDB *space_get_ipod_itdb (void);
+void space_data_update (void);
+gboolean ipod_connected (void);
+
+/* standard messages */
+void message_sb_no_itdb_selected (void);
+void message_sb_no_tracks_selected (void);
+void message_sb_no_playlist_selected (void);
+void message_sb_no_ipod_itdb_selected (void);
+
+#endif

Added: trunk/src/ipod_init.c
===================================================================
--- trunk/src/ipod_init.c	                        (rev 0)
+++ trunk/src/ipod_init.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,485 @@
+/* Time-stamp: <2007-06-19 22:52:52 jcs>
+|
+|  Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+| 
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+| 
+|  iTunes and iPod are trademarks of Apple
+| 
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: ipod_init.c 1564 2007-06-19 13:54:47Z jcsjcs $
+*/
+
+/* This file provides functions to initialize a new iPod */
+
+#include "ipod_init.h"
+#include "prefs.h"
+#include "misc.h"
+#include "fileselection.h"
+#include <string.h>
+
+struct _IpodInit
+{
+    GladeXML *xml;           /* XML info                             */
+    GtkWidget *window;       /* pointer to repository window         */
+    iTunesDB *itdb;
+};
+
+typedef struct _IpodInit IpodInit;
+
+/* Strings used several times */
+const gchar *SELECT_OR_ENTER_YOUR_MODEL=N_("Select or enter your model");
+
+/* string constants for window widgets used more than once */
+static const gchar *MOUNTPOINT_ENTRY="mountpoint_entry";
+static const gchar *MOUNTPOINT_BUTTON="mountpoint_button";
+static const gchar *MODEL_COMBO="model_combo";
+
+/* Columns for the model_combo tree model */
+enum
+{
+    COL_POINTER,
+    COL_STRING
+};
+
+
+/* shortcut to reference widgets when ii->xml is already set */
+#define GET_WIDGET(a) gtkpod_xml_get_widget (ii->xml,a)
+
+/* mountpoint browse button was clicked -> open a directory browser
+ * and copy the result into the mountpoint entry. */
+static void mountpoint_button_clicked (GtkButton *button, IpodInit *ii)
+{
+    const gchar *old_dir;
+    gchar *new_dir;
+
+    g_return_if_fail (ii);
+
+    old_dir = gtk_entry_get_text (
+	GTK_ENTRY (GET_WIDGET (MOUNTPOINT_ENTRY)));
+
+    new_dir = fileselection_get_file_or_dir (
+	_("Select mountpoint"),
+	old_dir,
+	GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
+
+    if (new_dir)
+    {
+	gtk_entry_set_text (GTK_ENTRY (GET_WIDGET (MOUNTPOINT_ENTRY)),
+			    new_dir);
+	g_free (new_dir);
+    }
+}
+
+
+static void
+set_cell (GtkCellLayout   *cell_layout,
+	  GtkCellRenderer *cell,
+	  GtkTreeModel    *tree_model,
+	  GtkTreeIter     *iter,
+	  gpointer         data)
+{
+  gboolean header;
+  gchar *text;
+  IpodInfo *info;
+
+  gtk_tree_model_get (tree_model, iter, COL_POINTER, &info, -1);
+  g_return_if_fail (info);
+
+  header = gtk_tree_model_iter_has_child (tree_model, iter);
+
+  if (header)
+  {
+      text = g_strdup (
+	  itdb_info_get_ipod_generation_string (info->ipod_generation));
+  }
+  else
+  {
+      if (info->capacity >= 1)
+      {   /* size in GB */
+	  text = g_strdup_printf ("%2.0f GB %s (x%s)",
+				  info->capacity,
+				  itdb_info_get_ipod_model_name_string (
+				      info->ipod_model),
+				  info->model_number);
+      }
+      else if (info->capacity > 0)
+      {   /* size in MB */
+	  text = g_strdup_printf ("%3.0f MB %s (x%s)",
+				  info->capacity * 1024,
+				  itdb_info_get_ipod_model_name_string (
+				      info->ipod_model),
+				  info->model_number);
+      }
+      else
+      {   /* no capacity information available */
+	  text = g_strdup_printf ("%s (x%s)",
+				  itdb_info_get_ipod_model_name_string (
+				      info->ipod_model),
+				  info->model_number);
+      }
+  }
+
+  g_object_set (cell,
+		"sensitive", !header,
+		"text", text,
+		NULL);
+
+  g_free (text);
+}
+
+
+
+/**
+ * gp_init_model_number_combo:
+ *
+ * Set up the the model for a model_number combo with all iPod models
+ * known to libgpod.
+ *
+ * @cb: the combobox that should be set up with a model.
+ */
+void gp_init_model_number_combo (GtkComboBox *cb)
+{
+    const IpodInfo *table;
+    Itdb_IpodGeneration generation;
+    GtkCellRenderer *renderer;
+    GtkTreeStore *store;
+    gboolean info_found;
+    gchar buf[PATH_MAX];
+
+    table = itdb_info_get_ipod_info_table ();
+    g_return_if_fail (table);
+
+    /* We need the G_TYPE_STRING column because GtkComboBoxEntry
+       requires it */
+    store = gtk_tree_store_new (2, G_TYPE_POINTER, G_TYPE_STRING);
+
+
+    /* Create a tree model with the model numbers listed as a branch
+       under each generation */
+    generation = ITDB_IPOD_GENERATION_FIRST;
+    do
+    {
+	GtkTreeIter iter;
+	const IpodInfo *info = table;
+	info_found = FALSE;
+
+	while (info->model_number)
+	{
+	    if (info->ipod_generation == generation)
+	    {
+		GtkTreeIter iter_child;
+		if (!info_found)
+		{
+		    gtk_tree_store_append (store, &iter, NULL);
+		    gtk_tree_store_set (store, &iter,
+					COL_POINTER, info,
+					COL_STRING, "",
+					-1);
+		    info_found = TRUE;
+		}
+		gtk_tree_store_append (store, &iter_child, &iter);
+		/* gtk_tree_store_set() is intelligent enough to copy
+		   strings we pass to it */
+		g_snprintf (buf, PATH_MAX, "x%s", info->model_number);
+		gtk_tree_store_set (store, &iter_child,
+				    COL_POINTER, info,
+				    COL_STRING, buf,
+				    -1);
+	    }
+	    ++info;
+	}
+	++generation;
+    } while (info_found);
+
+    /* set the model, specify the text column, and clear the cell
+       layout (glade seems to automatically add a text column which
+       messes up the entire layout) */
+    gtk_combo_box_set_model (cb, GTK_TREE_MODEL (store));
+    g_object_unref (store);
+    gtk_combo_box_entry_set_text_column (GTK_COMBO_BOX_ENTRY (cb),
+					 COL_STRING);
+    gtk_cell_layout_clear (GTK_CELL_LAYOUT (cb));
+
+    renderer = gtk_cell_renderer_text_new ();
+    gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (cb), renderer, FALSE);
+    gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (cb),
+					renderer,
+					set_cell,
+					NULL, NULL);
+}
+
+
+/**
+ * gp_ipod_init:
+ *
+ * Ask for the iPod model and mountpoint and then create the directory
+ * structure on the iPod.
+ *
+ * @itdb: itdb from where to extract the mountpoint. After
+ * initialisation the model number is set.
+ */
+gboolean gp_ipod_init (iTunesDB *itdb)
+{
+    IpodInit *ii;
+    gint response;
+    gboolean result = FALSE;
+    gchar *mountpoint, *new_mount, *name, *model;
+    GError *error = NULL;
+    GtkEntry *entry;
+    gchar buf[PATH_MAX];
+    GtkComboBox *cb;
+    const IpodInfo *info;
+
+    g_return_val_if_fail (itdb, FALSE);
+
+    /* Create window */
+    ii = g_new0 (IpodInit, 1);
+    ii->itdb = itdb;
+    ii->xml = glade_xml_new (xml_file, "ipod_init_dialog", NULL);
+    ii->window = gtkpod_xml_get_widget (ii->xml,
+					"ipod_init_dialog");
+    g_return_val_if_fail (ii->window, FALSE);
+
+    /* Set mountpoint */
+    mountpoint = get_itdb_prefs_string (itdb, KEY_MOUNTPOINT);
+    if (mountpoint)
+    {
+	gtk_entry_set_text (GTK_ENTRY (GET_WIDGET (MOUNTPOINT_ENTRY)),
+			    mountpoint);
+    }
+
+    /* Signal handlers */
+    g_signal_connect (GET_WIDGET (MOUNTPOINT_BUTTON), "clicked",
+		      G_CALLBACK (mountpoint_button_clicked), ii);
+
+
+    /* Setup model number combo */
+    cb = GTK_COMBO_BOX (GET_WIDGET (MODEL_COMBO));
+    gp_init_model_number_combo (cb);
+
+    /* If available set current model number, otherwise indicate that
+       none is available */
+    /* If available set current model number, otherwise indicate that
+       none is available */
+    info = itdb_device_get_ipod_info (itdb->device);
+    if (info && (info->ipod_generation != ITDB_IPOD_GENERATION_UNKNOWN))
+    {
+	g_snprintf (buf, PATH_MAX, "x%s", info->model_number);
+    }
+    else
+    {
+	model = get_itdb_prefs_string (itdb, KEY_IPOD_MODEL);
+	if (model && (strlen (g_strstrip (model)) != 0))
+	{
+	    g_snprintf (buf, PATH_MAX, "%s", model);
+	    g_free (model);
+	}
+	else
+	{
+	    g_snprintf (buf, PATH_MAX, "%s", gettext (SELECT_OR_ENTER_YOUR_MODEL));
+	}
+    }
+    entry = GTK_ENTRY (gtk_bin_get_child(GTK_BIN (cb)));
+    gtk_entry_set_text (entry, buf);
+
+    response = gtk_dialog_run (GTK_DIALOG (ii->window));
+
+    switch (response)
+    {
+    case GTK_RESPONSE_OK:
+	new_mount = g_strdup (
+	    gtk_entry_get_text (
+		GTK_ENTRY (GET_WIDGET (MOUNTPOINT_ENTRY))));
+	/* remove trailing '/' in case it's present. */
+	if (mountpoint && (strlen (mountpoint) > 0))
+	{
+	    if (G_IS_DIR_SEPARATOR(mountpoint[strlen(mountpoint) - 1]))
+	    {
+		mountpoint[strlen(mountpoint) - 1] = 0;
+	    }
+	}
+	if (new_mount && (strlen (new_mount) > 0))
+	{
+	    if (G_IS_DIR_SEPARATOR(new_mount[strlen(new_mount) - 1]))
+	    {
+		new_mount[strlen(new_mount) - 1] = 0;
+	    }
+	}
+	if (!(mountpoint && new_mount &&
+	      (strcmp (mountpoint, new_mount) == 0)))
+	{   /* mountpoint has changed */
+	    g_free (mountpoint);
+	    mountpoint = new_mount;
+	    new_mount = NULL;
+	    set_itdb_prefs_string (itdb, KEY_MOUNTPOINT, mountpoint);
+	    call_script ("gtkpod.load", mountpoint, NULL);
+	    itdb_set_mountpoint (itdb, mountpoint);
+	}
+	else
+	{
+	    g_free (new_mount);
+	    new_mount = NULL;
+	}
+	model = gtk_combo_box_get_active_text (
+	    GTK_COMBO_BOX (GET_WIDGET (MODEL_COMBO)));
+	if ((strcmp (model, gettext(SELECT_OR_ENTER_YOUR_MODEL)) == 0) ||
+	    (strlen (model) == 0))
+	{   /* User didn't choose a model */
+	    g_free (model);
+	    model = NULL;
+	}
+
+	/* Set model in the prefs system */
+	set_itdb_prefs_string (itdb, KEY_IPOD_MODEL, model);
+
+	name = get_itdb_prefs_string (itdb, "name");
+	result = itdb_init_ipod (mountpoint, model, name, &error);
+	if (!result)
+	{
+	    if (error)
+	    {
+		gtkpod_warning (_("Error initialising iPod: %s\n"),
+				error->message);
+		g_error_free (error);
+		error = NULL;
+	    }
+	    else
+	    {
+		gtkpod_warning (_("Error initialising iPod, unknown error\n"));
+	    }
+	}
+	g_free (name);
+	g_free (model);
+	break;
+    default:
+	/* canceled -- do nothing */
+	break;
+    }
+
+    gtk_widget_destroy (ii->window);
+
+    g_free (mountpoint);
+
+    g_free (ii);
+
+    return result;
+}
+
+
+/* Redefine shortcut to reference widgets.*/
+#undef GET_WIDGET
+#define GET_WIDGET(a) gtkpod_xml_get_widget (xml,a)
+
+
+/**
+ * gp_ipod_init_set_model:
+ *
+ * Ask for the iPod model, pre-select @old_model, set the selected
+ * model in the preferences.
+ *
+ * @itdb: the itdb to set
+ * @old_model: the model number string to initially propose.
+ */
+void gp_ipod_init_set_model (iTunesDB *itdb, const gchar *old_model)
+{
+    GladeXML *xml;
+    GtkWidget *window;
+    gint response;
+    gchar *model, *mountpoint;
+    GtkEntry *entry;
+    gchar buf[PATH_MAX];
+    GtkComboBox *cb;
+    const IpodInfo *info;
+
+    g_return_if_fail (itdb);
+
+    /* Create window */
+    xml = glade_xml_new (xml_file, "set_ipod_model_dialog", NULL);
+    window = GET_WIDGET ("set_ipod_model_dialog");
+    g_return_if_fail (window);
+
+    /* Set up label */
+    mountpoint = get_itdb_prefs_string (itdb, KEY_MOUNTPOINT);
+    g_return_if_fail (mountpoint);
+    g_snprintf (buf, PATH_MAX, _("<b>Please select your iPod model at </b><i>%s</i>"), mountpoint);
+    gtk_label_set_markup (GTK_LABEL (GET_WIDGET ("label")), buf);
+    g_free (mountpoint);
+
+    /* Setup model number combo */
+    cb = GTK_COMBO_BOX (GET_WIDGET (MODEL_COMBO));
+    gp_init_model_number_combo (cb);
+
+    /* If available set current model number, otherwise indicate that
+       none is available */
+    info = itdb_device_get_ipod_info (itdb->device);
+    if (info && (info->ipod_generation != ITDB_IPOD_GENERATION_UNKNOWN))
+    {
+	g_snprintf (buf, PATH_MAX, "x%s", info->model_number);
+    }
+    else
+    {
+	model = get_itdb_prefs_string (itdb, KEY_IPOD_MODEL);
+	if (model && (strlen (g_strstrip (model)) != 0))
+	{
+	    g_snprintf (buf, PATH_MAX, "%s", model);
+	    g_free (model);
+	}
+	else
+	{
+	    g_snprintf (buf, PATH_MAX, "%s", gettext (SELECT_OR_ENTER_YOUR_MODEL));
+	}
+    }
+
+    entry = GTK_ENTRY (gtk_bin_get_child(GTK_BIN (cb)));
+    gtk_entry_set_text (entry, buf);
+
+    response = gtk_dialog_run (GTK_DIALOG (window));
+
+    switch (response)
+    {
+    case GTK_RESPONSE_OK:
+	model = gtk_combo_box_get_active_text (
+	    GTK_COMBO_BOX (GET_WIDGET (MODEL_COMBO)));
+	if (!model)
+	{
+	    gtkpod_warning (_("Could not determine the model you selected -- this could be a bug or incompatibilty in the GTK+ or glade library.\n\n"));
+	}
+	else if (strcmp (model, gettext(SELECT_OR_ENTER_YOUR_MODEL)) == 0)
+	{   /* User didn't choose a model */
+	    g_free (model);
+	    model = NULL;
+	}
+	if (model)
+	{
+	    /* Set model in the prefs system */
+	    set_itdb_prefs_string (itdb, KEY_IPOD_MODEL, model);
+	    /* Set the model on the iPod */
+	    itdb_device_set_sysinfo (itdb->device, "ModelNumStr", model);
+	    g_free (model);
+	}
+	break;
+    default:
+	/* canceled -- do nothing */
+	break;
+    }
+
+    gtk_widget_destroy (window);
+}

Added: trunk/src/ipod_init.h
===================================================================
--- trunk/src/ipod_init.h	                        (rev 0)
+++ trunk/src/ipod_init.h	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,46 @@
+/* Time-stamp: <2006-06-10 18:20:18 jcs>
+|
+|  Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+| 
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+| 
+|  iTunes and iPod are trademarks of Apple
+| 
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: ipod_init.h 813 2006-06-10 10:38:59Z jcsjcs $
+*/
+
+#ifndef __IPOD_INIT_H__
+#define __IPOD_INIT_H__
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+ 
+#include <gtk/gtk.h>
+#include "itdb.h"
+
+
+extern const gchar *SELECT_OR_ENTER_YOUR_MODEL;
+
+gboolean gp_ipod_init (iTunesDB *itdb);
+void gp_init_model_number_combo (GtkComboBox *cb);
+void gp_ipod_init_set_model (iTunesDB *itdb, const gchar *old_model);
+#endif

Added: trunk/src/itdb.h
===================================================================
--- trunk/src/itdb.h	                        (rev 0)
+++ trunk/src/itdb.h	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,53 @@
+/* Time-stamp: <2006-06-05 21:34:12 jcs>
+|
+|  Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  Most of the code in this file has been ported from the perl
+|  script "mktunes.pl" (part of the gnupod-tools collection) written
+|  by Adrian Ulrich <pab at blinkenlights.ch>.
+|
+|  gnupod-tools: http://www.blinkenlights.ch/cgi-bin/fm.pl?get=ipod
+|
+|  The code contained in this file is free software; you can redistribute
+|  it and/or modify it under the terms of the GNU Lesser General Public
+|  License as published by the Free Software Foundation; either version
+|  2.1 of the License, or (at your option) any later version.
+|
+|  This file 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
+|  Lesser General Public License for more details.
+|
+|  You should have received a copy of the GNU Lesser General Public
+|  License along with this code; if not, write to the Free Software
+|  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: itdb.h 1750 2007-11-01 21:57:01Z phantom_sf $
+*/
+
+#ifndef ITDB_H
+#define ITDB_H
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <gpod/itdb.h>
+
+typedef Itdb_iTunesDB iTunesDB;
+typedef Itdb_Playlist Playlist;
+typedef Itdb_Track Track;
+typedef Itdb_Thumb Thumb;
+typedef Itdb_Artwork Artwork;
+typedef Itdb_IpodInfo IpodInfo;
+typedef Itdb_PhotoDB PhotoDB;
+typedef Itdb_PhotoAlbum PhotoAlbum;
+#endif

Added: trunk/src/main.c
===================================================================
--- trunk/src/main.c	                        (rev 0)
+++ trunk/src/main.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,73 @@
+/*
+|  Copyright (C) 2002-2007 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: main.c 1053 2007-04-23 15:33:31Z jcsjcs $
+*/
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <time.h>
+
+#include "display.h"
+#include "misc.h"
+
+/* path to gtkpod.glade */
+gchar *xml_file = NULL;
+
+int
+main (int argc, char *argv[])
+{
+#ifdef ENABLE_NLS
+    bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);
+    bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+    textdomain (GETTEXT_PACKAGE);
+#endif
+
+#ifdef G_THREADS_ENABLED
+    /* this must be called before gtk_init () */
+    g_thread_init (NULL);
+    /* FIXME: this call causes gtkpod to freeze as soon as tracks should be
+       displayed */
+    gdk_threads_init ();
+#endif
+
+    gdk_threads_enter ();
+
+    gtk_init (&argc, &argv);
+
+    srand(time(NULL));
+
+    gtkpod_init (argc, argv);
+
+    gtk_main ();
+
+    gdk_threads_leave ();
+
+    /* all the cleanup is already done in gtkpod_main_shutdown () in misc.c */
+    return 0;
+}

Added: trunk/src/misc.c
===================================================================
--- trunk/src/misc.c	                        (rev 0)
+++ trunk/src/misc.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,1926 @@
+/* -*- coding: utf-8; -*-
+|
+|  Copyright (C) 2002-2007 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: misc.c 1822 2007-12-12 16:31:26Z dforsi $
+*/
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <errno.h>
+#include <gtk/gtk.h>
+#include <glib/gstdio.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <unistd.h>
+#include "autodetection.h"
+#include "charset.h"
+#include "clientserver.h"
+#include "file_convert.h"
+#include "misc.h"
+#include "prefs.h"
+#include "misc_track.h"
+#include "display_photo.h"
+#include "stock_icons.h"
+
+#define DEBUG_MISC 0
+
+
+/* where to find the scripts */
+const gchar *SCRIPTDIR = PACKAGE_DATA_DIR G_DIR_SEPARATOR_S PACKAGE G_DIR_SEPARATOR_S "scripts" G_DIR_SEPARATOR_S;
+
+
+/*------------------------------------------------------------------*\
+ *                                                                  *
+ *             About Window                                         *
+ *                                                                  *
+\*------------------------------------------------------------------*/
+
+/* ATTENTION: directly used as callback in gtkpod.glade -- if you
+   change the arguments of this function make sure you define a
+   separate callback for gtkpod.glade */
+void open_about_window ()
+{
+	const gchar *authors[] = {
+		_("© 2002 - 2007\n"
+		    "Jorg Schuler (jcsjcs at users dot sourceforge dot net)\n"
+		    "Corey Donohoe (atmos at atmos dot org)\n"
+		    ""),
+		_("Patches were supplied by the following people (list may be incomplete -- please contact me)\n"),
+		_("Ramesh Dharan: Multi-Edit (edit tags of several tracks in one run)"),
+		_("Hiroshi Kawashima: Japanese charset autodetection feature"),
+		_("Adrian Ulrich: porting of playlist code from mktunes.pl to itunesdb.c"),
+		_("Walter Bell: correct handling of DND URIs with escaped characters and/or cr/newlines at the end"),
+		_("Sam Clegg: user defined filenames when exporting tracks from the iPod"),
+		_("Chris Cutler: automatic creation of various playlist types"),
+		_("Graeme Wilford: reading and writing of the 'Composer' ID3 tags, progress dialogue during sync"),
+		_("Edward Matteucci: debugging, special playlist creation, most of the volume normalizing code"),
+		_("Jens Lautenbach: some optical improvements"),
+		_("Alex Tribble: iPod eject patch"),
+		_("Yaroslav Halchenko: Orphaned and dangling tracks handling"),
+		_("Andrew Huntwork: Filename case sensitivity fix and various other bugfixes"),
+		_("Ero Carrera: Filename validation and quick sync when copying tracks from the iPod"),
+		_("Jens Taprogge: Support for LAME's replay gain tag to normalize volume"),
+		_("Armando Atienza: Support with external playcounts"),
+		_("D.L. Sharp: Support for m4b files (bookmarkable AAC files)"),
+		_("Jim Hall: Decent INSTALL file"),
+		_("Juergen Helmers, Markus Gaugusch: Conversion scripts to sync calendar/contacts to the iPod"),    /* J"urgen! */
+		_("Flavio Stanchina: bugfixes"),
+		_("Chris Micacchi: when sorting ignore 'the' and similar at the beginning of the title"),
+		_("Steve Jay: use statvfs() instead of df (better portability, faster)"),
+		"",
+		_("Christoph Kunz: address compatibility issues when writing id3v2.4 type mp3 tags"),
+		"",
+		_("James Liggett:\n"
+		    "replacement of old GTK file selection dialogs with new GTK filechooser dialogs\n"
+		    "refactored user preferences system."),
+		"",
+		_("Daniel Kercher: sync scripts for abook and webcalendar"),
+		"",
+		_("Clinton Gormley: sync scripts for thunderbird"),
+		"",
+		_("Sebastien Beridot: sync script for ldif addressbook format"),
+		"",
+		_("Sebastian Scherer: sync script for kNotes"),
+		"",
+		_("Nick Piper: sync script for Palm, type-ahead search"),
+		"",
+		_("Uwe Hermann: help with support for iPod Video"),
+		"",
+		_("Iain Benson: support for compilation tag in mp3 files and separate display of compilations in the sort tab."),
+		_("Nicolas Chariot: icons of buttons\n"
+		    "\n"),
+		_("This program borrows code from the following projects:"),
+		_("gnutools: (mktunes.pl, ported to C) reading and writing of iTunesDB  (http://www.gnu.org/software/gnupod/)"),
+		_("iPod.cpp, iPod.h by Samuel Wood (sam dot wood at gmail dot com): some code for smart playlists is based on his C++-classes."),
+		_("mp3info: mp3 playlength detection (http://ibiblio.org/mp3info/)"),
+		_("xmms: dirbrowser, mp3 playlength detection (http://www.xmms.org)"),
+		"",
+		_("The GUI was created with the help of glade-2 (http://glade.gnome.org/)."),
+		NULL };
+
+	gchar  *translators[] = {
+		_("French: David Le Brun (david at dyn-ns dot net)"),
+		_("French: Éric Lassauge (rpmfarm at free dot fr)"),
+		_("German: Jorg Schuler (jcsjcs at users dot sourceforge dot net)"),
+		_("German: Kai-Ove"),
+		_("Hebrew: Assaf Gillat (gillata at gmail dot com)"),
+		_("Italian: Edward Matteucci (edward_matteucc at users dot sourceforge dot net)"),
+		_("Italian: Daniele Forsi (dforsi at gmail dot com)"),
+		_("Japanese: Ayako Sano"),
+		_("Japanese: Kentaro Fukuchi (fukuchi at users dot sourceforge dot net)"),
+		_("Romanian: Alex Eftimie (alexeftimie at gmail dot com)"),
+		_("Spanish: Alejandro Lamas Daviña (alejandro.lamas at ific dot uv dot es)"),
+		_("Swedish: Stefan Asserhall (stefan.asserhall at comhem dot se)"),
+		NULL
+	};
+
+	gchar *license = _(
+		"This program is free software; you can redistribute it and/or\n"
+		"modify it under the terms of the GNU General Public License as\n"
+		"published by the Free Software Foundation; either version 2 of the\n"
+		"License, or (at your option) any later version.\n"
+		"\n"
+		"This program is distributed in the hope that it will be useful, but\n"
+		"WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+		"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See\n"
+		"the GNU General Public License for more details.\n"
+		"\n"
+		"You should have received a copy of the GNU General Public\n"
+		"License along with this program; if not, write to the Free Software\n"
+		"Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA\n02111-1307, USA."
+	);
+
+	gchar *copyright = _("© 2002-2007\nJorg Schuler <jcsjcs at users.sourceforge.net>\nCorey Donohoe <atmos at atmos.org>");
+	gchar *translator_credits = g_strjoinv("\n", translators);
+	GdkPixbuf *icon = gdk_pixbuf_new_from_file(PACKAGE_DATA_DIR G_DIR_SEPARATOR_S PACKAGE G_DIR_SEPARATOR_S "data" G_DIR_SEPARATOR_S "gtkpod-logo.png", NULL);
+
+	gtk_show_about_dialog(GTK_WINDOW(gtkpod_window),
+		"name", "gtkpod",
+		"version", VERSION,
+		"logo", icon,
+		"comments", _("Cross-platform multilingual interface to Apple's iPod™"),
+		"copyright", copyright,
+		"website", "http://gtkpod.org",
+		"license", license,
+		"authors", authors,
+		"translator_credits", translator_credits,
+		NULL);
+
+	g_free(translator_credits);
+
+	if(icon)
+		g_object_unref(icon);
+}
+
+
+/*------------------------------------------------------------------*\
+ *                                                                  *
+ *             Miscellaneous                                        *
+ *                                                                  *
+\*------------------------------------------------------------------*/
+
+
+/* Calculate the time in ms passed since @old_time. @old_time is
+   updated with the current time if @update is TRUE*/
+float get_ms_since (GTimeVal *old_time, gboolean update)
+{
+    GTimeVal new_time;
+    float result;
+
+    g_get_current_time (&new_time);
+    result = (new_time.tv_sec - old_time->tv_sec) * 1000 +
+	(float)(new_time.tv_usec - old_time->tv_usec) / 1000;
+    if (update)
+    {
+	old_time->tv_sec = new_time.tv_sec;
+	old_time->tv_usec = new_time.tv_usec;
+    }
+    return result;
+}
+
+/* parse a bunch of track pointers delimited by \n
+ * @s - address of the character string we're parsing (gets updated)
+ * @track - pointer the track pointer parsed from the string
+ * Returns FALSE when the string is empty, TRUE when the string can still be
+ *	parsed
+ */
+gboolean
+parse_tracks_from_string(gchar **s, Track **track)
+{
+    g_return_val_if_fail (track, FALSE);
+    *track = NULL;
+    g_return_val_if_fail (s, FALSE);
+
+    if(*s)
+    {
+	gchar *str = *s;
+	gchar *strp = strchr (str, '\n');
+	int tokens;
+
+	if (strp == NULL)
+	{
+	    *track = NULL;
+	    *s = NULL;
+	    return FALSE;
+	}
+	tokens = sscanf (str, "%p", track);
+	++strp;
+	if (*strp) *s = strp;
+	else       *s = NULL;
+	if (tokens == 1) 	return TRUE;
+	else                    return FALSE;
+    }
+    return FALSE;
+}
+
+gboolean
+parse_artwork_from_string(gchar **s, Artwork **artwork)
+{
+    g_return_val_if_fail (artwork, FALSE);
+    *artwork = NULL;
+    g_return_val_if_fail (s, FALSE);
+
+    if(*s)
+    {
+	gchar *str = *s;
+	gchar *strp = strchr (str, '\n');
+	int tokens;
+
+	if (strp == NULL)
+	{
+	    *artwork = NULL;
+	    *s = NULL;
+	    return FALSE;
+	}
+	tokens = sscanf (str, "%p", artwork);
+	++strp;
+	if (*strp) *s = strp;
+	else       *s = NULL;
+	if (tokens == 1) 	return TRUE;
+	else                    return FALSE;
+    }
+    return FALSE;
+}
+
+/* Duplicate a GList (shallow copy) */
+GList *glist_duplicate (GList *list)
+{
+    auto void gl_dup_fe (gpointer data, GList **dup);
+    void gl_dup_fe (gpointer data, GList **dup)
+	{
+	    *dup = g_list_append (*dup, data);
+	}
+    GList *dup = NULL;
+    g_list_foreach (list, (GFunc)gl_dup_fe, &dup);
+    return dup;
+}
+
+
+/***************************************************************************
+ * gtkpod.in,out calls
+ *
+ **************************************************************************/
+
+
+/* tries to call "/bin/sh @script" with command line options */
+static void do_script (const gchar *script, va_list args)
+{
+    char *str;
+    char **argv;
+    GPtrArray *ptra = g_ptr_array_sized_new (10);
+
+    /* prepend args with "sh" and the name of the script */
+    g_ptr_array_add (ptra, "sh");
+    g_ptr_array_add (ptra, (gpointer)script);
+    /* add remaining args */
+    while ((str = va_arg (args, char *)))
+    {
+	g_ptr_array_add (ptra, str);
+    }
+    g_ptr_array_add (ptra, NULL);
+    argv = (char **)g_ptr_array_free (ptra, FALSE);
+
+    if (script)
+    {
+	pid_t pid, tpid;
+	int status;
+
+	pid = fork ();
+	switch (pid)
+	{
+	case 0: /* child */
+	    execv("/bin/sh", argv);
+	    exit(0);
+	break;
+	case -1: /* parent and error */
+	break;
+	default: /* parent -- let's wait for the child to terminate */
+	    tpid = waitpid (pid, &status, 0);
+	    /* we could evaluate tpid and status now */
+	    break;
+	}
+    }
+    g_free (argv);
+}
+
+
+/* tries to execute "/bin/sh ~/.gtkpod/@script" or
+ * "/bin/sh /etc/gtkpod/@script" if the former does not exist. This
+ * function accepts command line arguments that must be terminated by
+ * NULL. */
+void call_script (gchar *script, ...)
+{
+    gchar *cfgdir;
+    va_list args;
+    gchar *file;
+
+    if (!script) return;
+
+    cfgdir =  prefs_get_cfgdir ();
+    file = g_build_filename (cfgdir, script, NULL);
+
+    va_start (args, script);
+    if (g_file_test (file, G_FILE_TEST_EXISTS))
+    {
+	do_script (file, args);
+    }
+    else
+    {
+	C_FREE (file);
+	file = g_build_filename ("/etc/gtkpod/", script, NULL);
+	if (g_file_test (file, G_FILE_TEST_EXISTS))
+	{
+	    do_script (file, args);
+	}
+    }
+    va_end (args);
+
+    g_free (file);
+    g_free (cfgdir);
+}
+
+
+
+/* Create a NULL-terminated array of strings given in the command
+   line. The last argument must be NULL.
+
+   As a special feature, the first argument is split up into
+   individual strings to allow the use of "convert-2mp3 -q <special
+   settings>". Set the first argument to NULL if you don't want this.
+
+   You must free the returned array with g_strfreev() after use. */
+gchar **build_argv_from_strings (const gchar *first_arg, ...)
+{
+    gchar **argv;
+    va_list args;
+    const gchar *str;
+    GPtrArray *ptra = g_ptr_array_sized_new (20);
+
+    if (first_arg)
+    {
+	gchar **strings = g_strsplit (first_arg, " ", 0);
+	gchar **strp = strings;
+	while (*strp)
+	{
+	    if (**strp)
+	    {   /* ignore empty strings */
+		g_ptr_array_add (ptra, g_strdup(*strp));
+	    }
+	    ++strp;
+	}
+	g_strfreev (strings);
+    }
+
+    va_start (args, first_arg);
+    do
+    {
+	str = va_arg (args, const gchar *);
+	g_ptr_array_add (ptra, g_strdup (str));
+    }
+    while (str);
+
+    va_end (args);
+
+    argv = (gchar **)g_ptr_array_free (ptra, FALSE);
+
+    return argv;
+}
+
+
+
+
+/* compare @str1 and @str2 case-sensitively or case-insensitively
+ * depending on prefs settings */
+gint compare_string (const gchar *str1, const gchar *str2)
+{
+    if (prefs_get_int("case_sensitive"))
+	return strcmp (str1, str2);
+    else
+	return compare_string_case_insensitive (str1, str2);
+}
+
+struct csfk
+{
+    gint length;
+    gchar *key;
+};
+
+static GList *csfk_list = NULL;
+
+
+/* needs to be called everytime the sort_ign_strings in the prefs were
+   changed */
+void compare_string_fuzzy_generate_keys (void)
+{
+    GList *gl;
+    GList *sort_ign_strings;
+    GList *current;
+
+    /* remove old keys */
+    for (gl=csfk_list; gl; gl=gl->next)
+    {
+	struct csfk *csfk = gl->data;
+	g_return_if_fail (csfk);
+	g_free (csfk->key);
+	g_free (csfk);
+    }
+    g_list_free (csfk_list);
+    csfk_list = NULL;
+
+    /* create new keys */
+    sort_ign_strings = prefs_get_list("sort_ign_string_");
+    current = sort_ign_strings;
+    while (current)
+    {
+	gchar *str = current->data;
+	struct csfk *csfk;
+	gchar *tempStr;
+	
+	current = g_list_next(current);
+
+	csfk = g_malloc (sizeof (struct csfk));
+	tempStr = g_utf8_casefold (str, -1 );
+	csfk->length = g_utf8_strlen (tempStr, -1 );
+	csfk->key = g_utf8_collate_key (tempStr, -1 );
+	g_free (tempStr);
+
+	csfk_list = g_list_append (csfk_list, csfk);
+    }
+    prefs_free_list(sort_ign_strings);
+}
+
+
+/* compare @str1 and @str2 case-sensitively or case-insensitively
+ * depending on prefs settings, and ignoring certain initial articles 
+ * ("the", "le"/"la", etc) */
+gint compare_string_fuzzy (const gchar *str1, const gchar *str2)
+{
+    gchar *tempStr;
+    gint   result;
+    
+    gchar *cleanStr1 = g_utf8_casefold (str1, -1);
+    gchar *cleanStr2 = g_utf8_casefold (str2, -1);
+
+    const gchar *pstr1 = str1;
+    const gchar *pstr2 = str2;
+    gchar *pcleanStr1 = cleanStr1;
+    gchar *pcleanStr2 = cleanStr2;
+    
+    GList *gl;
+
+    /* If the article collations keys have not been generated, 
+     * do that first
+     */
+    if (!csfk_list)
+	compare_string_fuzzy_generate_keys ();
+
+    if (!csfk_list)
+	return compare_string (str1, str2);
+
+    /* Check the beginnings of both strings for any of the 
+     * articles we should ignore
+     */
+    for (gl=csfk_list; gl; gl=gl->next)
+    {
+	struct csfk *csfk = gl->data;
+	g_return_val_if_fail (csfk, 0);
+    	tempStr = g_utf8_collate_key (cleanStr1, csfk->length);
+	if (strcmp (tempStr, csfk->key) == 0)
+	{
+	    /* Found article, bump pointers ahead appropriate distance
+	     */
+	    pstr1 += csfk->length;
+	    pcleanStr1 = g_utf8_offset_to_pointer (cleanStr1, csfk->length);
+	    g_free (tempStr);
+	    break;
+	}
+	g_free (tempStr);
+    }
+    for (gl=csfk_list; gl; gl=gl->next)
+    {
+	struct csfk *csfk = gl->data;
+	g_return_val_if_fail (csfk, 0);
+    	tempStr = g_utf8_collate_key (cleanStr2, csfk->length);
+	if (strcmp (tempStr, csfk->key) == 0)
+	{
+	    /* Found article, bump pointers ahead apropriate distance
+	     */
+	    pstr2 += csfk->length;
+	    pcleanStr2 = g_utf8_offset_to_pointer (cleanStr2, csfk->length);
+	    g_free (tempStr);
+	    break;
+	}
+	g_free (tempStr);
+    }
+
+    if (prefs_get_int("case_sensitive"))
+	result = strcmp(pstr1, pstr2);
+    else
+    	result = g_utf8_collate(pcleanStr1, pcleanStr2);
+
+    g_free (cleanStr1);
+    g_free (cleanStr2);
+    return result;
+}
+
+/* compare @str1 and @str2 case-sensitively or case-insensitively
+ * depending on prefs settings */
+gint compare_string_case_insensitive (const gchar *str1, const gchar *str2)
+{
+    gchar *string1 = g_utf8_casefold (str1, -1);
+    gchar *string2 = g_utf8_casefold (str2, -1);
+    gint result = g_utf8_collate (string1, string2);
+    g_free (string1);
+    g_free (string2);
+    return result;
+}
+
+/* todo: optionally ignore 'the', 'a,' etc. */
+gboolean compare_string_start_case_insensitive (const gchar *haystack, const gchar *needle)
+{
+  gint cmp = 0;
+  gchar *nhaystack = g_utf8_normalize(haystack, -1, G_NORMALIZE_ALL);
+  gchar *lhaystack = g_utf8_casefold(nhaystack,-1);
+  gchar *nneedle = g_utf8_normalize(needle, -1, G_NORMALIZE_ALL);
+  gchar *lneedle = g_utf8_casefold(nneedle,-1);
+
+
+  cmp = strncmp(lhaystack, lneedle, strlen(lneedle));
+
+  /*
+    printf("searched for %s , matching against %s with %d bytes. say=%d\n", 
+    lneedle, lhaystack, strlen(lneedle), cmp);
+  */
+  
+  g_free(nhaystack);
+  g_free(lhaystack);
+  g_free(nneedle);
+  g_free(lneedle);
+  return cmp;
+};
+
+
+/* ------------------------------------------------------------
+------------------------------------------------------------------
+--------                                                 ---------
+--------                 UTF16 section                   ---------
+--------                                                 ---------
+------------------------------------------------------------------
+   ------------------------------------------------------------ */
+
+/* Get length of utf16 string in number of characters (words) */
+guint32 utf16_strlen (gunichar2 *utf16)
+{
+  guint32 i=0;
+  if (utf16)
+      while (utf16[i] != 0) ++i;
+  return i;
+}
+
+/* duplicate a utf16 string */
+gunichar2 *utf16_strdup (gunichar2 *utf16)
+{
+    guint32 len;
+    gunichar2 *new = NULL;
+
+    if (utf16)
+    {
+	len = utf16_strlen (utf16);
+	new = g_malloc (sizeof (gunichar2) * (len+1));
+	if (new) memcpy (new, utf16, sizeof (gunichar2) * (len+1));
+    }
+    return new;
+}
+
+
+
+
+/*------------------------------------------------------------------*\
+ *                                                                  *
+ *  Generic functions to handle options in pop-up requesters        *
+ *                                                                  *
+\*------------------------------------------------------------------*/
+
+
+
+
+/* Set the toggle button to active that is specified by @prefs_string
+   (integer value). If no parameter is set in the prefs, use
+   @dflt. The corresponding widget names are stored in an array
+   @widgets and are member of @win */
+void option_set_radio_button (GladeXML *win_xml,
+			      const gchar *prefs_string,
+			      const gchar **widgets,
+			      gint dflt)
+{
+    gint wnum, num=0;
+    GtkWidget *w;
+
+    g_return_if_fail (win_xml && prefs_string && widgets);
+
+    /* number of available widgets */
+    num=0;
+    while (widgets[num]) ++num;
+
+    if (!prefs_get_int_value (prefs_string, &wnum))
+	wnum = dflt;
+
+    if ((wnum >= num) || (wnum < 0))
+    {
+	fprintf (stderr, "Programming error: wnum > num (%d,%d,%s)\n",
+		 wnum, num, prefs_string);
+	/* set to reasonable default value */
+	prefs_set_int (prefs_string, 0);
+	wnum = 0;
+    }
+    w = gtkpod_xml_get_widget (win_xml, widgets[wnum]);
+    if (w)
+	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), TRUE);
+}
+
+
+/* Retrieve which toggle button was activated and store the state in
+ * the prefs */
+gint option_get_radio_button (GladeXML *win_xml,
+			      const gchar *prefs_string,
+			      const gchar **widgets)
+{
+    gint i;
+
+    g_return_val_if_fail (win_xml && prefs_string && widgets, 0);
+
+    for (i=0; widgets[i]; ++i)
+    {
+	GtkWidget *w = gtkpod_xml_get_widget (win_xml, widgets[i]);
+	if (w)
+	{
+	    if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)))
+		break;
+	}
+    }
+    if (!widgets[i])
+    {
+	fprintf (stderr, "Programming error: no active toggle button (%s)", prefs_string);
+	/* set reasonable default */
+	i=0;
+    }
+    prefs_set_int (prefs_string, i);
+    return i;
+}
+
+
+/* Set the current folder to what is stored in the prefs */
+void option_set_folder (GtkFileChooser *fc, const gchar *prefs_string)
+{
+    gchar *folder;
+
+    g_return_if_fail (fc && prefs_string);
+
+    prefs_get_string_value (prefs_string, &folder);
+    if (!folder)
+	folder = g_strdup (g_get_home_dir ());
+    gtk_file_chooser_set_current_folder (fc, folder);
+    g_free (folder);
+}
+
+
+/* Retrieve the current folder and write it to the prefs */
+/* If @value is != NULL, a copy of the folder is placed into
+   @value. It has to be g_free()d after use */
+void option_get_folder (GtkFileChooser *fc,
+			const gchar *prefs_string,
+			gchar **value)
+{
+    gchar *folder;
+
+    g_return_if_fail (fc && prefs_string);
+
+    folder = gtk_file_chooser_get_current_folder (fc);
+    prefs_set_string (prefs_string, folder);
+
+    if (value) *value = folder;
+    else       g_free (folder);
+}
+
+
+/* Set the current filename to what is stored in the prefs */
+void option_set_filename (GtkFileChooser *fc, const gchar *prefs_string)
+{
+    gchar *filename;
+
+    g_return_if_fail (fc && prefs_string);
+
+    prefs_get_string_value (prefs_string, &filename);
+    if (!filename)
+	filename = g_strdup (g_get_home_dir ());
+    gtk_file_chooser_set_current_name (fc, filename);
+    g_free (filename);
+}
+
+
+/* Retrieve the current filename and write it to the prefs */
+/* If @value is != NULL, a copy of the filename is placed into
+   @value. It has to be g_free()d after use */
+void option_get_filename (GtkFileChooser *fc,
+			  const gchar *prefs_string,
+			  gchar **value)
+{
+    gchar *filename;
+
+    g_return_if_fail (fc && prefs_string);
+
+    filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(fc));
+    prefs_set_string (prefs_string, filename);
+
+    if (value) *value = filename;
+    else       g_free (filename);
+}
+
+
+/* Set the string entry @name to the prefs value stored in @name or
+   to @default if @name is not yet defined. */
+void option_set_string (GladeXML *win_xml,
+			const gchar *name,
+			const gchar *dflt)
+{
+    gchar *string;
+    GtkWidget *entry;
+
+    g_return_if_fail (win_xml && name && dflt);
+
+    prefs_get_string_value (name, &string);
+
+    if (!string)
+	string = g_strdup (dflt);
+
+    entry = gtkpod_xml_get_widget (win_xml, name);
+
+    if (entry)
+	gtk_entry_set_text(GTK_ENTRY(entry), string);
+
+    g_free (string);
+}
+
+/* Retrieve the current content of the string entry @name and write it
+ * to the prefs (@name) */
+/* If @value is != NULL, a copy of the string is placed into
+   @value. It has to be g_free()d after use */
+void option_get_string (GladeXML *win_xml,
+			const gchar *name,
+			gchar **value)
+{
+    GtkWidget *entry;
+
+    g_return_if_fail (win_xml && name);
+
+    entry = gtkpod_xml_get_widget (win_xml, name);
+
+    if (entry)
+    {
+	const gchar *str = gtk_entry_get_text (GTK_ENTRY (entry));
+	prefs_set_string (name, str);
+	if (value) *value = g_strdup (str);
+    }
+}
+
+
+/* Set the state of toggle button @name to the prefs value stored in
+   @name or to @default if @name is not yet defined. */
+void option_set_toggle_button (GladeXML *win_xml,
+			       const gchar *name,
+			       gboolean dflt)
+{
+    gboolean active;
+    GtkWidget *button;
+
+    g_return_if_fail (win_xml && name);
+
+    if (!prefs_get_int_value (name, &active))
+	active = dflt;
+
+    button = gtkpod_xml_get_widget (win_xml, name);
+
+    if (button)
+	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button),
+				      active);
+}
+
+/* Retrieve the current state of the toggle button @name and write it
+ * to the prefs (@name) */
+/* Return value: the current state */
+gboolean option_get_toggle_button (GladeXML *win_xml,
+				   const gchar *name)
+{
+    gboolean active = FALSE;
+    GtkWidget *button;
+
+    g_return_val_if_fail (win_xml && name, active);
+
+    button = gtkpod_xml_get_widget (win_xml, name);
+
+    if (button)
+    {
+	active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(button));
+	prefs_set_int (name, active);
+    }
+    return active;
+}
+
+
+
+/*------------------------------------------------------------------*\
+ *                                                                  *
+ *  Functions to create string/filename from a template             *
+ *                                                                  *
+\*------------------------------------------------------------------*/
+
+
+
+
+/*
+|  Copyright (C) 2004 Ero Carrera <ero at dkbza.org>
+|
+|  Placed under GPL in agreement with Ero Carrera. (JCS -- 12 March 2004)
+*/
+
+/**
+ * Check if supported char and return substitute.
+ */
+static gchar check_char(gchar c)
+{
+    gint i;
+    static const gchar 
+	invalid[]={'"', '*', ':', '<', '>', '?', '\\', '|', '/', 0};
+    static const gchar
+	replace[]={'_', '_', '-', '_', '_', '_', '-',  '-', '-', 0};
+    for(i=0; invalid[i]!=0; i++)
+	if(c==invalid[i])  return replace[i];
+    return c;
+}
+
+/**
+ * Process a path. It will substitute all the invalid characters.
+ * The changes are made within the original string. A pointer to the
+ * original string is returned.
+ */
+static gchar *fix_path(gchar *orig)
+{
+        if(orig)
+	{
+	    gchar *op = orig;
+	    while (*op)
+	    {
+		*op = check_char(*op);
+		++op;
+	    }
+	}
+	return orig;
+}
+
+/* End of code originally supplied by Ero Carrera */
+
+
+/* Match a list of templates @p separated by ';' with the type of the
+   filename. E.g. '%s.mp3;%t.wav' will return '%s.mp3' if @track is an
+   mp3 file, or '%t.wav' if @track is a wav file. If no template can
+   be matched, an empty string is returned.
+
+   String be freed after use.
+*/
+static gchar *select_template (Track *track, const gchar *p)
+{
+    gchar **templates, **tplp;
+    gchar *ext = NULL;
+    const gchar *tname;
+    gchar *result;
+    ExtraTrackData *etr;
+
+    g_return_val_if_fail (track, strdup (""));
+    etr = track->userdata;
+    g_return_val_if_fail (etr, strdup (""));
+    if (etr->pc_path_locale && strlen(etr->pc_path_locale))
+	tname = etr->pc_path_locale;
+    else
+	tname = track->ipod_path;
+    if (!tname)
+    {   /* this should not happen... */
+	gchar *buf = get_track_info (track, TRUE);
+	gtkpod_warning (_("Could not process '%s' (no filename available)"),
+			buf);
+	g_free (buf);
+    }
+    ext = strrchr (tname, '.');        /* pointer to filename extension */
+
+    templates = g_strsplit (p, ";", 0);
+    tplp = templates;
+    while (*tplp)
+    {
+	if (strcmp (*tplp, "%o") == 0)
+	{   /* this is only a valid extension if the original filename
+	       is present */
+	    if (etr->pc_path_locale && strlen(etr->pc_path_locale))  break;
+	}
+	else if (strrchr (*tplp, '.') == NULL)
+	{   /* this template does not have an extension and therefore
+	     * matches */
+	    if (ext)
+	    {   /* if we have an extension, add it */
+		gchar *str = g_strdup_printf ("%s%s", *tplp, ext);
+		g_free (*tplp);
+		*tplp = str;
+	    }
+	    break;
+	}
+	else if (ext && (strlen (*tplp) >= strlen (ext)))
+	{  /* this template is valid if the extensions match */
+	    if (strcasecmp (&((*tplp)[strlen (*tplp) - strlen (ext)]),
+			    ext) == 0)
+		break;
+	}
+	++tplp;
+    }
+    result = g_strdup (*tplp);
+    g_strfreev (templates);
+    return result;
+}
+
+
+/* Return a string for @track built according to @template.
+
+   @is_filename: if TRUE, remove potentially harmful characters.
+   @silent: don't print error messages (no gtk_*() calls -- thread
+   safe)
+*/
+gchar *get_string_from_template (Track *track,
+				 const gchar *template,
+				 gboolean is_filename,
+				 gboolean silent)
+{
+    GString *result;
+    gchar *res_utf8;
+    const gchar *p;
+    gchar *basename = NULL;
+    gchar *basename_noext = NULL;
+    ExtraTrackData *etr;
+
+    g_return_val_if_fail (track, NULL);
+    g_return_val_if_fail (template, NULL);
+    etr = track->userdata;
+    g_return_val_if_fail (etr, NULL);
+
+    result = g_string_new ("");
+
+    /* try to get the original filename */
+    if (etr->pc_path_utf8)
+	basename = g_path_get_basename (etr->pc_path_utf8);
+    /* get original filename without extension */
+    if (basename)
+    {
+	gchar *ptr;
+	basename_noext = g_strdup (basename);
+	ptr = strrchr (basename_noext, '.');
+	if (ptr) *ptr = '\0';
+    }
+
+    p=template;
+    while (*p != '\0') {
+	if (*p == '%') {
+	    const gchar* tmp = NULL;
+	    gchar dummy[100];
+	    Playlist *pl;
+	    p++;
+	    switch (*p) {
+	    case 'o':
+		if (basename)
+		{
+		    tmp = basename;
+		}
+		break;
+	    case 'O':
+		if (basename_noext)
+		{
+		    tmp = basename_noext;
+		}
+		break;
+	    case 'p':
+		pl = pm_get_selected_playlist ();
+		if (pl)
+		    tmp = pl->name;
+		break;
+	    case 'a':
+		tmp = track_get_item (track, T_ARTIST);
+		break;
+	    case 'A':
+		tmp = track_get_item (track, T_ALBUM);
+		break;
+	    case 't':
+		tmp = track_get_item (track, T_TITLE);
+		break;
+	    case 'c':
+		tmp = track_get_item (track, T_COMPOSER);
+		break;
+	    case 'g':
+	    case 'G':
+		tmp = track_get_item (track, T_GENRE);
+		break;
+	    case 'C':
+		if (track->cds == 0)
+		    sprintf (dummy, "%.2d", track->cd_nr);
+		else if (track->cds < 10)
+		    sprintf(dummy, "%.1d", track->cd_nr);
+		else if (track->cds < 100)
+		    sprintf (dummy, "%.2d", track->cd_nr);
+		else if (track->cds < 1000)
+		    sprintf (dummy, "%.3d", track->cd_nr);
+		else
+		    sprintf (dummy,"%.4d", track->cd_nr);
+		tmp = dummy;
+		break;
+	    case 'T':
+		if (track->tracks == 0)
+		    sprintf (dummy, "%.2d", track->track_nr);
+		else if (track->tracks < 10)
+		    sprintf(dummy, "%.1d", track->track_nr);
+		else if (track->tracks < 100)
+		    sprintf (dummy, "%.2d", track->track_nr);
+		else if (track->tracks < 1000)
+		    sprintf (dummy, "%.3d", track->track_nr);
+		else
+		    sprintf (dummy,"%.4d", track->track_nr);
+		tmp = dummy;
+		break;
+	    case 'Y':
+		sprintf (dummy, "%4d", track->year);
+		tmp = dummy;
+		break;
+	    case '%':
+		tmp = "%";
+		break;
+	    default:
+		if (!silent)
+		{
+		    gtkpod_warning (_("Unknown token '%%%c' in template '%s'"),
+				    *p, template);
+		}
+		break;
+	    }
+	    if (tmp)
+	    {
+		gchar *tmpcp = g_strdup (tmp);
+		if (is_filename)
+		{
+		    /* remove potentially illegal/harmful characters */
+		    fix_path (tmpcp);
+		    /* strip spaces to avoid problems with vfat */
+		    g_strstrip (tmpcp);
+		    /* append to current string */
+		}
+		result = g_string_append (result, tmpcp);
+		tmp = NULL;
+		g_free (tmpcp);
+	    }
+	}
+	else 
+	    result = g_string_append_c (result, *p);
+	p++;
+    }
+    /* get the utf8 version of the filename */
+    res_utf8 = g_string_free (result, FALSE);
+
+    if (is_filename)
+    {   /* remove white space before the filename extension
+	   (last '.') */
+	gchar *ext = strrchr (res_utf8, '.');
+	gchar *extst = NULL;
+	if (ext)
+	{
+	    extst = g_strdup (ext);
+	    *ext = '\0';
+	}
+	g_strstrip (res_utf8);
+	if (extst)
+	{
+	    /* The following strcat() is safe because g_strstrip()
+	       does not increase the original string size. Therefore
+	       the result of the strcat() call will not be longer than
+	       the original string. */
+	    strcat (res_utf8, extst);
+	    g_free (extst);
+	}
+    }
+
+    g_free (basename);
+    g_free (basename_noext);
+
+    return res_utf8;
+}
+
+
+
+/* Return a string for @track built according to @full_template.
+   @full_template can contain several templates separated by ';',
+   e.g. '%s.mp3;%t.wav'. The correct one is selected using
+   select_template() defined above.
+
+   If @is_filename is TRUE, potentially harmful characters are
+   replaced in an attempt to create a valid filename.
+
+   If @is_filename is FALSE, the extension (e.g. '.mp3' will be
+   removed). */
+gchar *get_string_from_full_template (Track *track,
+				      const gchar *full_template,
+				      gboolean is_filename)
+{
+    gchar *res_utf8;
+    gchar *template;
+
+    g_return_val_if_fail (track, NULL);
+    g_return_val_if_fail (full_template, NULL);
+
+    template = select_template (track, full_template);
+
+    if (!template)
+    {
+	gchar *fn = get_file_name_from_source (track, SOURCE_PREFER_LOCAL);
+	gtkpod_warning (_("Template ('%s') does not match file type '%s'\n"), full_template, fn ? fn:"");
+	g_free (fn);
+	return NULL;
+    }
+
+    if (!is_filename)
+    {   /* remove an extension, if present ('.???' or '.????'  at the
+	   end) */
+	gchar *pnt = strrchr (template, '.');
+	if (pnt)
+	{
+	    if (pnt == template+strlen(template)-3)
+		*pnt = 0;
+	    if (pnt == template+strlen(template)-4)
+		*pnt = 0;
+	}
+    }
+
+    res_utf8 = get_string_from_template (track, template, is_filename, FALSE);
+
+    g_free (template);
+
+    return res_utf8;
+}
+
+
+/**
+ * which - run the shell command which, useful for querying default values
+ * for executable,
+ * @name - the executable we're trying to find the path for
+ * Returns the path to the executable, NULL on not found
+ */
+gchar *which (const gchar *exe)
+{
+    FILE *fp = NULL;
+    gchar *result = NULL;
+    gchar buf[PATH_MAX];
+    gchar *which_exec = NULL;
+
+    g_return_val_if_fail (exe, NULL);
+
+    memset(&buf[0], 0, PATH_MAX);
+    which_exec = g_strdup_printf("which %s", exe);
+    if((fp = popen(which_exec, "r")))
+    {
+        int read_bytes = 0;
+        if((read_bytes = fread(buf, sizeof(gchar), PATH_MAX, fp)) > 0)
+            result = g_strndup(buf, read_bytes-1);
+        pclose(fp);
+    }
+    g_free(which_exec);
+    return(result);
+}
+
+/**
+ * Recursively make directories.
+ *
+ * @silent: don't print error messages via gtk (->thread safe)
+ *
+ * @return FALSE is this is not possible.
+ */
+gboolean mkdirhier(const gchar *dirname, gboolean silent)
+{
+    gchar *dn, *p;
+
+    g_return_val_if_fail (dirname && *dirname, FALSE);
+
+    if (strncmp ("~/", dirname, 2) == 0)
+	 dn = g_build_filename (g_get_home_dir(), dirname+2, NULL);
+    else dn = g_strdup (dirname);
+
+    p = dn;
+
+    do
+    {
+	++p;
+	p = index (p, G_DIR_SEPARATOR);
+
+	if (p)   *p = '\0';
+
+	if (!g_file_test(dn, G_FILE_TEST_EXISTS))
+	{
+	    if (g_mkdir(dn, 0777) == -1)
+	    {
+		if (!silent)
+		{
+		    gtkpod_warning (_("Error creating %s: %s\n"),
+				    dn, g_strerror(errno));
+		}
+		g_free (dn);
+		return FALSE;
+	    }
+	}
+	if (p)   *p = G_DIR_SEPARATOR;
+    } while (p);
+
+    g_free (dn);
+    return TRUE;
+}
+
+/**
+ * Recursively make directories in the given filename.
+ * @return FALSE is this is not possible.
+ */
+gboolean mkdirhierfile(const gchar *filename)
+{
+    gboolean result;
+    gchar *dirname = g_path_get_dirname (filename);
+    result = mkdirhier (dirname, FALSE);
+    g_free (dirname);
+    return result;
+}
+
+
+/**
+ * Convert "~/" to "/home/.../"
+ *
+ * g_free() return value when no longer needed.
+ */
+gchar *convert_filename (const gchar *filename)
+{
+  if (filename)
+  {    
+    if (strncmp ("~/", filename, 2) == 0)
+      return g_build_filename (g_get_home_dir(), filename+2, NULL);
+    else 
+      return g_strdup (filename);
+  }
+  
+  return NULL;
+}
+
+
+/**
+ * get_size_of_directory
+ *
+ * Determine the total size in bytes of all files in @dir including
+ * subdirectories. This function ignores errors in the sense that if a
+ * directory or file cannot be accessed, a size of 0 is assumed.
+ */
+gint64 get_size_of_directory (const gchar *dir)
+{
+    GDir *gdir;
+    const gchar *fname;
+    gint64 tsize = 0;
+
+    g_return_val_if_fail (dir, 0);
+
+    gdir = g_dir_open (dir, 0, NULL);
+
+    /* Check for error */
+    if (!gdir)
+	return 0;
+
+    while ((fname = g_dir_read_name (gdir)))
+    {
+	gchar *fullname = g_build_filename (dir, fname, NULL);
+	if (g_file_test (fullname, G_FILE_TEST_IS_DIR))
+	{
+	    tsize += get_size_of_directory (fullname);
+	}
+	else if (g_file_test (fullname, G_FILE_TEST_IS_REGULAR))
+	{
+	    struct stat statbuf;
+	    if (g_stat (fullname, &statbuf) == 0)
+	    {   /* OK, add size */
+		tsize += statbuf.st_size;
+	    }
+	}
+	g_free (fullname);
+    }
+
+    g_dir_close (gdir);
+
+    return tsize;
+}
+
+
+
+/**
+ * Wrapper for gtkpod_xml_get_widget() giving out a warning if widget
+ * could not be found.
+ *
+ **/
+GtkWidget *gtkpod_xml_get_widget (GladeXML *xml, const gchar *name)
+{
+    GtkWidget *w=glade_xml_get_widget (xml, name);
+
+    if (!w)
+	fprintf (stderr, "*** Programming error: Widget not found: '%s'\n",
+		 name);
+
+    return w;
+}
+
+
+/* ------------------------------------------------------------
+ *
+ *        Helper functions for pref keys
+ *
+ * ------------------------------------------------------------ */
+
+
+/**
+ * Helper function to construct prefs key for itdb,
+ * e.g. itdb_1_mountpoint...
+ * gfree() after use
+ *
+ **/
+gchar *get_itdb_prefs_key (gint index, const gchar *subkey)
+{
+    g_return_val_if_fail (subkey, NULL);
+
+    return g_strdup_printf ("itdb_%d_%s", index, subkey);
+}
+
+
+/**
+ * Helper function to construct prefs key for playlists,
+ * e.g. itdb_1_playlist_xxxxxxxxxxx_syncmode...
+ *
+ * gfree() after use
+ **/
+gchar *get_playlist_prefs_key (gint index,
+			       Playlist *pl, const gchar *subkey)
+{
+    g_return_val_if_fail (pl, NULL);
+    g_return_val_if_fail (subkey, NULL);
+
+    return g_strdup_printf ("itdb_%d_playlist_%llu_%s",
+			    index, (unsigned long long)pl->id, subkey);
+}
+
+
+/**
+ * Helper function to retrieve the index number of @itdb needed to
+ * construct any keys (see above)
+ **/
+gint get_itdb_index (iTunesDB *itdb)
+{
+	struct itdbs_head *itdbs_head;
+
+	itdbs_head = gp_get_itdbs_head (gtkpod_window);
+	g_return_val_if_fail (itdbs_head, 0);
+	
+	return g_list_index (itdbs_head->itdbs, itdb);
+}
+
+
+/**
+ * Helper function to retrieve a string prefs entry for @itdb.
+ * 
+ * gfree() after use
+ **/
+gchar *get_itdb_prefs_string (iTunesDB *itdb, const gchar *subkey)
+{
+    gchar *key, *value;
+
+    g_return_val_if_fail (itdb, NULL);
+    g_return_val_if_fail (subkey, NULL);
+
+    key = get_itdb_prefs_key (get_itdb_index (itdb), subkey);
+    value = prefs_get_string (key);
+    g_free (key);
+
+    return value;
+}
+
+
+/**
+ * Helper function to retrieve a string prefs entry for @playlist.
+ * 
+ **/
+gchar *get_playlist_prefs_string (Playlist *playlist, const gchar *subkey)
+{
+    gchar *key, *value;
+
+    g_return_val_if_fail (playlist, 0);
+    g_return_val_if_fail (subkey, 0);
+
+    key = get_playlist_prefs_key (get_itdb_index (playlist->itdb),
+				  playlist, subkey);
+    value = prefs_get_string (key);
+    g_free (key);
+
+    return value;
+}
+
+/**
+ * Helper function to retrieve an int prefs entry for @itdb.
+ * 
+ **/
+gint get_itdb_prefs_int (iTunesDB *itdb, const gchar *subkey)
+{
+    gchar *key;
+    gint value;
+
+    g_return_val_if_fail (itdb, 0);
+    g_return_val_if_fail (subkey, 0);
+
+    key = get_itdb_prefs_key (get_itdb_index (itdb), subkey);
+    value = prefs_get_int (key);
+    g_free (key);
+
+    return value;
+}
+
+/**
+ * Helper function to retrieve an int prefs entry for @playlist.
+ * 
+ **/
+gint get_playlist_prefs_int (Playlist *playlist, const gchar *subkey)
+{
+    gchar *key;
+    gint value;
+
+    g_return_val_if_fail (playlist, 0);
+    g_return_val_if_fail (subkey, 0);
+
+    key = get_playlist_prefs_key (get_itdb_index (playlist->itdb),
+				  playlist, subkey);
+    value = prefs_get_int (key);
+    g_free (key);
+
+    return value;
+}
+
+/**
+ * Helper function to retrieve a string prefs entry for @itdb.
+ *
+ * Returns TRUE if the key was actually set in the prefs. 
+ * 
+ * gfree() after use
+ **/
+gboolean get_itdb_prefs_string_value (iTunesDB *itdb, const gchar *subkey,
+				      gchar **value)
+{
+    gchar *key;
+    gboolean result;
+
+    g_return_val_if_fail (itdb, FALSE);
+    g_return_val_if_fail (subkey, FALSE);
+
+    key = get_itdb_prefs_key (get_itdb_index (itdb), subkey);
+    result = prefs_get_string_value (key, value);
+    g_free (key);
+
+    return result;
+}
+
+
+/**
+ * Helper function to retrieve an in prefs entry for @itdb.
+ * 
+ **/
+gboolean get_itdb_prefs_int_value (iTunesDB *itdb, const gchar *subkey,
+				   gint *value)
+{
+    gchar *key;
+    gboolean result;
+
+    g_return_val_if_fail (itdb, FALSE);
+    g_return_val_if_fail (subkey, FALSE);
+
+    key = get_itdb_prefs_key (get_itdb_index (itdb), subkey);
+    result = prefs_get_int_value (key, value);
+    g_free (key);
+
+    return result;
+}
+
+
+/**
+ * Helper function to set a string prefs entry for @itdb.
+ * 
+ * gfree() after use
+ **/
+void set_itdb_prefs_string (iTunesDB *itdb,
+			    const gchar *subkey, const gchar *value)
+{
+    gchar *key;
+
+    g_return_if_fail (itdb);
+    g_return_if_fail (subkey);
+
+    key = get_itdb_prefs_key (get_itdb_index (itdb), subkey);
+    prefs_set_string (key, value);
+    g_free (key);
+}
+
+
+/**
+ * Helper function to set a string prefs entry for @itdb.
+ * 
+ * gfree() after use
+ **/
+void set_itdb_index_prefs_string (gint index,
+				  const gchar *subkey, const gchar *value)
+{
+    gchar *key;
+
+    g_return_if_fail (subkey);
+
+    key = get_itdb_prefs_key (index, subkey);
+    prefs_set_string (key, value);
+    g_free (key);
+}
+
+
+/**
+ * Helper function to set an in prefs entry for @itdb.
+ * 
+ **/
+void set_itdb_prefs_int (iTunesDB *itdb, const gchar *subkey, gint value)
+{
+    gchar *key;
+
+    g_return_if_fail (itdb);
+    g_return_if_fail (subkey);
+
+    key = get_itdb_prefs_key (get_itdb_index (itdb), subkey);
+    prefs_set_int (key, value);
+    g_free (key);
+}
+
+
+/**
+ * Helper function to set an in prefs entry for @itdb.
+ * 
+ **/
+void set_itdb_index_prefs_int (gint index,
+			       const gchar *subkey, gint value)
+{
+    gchar *key;
+
+    g_return_if_fail (subkey);
+
+    key = get_itdb_prefs_key (index, subkey);
+    prefs_set_int (key, value);
+    g_free (key);
+}
+
+/**
+ * Helper function to remove all prefs strings for itdb @index and
+ * move all subsequent itdb strings forward. You can call this even
+ * after your have removed the itdb from itdbs_head.
+ * 
+ **/
+static void remove_itdb_index_prefs (gint index)
+{
+    struct itdbs_head *itdbs_head;
+    gchar *subkey;
+    gint i, n;
+
+    itdbs_head = gp_get_itdbs_head (gtkpod_window);
+    g_return_if_fail (itdbs_head);
+
+    n = g_list_length (itdbs_head->itdbs);
+    subkey = get_itdb_prefs_key (index, "");
+    prefs_flush_subkey (subkey);
+    g_free (subkey);
+    
+    for (i=index; i<=n; ++i)
+    {
+	gchar *from_key = get_itdb_prefs_key (i+1, "");
+	gchar *to_key = get_itdb_prefs_key (i, "");
+	prefs_rename_subkey (from_key, to_key);
+	g_free (from_key);
+	g_free (to_key);
+    }
+}
+
+
+/**
+ * Helper function to remove all prefs strings for @itdb and move all
+ * subsequent itdb strings forward. Call this before removing the itdb
+ * from itdbs_head.
+ * 
+ **/
+void remove_itdb_prefs (iTunesDB *itdb)
+{
+    g_return_if_fail (itdb);
+
+    remove_itdb_index_prefs (get_itdb_index (itdb));
+}
+
+/* Save all itdb_<index>_* keys to the iPod
+ * (<ControlDir>/gtkpod.prefs).
+ *
+ * Return value: TRUE on succes, FALSE on error
+ */
+gboolean save_ipod_index_prefs (gint index, const gchar *mountpoint)
+{
+    TempPrefs *temp_prefs;
+    gboolean result = FALSE;
+    gchar *subkey, *dir;
+
+    g_return_val_if_fail (mountpoint, FALSE);
+
+    /* isolate all 'itdb_<index>_*' keys */
+    subkey = get_itdb_prefs_key (index, "");
+    temp_prefs = prefs_create_subset (subkey);
+
+    /* rename to 'itdb_*' */
+    temp_prefs_rename_subkey (temp_prefs, subkey, "itdb_");
+
+    /* remove some keys */
+    temp_prefs_remove_key (temp_prefs, "itdb_mountpoint");
+    temp_prefs_remove_key (temp_prefs, "itdb_name");
+    temp_prefs_remove_key (temp_prefs, "itdb_type");
+
+    /* build filename path */
+    dir = itdb_get_itunes_dir (mountpoint);
+    if (dir)
+    {
+	GError *error = NULL;
+	gchar *path = g_build_filename (dir, "gtkpod.prefs", NULL);
+	result = temp_prefs_save (temp_prefs, path, &error);
+	if (result == FALSE)
+	{
+	    gtkpod_warning (_("Writing preferences file '%s' failed (%s).\n\n"),
+			    path,
+			    error? error->message:_("unspecified error"));
+	    g_error_free (error);
+	}
+	g_free (path);
+	g_free (dir);
+    }
+    else
+    {
+	gtkpod_warning (_("Writing preferences to the iPod (%s) failed: could not get path to Control Directory.\n\n"),
+			mountpoint);
+    }
+
+    temp_prefs_destroy (temp_prefs);
+    g_free (subkey);
+
+    return result;
+}
+
+
+
+/* Save all itdb_<index>_* keys to the iPod
+ * (<ControlDir>/gtkpod.prefs).
+ *
+ * Return value: TRUE on succes, FALSE on error
+ */
+gboolean save_ipod_prefs (iTunesDB *itdb, const gchar *mountpoint)
+{
+    g_return_val_if_fail (itdb && mountpoint, FALSE);
+    return save_ipod_index_prefs (get_itdb_index (itdb), mountpoint);
+}
+
+
+/* Load preferences file from the iPod and merge them into the general
+ * prefs system.
+ */
+static void load_ipod_index_prefs (gint index, const gchar *mountpoint)
+{
+    gchar *dir;
+
+    g_return_if_fail (mountpoint);
+
+    /* build filename path */
+    dir = itdb_get_itunes_dir (mountpoint);
+    if (dir)
+    {
+	TempPrefs *temp_prefs;
+	GError *error = NULL;
+	gchar *path = g_build_filename (dir, "gtkpod.prefs", NULL);
+	temp_prefs = temp_prefs_load (path, &error);
+	if (temp_prefs)
+	{
+	    gchar *subkey;
+	    subkey = get_itdb_prefs_key (index, "");
+	    /* rename 'itdb_*' to 'itdb_<index>_*' */
+	    temp_prefs_rename_subkey (temp_prefs, "itdb_", subkey);
+	    /* merge with real prefs */
+	    temp_prefs_apply (temp_prefs);
+	    /* destroy temp prefs */
+	    temp_prefs_destroy (temp_prefs);
+	}
+	else
+	{
+	    /* we ignore errors -- no need to be concerned about them */
+	    g_error_free (error);
+	}
+	g_free (dir);
+    }
+}
+
+
+
+/* Load preferences file from the iPod and merge them into the general
+ * prefs system.
+ */
+void load_ipod_prefs (iTunesDB *itdb, const gchar *mountpoint)
+{
+    g_return_if_fail (mountpoint);
+    load_ipod_index_prefs (get_itdb_index (itdb), mountpoint);
+}
+
+
+
+
+/* retrieve offline mode from itdb (convenience function) */
+gboolean get_offline (iTunesDB *itdb)
+{
+    ExtraiTunesDBData *eitdb;
+
+    g_return_val_if_fail (itdb, FALSE);
+    eitdb = itdb->userdata;
+    g_return_val_if_fail (eitdb, FALSE);
+
+    return eitdb->offline;
+}
+
+/* ----------------------------------------------------------------
+ *
+ * Main program init and shutdown
+ *
+ * ---------------------------------------------------------------- */
+
+/**
+ * gtkpod_init
+ *
+ * initialize prefs and other services as well as display
+ */
+void gtkpod_init (int argc, char *argv[])
+{
+    gchar *progname;
+
+    /* initialize xml_file: if gtkpod is called in the build directory
+       (".../src/gtkpod") use the local gtkpod.glade (in the data
+       directory), otherwise use
+       "PACKAGE_DATA_DIR/PACKAGE/data/gtkpod.glade" */
+
+    progname = g_find_program_in_path (argv[0]);
+    if (progname)
+    {
+	static const gchar *SEPsrcSEPgtkpod = G_DIR_SEPARATOR_S "src" G_DIR_SEPARATOR_S "gtkpod";
+
+	if (!g_path_is_absolute (progname))
+	{
+	    gchar *cur_dir = g_get_current_dir ();
+	    gchar *prog_absolute;
+
+	    if (g_str_has_prefix (progname, "." G_DIR_SEPARATOR_S))
+		prog_absolute = g_build_filename (cur_dir,progname+2,NULL);
+	    else
+		prog_absolute = g_build_filename (cur_dir,progname,NULL);
+	    g_free (progname);
+	    g_free (cur_dir);
+	    progname = prog_absolute;
+	}
+
+	if (g_str_has_suffix (progname, SEPsrcSEPgtkpod))
+	{
+	    gchar *suffix = g_strrstr (progname, SEPsrcSEPgtkpod);
+	    if (suffix)
+	    {
+		*suffix = 0;
+		xml_file = g_build_filename (progname, "data", "gtkpod.glade", NULL);
+	    }
+	}
+	g_free (progname);
+	if (xml_file && !g_file_test (xml_file, G_FILE_TEST_EXISTS))
+	{
+	    g_free (xml_file);
+	    xml_file = NULL;
+	}
+    }
+    if (!xml_file)
+	xml_file = g_build_filename (PACKAGE_DATA_DIR, PACKAGE, "data", "gtkpod.glade", NULL);
+    else
+    {
+	printf ("Using local gtkpod.glade file since program was started from source directory:\n%s\n", xml_file);
+    }
+
+    /* Initialisation of libxml */
+    LIBXML_TEST_VERSION;
+
+    main_window_xml = glade_xml_new (xml_file, "gtkpod", NULL);
+
+    glade_xml_signal_autoconnect (main_window_xml);
+  
+    gtkpod_window = gtkpod_xml_get_widget (main_window_xml, "gtkpod");
+
+    prefs_init (argc, argv); 
+
+    coverart_init (argv[0]);
+    stockid_init (argv[0]);
+
+    file_convert_init ();
+
+    display_create ();
+
+    gtk_widget_show (gtkpod_window);
+
+    init_data (gtkpod_window);   /* setup base data, importing all local
+				  * repositories */
+
+    /* stuff to be done before starting gtkpod */
+    call_script ("gtkpod.in", NULL);
+
+    autodetection_init ();
+	
+    server_setup ();   /* start server to accept playcount updates */
+}
+
+
+
+/**
+ * gtkpod_shutdown
+ *
+ * free memory, shutdown services and call gtk_main_quit ()
+ */
+void gtkpod_shutdown ()
+{
+    /* stop accepting requests for playcount updates */
+    server_shutdown ();
+
+		/* Change the windows back to track view to ensure the
+		 * sorttab state is saved correctly/
+		 */
+		gphoto_change_to_photo_window (FALSE);
+		
+    /* Sort column order needs to be stored */
+    tm_store_col_order();
+  
+    /* Update default sizes */
+    display_update_default_sizes();
+
+    /* shut down conversion infrastructure */
+    file_convert_shutdown ();
+
+    /* Save prefs */
+    prefs_save ();
+
+/* FIXME: release memory in a clean way */
+#if 0
+    remove_all_playlists ();  /* first remove playlists, then tracks!
+			       * (otherwise non-existing *tracks may
+			       * be accessed) */
+    remove_all_tracks ();
+#endif
+    display_cleanup ();
+
+    prefs_shutdown ();
+
+    xmlCleanupParser();
+    xmlMemoryDump();
+	
+    call_script ("gtkpod.out", NULL);
+    gtk_main_quit ();
+}

Added: trunk/src/misc.h
===================================================================
--- trunk/src/misc.h	                        (rev 0)
+++ trunk/src/misc.h	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,267 @@
+/*
+|  Copyright (C) 2002-2007 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: misc.h 1814 2007-12-11 12:53:22Z jcsjcs $
+*/
+
+#ifndef __MISC_H__
+#define __MISC_H__
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <glib/gi18n-lib.h>
+#include <gtk/gtk.h>
+#include <glade/glade.h>
+#include <stdio.h>
+#include <libxml/xmlversion.h>
+#include <libxml/xmlmemory.h>
+#include "file.h"
+#include "display_itdb.h"
+#include "display.h"
+#include "confirmation.h"
+#include "time.h"
+
+
+#define C_FREE(a) {g_free(a); a=NULL;}
+
+/* where to find the scripts */
+extern const gchar *SCRIPTDIR;
+
+/* version of GTK_CHECK_VERSION that uses the runtime variables
+   gtk_*_version... instead of the compile-time constants
+   GTK_*_VERSION */
+#define	RUNTIME_GTK_CHECK_VERSION(major,minor,micro)	\
+    (gtk_major_version > (major) || \
+     (gtk_major_version == (major) && gtk_minor_version > (minor)) || \
+     (gtk_major_version == (major) && gtk_minor_version == (minor) && \
+      gtk_micro_version >= (micro)))
+
+/* compare a and b, return sign (a-b) -- it has to be this way rather
+   than just calculate a-b, because a and b might be unsigned... */
+#define COMP(a,b) (a<b ? -1:a>b ? +1:0)
+
+/* Response for the Apply button (we cannot use GTK_RESPONSE_APPLY)
+ * because that is only emitted if a filename is present */
+enum { RESPONSE_APPLY = 5 };
+
+/* indicates whether widgets are currently blocked */
+extern gboolean widgets_blocked;
+/* full path to 'gtkpod.glade', defined in main.c */
+extern gchar *xml_file;
+
+/* Some symbols not necessarily defined */
+
+/* Introduced in 2.6 */
+#ifndef GTK_STOCK_DISCONNECT
+#define GTK_STOCK_DISCONNECT GTK_STOCK_GOTO_TOP
+#define GTK_STOCK_CONNECT GTK_STOCK_GOTO_BOTTOM
+#endif
+#ifndef GTK_STOCK_EDIT
+#define GTK_STOCK_EDIT NULL
+#endif
+#ifndef G_IS_DIR_SEPARATOR
+#define G_IS_DIR_SEPARATOR(c) (c == G_DIR_SEPARATOR)
+#endif
+/* SEMIBOLD was introduced with version 2.8 */
+#ifndef PANGO_WEIGHT_SEMIBOLD
+#define PANGO_WEIGHT_SEMIBOLD 600
+#endif
+
+
+
+
+gchar *get_user_string (gchar *title, gchar *message, gchar *dflt,
+			gchar *opt_msg, gboolean *opt_state);
+Playlist *add_new_pl_user_name (iTunesDB *itdb, gchar *dflt, gint32 pos);
+void add_new_pl_or_spl_user_name (iTunesDB *itdb, gchar *dflt, gint32 pos);
+void create_add_files_fileselector (void);
+void create_add_playlists_fileselector (void);
+gchar *concat_dir (G_CONST_RETURN gchar *dir, G_CONST_RETURN gchar *file);
+gchar *concat_dir_if_relative (G_CONST_RETURN gchar *base_dir,
+			       G_CONST_RETURN gchar *rel_dir);
+float get_ms_since (GTimeVal *old_time, gboolean update);
+gint get_sort_tab_number (gchar *text);
+void open_about_window (void);
+gboolean parse_tracks_from_string (gchar **s, Track **track);
+gboolean parse_artwork_from_string(gchar **s, Artwork **artwork);
+void gtkpod_init (int argc, char *argv[]);
+void gtkpod_shutdown (void);
+
+gchar *get_allowed_percent_char (void);
+T_item TM_to_T (TM_item sm);
+T_item char_to_T (char c);
+T_item ST_to_T (ST_CAT_item st);
+const gchar *get_tm_string (TM_item tm);
+const gchar *get_tm_tooltip (TM_item tm);
+const gchar *get_t_string (T_item t);
+const gchar *get_t_tooltip (T_item t);
+
+void delete_playlist_head (DeleteAction deleteaction);
+void delete_track_head (DeleteAction deleteaction);
+void delete_entry_head (gint entry_inst, DeleteAction deleteaction);
+
+void delete_populate_settings (struct DeleteData *dd,
+			       gchar **label, gchar **title,
+			       gboolean *confirm_again,
+			       gchar **confirm_again_key,
+			       GString **str);
+
+void block_widgets (void);
+void release_widgets (void);
+void update_blocked_widget (GtkWidget *w, gboolean sens);
+
+/*void mount_ipod(void);
+  void unmount_ipod(void);*/
+void call_script (gchar *script, ...);
+
+gchar **build_argv_from_strings (const gchar *first_arg, ...);
+
+void delete_track_ok (struct DeleteData *dd);
+
+void gtkpod_warning (const gchar *format, ...);
+
+gchar *time_time_to_string (time_t t);
+gchar *time_fromtime_to_string (time_t t);
+gchar *time_totime_to_string (time_t t);
+time_t time_string_to_time (const gchar *str);
+time_t time_string_to_fromtime (const gchar *str);
+time_t time_string_to_totime (const gchar *str);
+time_t time_get_time (Track *track, T_item t_item);
+gchar *time_field_to_string (Track *track, T_item t_item);
+void time_set_time (Track *track, time_t t, T_item t_item);
+
+gchar *get_filesize_as_string (double size);
+
+gint compare_string (const gchar *str1, const gchar *str2);
+void compare_string_fuzzy_generate_keys (void);
+gint compare_string_fuzzy (const gchar *str1, const gchar *str2);
+gint compare_string_case_insensitive (const gchar *str1,
+				      const gchar *str2);
+gint compare_string_start_case_insensitive (const gchar *haystack,
+					    const gchar *needle);
+
+gchar *filename_from_uri (const char *uri,
+			  char      **hostname,
+			  GError    **error);
+
+void generate_category_playlists (iTunesDB *itdb, T_item cat);
+Playlist *generate_displayed_playlist (void);
+Playlist *generate_selected_playlist (void);
+void randomize_current_playlist (void);
+Playlist *generate_random_playlist (iTunesDB *itdb);
+Playlist *generate_not_listed_playlist (iTunesDB *itdb);
+Playlist *generate_playlist_with_name (iTunesDB *itdb, GList *tracks,
+				       gchar *pl_name, gboolean del_old);
+Playlist *generate_new_playlist (iTunesDB *itdb, GList *tracks);
+void most_listened_pl (iTunesDB *itdb);
+void never_listened_pl (iTunesDB *itdb);
+void last_listened_pl(iTunesDB *itdb);
+void most_rated_pl(iTunesDB *itdb);
+void since_last_pl(iTunesDB *itdb);
+void each_rating_pl (iTunesDB *itdb);
+
+guint32 utf16_strlen (gunichar2 *utf16);
+gunichar2 *utf16_strdup (gunichar2 *utf16);
+
+void check_db (iTunesDB *db);
+
+gboolean mkdirhier(const gchar *dirname, gboolean silent);
+gboolean mkdirhierfile(const gchar *filename);
+gint64 get_size_of_directory (const gchar *dir);
+gchar *convert_filename (const gchar *filename);
+
+guint32 replaygain_to_soundcheck (gdouble gain);
+gdouble soundcheck_to_replaygain (guint32 soundcheck);
+
+
+void option_set_radio_button (GladeXML *win_xml,
+			      const gchar *prefs_string,
+			      const gchar **widgets,
+			      gint dflt);
+gint option_get_radio_button (GladeXML *win_xml,
+			      const gchar *prefs_string,
+			      const gchar **widgets);
+void option_set_folder (GtkFileChooser *fc,
+			const gchar *prefs_string);
+void option_get_folder (GtkFileChooser *fc,
+			const gchar *prefs_string,
+			gchar **value);
+void option_set_filename (GtkFileChooser *fc,
+			  const gchar *prefs_string);
+void option_get_filename (GtkFileChooser *fc,
+			  const gchar *prefs_string,
+			  gchar **value);
+void option_set_string (GladeXML *win_xml,
+			const gchar *name,
+			const gchar *dflt);
+void option_get_string (GladeXML *win_xml,
+			const gchar *name,
+			gchar **value);
+void option_set_toggle_button (GladeXML *win_xml,
+			       const gchar *name,
+			       gboolean dflt);
+gboolean option_get_toggle_button (GladeXML *win_xml,
+				   const gchar *name);
+
+gchar *get_string_from_template (Track *track,
+				 const gchar *template,
+				 gboolean is_filename,
+				 gboolean silent);
+gchar *get_string_from_full_template (Track *track,
+				      const gchar *full_template,
+				      gboolean is_filename);
+
+GList *glist_duplicate (GList *list);
+
+gchar *which (const gchar *exe);
+
+GtkWidget *gtkpod_xml_get_widget (GladeXML *xml, const gchar *name);
+
+gchar *get_itdb_prefs_key (gint index, const gchar *subkey);
+gchar *get_playlist_prefs_key (gint index, Playlist *pl, const gchar *subkey);
+gint get_itdb_index (iTunesDB *itdb);
+gchar *get_itdb_prefs_string (iTunesDB *itdb, const gchar *subkey);
+gchar *get_playlist_prefs_string (Playlist *playlist, const gchar *subkey);
+gint get_itdb_prefs_int (iTunesDB *itdb, const gchar *subkey);
+gint get_playlist_prefs_int (Playlist *playlist, const gchar *subkey);
+gboolean get_itdb_prefs_string_value (iTunesDB *itdb, const gchar *subkey,
+				      gchar **value);
+gboolean get_itdb_prefs_int_value (iTunesDB *itdb, const gchar *subkey,
+				   gint *value);
+void set_itdb_prefs_string (iTunesDB *itdb,
+			    const gchar *subkey, const gchar *value);
+void set_itdb_index_prefs_string (gint index,
+				  const gchar *subkey, const gchar *value);
+void set_itdb_prefs_int (iTunesDB *itdb, const gchar *subkey, gint value);
+void set_itdb_index_prefs_int (gint index,
+			       const gchar *subkey, gint value);
+void remove_itdb_prefs (iTunesDB *itdb);
+void load_ipod_prefs (iTunesDB *itdb, const gchar *mountpoint);
+gboolean save_ipod_prefs (iTunesDB *itdb, const gchar *mountpoint);
+
+gboolean get_offline (iTunesDB *itdb);
+#endif

Added: trunk/src/misc_confirm.c
===================================================================
--- trunk/src/misc_confirm.c	                        (rev 0)
+++ trunk/src/misc_confirm.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,884 @@
+/*
+|  Copyright (C) 2002-2007 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: misc_confirm.c 1822 2007-12-12 16:31:26Z dforsi $
+*/
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <gtk/gtk.h>
+#include <string.h>
+#include <sys/stat.h>
+#include "confirmation.h"
+#include "misc.h"
+#include "prefs.h"
+#include "info.h"
+#include "display_coverart.h"
+
+#ifdef HAVE_STATVFS
+#include <sys/types.h>
+#include <sys/statvfs.h>
+#endif
+
+#define DEBUG_MISC 0
+
+/*------------------------------------------------------------------*\
+ *                                                                  *
+ *                       gtkpod_warning                             *
+ *                                                                  *
+\*------------------------------------------------------------------*/
+
+/* gtkpod_warning(): will pop up a window and display text as a
+ * warning. If a warning window is already open, the text will be
+ * added to the existing window. */
+/* parameters: same as printf */
+void gtkpod_warning (const gchar *format, ...)
+{
+    va_list arg;
+    gchar *text;
+
+    va_start (arg, format);
+    text = g_strdup_vprintf (format, arg);
+    va_end (arg);
+
+    gtkpod_confirmation (CONF_ID_GTKPOD_WARNING,    /* gint id, */
+			 FALSE,                     /* gboolean modal, */
+			 _("Warning"),              /* title */
+			 _("The following has occurred:"),
+			 text,                /* text to be displayed */
+			 NULL, 0, NULL,       /* option 1 */
+			 NULL, 0, NULL,       /* option 2 */
+			 TRUE,                /* gboolean confirm_again, */
+			 NULL, /* ConfHandlerOpt confirm_again_key, */
+			 CONF_NULL_HANDLER,   /* ConfHandler ok_handler,*/
+			 NULL,                /* don't show "Apply" */
+			 NULL,                /* cancel_handler,*/
+			 NULL,                /* gpointer user_data1,*/
+			 NULL);               /* gpointer user_data2,*/
+    g_free (text);
+}
+
+
+/*------------------------------------------------------------------*\
+ *                                                                  *
+ *             Delete Tracks                                         *
+ *                                                                  *
+\*------------------------------------------------------------------*/
+
+/* This is the same for delete_track_head() and delete_st_head(), so I
+ * moved it here to make changes easier */
+void delete_populate_settings (struct DeleteData *dd,
+			       gchar **label, gchar **title,
+			       gboolean *confirm_again,
+			       gchar **confirm_again_key,
+			       GString **str)
+{
+    Track *s;
+    GList *l;
+    guint n;
+
+    g_return_if_fail (dd);
+    g_return_if_fail (dd->itdb);
+
+    /* write title and label */
+    n = g_list_length (dd->tracks);
+
+    if (dd->itdb->usertype & GP_ITDB_TYPE_IPOD)
+    {
+	switch (dd->deleteaction)
+	{
+	case DELETE_ACTION_LOCAL:
+	case DELETE_ACTION_DATABASE:
+	    /* not allowed -- programming error */
+	    g_return_if_reached ();
+	    break;
+	case DELETE_ACTION_IPOD:
+	    if (label)
+		*label = g_strdup (
+		    ngettext ("Are you sure you want to delete the following track completely from your iPod? The number of playlists this track is a member of is indicated in parentheses.",
+			      "Are you sure you want to delete the following tracks completely from your iPod? The number of playlists the tracks are member of is indicated in parentheses.", n));
+	    if (title)
+		*title = g_strdup (
+		    ngettext ("Delete Track Completely from iPod?",
+			      "Delete Tracks Completely from iPod?", n));
+	    if (confirm_again)
+		*confirm_again = prefs_get_int("delete_ipod");
+	    if (confirm_again_key)
+		*confirm_again_key = g_strdup("delete_ipod");
+	    break;
+	case DELETE_ACTION_PLAYLIST:
+	    g_return_if_fail (dd->pl);
+	    if (label)
+		*label = g_strdup_printf(
+		    ngettext ("Are you sure you want to remove the following track from the playlist \"%s\"?",
+			      "Are you sure you want to remove the following tracks from the playlist \"%s\"?", n), dd->pl->name);
+	    if (title)
+		*title = g_strdup (
+		    ngettext ("Remove Track From Playlist?",
+			      "Remove Tracks From Playlist?", n));
+	    if (confirm_again)
+		*confirm_again = prefs_get_int("delete_track");
+	    if (confirm_again_key)
+		*confirm_again_key = g_strdup("delete_track");
+	    break;
+	default:
+	    g_return_if_reached ();
+	}
+    }
+    if (dd->itdb->usertype & GP_ITDB_TYPE_LOCAL)
+    {
+	switch (dd->deleteaction)
+	{
+	case DELETE_ACTION_IPOD:
+	    /* not allowed -- programming error */
+	    g_return_if_reached ();
+	    break;
+	case DELETE_ACTION_LOCAL:
+	    if (label)
+		*label = g_strdup (
+		    ngettext ("Are you sure you want to delete the following track completely from your harddisk? The number of playlists this track is a member of is indicated in parentheses.",
+			      "Are you sure you want to delete the following tracks completely from your harddisk? The number of playlists the tracks are member of is indicated in parentheses.", n));
+	    if (title)
+		*title = g_strdup (
+		    ngettext ("Delete Track from Harddisk?",
+			      "Delete Tracks from Harddisk?", n));
+	    if (confirm_again)
+		*confirm_again = prefs_get_int("delete_local_file");
+	    if (confirm_again_key)
+		*confirm_again_key = g_strdup("delete_local_file");
+	    break;
+	case DELETE_ACTION_PLAYLIST:
+	    g_return_if_fail (dd->pl);
+	    if (label)
+		*label = g_strdup_printf(
+		    ngettext ("Are you sure you want to remove the following track from the playlist \"%s\"?",
+			      "Are you sure you want to remove the following tracks from the playlist \"%s\"?", n), dd->pl->name);
+	    if (title)
+		*title = g_strdup (
+		    ngettext ("Remove Track From Playlist?",
+			      "Remove Tracks From Playlist?", n));
+	    if (confirm_again)
+		*confirm_again = prefs_get_int("delete_file");
+	    if (confirm_again_key)
+		*confirm_again_key = g_strdup("delete_file");
+	    break;
+	case DELETE_ACTION_DATABASE:
+	    if (label)
+		*label = g_strdup (
+		    ngettext ("Are you sure you want to remove the following track completely from your local database? The number of playlists this track is a member of is indicated in parentheses.",
+			      "Are you sure you want to remove the following tracks completely from your local database? The number of playlists the tracks are member of is indicated in parentheses.", n));
+	    if (title)
+		*title = g_strdup (
+		    ngettext ("Remove Track from Local Database?",
+			      "Remove Tracks from Local Database?", n));
+	    if (confirm_again)
+		*confirm_again = prefs_get_int("delete_database");
+	    if (confirm_again_key)
+		*confirm_again_key = g_strdup("delete_database");
+	    break;
+	default:
+	    g_return_if_reached ();
+	}
+    }
+
+    /* Write names of tracks */
+    if (str)
+    {
+	*str = g_string_sized_new (2000);
+	for(l = dd->tracks; l; l = l->next)
+	{
+	    s = l->data;
+	    g_return_if_fail (s);
+	    g_string_append_printf (*str, "%s-%s (%d)\n",
+				    s->artist, s->title,
+				    itdb_playlist_contain_track_number (s));
+	}
+    }
+}
+
+
+/* cancel handler for delete track */
+/* @user_data1 the selected playlist, @user_data2 are the selected tracks */
+static void delete_track_cancel (struct DeleteData *dd)
+{
+    g_return_if_fail (dd);
+
+    g_list_free (dd->tracks);
+    g_free (dd);
+}
+
+
+
+/* ok handler for delete track */
+/* @user_data1 the selected playlist, @user_data2 are the selected tracks */
+void delete_track_ok (struct DeleteData *dd)
+{
+    gint n;
+    GList *l;
+
+    g_return_if_fail (dd);
+    g_return_if_fail (dd->pl);
+    g_return_if_fail (dd->itdb);
+
+    /* should never happen */
+    if (!dd->tracks)	delete_track_cancel (dd);
+
+		/* Deafen the coverart display while deletion is occurring */
+		coverart_block_change (TRUE);
+		
+    /* nr of tracks to be deleted */
+    n = g_list_length (dd->tracks);
+    if (dd->itdb->usertype & GP_ITDB_TYPE_IPOD)
+    {
+	switch (dd->deleteaction)
+	{
+	case DELETE_ACTION_IPOD:
+	    gtkpod_statusbar_message (
+		ngettext ("Deleted one track completely from iPod",
+			  "Deleted %d tracks completely from iPod",
+			  n), n);
+	    break;
+	case DELETE_ACTION_PLAYLIST:
+	    gtkpod_statusbar_message (
+		ngettext ("Deleted %d track from playlist '%s'",
+			  "Deleted %d tracks from playlist '%s'",
+			  n), n, dd->pl->name);
+	    break;
+	case DELETE_ACTION_LOCAL:
+	case DELETE_ACTION_DATABASE:
+	default:
+	    /* not allowed -- programming error */
+	    g_return_if_reached ();
+	    break;
+	}
+    }
+    if (dd->itdb->usertype & GP_ITDB_TYPE_LOCAL)
+    {
+	switch (dd->deleteaction)
+	{
+	case DELETE_ACTION_LOCAL:
+	    gtkpod_statusbar_message (
+		ngettext ("Deleted one track from harddisk",
+			  "Deleted %d tracks from harddisk",
+			  n), n);
+	    break;
+	case DELETE_ACTION_PLAYLIST:
+	    gtkpod_statusbar_message (
+		ngettext ("Deleted %d track from playlist '%s'",
+			  "Deleted %d tracks from playlist '%s'",
+			  n), n, dd->pl->name);
+	    break;
+	case DELETE_ACTION_DATABASE:
+	    gtkpod_statusbar_message (
+		ngettext ("Deleted track from local database",
+			  "Deleted %d tracks from local database",
+			  n), n);
+	    break;
+	case DELETE_ACTION_IPOD:
+	default:
+	    /* not allowed -- programming error */
+	    g_return_if_reached ();
+	    break;
+	}
+    }
+    for (l = dd->tracks; l; l = l->next)
+    {
+	gp_playlist_remove_track (dd->pl, l->data, dd->deleteaction);
+    }
+
+		/* Awaken coverart selection */
+		coverart_block_change (FALSE);
+    g_list_free (dd->tracks);
+    g_free (dd);
+
+    gtkpod_tracks_statusbar_update ();
+}
+
+/* Deletes selected tracks from current playlist.
+   @deleteaction: on of the DeleteActions defined in misc.h */
+void delete_track_head (DeleteAction deleteaction)
+{
+    Playlist *pl;
+    GList *selected_tracks;
+    GString *str;
+    gchar *label, *title;
+    gboolean confirm_again;
+    struct DeleteData *dd;
+    iTunesDB *itdb;
+    GtkResponseType response;
+    gchar *confirm_again_key;
+
+    pl = pm_get_selected_playlist ();
+    if (pl == NULL)
+    { /* no playlist??? Cannot happen, but... */
+	message_sb_no_playlist_selected ();
+	return;
+    }
+    itdb = pl->itdb;
+    g_return_if_fail (itdb);
+
+    selected_tracks = tm_get_selected_tracks();
+    if (selected_tracks == NULL)
+    {  /* no tracks selected */
+	message_sb_no_tracks_selected ();
+	return;
+    }
+
+    dd = g_malloc0 (sizeof (struct DeleteData));
+    dd->deleteaction = deleteaction;
+    dd->tracks = selected_tracks;
+    dd->pl = pl;
+    dd->itdb = itdb;
+
+    delete_populate_settings (dd,
+			      &label, &title,
+			      &confirm_again, &confirm_again_key,
+			      &str);
+    /* open window */
+    response = gtkpod_confirmation
+	(-1,                   /* gint id, */
+	 TRUE,                 /* gboolean modal, */
+	 title,                /* title */
+	 label,                /* label */
+	 str->str,             /* scrolled text */
+	 NULL, 0, NULL,        /* option 1 */
+	 NULL, 0, NULL,        /* option 2 */
+	 confirm_again,        /* gboolean confirm_again, */
+	 confirm_again_key,/* ConfHandlerOpt confirm_again_key,*/
+	 CONF_NULL_HANDLER,    /* ConfHandler ok_handler,*/
+	 NULL,                 /* don't show "Apply" button */
+	 CONF_NULL_HANDLER,    /* cancel_handler,*/
+	 NULL,                 /* gpointer user_data1,*/
+	 NULL);                /* gpointer user_data2,*/
+
+    switch (response)
+    {
+    case GTK_RESPONSE_OK:
+	/* Delete the tracks */
+	delete_track_ok (dd);
+	break;
+    default:
+	delete_track_cancel (dd);
+	break;
+    }
+
+    g_free (label);
+    g_free (title);
+    g_free(confirm_again_key);
+    g_string_free (str, TRUE);
+}
+
+
+
+/*------------------------------------------------------------------*\
+ *                                                                  *
+ *             Delete tracks in st entry                             *
+ *                                                                  *
+\*------------------------------------------------------------------*/
+
+/* deletes the currently selected entry from the current playlist
+   @inst: selected entry of which instance?
+   @delete_full: if true, member songs are removed from the iPod
+   completely */
+void delete_entry_head (gint inst, DeleteAction deleteaction)
+{
+    struct DeleteData *dd;
+    Playlist *pl;
+    GList *selected_tracks=NULL;
+    GString *str;
+    gchar *label = NULL, *title = NULL;
+    gboolean confirm_again;
+    gchar *confirm_again_key;
+    TabEntry *entry;
+    GtkResponseType response;
+    iTunesDB *itdb;
+
+    g_return_if_fail (inst >= 0);
+    g_return_if_fail (inst <= prefs_get_int("sort_tab_num"));
+
+    pl = pm_get_selected_playlist();
+    if (pl == NULL)
+    { /* no playlist??? Cannot happen, but... */
+	message_sb_no_playlist_selected ();
+	return;
+    }
+    itdb = pl->itdb;
+    g_return_if_fail (itdb);
+
+    entry = st_get_selected_entry (inst);
+    if (entry == NULL)
+    {  /* no entry selected */
+	gtkpod_statusbar_message (_("No entry selected."));
+	return;
+    }
+
+    if (entry->members == NULL)
+    {  /* no tracks in entry -> just remove entry */
+	if (!entry->master)  st_remove_entry (entry, inst);
+	else   gtkpod_statusbar_message (_("Cannot remove entry 'All'"));
+	return;
+    }
+
+    selected_tracks = g_list_copy (entry->members);
+
+    dd = g_malloc0 (sizeof (struct DeleteData));
+    dd->deleteaction = deleteaction;
+    dd->tracks = selected_tracks;
+    dd->pl = pl;
+    dd->itdb = itdb;
+
+    delete_populate_settings (dd,
+			      &label, &title,
+			      &confirm_again, &confirm_again_key,
+			      &str);
+
+    /* open window */
+    response = gtkpod_confirmation
+	(-1,                   /* gint id, */
+	 TRUE,                 /* gboolean modal, */
+	 title,                /* title */
+	 label,                /* label */
+	 str->str,             /* scrolled text */
+	 NULL, 0, NULL,        /* option 1 */
+	 NULL, 0, NULL,        /* option 2 */
+	 confirm_again,        /* gboolean confirm_again, */
+	 confirm_again_key,/* ConfHandlerOpt confirm_again_key,*/
+	 CONF_NULL_HANDLER,    /* ConfHandler ok_handler,*/
+	 NULL,                 /* don't show "Apply" button */
+	 CONF_NULL_HANDLER,    /* cancel_handler,*/
+	 NULL,                 /* gpointer user_data1,*/
+	 NULL);                /* gpointer user_data2,*/
+
+    switch (response)
+    {
+    case GTK_RESPONSE_OK:
+	/* Delete the tracks */
+	delete_track_ok (dd);
+	/* Delete the entry */
+	st_remove_entry (entry, inst);
+	break;
+    default:
+	delete_track_cancel (dd);
+	break;
+    }
+
+    g_free (label);
+    g_free (title);
+    g_free(confirm_again_key);
+    g_string_free (str, TRUE);
+}
+
+
+/*------------------------------------------------------------------*\
+ *                                                                  *
+ *             Delete Playlist                                      *
+ *                                                                  *
+\*------------------------------------------------------------------*/
+
+
+/* clean up delete playlist */
+static void delete_playlist_cleanup (struct DeleteData *dd)
+{
+    g_return_if_fail (dd);
+
+    g_list_free (dd->tracks);
+    g_free (dd);
+}
+
+static void delete_playlist_ok (struct DeleteData *dd)
+{
+    gint n;
+    gchar *msg = NULL;
+
+    g_return_if_fail (dd);
+    g_return_if_fail (dd->pl);
+    g_return_if_fail (dd->itdb);
+
+    n = g_list_length (dd->pl->members);
+
+    if (dd->itdb->usertype & GP_ITDB_TYPE_IPOD)
+    {
+	switch (dd->deleteaction)
+	{
+	case DELETE_ACTION_IPOD:
+	    while (dd->pl->members)
+	    {
+		/* remove tracks from iPod */
+		gp_playlist_remove_track (dd->pl, dd->pl->members->data,
+					  dd->deleteaction);
+	    }
+	    if (itdb_playlist_is_mpl (dd->pl))
+	    {
+		msg = g_strdup_printf (_("Removed all %d tracks from the iPod"), n);
+		display_reset (0);
+	    }
+	    else if (itdb_playlist_is_podcasts (dd->pl))
+	    {
+		msg = g_strdup_printf (_("Removed all podcasts from the iPod"));
+		if (pm_get_selected_playlist () == dd->pl)
+		    st_redisplay (0);
+/*		display_reset (0);*/
+	    }
+	    else
+	    {
+		/* first use playlist name */
+		msg = g_strdup_printf (
+		    ngettext ("Deleted playlist '%s' including %d member track",
+			      "Deleted playlist '%s' including %d member tracks",
+			      n),
+		    dd->pl->name, n);
+		/* then remove playlist */
+		gp_playlist_remove (dd->pl);
+	    }
+	    break;
+	case DELETE_ACTION_PLAYLIST:
+	    if (itdb_playlist_is_mpl (dd->pl))
+	    {	/* not allowed -- programming error */
+		g_return_if_reached ();
+	    }
+	    else
+	    {
+		/* first use playlist name */
+		msg = g_strdup_printf (_("Deleted playlist '%s'"),
+				       dd->pl->name);
+		/* then remove playlist */
+		gp_playlist_remove (dd->pl);
+	    }
+	    break;
+	case DELETE_ACTION_LOCAL:
+	case DELETE_ACTION_DATABASE:
+	    /* not allowed -- programming error */
+	    g_return_if_reached ();
+	    break;
+	}
+    }
+    if (dd->itdb->usertype & GP_ITDB_TYPE_LOCAL)
+    {
+	switch (dd->deleteaction)
+	{
+	case DELETE_ACTION_LOCAL:
+	    if (itdb_playlist_is_mpl (dd->pl))
+	    {   /* for safety reasons this is not implemented (would
+		   remove all tracks from your local harddisk) */
+		g_return_if_reached ();
+	    }
+	    else
+	    {
+		while (dd->pl->members)
+		{
+		    /* remove tracks from playlist */
+		    gp_playlist_remove_track (dd->pl,
+					      dd->pl->members->data,
+					      dd->deleteaction);
+		}
+		/* first use playlist name */
+		msg = g_strdup_printf (
+		    ngettext ("Deleted playlist '%s' including %d member track on harddisk",
+			      "Deleted playlist '%s' including %d member tracks on harddisk",
+			      n),
+		    dd->pl->name, n);
+		/* then remove playlist */
+		gp_playlist_remove (dd->pl);
+	    }
+	    break;
+	case DELETE_ACTION_DATABASE:
+	    while (dd->pl->members)
+	    {
+		/* remove tracks from database */
+		gp_playlist_remove_track (dd->pl, dd->pl->members->data,
+					  dd->deleteaction);
+	    }
+	    if (itdb_playlist_is_mpl (dd->pl))
+	    {
+		msg = g_strdup_printf (_("Removed all %d tracks from the database"), n);
+		display_reset (0);
+	    }
+	    else
+	    {
+		/* first use playlist name */
+		msg = g_strdup_printf (
+		    ngettext ("Deleted playlist '%s' including %d member track",
+			      "Deleted playlist '%s' including %d member tracks",
+			      n),
+		    dd->pl->name, n);
+		/* then remove playlist */
+		gp_playlist_remove (dd->pl);
+	    }
+	    break;
+	case DELETE_ACTION_PLAYLIST:
+	    if (itdb_playlist_is_mpl (dd->pl))
+	    {	/* not allowed -- programming error */
+		g_return_if_reached ();
+	    }
+	    else
+	    {
+		/* first use playlist name */
+		msg = g_strdup_printf (_("Deleted playlist '%s'"),
+				       dd->pl->name);
+		/* then remove playlist */
+		gp_playlist_remove (dd->pl);
+	    }
+	    break;
+	case DELETE_ACTION_IPOD:
+	    /* not allowed -- programming error */
+	    g_return_if_reached ();
+	    break;
+	}
+    }
+    delete_playlist_cleanup (dd);
+
+    gtkpod_tracks_statusbar_update ();
+}
+
+
+
+/* delete currently selected playlist
+   @delete_full: if TRUE, member songs are removed from the iPod */
+void delete_playlist_head (DeleteAction deleteaction)
+{
+    struct DeleteData *dd;
+    Playlist *pl;
+    iTunesDB *itdb;
+    GtkResponseType response = GTK_RESPONSE_NONE;
+    gchar *label = NULL, *title = NULL;
+    gboolean confirm_again;
+    gchar *confirm_again_key;
+    guint32 n = 0;
+    GString *str;
+
+    pl = pm_get_selected_playlist();
+    if (!pl)
+    { /* no playlist selected */
+	message_sb_no_playlist_selected ();
+	return;
+    }
+
+    itdb = pl->itdb;
+    g_return_if_fail (itdb);
+
+    dd = g_malloc0 (sizeof (struct DeleteData));
+    dd->deleteaction = deleteaction;
+    dd->pl = pl;
+    dd->itdb = itdb;
+
+    if (itdb->usertype & GP_ITDB_TYPE_IPOD)
+    {
+	switch (deleteaction)
+	{
+	case DELETE_ACTION_IPOD:
+	    if (itdb_playlist_is_mpl (pl))
+	    {
+		label = g_strdup_printf (_("Are you sure you want to remove all tracks from your iPod?"));
+	    }
+	    else if (itdb_playlist_is_podcasts (pl))
+	    {   /* podcasts playlist */
+		dd->tracks = g_list_copy (pl->members);
+		label = g_strdup_printf (_("Are you sure you want to remove all podcasts from your iPod?"));
+	    }
+	    else 
+	    {   /* normal playlist */
+		/* we set selected_tracks to get a list printed by
+		 * delete_populate_settings() further down */
+		dd->tracks = g_list_copy (pl->members);
+		label = g_strdup_printf (
+		    ngettext ("Are you sure you want to delete playlist '%s' and the following track completely from your iPod? The number of playlists this track is a member of is indicated in parentheses.",
+			      "Are you sure you want to delete playlist '%s' and the following tracks completely from your iPod? The number of playlists the tracks are member of is indicated in parentheses.", n), pl->name);
+	    }
+	    break;
+	case DELETE_ACTION_PLAYLIST:
+	    if (itdb_playlist_is_mpl (pl))
+	    {	/* not allowed -- programming error */
+		g_return_if_reached ();
+	    }
+	    else
+	    {
+		label = g_strdup_printf(_("Are you sure you want to delete the playlist '%s'?"), pl->name);
+	    }
+	    break;
+	case DELETE_ACTION_LOCAL:
+	case DELETE_ACTION_DATABASE:
+	    /* not allowed -- programming error */
+	    g_return_if_reached ();
+	    break;
+	}
+    }
+    if (itdb->usertype & GP_ITDB_TYPE_LOCAL)
+    {
+	switch (deleteaction)
+	{
+	case DELETE_ACTION_LOCAL:
+	    if (itdb_playlist_is_mpl (pl))
+	    {   /* for safety reasons this is not implemented (would
+		   remove all tracks from your local harddisk */
+		g_return_if_reached ();
+	    }
+	    else
+	    {
+		/* we set selected_tracks to get a list printed by
+		 * delete_populate_settings() further down */
+		dd->tracks = g_list_copy (pl->members);
+		label = g_strdup_printf (
+		    ngettext ("Are you sure you want to delete playlist '%s' and remove the following track from your harddisk? The number of playlists this track is a member of is indicated in parentheses.",
+			      "Are you sure you want to delete playlist '%s' and remove the following tracks from your harddisk? The number of playlists the tracks are member of is indicated in parentheses.",
+			      n), pl->name);
+	    }
+	    break;
+	case DELETE_ACTION_DATABASE:
+	    if (itdb_playlist_is_mpl (pl))
+	    {
+		label = g_strdup_printf (_("Are you sure you want to remove all tracks from the database?"));
+		
+	    }
+	    else
+	    {
+		/* we set selected_tracks to get a list printed by
+		 * delete_populate_settings() further down */
+		dd->tracks = g_list_copy (pl->members);
+		label = g_strdup_printf (
+		    ngettext ("Are you sure you want to delete playlist '%s' and remove the following track from the database? The number of playlists this track is a member of is indicated in parentheses.",
+			      "Are you sure you want to delete playlist '%s' and remove the following tracks from the database? The number of playlists the tracks are member of is indicated in parentheses.",
+			      n), pl->name);
+	    }
+	    break;
+	case DELETE_ACTION_PLAYLIST:
+	    if (itdb_playlist_is_mpl (pl))
+	    {	/* not allowed -- programming error */
+		g_return_if_reached ();
+	    }
+	    else
+	    {
+		label = g_strdup_printf(_("Are you sure you want to delete the playlist '%s'?"), pl->name);
+	    }
+	    break;
+	case DELETE_ACTION_IPOD:
+	    /* not allowed -- programming error */
+	    g_return_if_reached ();
+	    break;
+	}
+    }
+
+    delete_populate_settings (dd,
+			      NULL, &title,
+			      &confirm_again,
+			      &confirm_again_key,
+			      &str);
+
+    response = gtkpod_confirmation
+	(-1,                     /* gint id, */
+	 TRUE,                   /* gboolean modal, */
+	 title,                  /* title */
+	 label,                  /* label */
+	 str->str,               /* scrolled text */
+	 NULL, 0, NULL,          /* option 1 */
+	 NULL, 0, NULL,          /* option 2 */
+	 confirm_again,          /* gboolean confirm_again, */
+	 confirm_again_key,  /* ConfHandlerOpt confirm_again_key,*/
+	 CONF_NULL_HANDLER,      /* ConfHandler ok_handler,*/
+	 NULL,                   /* don't show "Apply" button */
+	 CONF_NULL_HANDLER,      /* cancel_handler,*/
+	 NULL,                   /* gpointer user_data1,*/
+	 NULL);                  /* gpointer user_data2,*/
+
+    g_free (label);
+    g_free (title);
+    g_free(confirm_again_key);
+    g_string_free (str, TRUE);
+
+    switch (response)
+    {
+    case GTK_RESPONSE_OK:
+	delete_playlist_ok (dd);
+	break;
+    default:
+	delete_playlist_cleanup (dd);
+	break;
+    }
+}
+
+
+
+/**
+ * gtkpod_shutdown
+ *
+ * return value: TRUE if it's OK to quit.
+ */
+static gboolean
+ok_to_close_gtkpod (void)
+{
+    gint result = GTK_RESPONSE_YES;
+
+    if (!files_are_saved ())
+    {
+	GtkWidget *dialog = gtk_message_dialog_new (
+	    GTK_WINDOW (gtkpod_window),
+	    GTK_DIALOG_DESTROY_WITH_PARENT,
+	    GTK_MESSAGE_WARNING,
+	    GTK_BUTTONS_YES_NO,
+	    _("Data has been changed and not been saved.\nOK to exit gtkpod?"));
+	result = gtk_dialog_run (GTK_DIALOG (dialog));
+	gtk_widget_destroy (dialog);
+    }
+
+    if (result == GTK_RESPONSE_YES)
+    {
+	return TRUE;
+    }
+    return FALSE;
+}
+
+
+/* callback for gtkpod window's close button */
+gboolean
+on_gtkpod_delete_event                 (GtkWidget       *widget,
+					GdkEvent        *event,
+					gpointer         user_data)
+{
+    if (!widgets_blocked)
+    {
+	if (ok_to_close_gtkpod ())
+	{
+	    gtkpod_shutdown ();
+	    return FALSE;
+	}
+    }
+    return TRUE; /* don't quit -- would cause numerous error messages */
+}
+
+
+/* callback for quit menu entry */
+void
+on_quit1_activate                      (GtkMenuItem     *menuitem,
+					gpointer         user_data)
+{
+    if (!widgets_blocked)
+    {
+	if (ok_to_close_gtkpod ())
+	{
+	    gtkpod_shutdown ();
+	}
+    }
+}

Added: trunk/src/misc_conversion.c
===================================================================
--- trunk/src/misc_conversion.c	                        (rev 0)
+++ trunk/src/misc_conversion.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,858 @@
+/*
+|  Copyright (C) 2002-2007 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: misc_conversion.c 1655 2007-07-27 02:22:31Z tiffman $
+*/
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#define __USE_XOPEN     /* needed for strptime() with glibc2 */
+#define _XOPEN_SOURCE   /* needed for strptime() with glibc2 */
+
+#include <gtk/gtk.h>
+#include <math.h>
+#include <string.h>
+
+#include "charset.h"
+#include "itdb.h"
+#include "misc.h"
+#include "display.h"
+#include "prefs.h"
+#include <time.h>
+
+
+#define DEBUG_MISC 0
+
+/* Note: the toggle buttons for tag_autoset and display_col in the
+ * prefs_window are named after the the TM_COLUM_* numbers defined in
+ * display.h (Title: tag_autoset0, Artist: tag_autoset1
+ * etc.). ign_field is named after T_*. Since the labels to the
+ * buttons are set in prefs_window.c when creating the window, you
+ * only need to name the buttons in the intended order using
+ * glade-2. There is no need to label them. */
+/* Strings associated to the column headers */
+static const gchar *t_strings[] = {
+    N_("All"),               /*  0 */
+    N_("Album"),
+    N_("Artist"),
+    N_("Title"),
+    N_("Genre"),
+    N_("Comment"),           /*  5 */
+    N_("Composer"),
+    N_("File type"),
+    N_("PC File"),
+    N_("iPod File"),
+    N_("iPod ID"),           /* 10 */
+    N_("Track Nr (#)"),
+    N_("Transferred"),
+    N_("File Size"),
+    N_("Play Time"),
+    N_("Bitrate"),           /* 15 */
+    N_("Samplerate"),
+    N_("BPM"),
+    N_("Playcount"),
+    N_("Rating"),
+    N_("Date added"),        /* 20 */
+    N_("Date played"),
+    N_("Date modified"),
+    N_("Volume"),
+    N_("Soundcheck"),
+    N_("Year"),              /* 25 */
+    N_("CD Nr"),
+    N_("Grouping"),
+    N_("Compilation"),
+    N_("Category"),
+    N_("Description"),       /* 30 */
+    N_("Podcast URL"),
+    N_("Podcast RSS"),
+    N_("Subtitle"),
+    N_("Date released"),
+    N_("Checked"),           /* 35 */
+    N_("Start time"),
+    N_("Stop time"),
+    N_("Remember Playback Position"),
+    N_("Skip when Shuffling"),
+    N_("Artwork Path"),      /* 40 */
+    N_("Media Type"),
+    N_("TV Show"),
+    N_("TV Episode"),
+    N_("TV Network"),
+    N_("Season Nr"),         /* 45 */
+    N_("Episode Nr"),
+    N_("Album Artist"),
+    N_("Sort Artist"),
+    N_("Sort Title"),
+    N_("Sort Album"),        /* 50 */
+    N_("Sort Album Artist"),
+    N_("Sort Composer"),
+    N_("Sort TV Show"),
+    N_("Gapless Track Flag"),
+    NULL };
+
+/* Tooltips for prefs window */
+static const gchar *t_tooltips[] = {
+    NULL,                                              /*  0 */
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,                                              /*  5 */
+    NULL,
+    NULL,
+    N_("Name of file on PC, if available"),
+    N_("Name of file on the iPod"),
+    NULL,                                              /* 10 */
+    N_("Track Nr. and total number of tracks on CD"),
+    N_("Whether the file has already been "
+       "transferred to the iPod or not"),
+    NULL,
+    NULL,
+    NULL,                                              /* 15 */
+    NULL,
+    N_("Beats per minute"),
+    N_("Number of times the track has been played"),
+    N_("Star rating from 0 to 5"),
+    N_("Date and time track has been added"),          /* 20 */
+    N_("Date and time track has last been played"),
+    N_("Date and time track has last been modified"),
+    N_("Manual volume adjust"),
+    N_("Volume adjust in dB (replay gain) -- "
+       "you need to activate 'soundcheck' on the iPod"),
+    NULL,                                              /* 25 */
+    N_("CD Nr. and total number of CDS in set"),
+    NULL,
+    NULL,
+    N_("The category (e.g. 'Technology' or 'Music') where the podcast was located."),
+    N_("Accessible by selecting the center button on the iPod."), /* 30 */
+    NULL,
+    NULL,
+    NULL,
+    N_("Release date (for podcasts displayed next to the title on the iPod)"),
+    NULL,   /* 35 */
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,   /* 40 */
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,   /* 45 */
+    NULL,
+    NULL,
+    N_("Used for sorting on the iPod"),
+    N_("Used for sorting on the iPod"),
+    N_("Used for sorting on the iPod"),  /* 50 */
+    N_("Used for sorting on the iPod"),
+    N_("Used for sorting on the iPod"),
+    N_("Used for sorting on the iPod"),
+    NULL
+ };
+
+
+/* translates a TM_COLUMN_... (defined in display.h) into a
+ * T_... (defined in display.h). Returns -1 in case a translation is not
+ * possible */
+T_item TM_to_T (TM_item tm)
+{
+    switch (tm)
+    {
+    case TM_COLUMN_TITLE:         return T_TITLE;
+    case TM_COLUMN_ARTIST:        return T_ARTIST;
+    case TM_COLUMN_ALBUM:         return T_ALBUM;
+    case TM_COLUMN_GENRE:         return T_GENRE;
+    case TM_COLUMN_COMPOSER:      return T_COMPOSER;
+    case TM_COLUMN_FILETYPE:      return T_FILETYPE;
+    case TM_COLUMN_GROUPING:      return T_GROUPING;
+    case TM_COLUMN_TRACK_NR:      return T_TRACK_NR;
+    case TM_COLUMN_CD_NR:         return T_CD_NR;
+    case TM_COLUMN_IPOD_ID:       return T_IPOD_ID;
+    case TM_COLUMN_PC_PATH:       return T_PC_PATH;
+    case TM_COLUMN_IPOD_PATH:     return T_IPOD_PATH;
+    case TM_COLUMN_TRANSFERRED:   return T_TRANSFERRED;
+    case TM_COLUMN_SIZE:          return T_SIZE;
+    case TM_COLUMN_TRACKLEN:      return T_TRACKLEN;
+    case TM_COLUMN_BITRATE:       return T_BITRATE;
+    case TM_COLUMN_SAMPLERATE:    return T_SAMPLERATE;
+    case TM_COLUMN_BPM:           return T_BPM;
+    case TM_COLUMN_PLAYCOUNT:     return T_PLAYCOUNT;
+    case TM_COLUMN_RATING:        return T_RATING;
+    case TM_COLUMN_TIME_ADDED:    return T_TIME_ADDED;
+    case TM_COLUMN_TIME_PLAYED:   return T_TIME_PLAYED;
+    case TM_COLUMN_TIME_MODIFIED: return T_TIME_MODIFIED;
+    case TM_COLUMN_VOLUME:        return T_VOLUME;
+    case TM_COLUMN_SOUNDCHECK:    return T_SOUNDCHECK;
+    case TM_COLUMN_YEAR:          return T_YEAR;
+    case TM_COLUMN_COMPILATION:   return T_COMPILATION;
+    case TM_COLUMN_COMMENT:       return T_COMMENT;
+    case TM_COLUMN_CATEGORY:      return T_CATEGORY;
+    case TM_COLUMN_DESCRIPTION:   return T_DESCRIPTION;
+    case TM_COLUMN_PODCASTURL:    return T_PODCASTURL;
+    case TM_COLUMN_PODCASTRSS:    return T_PODCASTRSS;
+    case TM_COLUMN_SUBTITLE:      return T_SUBTITLE;
+    case TM_COLUMN_TIME_RELEASED: return T_TIME_RELEASED;
+    case TM_COLUMN_THUMB_PATH:    return T_THUMB_PATH;
+    case TM_COLUMN_MEDIA_TYPE:    return T_MEDIA_TYPE;
+    case TM_COLUMN_TV_SHOW:       return T_TV_SHOW;
+    case TM_COLUMN_TV_EPISODE:    return T_TV_EPISODE;
+    case TM_COLUMN_TV_NETWORK:    return T_TV_NETWORK;
+    case TM_COLUMN_SEASON_NR:     return T_SEASON_NR;
+    case TM_COLUMN_EPISODE_NR:    return T_EPISODE_NR;
+    case TM_COLUMN_ALBUMARTIST:   return T_ALBUMARTIST;
+    case TM_COLUMN_SORT_ARTIST:   return T_SORT_ARTIST;
+    case TM_COLUMN_SORT_TITLE:    return T_SORT_TITLE;
+    case TM_COLUMN_SORT_ALBUM:    return T_SORT_ALBUM;
+    case TM_COLUMN_SORT_ALBUMARTIST: return T_SORT_ALBUMARTIST;
+    case TM_COLUMN_SORT_COMPOSER: return T_SORT_COMPOSER;
+    case TM_COLUMN_SORT_TVSHOW:   return T_SORT_TVSHOW;
+    case TM_NUM_COLUMNS:          g_return_val_if_reached (-1);
+    }
+    return -1;
+}
+
+
+/* See track_get_item() / track_get_item_pointer()  */
+gchar *get_allowed_percent_char(void )
+{
+    return g_strdup("latgcoysSny");
+}
+/* translates a char into a T_... (defined in display.h) */
+T_item char_to_T(gchar c){
+    switch (c) {
+        case 'l': return T_ALBUM;
+        case 'a': return T_ARTIST;
+        case 't': return T_TITLE;
+        case 'g': return T_GENRE;
+        case 'c': return T_COMMENT;
+        case 'o': return T_COMPOSER;
+        case 'f': return T_FILETYPE;
+        case 's': return T_PC_PATH;
+        case 'S': return T_IPOD_PATH;
+	    /* case 'i': return T_IPOD_ID; */
+        case 'n': return T_TRACK_NR;
+	    /* case 'f': return T_TRANSFERRED; */
+	    /* case 'z': return T_SIZE; */
+	    /* case 'L': return T_TRACKLEN; */
+	    /* case 'b': return T_BITRATE; */
+	    /* case 'r': return T_SAMPLERATE; */
+	    /* case 'b': return T_BPM; */
+	    /* case 'C': return T_PLAYCOUNT; */
+	    /* case 'i': return T_RATING; */
+	    /* case '': return T_TIME_ADDED; */
+	    /* case '': return T_TIME_PLAYED; */
+	    /* case '': return T_TIME_MODIFIED; */
+	    /* case '': return T_VOLUME; */
+	    /* case '': return T_SOUNDCHECK; */
+        case 'y': return T_YEAR;
+	    /* case 'd': return T_CD_NR; */
+	    /* case '': return T_GROUPING; */
+	    /* case '': return T_COMPILATION; */
+	    /* case '': return T_CATEGORY; */
+	    /* case '': return T_DESCRIPTION; */
+	    /* case '': return T_PODCASTURL; */
+	    /* case '': return T_PODCASTRSS; */
+	    /* case '': return T_SUBTITLE; */
+	    /* case '': return T_TIME_RELEASED; */
+	    /* case '': return T_CHECKED; */
+    }
+    return -1;
+}
+
+/* translates a ST_CAT_... (defined in display.h) into a
+ * T_... (defined in display.h). Returns -1 in case a translation is not
+ * possible */
+T_item ST_to_T (ST_CAT_item st)
+{
+    switch (st)
+    {
+    case ST_CAT_ARTIST:      return T_ARTIST;
+    case ST_CAT_ALBUM:       return T_ALBUM;
+    case ST_CAT_GENRE:       return T_GENRE;
+    case ST_CAT_COMPOSER:    return T_COMPOSER;
+    case ST_CAT_TITLE:       return T_TITLE;
+    case ST_CAT_YEAR:        return T_YEAR;
+    case ST_CAT_SPECIAL:
+    case ST_CAT_NUM:         g_return_val_if_reached (-1);
+    }
+    return -1;
+}
+
+
+/* return descriptive string (non-localized -- pass through gettext()
+ * for the localized version) for tm_item (usually used to name
+ * buttons or column headers). */
+const gchar *get_tm_string (TM_item tm)
+{
+    T_item t = TM_to_T (tm);
+
+    g_return_val_if_fail (t != -1, "");
+
+    return t_strings[t];
+}
+
+
+/* return string (non-localized -- pass through gettext()
+ * for the localized version) for tm_item that can be used as a
+ * tooltip */
+const gchar *get_tm_tooltip (TM_item tm)
+{
+    T_item t = TM_to_T (tm);
+
+    g_return_val_if_fail (t != -1, "");
+
+    return t_tooltips[t];
+}
+
+
+/* return descriptive string (non-localized -- pass through gettext()
+ * for the localized version) for tm_item (usually used to name
+ * buttons or column headers). */
+const gchar *get_t_string (T_item t)
+{
+    g_return_val_if_fail (t>=0 && t<T_ITEM_NUM, "");
+
+    return t_strings[t];
+}
+
+
+/* return string (non-localized -- pass through gettext()
+ * for the localized version) for tm_item that can be used as a
+ * tooltip */
+const gchar *get_t_tooltip (T_item t)
+{
+    if ((t >= 0) && (t<T_ITEM_NUM))   return t_tooltips[t];
+    else                              return ("");
+}
+
+
+
+/*------------------------------------------------------------------*\
+ *                                                                  *
+ *                       Timestamp stuff                            *
+ *                                                                  *
+\*------------------------------------------------------------------*/
+
+
+	/* NOTE:
+	 *
+	 * The iPod (firmware 1.3, 2.0, ...?) doesn't seem to use the
+	 * timezone information correctly -- no matter what you set
+	 * iPod's timezone to, it will always record as if it were set
+	 * to UTC -- we need to subtract the difference between
+	 * current timezone and UTC to get a correct
+	 * display. 'timezone' (initialized above) contains the
+	 * difference in seconds.
+	 */
+/*	if (playcount->time_played)
+	playcount->time_played += timezone;*/
+/* FIXME: THIS IS NOT IMPLEMENTED CORRECTLY */
+
+
+#define DATE_FORMAT_LONG "%x %X"
+#define DATE_FORMAT_SHORT "%x"
+
+
+static gchar *time_to_string_format (time_t t, const gchar *format)
+{
+    gchar buf[PATH_MAX+1];
+    struct tm tm;
+    size_t size;
+
+    g_return_val_if_fail (format, NULL);
+
+    if (t)
+    {
+	localtime_r (&t, &tm);
+	size = strftime (buf, PATH_MAX, format, &tm);
+	buf[size] = 0;
+	return g_locale_to_utf8 (buf, -1, NULL, NULL, NULL);
+    }
+    return g_strdup ("--");
+}
+
+
+
+/* converts the time stamp @t to a string (max. length:
+ * PATH_MAX). You must g_free the return value */
+gchar *time_time_to_string (time_t t)
+{
+    return time_to_string_format (t, DATE_FORMAT_LONG);
+}
+
+
+/* converts the time stamp @t to a string (max. length PATH_MAX)
+   assuming that no time should be shown if the time is 0:00:00 */
+gchar *time_fromtime_to_string (time_t t)
+{
+    struct tm tm;
+    
+    localtime_r (&t, &tm);
+    if ((tm.tm_sec == 0) && (tm.tm_min == 0) && (tm.tm_hour == 0))
+	 return time_to_string_format (t, DATE_FORMAT_SHORT);
+    else return time_to_string_format (t, DATE_FORMAT_LONG);
+}
+
+
+/* converts the time stamp @t to a string (max. length PATH_MAX)
+   assuming that no time should be shown if the time is 23:59:59 */
+gchar *time_totime_to_string (time_t t)
+{
+    struct tm tm;
+    
+    localtime_r (&t, &tm);
+    if ((tm.tm_sec == 59) && (tm.tm_min == 59) && (tm.tm_hour == 23))
+	 return time_to_string_format (t, DATE_FORMAT_SHORT);
+    else return time_to_string_format (t, DATE_FORMAT_LONG);
+}
+
+
+/* convert the string @str to a time stamp */
+time_t time_string_to_time (const gchar *str)
+{
+    return time_string_to_fromtime (str);
+}
+
+
+/* convert the string @str to a time stamp, assuming 0:00:00 if no
+ * time is given. Returns 0 if @str is "--" */
+time_t time_string_to_fromtime (const gchar *str)
+{
+    time_t t;
+    struct tm tm;
+
+    g_return_val_if_fail (str, -1);
+
+    if (strcmp (str, "--") == 0)  return 0;
+
+    t = time (NULL);
+    localtime_r (&t, &tm);
+    tm.tm_sec = 0;
+    tm.tm_min = 0;
+    tm.tm_hour = 0;
+    strptime (str, DATE_FORMAT_LONG, &tm);
+    t = mktime (&tm);
+    return t;
+}
+
+
+/* convert the string @str to a time stamp, assuming 23:59:59 if only
+ * date is specified */
+time_t time_string_to_totime (const gchar *str)
+{
+    time_t t;
+    struct tm tm;
+
+    g_return_val_if_fail (str, -1);
+
+    t = time (NULL);
+    localtime_r (&t, &tm);
+    tm.tm_sec = 59;
+    tm.tm_min = 59;
+    tm.tm_hour = 23;
+    strptime (str, DATE_FORMAT_LONG, &tm);
+    t = mktime (&tm);
+    return t;
+}
+
+
+/* get the timestamp TM_COLUMN_TIME_CREATE/PLAYED/MODIFIED/RELEASED */
+time_t time_get_time (Track *track, T_item t_item)
+{
+    guint32 mactime = 0;
+
+    if (track) switch (t_item)
+    {
+    case T_TIME_ADDED:
+	mactime = track->time_added;
+	break;
+    case T_TIME_PLAYED:
+	mactime = track->time_played;
+	break;
+    case T_TIME_MODIFIED:
+	mactime = track->time_modified;
+	break;
+    case T_TIME_RELEASED:
+	mactime = track->time_released;
+	break;
+    default:
+	mactime = 0;
+	break;
+    }
+    return mactime;
+}
+
+
+/* hopefully obvious */
+gchar *time_field_to_string (Track *track, T_item t_item)
+{
+    return (time_time_to_string (time_get_time (track, t_item)));
+}
+
+
+/* get the timestamp TM_COLUMN_TIME_CREATE/PLAYED/MODIFIED/RELEASED */
+void time_set_time (Track *track, time_t timet, T_item t_item)
+{
+    g_return_if_fail (track);
+
+    switch (t_item)
+    {
+    case T_TIME_ADDED:
+	track->time_added = timet;
+	break;
+    case T_TIME_PLAYED:
+	track->time_played = timet;
+	break;
+    case T_TIME_MODIFIED:
+	track->time_modified = timet;
+	break;
+    case T_TIME_RELEASED:
+	track->time_released = timet;
+	break;
+    default:
+	break;
+    }
+}
+
+
+
+/* -------------------------------------------------------------------
+ * The following is taken straight out of glib2.0.6 (gconvert.c):
+ * g_filename_from_uri uses g_filename_from_utf8() to convert from
+ * utf8. However, the user might have selected a different charset
+ * inside gtkpod -- we must use gtkpod's charset_from_utf8()
+ * instead. That's the only line changed...
+ * -------------------------------------------------------------------*/
+
+/* Test of haystack has the needle prefix, comparing case
+ * insensitive. haystack may be UTF-8, but needle must
+ * contain only ascii. */
+static gboolean
+has_case_prefix (const gchar *haystack, const gchar *needle)
+{
+  const gchar *h, *n;
+
+  /* Eat one character at a time. */
+  h = haystack;
+  n = needle;
+
+  while (*n && *h &&
+	 g_ascii_tolower (*n) == g_ascii_tolower (*h))
+    {
+      n++;
+      h++;
+    }
+
+  return *n == '\0';
+}
+
+static int
+unescape_character (const char *scanner)
+{
+  int first_digit;
+  int second_digit;
+
+  first_digit = g_ascii_xdigit_value (scanner[0]);
+  if (first_digit < 0)
+    return -1;
+
+  second_digit = g_ascii_xdigit_value (scanner[1]);
+  if (second_digit < 0)
+    return -1;
+
+  return (first_digit << 4) | second_digit;
+}
+
+static gchar *
+g_unescape_uri_string (const char *escaped,
+		       int         len,
+		       const char *illegal_escaped_characters,
+		       gboolean    ascii_must_not_be_escaped)
+{
+  const gchar *in, *in_end;
+  gchar *out, *result;
+  int c;
+
+  if (escaped == NULL)
+    return NULL;
+
+  if (len < 0)
+    len = strlen (escaped);
+
+  result = g_malloc (len + 1);
+
+  out = result;
+  for (in = escaped, in_end = escaped + len; in < in_end; in++)
+    {
+      c = *in;
+
+      if (c == '%')
+	{
+	  /* catch partial escape sequences past the end of the substring */
+	  if (in + 3 > in_end)
+	    break;
+
+	  c = unescape_character (in + 1);
+
+	  /* catch bad escape sequences and NUL characters */
+	  if (c <= 0)
+	    break;
+
+	  /* catch escaped ASCII */
+	  if (ascii_must_not_be_escaped && c <= 0x7F)
+	    break;
+
+	  /* catch other illegal escaped characters */
+	  if (strchr (illegal_escaped_characters, c) != NULL)
+	    break;
+
+	  in += 2;
+	}
+
+      *out++ = c;
+    }
+
+  g_return_val_if_fail (out - result <= len, NULL);
+  *out = '\0';
+
+  if (in != in_end || !g_utf8_validate (result, -1, NULL))
+    {
+      g_free (result);
+      return NULL;
+    }
+
+  return result;
+}
+
+static gboolean
+is_escalphanum (gunichar c)
+{
+  return c > 0x7F || g_ascii_isalnum (c);
+}
+
+static gboolean
+is_escalpha (gunichar c)
+{
+  return c > 0x7F || g_ascii_isalpha (c);
+}
+
+/* allows an empty string */
+static gboolean
+hostname_validate (const char *hostname)
+{
+  const char *p;
+  gunichar c, first_char, last_char;
+
+  p = hostname;
+  if (*p == '\0')
+    return TRUE;
+  do
+    {
+      /* read in a label */
+      c = g_utf8_get_char (p);
+      p = g_utf8_next_char (p);
+      if (!is_escalphanum (c))
+	return FALSE;
+      first_char = c;
+      do
+	{
+	  last_char = c;
+	  c = g_utf8_get_char (p);
+	  p = g_utf8_next_char (p);
+	}
+      while (is_escalphanum (c) || c == '-');
+      if (last_char == '-')
+	return FALSE;
+
+      /* if that was the last label, check that it was a toplabel */
+      if (c == '\0' || (c == '.' && *p == '\0'))
+	return is_escalpha (first_char);
+    }
+  while (c == '.');
+  return FALSE;
+}
+
+/**
+ * g_filename_from_uri:
+ * @uri: a uri describing a filename (escaped, encoded in UTF-8).
+ * @hostname: Location to store hostname for the URI, or %NULL.
+ *            If there is no hostname in the URI, %NULL will be
+ *            stored in this location.
+ * @error: location to store the error occuring, or %NULL to ignore
+ *         errors. Any of the errors in #GConvertError may occur.
+ *
+ * Converts an escaped UTF-8 encoded URI to a local filename in the
+ * encoding used for filenames.
+ *
+ * Return value: a newly-allocated string holding the resulting
+ *               filename, or %NULL on an error.
+ **/
+gchar *
+filename_from_uri (const char *uri,
+		   char      **hostname,
+		   GError    **error)
+{
+  const char *path_part;
+  const char *host_part;
+  char *unescaped_hostname;
+  char *result;
+  char *filename;
+  int offs;
+#ifdef G_OS_WIN32
+  char *p, *slash;
+#endif
+
+  if (hostname)
+    *hostname = NULL;
+
+  if (!has_case_prefix (uri, "file:/"))
+    {
+      g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_BAD_URI,
+		   _("The URI '%s' is not an absolute URI using the file scheme"),
+		   uri);
+      return NULL;
+    }
+
+  path_part = uri + strlen ("file:");
+
+  if (strchr (path_part, '#') != NULL)
+    {
+      g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_BAD_URI,
+		   _("The local file URI '%s' may not include a '#'"),
+		   uri);
+      return NULL;
+    }
+
+  if (has_case_prefix (path_part, "///"))
+    path_part += 2;
+  else if (has_case_prefix (path_part, "//"))
+    {
+      path_part += 2;
+      host_part = path_part;
+
+      path_part = strchr (path_part, '/');
+
+      if (path_part == NULL)
+	{
+	  g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_BAD_URI,
+		       _("The URI '%s' is invalid"),
+		       uri);
+	  return NULL;
+	}
+
+      unescaped_hostname = g_unescape_uri_string (host_part, path_part - host_part, "", TRUE);
+
+      if (unescaped_hostname == NULL ||
+	  !hostname_validate (unescaped_hostname))
+	{
+	  g_free (unescaped_hostname);
+	  g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_BAD_URI,
+		       _("The hostname of the URI '%s' is invalid"),
+		       uri);
+	  return NULL;
+	}
+
+      if (hostname)
+	*hostname = unescaped_hostname;
+      else
+	g_free (unescaped_hostname);
+    }
+
+  filename = g_unescape_uri_string (path_part, -1, "/", FALSE);
+
+  if (filename == NULL)
+    {
+      g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_BAD_URI,
+		   _("The URI '%s' contains invalidly escaped characters"),
+		   uri);
+      return NULL;
+    }
+
+  offs = 0;
+#ifdef G_OS_WIN32
+  /* Drop localhost */
+  if (hostname && *hostname != NULL &&
+      g_ascii_strcasecmp (*hostname, "localhost") == 0)
+    {
+      g_free (*hostname);
+      *hostname = NULL;
+    }
+
+  /* Turn slashes into backslashes, because that's the canonical spelling */
+  p = filename;
+  while ((slash = strchr (p, '/')) != NULL)
+    {
+      *slash = '\\';
+      p = slash + 1;
+    }
+
+  /* Windows URIs with a drive letter can be like "file://host/c:/foo"
+   * or "file://host/c|/foo" (some Netscape versions). In those cases, start
+   * the filename from the drive letter.
+   */
+  if (g_ascii_isalpha (filename[1]))
+    {
+      if (filename[2] == ':')
+	offs = 1;
+      else if (filename[2] == '|')
+	{
+	  filename[2] = ':';
+	  offs = 1;
+	}
+    }
+#endif
+
+  /* This is where we differ from glib2.0.6: we use
+     gtkpod's charset_from_utf8() instead of glib's
+     g_filename_from_utf8() */
+  result = charset_from_utf8 (filename + offs);
+  g_free (filename);
+
+  return result;
+}
+
+
+/* exp10() and log10() are gnu extensions */
+#ifndef exp10
+#define exp10(x) (exp((x)*log(10)))
+#endif
+
+#ifndef log10
+#define log10(x) (log(x)/log(10))
+#endif
+
+guint32 replaygain_to_soundcheck(gdouble replaygain)
+{
+    /* according to Samuel Wood -- thanks! */
+    return floor (1000. * exp10 (-replaygain * 0.1) + 0.5);
+}
+
+gdouble soundcheck_to_replaygain(guint32 soundcheck)
+{
+    if (soundcheck == 0) return 0;  /* unset should be 0 dB */
+    return (-10. * log10 (soundcheck/1000.));
+}

Added: trunk/src/misc_input.c
===================================================================
--- trunk/src/misc_input.c	                        (rev 0)
+++ trunk/src/misc_input.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,374 @@
+/* Time-stamp: <2007-06-25 00:53:20 jcs>
+|
+|  Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: misc_input.c 1588 2007-06-24 16:02:51Z jcsjcs $
+*/
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <stdlib.h>
+#include "charset.h"
+#include "fileselection.h"
+#include "info.h"
+#include "misc.h"
+#include "misc_track.h"
+#include "prefs.h"
+#include "prefs_window.h"
+
+
+#define DEBUG_MISC 0
+
+/* Concats @base_dir and @rel_dir if and only if @rel_dir is not
+ * absolute (does not start with '~' or '/'). Otherwise simply return
+ * a copy of @rel_dir. Must free return value after use */
+gchar *concat_dir_if_relative (G_CONST_RETURN gchar *base_dir,
+			       G_CONST_RETURN gchar *rel_dir)
+{
+    /* sanity */
+    if (!rel_dir || !*rel_dir)
+	return g_build_filename (base_dir, rel_dir, NULL);
+				 /* this constellation is nonsense... */
+    if ((*rel_dir == '/') || (*rel_dir == '~'))
+	return g_strdup (rel_dir);             /* rel_dir is absolute */
+					       /* make absolute path */
+    return g_build_filename (base_dir, rel_dir, NULL);
+}
+
+
+/*------------------------------------------------------------------*\
+ *                                                                  *
+ *             Ask for User Input (String, SortTab Nr.)             *
+ *                                                                  *
+\*------------------------------------------------------------------*/
+
+
+/* Retrieves a string (and option) from the user using a dialog.
+   @title: title of the dialogue (may be NULL)
+   @message: text (question) to be displayed (may be NULL)
+   @dflt: default string to be returned (may be NULL)
+   @opt_msg: message for the option checkbox (or NULL)
+   @opt_state: original state of the checkbox. Will be updated
+   return value: the string entered by the user or NULL if the dialog
+   was cancelled. */
+gchar *get_user_string (gchar *title, gchar *message, gchar *dflt,
+			gchar *opt_msg, gboolean *opt_state)
+{
+
+    GtkWidget *dialog, *image, *label=NULL;
+    GtkWidget *entry, *checkb=NULL, *hbox;
+    gint response;
+    gchar *result = NULL;
+
+    /* create the dialog window */
+    dialog = gtk_dialog_new_with_buttons (
+	title,
+	GTK_WINDOW (gtkpod_window),
+	GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+	GTK_STOCK_OK, GTK_RESPONSE_OK,
+	GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+	NULL);
+    gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
+
+    /* emulate gtk_message_dialog_new */
+    image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_QUESTION,
+				    GTK_ICON_SIZE_DIALOG);
+    gtk_misc_set_alignment (GTK_MISC (image), 0.5, 0.0);
+
+    if (message)
+    {
+	label = gtk_label_new (message);
+	gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
+	gtk_label_set_selectable (GTK_LABEL (label), TRUE);
+	gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
+	gtk_label_set_selectable (GTK_LABEL (label), TRUE);
+    }
+    /* hbox to put the image+label in */
+    hbox = gtk_hbox_new (FALSE, 6);
+    gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0);
+    if (label) gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+
+    /* Create entry */
+    entry = gtk_entry_new ();
+    if (dflt)
+    {
+	gtk_entry_set_text (GTK_ENTRY (entry), dflt);
+	gtk_editable_select_region (GTK_EDITABLE (entry), 0, -1);
+    }
+    /* Pressing enter should activate the default response (default
+       response set above */
+    gtk_entry_set_activates_default (GTK_ENTRY (entry), TRUE);
+
+    /* create option checkbox */
+    if (opt_msg && opt_state)
+    {
+	checkb = gtk_check_button_new_with_mnemonic (opt_msg);
+	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkb),
+				      *opt_state);
+    }
+
+    /* add to vbox */
+    gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
+			hbox, FALSE, FALSE, 2);
+    gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
+			entry, FALSE, FALSE, 2);
+    if (checkb)
+	gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
+			    checkb, FALSE, FALSE, 2);
+
+    /* Start the dialogue */
+    gtk_widget_show_all (dialog);
+    response = gtk_dialog_run (GTK_DIALOG (dialog));
+
+    if (response == GTK_RESPONSE_OK)
+    {
+	result = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
+	/* get state of checkbox */
+	if (checkb)
+	{
+	    *opt_state = gtk_toggle_button_get_active (
+		GTK_TOGGLE_BUTTON (checkb));
+	}
+    }
+
+    gtk_widget_destroy (dialog);
+    return result;
+}
+
+
+
+/* Let the user select a sort tab number */
+/* @text: text to be displayed */
+/* return value: -1: user selected cancel
+   0...prefs_get_sort_tab_number()-1: selected tab */
+gint get_sort_tab_number (gchar *text)
+{
+    static gint last_nr = 1;
+    GtkWidget *mdialog;
+    GtkDialog *dialog;
+    GtkWidget *combo;
+    gint result;
+    gint i, nr, stn;
+    GList *list=NULL, *lnk;
+    gchar buf[20], *bufp;
+
+    mdialog = gtk_message_dialog_new (
+	GTK_WINDOW (gtkpod_window),
+	GTK_DIALOG_DESTROY_WITH_PARENT,
+	GTK_MESSAGE_QUESTION,
+	GTK_BUTTONS_OK_CANCEL,
+	text);
+
+    dialog = GTK_DIALOG (mdialog);
+
+    combo = gtk_combo_new ();
+    gtk_widget_show (combo);
+    gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox), combo);
+
+    stn = prefs_get_int("sort_tab_num");
+    /* Create list */
+    for (i=1; i<=stn; ++i)
+    {
+	bufp = g_strdup_printf ("%d", i);
+	list = g_list_append (list, bufp);
+    }
+
+    /* set pull down items */
+    gtk_combo_set_popdown_strings (GTK_COMBO (combo), list);
+    /* set standard entry */
+    if (last_nr > stn) last_nr = 1;  /* maybe the stn has become
+					smaller... */
+    snprintf (buf, 20, "%d", last_nr);
+    gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (combo)->entry), buf);
+
+    result = gtk_dialog_run (GTK_DIALOG (mdialog));
+
+    /* free the list */
+    for (lnk = list; lnk; lnk = lnk->next)
+    {
+	C_FREE (lnk->data);
+    }
+    g_list_free (list);
+    list = NULL;
+
+    if (result == GTK_RESPONSE_CANCEL)
+    {
+	nr = -1;  /* no selection */
+    }
+    else
+    {
+	bufp = gtk_editable_get_chars (GTK_EDITABLE (GTK_COMBO (combo)->entry),
+				      0, -1);
+	nr = atoi (bufp)-1;
+	last_nr = nr+1;
+	C_FREE (bufp);
+    }
+
+    gtk_widget_destroy (mdialog);
+
+    return nr;
+}
+
+
+
+
+/*------------------------------------------------------------------*\
+ *                                                                  *
+ *             Functions for blocking widgets (block input)         *
+ *                                                                  *
+\*------------------------------------------------------------------*/
+
+/* --------------------------------------------------------------*/
+/* are widgets blocked at the moment? */
+gboolean widgets_blocked = FALSE;
+struct blocked_widget { /* struct to be kept in blocked_widgets */
+    GtkWidget *widget;   /* widget that has been turned insensitive */
+    gboolean  sensitive; /* state of the widget before */
+};
+/* --------------------------------------------------------------*/
+
+
+enum {
+    BR_BLOCK,
+    BR_RELEASE,
+    BR_UPDATE
+};
+
+/* function to add one widget to the blocked_widgets list */
+static GList *add_blocked_widget (GList *blocked_widgets, gchar *name)
+{
+    GtkWidget *w;
+    struct blocked_widget *bw;
+
+    if((w = gtkpod_xml_get_widget (main_window_xml,  name)))
+    {
+	bw = g_malloc0 (sizeof (struct blocked_widget));
+	bw->widget = w;
+	/* we don't have to set the sensitive flag right now. It's
+	 * done in "block_widgets ()" */
+	blocked_widgets = g_list_append (blocked_widgets, bw);
+    }
+    return blocked_widgets;
+}
+
+/* called by block_widgets() and release_widgets() */
+/* "block": TRUE = block, FALSE = release */
+static void block_release_widgets (gint action, GtkWidget *w, gboolean sens)
+{
+    /* list with the widgets that are turned insensitive during
+       import/export...*/
+    static GList *bws = NULL;
+    static gint count = 0; /* how many times are the widgets blocked? */
+    GList *l;
+    struct blocked_widget *bw;
+
+    /* Create a list of widgets that are to be turned insensitive when
+     * importing/exporting, adding tracks or directories etc. */
+    if (bws == NULL)
+    {
+	bws = add_blocked_widget (bws, "menubar");
+	bws = add_blocked_widget (bws, "load_ipods_button");
+	bws = add_blocked_widget (bws, "save_changes_button");
+	bws = add_blocked_widget (bws, "add_files_button");
+	bws = add_blocked_widget (bws, "add_dirs_button");
+	bws = add_blocked_widget (bws, "add_PL_button");
+	bws = add_blocked_widget (bws, "new_PL_button");
+	widgets_blocked = FALSE;
+    }
+
+    switch (action)
+    {
+    case BR_BLOCK:
+	/* we must block the widgets */
+	++count;  /* increase number of locks */
+	if (!widgets_blocked)
+	{ /* only block widgets, if they are not already blocked */
+	    for (l = bws; l; l = l->next)
+	    {
+		bw = (struct blocked_widget *)l->data;
+		/* remember the state the widget was in before */
+		bw->sensitive = GTK_WIDGET_SENSITIVE (bw->widget);
+		gtk_widget_set_sensitive (bw->widget, FALSE);
+	    }
+	    sort_window_block ();
+	    prefs_window_block ();
+	    widgets_blocked = TRUE;
+	}
+	break;
+    case BR_RELEASE:
+	/* release the widgets if --count == 0 */
+	if (widgets_blocked)
+	{ /* only release widgets, if they are blocked */
+	    --count;
+	    if (count == 0)
+	    {
+		for (l = bws; l; l = l->next)
+		{
+		    bw = (struct blocked_widget *)l->data;
+		    gtk_widget_set_sensitive (bw->widget, bw->sensitive);
+		}
+		sort_window_release ();
+		prefs_window_release ();
+		widgets_blocked = FALSE;
+	    }
+	}
+	break;
+    case BR_UPDATE:
+	if (widgets_blocked)
+	{ /* only update widgets, if they are blocked */
+	    for (l = bws; l; l = l->next)
+	    { /* find the required widget */
+		bw = (struct blocked_widget *)l->data;
+		if (bw->widget == w)
+		{ /* found -> set to new desired state */
+		    bw->sensitive = sens;
+		    break;
+		}
+	    }
+	}
+	break;
+    }
+}
+
+
+/* Block widgets (turn insensitive) listed in "bws" */
+void block_widgets (void)
+{
+    block_release_widgets (BR_BLOCK, NULL, FALSE);
+}
+
+/* Release widgets (i.e. return them to their state before
+   "block_widgets() was called */
+void release_widgets (void)
+{
+    block_release_widgets (BR_RELEASE, NULL, FALSE);
+}
+
+void update_blocked_widget (GtkWidget *w, gboolean sens)
+{
+    block_release_widgets (BR_UPDATE, w, sens);
+}

Added: trunk/src/misc_playlist.c
===================================================================
--- trunk/src/misc_playlist.c	                        (rev 0)
+++ trunk/src/misc_playlist.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,1238 @@
+/*
+|  Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: misc_playlist.c 1595 2007-06-26 13:43:54Z dforsi $
+*/
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <string.h>
+#include "charset.h"
+#include "itdb.h"
+#include "info.h"
+#include "sha1.h"
+#include "misc.h"
+#include "misc_track.h"
+#include "prefs.h"
+
+
+#define DEBUG_MISC 0
+
+
+/*------------------------------------------------------------------*\
+ *                                                                  *
+ *             Add new playlist asking user for name                *
+ *                                                                  *
+\*------------------------------------------------------------------*/
+
+/* Add a new playlist at position @position. The name for the new
+ * playlist is queried from the user. A default (@dflt) name can be
+ * provided.
+ * Return value: the new playlist or NULL if the dialog was
+ * cancelled. */
+Playlist *add_new_pl_user_name (iTunesDB *itdb,
+				gchar *dflt, gint32 position)
+{
+    Playlist *result = NULL;
+    gchar *name;
+
+    g_return_val_if_fail (itdb, NULL);
+
+    name = get_user_string (
+	_("New Playlist"),
+	_("Please enter a name for the new playlist"),
+	dflt? dflt:_("New Playlist"),
+	NULL, NULL);
+    if (name)
+    {
+	result = gp_playlist_add_new (itdb, name, FALSE, position);
+	gtkpod_tracks_statusbar_update ();
+    }
+    return result;
+}
+
+
+/* Add a new playlist or smart playlist at position @position. The
+ * name for the new playlist is queried from the user. A default
+ * (@dflt) name can be provided.
+ * Return value: none. In the case of smart playlists, the playlist
+ * will not be created immediately. */
+void add_new_pl_or_spl_user_name (iTunesDB *itdb,
+				  gchar *dflt, gint32 position)
+{
+    gboolean is_spl = FALSE;
+    gchar *name;
+
+    g_return_if_fail (itdb);
+
+    name = get_user_string (
+	_("New Playlist"),
+	_("Please enter a name for the new playlist"),
+	dflt? dflt:_("New Playlist"),
+	_("Smart Playlist"), &is_spl);
+
+    if (name)
+    {
+	if (!is_spl)
+	{   /* add standard playlist */
+	    gp_playlist_add_new (itdb, name, FALSE, position);
+	    gtkpod_tracks_statusbar_update ();
+	}
+	else
+	{   /* add smart playlist */
+	    spl_edit_new (itdb, name, position);
+	}
+    }
+}
+
+/* callback */
+void
+on_smart_playlist_activate             (GtkMenuItem     *menuitem,
+                                        gpointer         user_data)
+{
+    iTunesDB *itdb = gp_get_selected_itdb();
+
+    if (itdb)
+    {
+	spl_edit_new (itdb, NULL, -1);
+    }
+    else
+    {
+	message_sb_no_itdb_selected ();
+    }
+}
+
+
+/*------------------------------------------------------------------*\
+ *                                                                  *
+ *                     Special Playlist Stuff                       *
+ *                                                                  *
+\*------------------------------------------------------------------*/
+
+/* used for special playlist creation */
+typedef gboolean (*PL_InsertFunc)(Track *track, gpointer userdata);
+
+/* generate_category_playlists: Create a playlist for each category
+   @cat (T_ARTIST, T_ALBUM, T_GENRE, T_COMPOSER) */
+void generate_category_playlists (iTunesDB *itdb, T_item cat)
+{
+    Playlist *master_pl;
+    gchar *qualifier;
+    GList *gl;
+
+    g_return_if_fail (itdb);
+
+    /* Initialize the "qualifier". It is used to indicate the category of
+       automatically generated playlists */
+    switch (cat)
+    {
+    case T_ARTIST:
+	qualifier = _("AR:");
+	break;
+    case T_ALBUM:
+	qualifier = _("AL:");
+	break;
+    case T_GENRE:
+	qualifier = _("GE:");
+	break;
+    case T_COMPOSER:
+	qualifier = _("CO:");
+	break;
+    case T_YEAR:
+	qualifier = _("YE:");
+	break;
+    default:
+	g_return_if_reached ();
+	break;
+    }
+
+    /* FIXME: delete all playlists named '[<qualifier> .*]' and
+     * remember which playlist was selected if it gets deleted */
+
+    master_pl = itdb_playlist_mpl (itdb);
+    g_return_if_fail (master_pl);
+
+    for (gl=master_pl->members; gl; gl=gl->next)
+    {
+	Track *track = gl->data;
+	Playlist *cat_pl = NULL;
+	gchar *category = NULL;
+	const gchar *track_cat;
+
+	track_cat = track_get_item (track, cat);
+
+	if (track_cat)
+	{
+	    /* some tracks have empty strings in the genre field */
+	    if(track_cat[0] == '\0')
+	    {
+		category = g_strdup_printf ("[%s %s]",
+					    qualifier, _("Unknown"));
+	    }
+	    else
+	    {
+		category = g_strdup_printf ("[%s %s]",
+					    qualifier, track_cat);
+	    }
+
+	    /* look for category playlist */
+	    cat_pl = itdb_playlist_by_name (itdb, category);
+	    /* or, create category playlist */
+	    if(!cat_pl)
+	    {
+		cat_pl = gp_playlist_add_new (itdb, category,
+					      FALSE, -1);
+	    }
+	    gp_playlist_add_track (cat_pl, track, TRUE);
+	    g_free (category);
+	}
+    }
+    gtkpod_tracks_statusbar_update();
+}
+
+/* Generate a new playlist containing all the tracks currently
+   displayed */
+Playlist *generate_displayed_playlist (void)
+{
+    GList *tracks = tm_get_all_tracks ();
+    Playlist *result = NULL;
+
+    if (tracks)
+    {
+	result= generate_new_playlist (gp_get_selected_itdb (), tracks);
+	g_list_free (tracks);
+    }
+    return result;
+}
+
+
+/* Generate a new playlist containing all the tracks currently
+   selected */
+Playlist *generate_selected_playlist (void)
+{
+    GList *tracks = tm_get_selected_tracks ();
+    Playlist *result=NULL;
+
+    if (tracks)
+    {
+	result= generate_new_playlist (gp_get_selected_itdb (), tracks);
+	g_list_free (tracks);
+    }
+    return result;
+}
+
+
+/* Generates a playlist containing a random selection of
+   prefs_get_int("misc_track_nr") tracks in random order from the currently
+   displayed tracks */
+Playlist *generate_random_playlist (iTunesDB *itdb)
+{
+    GRand *grand = g_rand_new ();
+    Playlist *new_pl = NULL;
+    gchar *pl_name, *pl_name1;
+    GList *rtracks = NULL;
+    GList *tracks = tm_get_all_tracks ();
+    gint tracks_max = prefs_get_int("misc_track_nr");
+    gint tracks_nr = 0;
+
+
+    while (tracks && (tracks_nr < tracks_max))
+    {
+	/* get random number between 0 and g_list_length()-1 */
+	gint rn = g_rand_int_range (grand, 0, g_list_length (tracks));
+	GList *random = g_list_nth (tracks, rn);
+	rtracks = g_list_append (rtracks, random->data);
+	tracks = g_list_delete_link (tracks, random);
+	++tracks_nr;
+    }
+    pl_name1 = g_strdup_printf (_("Random (%d)"), tracks_max);
+    pl_name = g_strdup_printf ("[%s]", pl_name1);
+    new_pl = generate_playlist_with_name (itdb, rtracks, pl_name, TRUE);
+    g_free (pl_name1);
+    g_free (pl_name);
+    g_list_free (tracks);
+    g_list_free (rtracks);
+    g_rand_free (grand);
+    return new_pl;
+}
+
+
+void randomize_current_playlist (void)
+{
+    Playlist *pl= pm_get_selected_playlist ();
+
+    if (!pl)
+    {
+	message_sb_no_playlist_selected ();
+	return;
+    }
+
+    if (prefs_get_int("tm_autostore"))
+    {
+	prefs_set_int("tm_autostore", FALSE);
+	gtkpod_warning (_("Auto Store of track view disabled.\n\n"));
+/* 	sort_window_update (); */
+    }
+
+    itdb_playlist_randomize (pl);
+
+    st_adopt_order_in_playlist ();
+    tm_adopt_order_in_sorttab ();
+}
+
+
+static void not_listed_make_track_list (gpointer key, gpointer track,
+					gpointer tracks)
+{
+    *(GList **)tracks = g_list_append (*(GList **)tracks, (Track *)track);
+}
+
+/* Generate a playlist containing all tracks that are not part of any
+   playlist.
+   For this, playlists starting with a "[" (generated playlists) are
+   being ignored. */
+Playlist *generate_not_listed_playlist (iTunesDB *itdb)
+{
+    GHashTable *hash;
+    GList *gl, *tracks=NULL;
+    guint32 i;
+    gchar *pl_name;
+    Playlist *new_pl, *pl;
+
+    g_return_val_if_fail (itdb, NULL);
+
+    /* Create hash with all track/track pairs */
+    pl = itdb_playlist_mpl (itdb);
+    g_return_val_if_fail (pl, NULL);
+    hash = g_hash_table_new (NULL, NULL);
+    for (gl=pl->members; gl != NULL; gl=gl->next)
+    {
+	g_hash_table_insert (hash, gl->data, gl->data);
+    }
+    /* remove all tracks that are members of other playlists */
+    i=1;
+    do
+    {
+	pl = itdb_playlist_by_nr (itdb, i);
+	++i;
+	/* skip playlists starting with a '[' */
+	if (pl && pl->name && (pl->name[0] != '['))
+	{
+	    for (gl=pl->members; gl != NULL; gl=gl->next)
+	    {
+		g_hash_table_remove (hash, gl->data);
+	    }
+	}
+    } while (pl);
+
+    g_hash_table_foreach (hash, not_listed_make_track_list, &tracks);
+    g_hash_table_destroy (hash);
+    hash = NULL;
+
+    pl_name = g_strdup_printf ("[%s]", _("Not Listed"));
+
+    new_pl = generate_playlist_with_name (itdb, tracks, pl_name, TRUE);
+    g_free (pl_name);
+    g_list_free (tracks);
+    return new_pl;
+}
+
+
+/* Generate a playlist consisting of the tracks in @tracks
+ * with @name name. If @del_old ist TRUE, delete any old playlist with
+ * the same name. */
+Playlist *generate_playlist_with_name (iTunesDB *itdb,GList *tracks,
+				       gchar *pl_name, gboolean del_old)
+{
+    Playlist *new_pl=NULL;
+    gint n = g_list_length (tracks);
+
+    g_return_val_if_fail (itdb, new_pl);
+
+    if(n>0)
+    {
+	gboolean select = FALSE;
+	GList *l;
+	if (del_old)
+	{
+	    /* currently selected playlist */
+	    Playlist *sel_pl= pm_get_selected_playlist ();
+	    if (sel_pl->itdb != itdb)
+	    {   /* different itdb */
+		sel_pl = NULL;
+	    }
+	    /* remove all playlists with named @plname */
+	    gp_playlist_remove_by_name (itdb, pl_name);
+	    /* check if we deleted the selected playlist */
+	    if (sel_pl)
+	    {
+		if (g_list_find (itdb->playlists, sel_pl) == NULL)
+		    select = TRUE;
+	    }
+	}
+	new_pl = gp_playlist_add_new (itdb, pl_name, FALSE, -1);
+	g_return_val_if_fail (new_pl, new_pl);
+	for (l=tracks; l; l=l->next)
+	{
+	    Track *track = l->data;
+	    g_return_val_if_fail (track, new_pl);
+	    gp_playlist_add_track (new_pl, track, TRUE);
+	}
+	gtkpod_statusbar_message (
+	    ngettext ("Created playlist '%s' with %d track.",
+		      "Created playlist '%s' with %d tracks.",
+		      n), pl_name, n);
+	if (new_pl && select)
+	{   /* need to select newly created playlist because the old
+	     * selection was deleted */
+	    pm_select_playlist (new_pl);
+	}
+    }
+    else
+    {   /* n==0 */
+	gtkpod_statusbar_message (_("No tracks available, playlist not created"));
+    }
+    gtkpod_tracks_statusbar_update();
+    return new_pl;
+}
+
+/* Generate a playlist named "New Playlist" consisting of the tracks
+ * in @tracks. */
+Playlist *generate_new_playlist (iTunesDB *itdb, GList *tracks)
+{
+    gchar *name = get_user_string (
+	_("New Playlist"),
+	_("Please enter a name for the new playlist"),
+	_("New Playlist"),
+	NULL, NULL);
+    if (name)
+	return generate_playlist_with_name (itdb, tracks, name, FALSE);
+    return NULL;
+}
+
+/* look at the add_ranked_playlist help:
+ * BEWARE this function shouldn't be used by other functions */
+static GList *create_ranked_glist(iTunesDB *itdb, gint tracks_nr,
+				  PL_InsertFunc insertfunc,
+				  GCompareFunc comparefunc,
+				  gpointer userdata)
+{
+   GList *tracks=NULL;
+   gint f=0;
+   GList *gl;
+
+   g_return_val_if_fail (itdb, tracks);
+
+   for (gl=itdb->tracks; gl; gl=gl->next)
+   {
+       Track *track = gl->data;
+       g_return_val_if_fail (track, tracks);
+       if (track && (!insertfunc || insertfunc (track, userdata)))
+       {
+	   tracks = g_list_insert_sorted (tracks, track, comparefunc);
+	   ++f;
+	   if (tracks_nr && (f>tracks_nr))
+	   {   /*cut the tail*/
+	       tracks = g_list_remove(tracks,
+				      g_list_nth_data(tracks, tracks_nr));
+	       --f;
+	   }
+       }
+   }
+   return tracks;
+}
+/* Generate or update a playlist named @pl_name, containing
+ * @tracks_nr tracks.
+ *
+ * @str is the playlist's name (no [ or ])
+ * @insertfunc: determines which tracks to enter into the new playlist.
+ *              If @insertfunc is NULL, all tracks are added.
+ * @comparefunc: determines order of tracks
+ * @tracks_nr: max. number of tracks in playlist or 0 for no limit.
+ *
+ * Return value: the newly created playlist
+ */
+static Playlist *update_ranked_playlist(iTunesDB *itdb,
+					gchar *str, gint tracks_nr,
+					PL_InsertFunc insertfunc,
+					GCompareFunc comparefunc,
+					gpointer userdata)
+{
+    Playlist *result = NULL;
+    gchar *pl_name = g_strdup_printf ("[%s]", str);
+    GList *tracks;
+
+    g_return_val_if_fail (itdb, result);
+
+    tracks = create_ranked_glist(itdb, tracks_nr,
+				 insertfunc, comparefunc, userdata);
+
+    if (tracks)
+    /* else generate_playlist_with_name prints something*/
+    {
+	result = generate_playlist_with_name (itdb, tracks, pl_name, TRUE);
+    }
+    g_list_free (tracks);
+    g_free (pl_name);
+    return result;
+}
+
+
+/* ------------------------------------------------------------ */
+/* Generate a new playlist containing the most listened (playcount
+ * reverse order) tracks. to enter this playlist a track must have been
+ * played */
+
+/* Sort Function: determines the order of the generated playlist */
+
+/* NOTE: THE USE OF 'COMP' ARE NECESSARY FOR THE TIME_PLAYED COMPARES
+   WHERE A SIGN OVERFLOW MAY OCCUR BECAUSE OF THE 32 BIT UNSIGNED MAC
+   TIMESTAMPS. */
+static gint Most_Listened_CF (gconstpointer aa, gconstpointer bb)
+{
+    gint result = 0;
+    const Track *a = aa;
+    const Track *b = bb;
+
+    if (a && b)
+    {
+	result = COMP (b->playcount, a->playcount);
+	if (result == 0) result = COMP (b->rating, a->rating);
+	if (result == 0) result = COMP (b->time_played, a->time_played);
+    }
+    return result;
+}
+
+/* Insert function: determines whether a track is entered into the playlist */
+static gboolean Most_Listened_IF (Track *track, gpointer userdata)
+{
+    if (track)   return (track->playcount != 0);
+    return      FALSE;
+}
+
+void most_listened_pl (iTunesDB *itdb)
+{
+    gint tracks_nr = prefs_get_int("misc_track_nr");
+    gchar *str;
+
+    g_return_if_fail (itdb);
+    str = g_strdup_printf (_("Most Listened (%d)"), tracks_nr);
+    update_ranked_playlist (itdb, str, tracks_nr,
+			    Most_Listened_IF, Most_Listened_CF, (gpointer)0 );
+    g_free (str);
+}
+
+
+/* ------------------------------------------------------------ */
+/* Generate a new playlist containing all songs never listened to. */
+
+/* Sort Function: determines the order of the generated playlist */
+
+/* NOTE: THE USE OF 'COMP' ARE NECESSARY FOR THE TIME_PLAYED COMPARES
+   WHERE A SIGN OVERFLOW MAY OCCUR BECAUSE OF THE 32 BIT UNSIGNED MAC
+   TIMESTAMPS. */
+static gint Never_Listened_CF (gconstpointer aa, gconstpointer bb)
+{
+    gint result = 0;
+    const Track *a = aa;
+    const Track *b = bb;
+
+    if (a && b)
+    {
+	result = COMP (b->rating, a->rating);
+    }
+    return result;
+}
+
+/* Insert function: determines whether a track is entered into the playlist */
+static gboolean Never_Listened_IF (Track *track, gpointer userdata)
+{
+    if (track)   return (track->playcount == 0);
+    return      FALSE;
+}
+
+void never_listened_pl (iTunesDB *itdb)
+{
+    gint tracks_nr = 0;  /* no limit */
+    gchar *str;
+
+    g_return_if_fail (itdb);
+    str = g_strdup_printf (_("Never Listened"));
+    update_ranked_playlist (itdb, str, tracks_nr,
+			    Never_Listened_IF, Never_Listened_CF, (gpointer)0 );
+    g_free (str);
+}
+
+
+/* ------------------------------------------------------------ */
+/* Generate a new playlist containing the most rated (rate
+ * reverse order) tracks. */
+
+/* Sort Function: determines the order of the generated playlist */
+static gint Most_Rated_CF (gconstpointer aa, gconstpointer bb)
+{
+    gint result = 0;
+    const Track *a = aa;
+    const Track *b = bb;
+
+    if (a && b)
+    {
+	result = COMP (b->rating, a->rating);
+	if (result == 0) result = COMP (b->playcount, a->playcount);
+	if (result == 0) result = COMP (b->time_played, a->time_played);
+    }
+    return result;
+}
+
+/* Insert function: determines whether a track is entered into the playlist */
+static gboolean Most_Rated_IF (Track *track, gpointer userdata)
+{
+    if (track) return ((track->playcount != 0) || prefs_get_int("not_played_track"));
+    return FALSE;
+}
+
+void most_rated_pl (iTunesDB *itdb)
+{
+    gint tracks_nr = prefs_get_int("misc_track_nr");
+    gchar *str;
+
+    g_return_if_fail (itdb);
+    str =  g_strdup_printf (_("Best Rated (%d)"), tracks_nr);
+    update_ranked_playlist (itdb, str, tracks_nr,
+			    Most_Rated_IF, Most_Rated_CF, (gpointer)0 );
+    g_free (str);
+}
+
+
+/* ------------------------------------------------------------ */
+/* Generate 6 playlists,one for each rating 1..5 and unrated    */
+
+
+/* Sort Function: determines the order of the generated playlist */
+static gint All_Ratings_CF (gconstpointer aa, gconstpointer bb)
+{
+    gint result = 0;
+    const Track *a = aa;
+    const Track *b = bb;
+
+    if (a && b)
+    {
+	result = COMP (b->playcount, a->playcount);
+	if (result == 0) result = COMP (b->time_played, a->time_played);
+    }
+    return result;
+}
+
+
+/* Insert function: determines whether a track is entered into the playlist */
+static gboolean All_Ratings_IF (Track *track, gpointer user_data)
+{
+    guint playlist_nr = GPOINTER_TO_UINT(user_data);
+    if (track) return (track->rating == playlist_nr*20);
+    return FALSE;
+}
+
+
+void each_rating_pl(iTunesDB *itdb)
+{
+    gchar *str;
+    guint playlist_nr;
+
+    g_return_if_fail (itdb);
+    str = _("Unrated tracks");
+    for (playlist_nr = 0; playlist_nr < 6; playlist_nr ++ )
+    {
+	if (playlist_nr > 0) 
+	{
+	    str = g_strdup_printf (_("Rated %d"), playlist_nr);
+	} 
+    	update_ranked_playlist (itdb, str, 0,
+				All_Ratings_IF, All_Ratings_CF,
+				GUINT_TO_POINTER(playlist_nr));
+    }
+    g_free (str);
+}
+
+
+/* ------------------------------------------------------------ */
+/* Generate a new playlist containing the last listened (last time play
+ * reverse order) tracks. */
+
+/* Sort Function: determines the order of the generated playlist */
+static gint Last_Listened_CF (gconstpointer aa, gconstpointer bb)
+{
+    gint result = 0;
+    const Track *a = aa;
+    const Track *b = bb;
+
+    if (a && b)
+    {
+	result = COMP (b->time_played, a->time_played);
+	if (result == 0) result = COMP (b->rating, a->rating);
+	if (result == 0) result = COMP (b->playcount, a->playcount);
+    }
+    return result;
+}
+
+/* Insert function: determines whether a track is entered into the playlist */
+static gboolean Last_Listened_IF (Track *track, gpointer userdata)
+{
+    if (track)   return (track->playcount != 0);
+    return      FALSE;
+}
+
+void last_listened_pl (iTunesDB *itdb)
+{
+    gint tracks_nr = prefs_get_int("misc_track_nr");
+    gchar *str;
+
+    g_return_if_fail (itdb);
+    str = g_strdup_printf (_("Recent (%d)"), tracks_nr);
+    update_ranked_playlist (itdb, str, tracks_nr,
+			    Last_Listened_IF, Last_Listened_CF, (gpointer)0);
+    g_free (str);
+}
+
+
+/* ------------------------------------------------------------ */
+/* Generate a new playlist containing the tracks listened to since the
+ * last time the iPod was connected to a computer (and the playcount
+ * file got wiped) */
+
+/* Sort Function: determines the order of the generated playlist */
+static gint since_last_CF (gconstpointer aa, gconstpointer bb)
+{
+    gint result = 0;
+    const Track *a = aa;
+    const Track *b = bb;
+
+    if (a && b)
+    {
+	result = COMP (b->recent_playcount, a->recent_playcount);
+	if (result == 0) result = COMP (b->time_played, a->time_played);
+	if (result == 0) result = COMP (b->playcount, a->playcount);
+	if (result == 0) result = COMP (b->rating, a->rating);
+    }
+    return result;
+}
+
+/* Insert function: determines whether a track is entered into the playlist */
+static gboolean since_last_IF (Track *track, gpointer userdata)
+{
+    if (track && (track->recent_playcount != 0))  return TRUE;
+    else                                        return FALSE;
+}
+
+void since_last_pl (iTunesDB *itdb)
+{
+    g_return_if_fail (itdb);
+    update_ranked_playlist (itdb, _("Last Time"), 0,
+			    since_last_IF, since_last_CF, (gpointer)0);
+}
+
+
+/*------------------------------------------------------------------*\
+ *                                                                  *
+ *                Find Orphans                                      *
+ *                                                                  *
+\*------------------------------------------------------------------*/
+
+/******************************************************************************
+ * Attempt to do everything at once:
+ *  - find dangling links in iTunesDB
+ *  - find orphaned files in mounted directory
+ * Will be done by creating first a hash of all known in iTunesDB filenames,
+ * and then checking every file on HDD in the hash table. If it is present -
+ * remove from hashtable, if not present - it is orphaned. If at the end
+ * hashtable still has some elements - they're dangling...
+ *
+ * TODO: instead of using case-sensitive comparison function it might be better
+ *  just to convert all filenames to lowercase before doing any comparisons
+ * FIX:
+ *  offline... when you import db offline and then switch to online mode you still
+ *  have offline db loaded and if it is different from IPOD's - then a lot of crap
+ *  can happen... didn't check yet
+ ******************************************************************************/
+
+
+/* compare @str1 and @str2 case-sensitively only */
+gint str_cmp (gconstpointer str1, gconstpointer str2, gpointer data)
+{
+	return compare_string_case_insensitive((gchar *)str1, (gchar *)str2);
+	/*return strcmp((gchar *)str1, (gchar *)str2);*/
+}
+
+static void treeKeyDestroy(gpointer key) { g_free(key); }
+static void treeValueDestroy(gpointer value) { }
+
+
+/* call back function for traversing what is left from the tree -
+ * dangling files - files present in DB but not present physically on iPOD.
+ * It adds found tracks to the dandling list so user can see what is missing
+ * and then decide on what to do with them */
+gboolean remove_dangling (gpointer key, gpointer value, gpointer pl_dangling)
+{
+/*     printf("Found dangling item pointing file %s\n", ((Track*)value)->ipod_path); */
+    Track *track = (Track*)value;
+    GList **l_dangling = ((GList **)pl_dangling);
+    gchar *filehash = NULL;
+    gint lind;
+    ExtraTrackData *etr;
+
+    g_return_val_if_fail (l_dangling, FALSE);
+    g_return_val_if_fail (track, FALSE);
+    etr = track->userdata;
+    g_return_val_if_fail (etr, FALSE);
+
+    /* 1 - Original file is present on PC */
+    /* 0 - Doesn't exist */
+    lind = 0;
+    if (etr->pc_path_locale && *etr->pc_path_locale &&
+	g_file_test (etr->pc_path_locale, G_FILE_TEST_EXISTS))
+    {
+	lind = 1;
+    }
+    l_dangling[lind]=g_list_append(l_dangling[lind], track);
+
+    g_free(filehash);
+    return FALSE;               /* do not stop traversal */
+}
+
+guint ntokens(gchar** tokens)
+{
+    guint n=0;
+    while (tokens[n]) n++;
+    return n;
+}
+
+
+void process_gtk_events_blocked()
+{    while (widgets_blocked && gtk_events_pending ()) gtk_main_iteration ();  }
+
+
+
+/* Frees memory busy by the lists containing tracks stored in
+   @user_data1 */
+static void
+check_db_danglingcancel0  (gpointer user_data1, gpointer user_data2)
+{
+    g_list_free((GList *)user_data1);
+    gtkpod_statusbar_message (_("Removal of dangling tracks with no files on PC was canceled."));
+}
+
+
+/* Frees memory busy by the lists containing tracks stored in
+   @user_data1 */
+static void
+check_db_danglingcancel1  (gpointer user_data1, gpointer user_data2)
+{
+    g_list_free((GList *)user_data1);
+    gtkpod_statusbar_message (_("Handling of dangling tracks with files on PC was canceled."));
+}
+
+/* "dangling": tracks that are in database but not on disk */
+/* To be called for ok to remove dangling Tracks with with no files
+ * linked.  Frees @user_data1 and @user_data2*/
+static void
+check_db_danglingok0 (gpointer user_data1, gpointer user_data2)
+{
+    GList *tlist = ((GList *)user_data1);
+    GList *l_dangling = tlist;
+    iTunesDB *itdb = user_data2;
+
+    g_return_if_fail (itdb);
+    /* traverse the list and append to the str */
+    for (tlist = g_list_first(tlist);
+	 tlist != NULL;
+	 tlist = g_list_next(tlist))
+    {
+	Track *track = tlist->data;
+	g_return_if_fail (track);
+	
+        /* printf("Removing track %d\n", track->ipod_id); */
+	/* remove track from database */
+	gp_playlist_remove_track (NULL, track, DELETE_ACTION_DATABASE);
+    }
+    g_list_free(l_dangling);
+    data_changed (itdb);
+    gtkpod_statusbar_message (_("Dangling tracks with no files on PC were removed."));
+}
+
+
+
+/* To be called for ok to remove dangling Tracks with with no files linked.
+ * Frees @user_data1 and @user_data2*/
+static void
+check_db_danglingok1 (gpointer user_data1, gpointer user_data2)
+{
+    GList *tlist = ((GList *)user_data1);
+    GList *l_dangling = tlist;
+    iTunesDB *itdb = user_data2;
+
+    g_return_if_fail (itdb);
+
+    block_widgets ();
+
+    /* traverse the list and append to the str */
+    for (tlist = g_list_first(tlist);
+	 tlist != NULL;
+	 tlist = g_list_next(tlist))
+    {
+	Track *oldtrack;
+	Track *track = tlist->data;
+	ExtraTrackData *etr;
+	gchar *buf;
+
+	g_return_if_fail (track);
+	etr = track->userdata;
+	g_return_if_fail (etr);
+        /* printf("Handling track %d\n", track->ipod_id); */
+
+	buf = get_track_info (track, TRUE);
+	gtkpod_statusbar_message (_("Processing '%s'..."), buf);
+	g_free (buf);
+				  
+	while (widgets_blocked && gtk_events_pending ())
+	    gtk_main_iteration ();
+
+	/* Indicate that file needs to be transfered */
+	track->transferred=FALSE;
+	/* Update SHA1 information */
+	/* remove track from sha1 hash and reinsert it
+	   (hash value may have changed!) */
+	sha1_track_remove (track);
+	/* need to remove the old value manually! */
+	g_free (etr->sha1_hash);
+	etr->sha1_hash = NULL;
+	oldtrack = sha1_track_exists_insert (itdb, track);
+	if (oldtrack) { /* track exists, remove old track
+			  and register the new version */
+	    sha1_track_remove (oldtrack);
+	    gp_duplicate_remove (track, oldtrack);
+	    sha1_track_exists_insert (itdb, track);
+	}
+	/* mark for conversion / transfer */
+	file_convert_add_track (track);
+    }
+    g_list_free(l_dangling);
+    data_changed (itdb);
+    gtkpod_statusbar_message (_("Dangling tracks with files on PC were handled."));
+    /* I don't think it's too interesting to pop up the list of
+       duplicates -- but we should reset the list. */
+    gp_duplicate_remove (NULL, (void *)-1);
+
+    release_widgets ();
+}
+
+
+
+/* checks iTunesDB for presence of dangling links and checks IPODs
+ * Music directory on subject of orphaned files */
+void check_db (iTunesDB *itdb)
+{
+
+    void glist_list_tracks (GList * tlist, GString * str)
+	{
+	    if (str==NULL)
+	    {
+		fprintf(stderr, "Report the bug please: shouldn't be NULL at %s:%d\n",__FILE__,__LINE__);
+		return;
+	    }
+	    /* traverse the list and append to the str */
+	    for (tlist = g_list_first(tlist);
+		 tlist != NULL;
+		 tlist = g_list_next(tlist))
+	    {
+		ExtraTrackData *etr;
+		Track *track = tlist->data;
+		g_return_if_fail (track);
+		etr = track->userdata;
+		g_return_if_fail (etr);
+		g_string_append_printf
+		    (str,"%s(%d) %s-%s -> %s\n",_("Track"),
+		     track->id, track->artist,  track->title,  etr->pc_path_utf8);
+	    }
+	} /* end of glist_list_tracks */
+
+    GTree *files_known = NULL;
+    GDir  *dir_des = NULL;
+
+    gchar *pathtrack=NULL;
+    gchar *ipod_filename = NULL;
+#   define localdebug  0      /* may be later becomes more general verbose param */
+    Playlist* pl_orphaned = NULL;
+    GList * l_dangling[2] = {NULL, NULL}; /* 2 kinds of dangling tracks: with approp
+					   * files and without */
+    /* 1 - Original file is present on PC and has the same sha1*/
+    /* 0 - Doesn't exist */
+
+    gpointer foundtrack ;
+    gint h,i;
+    gint norphaned = 0;
+    gint ndangling = 0;
+    gchar ** tokens;
+    const gchar *mountpoint = itdb_get_mountpoint (itdb);
+    ExtraiTunesDBData *eitdb;
+    GList *gl;
+    gchar *music_dir = NULL;
+
+    g_return_if_fail (itdb);
+    eitdb = itdb->userdata;
+    g_return_if_fail (eitdb);
+
+    /* If an iTunesDB exists on the iPod, the user probably is making
+       a mistake and we should tell him about it */
+    if (!eitdb->itdb_imported)
+    {
+	gchar *itunesdb_filename = itdb_get_itunesdb_path (mountpoint);
+	if (itunesdb_filename)
+	{
+	    GtkWidget *dialog = gtk_message_dialog_new (
+		GTK_WINDOW (gtkpod_window),
+		GTK_DIALOG_DESTROY_WITH_PARENT,
+		GTK_MESSAGE_WARNING,
+		GTK_BUTTONS_OK_CANCEL,
+		_("You did not import the existing iTunesDB. This is most likely incorrect and will result in the loss of the existing database.\n\nPress 'OK' if you want to proceed anyhow or 'Cancel' to abort. If you cancel, you can import the existing database before calling this function again.\n"));
+	    gint result = gtk_dialog_run (GTK_DIALOG (dialog));
+	    gtk_widget_destroy (dialog);
+	    g_free (itunesdb_filename);
+	    if (result == GTK_RESPONSE_CANCEL)
+	    {
+		return;
+	    }
+	}
+    }
+
+    gtkpod_statusbar_timeout (30*STATUSBAR_TIMEOUT);
+    block_widgets();
+
+    gtkpod_statusbar_message(_("Creating a tree of known files"));
+    gtkpod_tracks_statusbar_update();
+
+    /* put all files in the hash table */
+    files_known = g_tree_new_full (str_cmp, NULL,
+				   treeKeyDestroy, treeValueDestroy);
+    for (gl=itdb->tracks; gl; gl=gl->next)
+    {
+	Track *track = gl->data;
+        gint ntok=0;
+	g_return_if_fail (track);
+        /* we don't want to report non-transferred files as dangling */
+	if (!track->transferred) continue; 
+	tokens = g_strsplit(track->ipod_path,":",(track->ipod_path[0]==':'?4:3));
+        ntok=ntokens(tokens);
+	if (ntok>=3)
+	{
+	    pathtrack=g_strdup (tokens[ntok-1]);
+	}
+	else
+	{
+	    /* illegal ipod_path */
+	    /* the track has NO ipod_path, so we want the item to
+	       ultimately be deleted from DB, * however, we need to
+	       add it to tree it such a way that:
+               a) it will be unique
+               b) it won't match to any existing file on the ipod
+
+               so use something invented using the pointer to the
+               track structure as a way to generate uniqueness
+            */
+           pathtrack=g_strdup_printf ("NOFILE-%p", track);
+	}
+
+        if (localdebug)
+	{
+            fprintf(stdout,"File %s\n", pathtrack);
+	    fflush(stdout);
+	}
+
+	g_tree_insert (files_known, pathtrack, track);
+	g_strfreev(tokens);
+    }
+
+    gtkpod_statusbar_message(_("Checking iPOD files against known files in DB"));
+    gtkpod_tracks_statusbar_update();
+    process_gtk_events_blocked();
+
+    music_dir = itdb_get_music_dir (mountpoint);
+
+    for(h=0; h<itdb_musicdirs_number (itdb); h++)
+    {
+	/* directory name */
+	gchar *ipod_dir=g_strdup_printf("F%02d",h); /* just directory name */
+	gchar *ipod_fulldir;
+	/* full path */
+	ipod_fulldir = itdb_get_path (music_dir, ipod_dir);
+	if(ipod_fulldir && (dir_des=g_dir_open(ipod_fulldir,0,NULL))) {
+	    while ((ipod_filename=g_strdup(g_dir_read_name(dir_des))))
+		/* we have a file in the directory*/
+	    {
+		pathtrack=g_strdup_printf("%s%c%s", ipod_dir, ':', ipod_filename);
+
+                if (localdebug) {
+                    fprintf(stdout,"Considering %s ", pathtrack);
+                    fflush(stdout);
+                }
+
+		if ( g_tree_lookup_extended (files_known, pathtrack,
+					     &foundtrack, &foundtrack) )
+		{ /* file is not orphaned */
+		    g_tree_remove(files_known, pathtrack); /* we don't need this any more */
+                    if (localdebug) fprintf(stdout," good ");
+		}
+		else
+		{  /* Now deal with orphaned... */
+		    gchar *fn_orphaned;
+		    gchar *num_str = g_strdup_printf ("F%02d", h);
+		    Track *dupl_track;
+
+		    const gchar *p_dcomps[] =
+			{ num_str, ipod_filename, NULL };
+
+		    fn_orphaned = itdb_resolve_path (music_dir, p_dcomps);
+
+		    if (!pl_orphaned)
+		    {
+			gchar *str = g_strdup_printf ("[%s]", _("Orphaned"));
+			pl_orphaned = gp_playlist_by_name_or_add (
+			    itdb, str, FALSE);
+			g_free (str);
+		    }
+
+		    norphaned++;
+
+                    if (localdebug) fprintf(stdout,"to orphaned ");
+		    if ((dupl_track = sha1_file_exists (itdb, fn_orphaned,
+						       TRUE)))
+		    {  /* This orphan has already been added again.
+			  It will be removed with the next sync */
+			Track *track = gp_track_new ();
+			gchar *fn_utf8 = charset_to_utf8 (fn_orphaned);
+			const gchar *dir_rel = music_dir + strlen (mountpoint);
+			if (*dir_rel == G_DIR_SEPARATOR) ++dir_rel;
+			track->ipod_path = g_strdup_printf (
+			    "%c%s%c%s%c%s",
+			    G_DIR_SEPARATOR, dir_rel,
+			    G_DIR_SEPARATOR, num_str,
+			    G_DIR_SEPARATOR, ipod_filename);
+			itdb_filename_fs2ipod (track->ipod_path);
+
+			gp_track_validate_entries (track);
+			mark_track_for_deletion (itdb, track);
+			gtkpod_warning (_(
+			 "The following orphaned file had already "
+			 "been added to the iPod again. It will be "
+			 "removed with the next sync:\n%s\n\n"),
+			 fn_utf8);
+			g_free (fn_utf8);
+		    }
+		    else
+		    {
+			add_track_by_filename(itdb,
+					      fn_orphaned, pl_orphaned,
+					      FALSE, NULL, NULL);
+		    }
+		    g_free (fn_orphaned);
+		    g_free (num_str);
+		}
+                if (localdebug) fprintf(stdout," done\n");
+
+		g_free(ipod_filename);
+		g_free(pathtrack);
+	    }
+            g_dir_close(dir_des);
+	}
+        g_free(ipod_dir);
+ 	g_free(ipod_fulldir);
+	process_gtk_events_blocked();
+    }
+
+    ndangling=g_tree_nnodes(files_known);
+    gtkpod_statusbar_message (_("Found %d orphaned and %d dangling files. Processing..."),
+			      norphaned, ndangling);
+    
+    gtkpod_tracks_statusbar_update();
+
+    g_free(music_dir);
+    music_dir = NULL;
+
+    /* Now lets deal with dangling tracks */
+    /* Traverse the tree - leftovers are dangling - put them in two lists */
+    g_tree_foreach(files_known, remove_dangling, l_dangling);
+
+    for (i=0;i<2;i++)
+    {
+	GString *str_dangs = g_string_sized_new(2000);
+	gint ndang=0;
+	gchar *buf;
+
+	glist_list_tracks(l_dangling[i], str_dangs); /* compose String list of the tracks */
+	ndang = g_list_length(l_dangling[i]);
+	if (ndang)
+	{
+	    if (i==1)
+		buf = g_strdup_printf (
+		    ngettext ("The following dangling track has a file on PC.\nPress OK to have them transfered from the file on next Sync, CANCEL to leave it as is.",
+			      "The following %d dangling tracks have files on PC.\nPress OK to have them transfered from the files on next Sync, CANCEL to leave them as is.",
+			      ndang), ndang);
+	    else
+		buf = g_strdup_printf (
+		    ngettext ("The following dangling track doesn't have file on PC. \nPress OK to remove it, CANCEL to leave it as is.",
+			      "The following %d dangling tracks do not have files on PC. \nPress OK to remove them, CANCEL to leave them. as is",
+			      ndang), ndang);
+
+	    if (gtkpod_confirmation
+		((i==1?CONF_ID_DANGLING1:CONF_ID_DANGLING0), /* we want unique window for each */
+		 FALSE,         /* gboolean modal, */
+		 _("Dangling Tracks"), /* title */
+		 buf,           /* label */
+		 str_dangs->str, /* scrolled text */
+		 NULL, 0, NULL, /* option 1 */
+		 NULL, 0, NULL, /* option 2 */
+		 TRUE,          /* gboolean confirm_again, */
+		 NULL,          /* ConfHandlerOpt confirm_again_handler,*/
+		 i==1?check_db_danglingok1:check_db_danglingok0, /* ConfHandler ok_handler,*/
+		 NULL,          /* don't show "Apply" button */
+		 i==1?check_db_danglingcancel1:check_db_danglingcancel0, /* cancel_handler,*/
+		 l_dangling[i], /* gpointer user_data1,*/
+		 itdb)             /* gpointer user_data2,*/
+		== GTK_RESPONSE_REJECT)
+	    {   /* free memory */
+		g_list_free(l_dangling[i]);
+	    }
+	    g_free (buf);
+	    g_string_free (str_dangs, TRUE);
+	}
+    }
+
+    if (pl_orphaned) data_changed (itdb);
+    g_tree_destroy (files_known);
+    gtkpod_statusbar_message (_("Found %d orphaned and %d dangling files. Done."),
+			      norphaned, ndangling);
+    gtkpod_statusbar_timeout (0);
+    release_widgets ();
+}

Added: trunk/src/misc_track.c
===================================================================
--- trunk/src/misc_track.c	                        (rev 0)
+++ trunk/src/misc_track.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,2209 @@
+/*
+|  Copyright (C) 2002-2007 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: misc_track.c 1686 2007-08-25 03:20:11Z jcsjcs $
+*/
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "display_itdb.h"
+#include "sha1.h"
+#include "prefs.h"
+#include "misc.h"
+#include "misc_track.h"
+#include "info.h"
+#include "charset.h"
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+/* ------------------------------------------------------------ *\
+|                                                                |
+|         functions for sha1 checksums                            |
+|                                                                |
+\* ------------------------------------------------------------ */
+
+/**
+ * Register all tracks in the sha1 hash and remove duplicates (while
+ * preserving playlists)
+ */
+void gp_sha1_hash_tracks_itdb (iTunesDB *itdb)
+{
+   gint ns, count;
+   GList *gl;
+
+   g_return_if_fail (itdb);
+
+   if (!prefs_get_int("sha1")) return;
+   ns = itdb_tracks_number (itdb);   /* number of tracks */
+   if (ns == 0)                 return;
+
+   block_widgets (); /* block widgets -- this might take a while,
+			so we'll do refreshs */
+   sha1_free (itdb);  /* release sha1 hash */
+   count = 0;
+   /* populate the hash table */
+   gl=itdb->tracks;
+   while (gl)
+   {
+       Track *track=gl->data;
+       Track *oldtrack = sha1_track_exists_insert (itdb, track);
+
+       /* need to get next track now because it might be a duplicate and
+	  thus be removed when we call gp_duplicate_remove() */
+       gl = gl->next;
+
+       if (oldtrack)
+       {
+	   gp_duplicate_remove (oldtrack, track);
+       }
+
+       ++count;
+       if (((count % 20) == 1) || (count == ns))
+       { /* update for count == 1, 21, 41 ... and for count == n */
+	   gtkpod_statusbar_message  (ngettext ("Hashed %d of %d track.",
+						"Hashed %d of %d tracks.", ns),
+				      count, ns);
+	   while (widgets_blocked && gtk_events_pending ())
+	       gtk_main_iteration ();
+       }
+   }
+   gp_duplicate_remove (NULL, NULL); /* show info dialogue */
+   release_widgets (); /* release widgets again */
+}
+
+
+/**
+ * Call gp_hash_tracks_itdb() for each itdb.
+ *
+ */
+void gp_sha1_hash_tracks (void)
+{
+    GList *gl;
+    struct itdbs_head *itdbs_head;
+
+    g_return_if_fail (gtkpod_window);
+    itdbs_head = g_object_get_data (G_OBJECT (gtkpod_window),
+				    "itdbs_head");
+    g_return_if_fail (itdbs_head);
+
+    block_widgets ();
+    for (gl=itdbs_head->itdbs; gl; gl=gl->next)
+    {
+	gp_sha1_hash_tracks_itdb (gl->data);
+    }
+    release_widgets ();
+}
+
+
+/**
+ * Call sha1_free() for each itdb and delete sha1 checksums in all tracks.
+ *
+ */
+void gp_sha1_free_hash (void)
+{
+    void rm_sha1 (gpointer track, gpointer user_data)
+	{
+	    ExtraTrackData *etr;
+	    g_return_if_fail (track);
+	    etr = ((Track *)track)->userdata;
+	    g_return_if_fail (etr);
+	    C_FREE (etr->sha1_hash);
+	}
+    GList *gl;
+    struct itdbs_head *itdbs_head;
+
+    g_return_if_fail (gtkpod_window);
+    itdbs_head = g_object_get_data (G_OBJECT (gtkpod_window),
+				    "itdbs_head");
+    g_return_if_fail (itdbs_head);
+
+    for (gl=itdbs_head->itdbs; gl; gl=gl->next)
+    {
+	iTunesDB *itdb = gl->data;
+	g_return_if_fail (itdb);
+	sha1_free (itdb);
+	g_list_foreach (itdb->tracks, rm_sha1, NULL);
+    }
+}
+
+
+/* This function removes a duplicate track "track" from memory while
+ * preserving the playlists.
+ *
+ * The sha1 hash is not modified.
+ *
+ * The playcount/recent_playcount are modified to show the cumulative
+ * playcounts for that track.
+ *
+ * The star rating is set to the average of both star ratings if both
+ * ratings are not 0, or the higher rating if one of the ratings is 0
+ * (it is assumed that a rating of "0" means that no rating has been
+ * set).
+ *
+ * The "added" timestamp is set to the older entry (unless that one
+ * is 0).
+ *
+ * The "modified" and "last played" timestamps are set to the more
+ * recent entry.
+ *
+ * You should call "gp_duplicate_remove (NULL, NULL)" to pop up the info
+ * dialogue with the list of duplicate tracks afterwards. Call with
+ * "NULL, (void *)-1" to just clean up without dialoge.
+ *
+ * If "track" does not exist in
+ * the master play list, only a message is logged (to be displayed
+ * later when called with "NULL, NULL" */
+void gp_duplicate_remove (Track *oldtrack, Track *track)
+{
+   gchar *buf, *buf2;
+   static gint deltrack_nr = 0;
+   static gboolean removed = FALSE;
+   static GString *str = NULL;
+
+/*   printf ("%p, %p, '%s'\n", oldtrack, track, str?str->str:"empty");*/
+
+   if (prefs_get_int("show_duplicates") && !oldtrack && !track && str)
+   {
+       if (str->len)
+       { /* Some tracks have been deleted. Print a notice */
+	   if (removed)
+	   {
+	       buf = g_strdup_printf (
+		   ngettext ("The following duplicate track has been removed.",
+			     "The following %d duplicate tracks have been removed.",
+			     deltrack_nr), deltrack_nr);
+	   }
+	   else
+	   {
+	       buf = g_strdup_printf (
+		   ngettext ("The following duplicate track has not been added to the master play list.",
+			     "The following %d duplicate tracks have not been added to the master play list.",
+			     deltrack_nr), deltrack_nr);
+	   }
+	   gtkpod_confirmation
+	       (-1,                      /* gint id, */
+		FALSE,                   /* gboolean modal, */
+		_("Duplicate detection"),/* title */
+		buf,                     /* label */
+		str->str,                /* scrolled text */
+		NULL, 0, NULL,      /* option 1 */
+		NULL, 0, NULL,      /* option 2 */
+		TRUE,               /* gboolean confirm_again, */
+		"show_duplicates",
+		                    /* ConfHandlerCA confirm_again_handler,*/
+		CONF_NULL_HANDLER,  /* ConfHandler ok_handler,*/
+		NULL,               /* don't show "Apply" button */
+		NULL,               /* don't show "Cancel" button */
+		NULL,               /* gpointer user_data1,*/
+		NULL);              /* gpointer user_data2,*/
+	   g_free (buf);
+       }
+   }
+
+   if (oldtrack == NULL)
+   { /* clean up */
+       if (str)       g_string_free (str, TRUE);
+       str = NULL;
+       removed = FALSE;
+       deltrack_nr = 0;
+       gtkpod_tracks_statusbar_update();
+   }
+
+   if (oldtrack && track)
+   {
+       ExtraTrackData *oldetr = oldtrack->userdata;
+       ExtraTrackData *etr = track->userdata;
+       iTunesDB *itdb = oldtrack->itdb;
+       g_return_if_fail (itdb);
+       g_return_if_fail (oldetr);
+       g_return_if_fail (etr);
+
+       if (prefs_get_int("show_duplicates"))
+       {
+	   /* add info about it to str */
+	   buf = get_track_info (track, TRUE);
+	   buf2 = get_track_info (oldtrack, TRUE);
+	   if (!str)
+	   {
+	       deltrack_nr = 0;
+	       str = g_string_sized_new (2000); /* used to keep record
+						 * of duplicate
+						 * tracks */
+	   }
+	   g_string_append_printf (str, "'%s': identical to '%s'\n",
+				   buf, buf2);
+	   g_free (buf);
+	   g_free (buf2);
+       }
+       /* Set playcount */
+       oldtrack->playcount += track->playcount;
+       oldtrack->recent_playcount += track->recent_playcount;
+       /* Set rating */
+       if (oldtrack->rating && track->rating)
+	   oldtrack->rating =
+	       floor((double)(oldtrack->rating + track->rating + ITDB_RATING_STEP) /
+		     (2 * ITDB_RATING_STEP)) * ITDB_RATING_STEP;
+       else
+	   oldtrack->rating = MAX (oldtrack->rating, track->rating);
+       /* Set 'modified' timestamp */
+       oldtrack->time_modified =  MAX (oldtrack->time_modified,
+				      track->time_modified);
+       /* Set 'played' timestamp */
+       oldtrack->time_played =  MAX (oldtrack->time_played, track->time_played);
+       /* Set 'added' timestamp */
+       oldtrack->time_added =  MIN (oldtrack->time_added, track->time_added);
+
+       /* Update filename if new track has filename set (should be
+	  always!?) and old filename is not available or no longer
+	  valid */
+       if (etr->pc_path_locale)
+       {
+	   if (!oldetr->pc_path_locale ||
+	       !g_file_test (oldetr->pc_path_locale, G_FILE_TEST_IS_REGULAR))
+	   {
+	       g_free (oldetr->pc_path_locale);
+	       g_free (oldetr->pc_path_utf8);
+	       oldetr->pc_path_locale = g_strdup (etr->pc_path_locale);
+	       oldetr->pc_path_utf8 = g_strdup (etr->pc_path_utf8);
+	   }
+       }
+       if (itdb_playlist_contains_track (itdb_playlist_mpl (itdb),
+					 track))
+       { /* track is already added to memory -> replace with "oldtrack" */
+	   /* check for "track" in all playlists (except for MPL) */
+	   GList *gl;
+	   gl = g_list_nth (itdb->playlists, 1);
+	   while (gl)
+	   {
+	       Playlist *pl = gl->data;
+	       g_return_if_fail (pl);
+	       /* if "track" is in playlist pl, we remove it and add
+		  the "oldtrack" instead (this way round we don't have
+		  to worry about changing sha1 hash entries */
+	       if (itdb_playlist_contains_track (pl, track))
+	       {
+		   gp_playlist_remove_track (pl, track,
+					     DELETE_ACTION_PLAYLIST);
+		   if (!itdb_playlist_contains_track (pl, oldtrack))
+		       gp_playlist_add_track (pl, oldtrack, TRUE);
+	       }
+	       gl = gl->next;
+	   }
+	   /* remove track from MPL, i.e. from the ipod (or the local
+	    * database */
+	   if (itdb->usertype & GP_ITDB_TYPE_IPOD)
+	   {
+	       gp_playlist_remove_track (NULL, track, DELETE_ACTION_IPOD);
+	   }
+	   if (itdb->usertype & GP_ITDB_TYPE_LOCAL)
+	   {
+	       gp_playlist_remove_track (NULL, track,
+					 DELETE_ACTION_DATABASE);
+	   }
+	   removed = TRUE;
+       }
+       ++deltrack_nr; /* count duplicate tracks */
+       data_changed (itdb);
+   }
+}
+
+
+/**
+ * Register all tracks in the sha1 hash and remove duplicates (while
+ * preserving playlists).
+ * Call  gp_duplicate_remove (NULL, NULL); to show an info dialogue
+ */
+void gp_itdb_hash (iTunesDB *itdb)
+{
+   gint ns, track_nr;
+   Track *track, *oldtrack;
+
+   g_return_if_fail (itdb);
+
+
+   if (!prefs_get_int("sha1")) return;
+
+   ns = itdb_tracks_number (itdb);
+   if (ns == 0)                 return;
+
+   block_widgets (); /* block widgets -- this might take a while,
+			so we'll do refreshs */
+   sha1_free (itdb);  /* release sha1 hash */
+   track_nr = 0;
+   /* populate the hash table */
+   while ((track = g_list_nth_data (itdb->tracks, track_nr)))
+   {
+       oldtrack = sha1_track_exists_insert (itdb, track);
+/*        printf("%d:%d:%p:%p\n", count, track_nr, track, oldtrack); */
+       if (oldtrack)
+       {
+	   gp_duplicate_remove (oldtrack, track);
+       }
+       else
+       { /* if we removed a track (above), we don't need to increment
+	    the track_nr here */
+	   ++track_nr;
+       }
+   }
+   release_widgets (); /* release widgets again */
+}
+
+
+
+
+/* ------------------------------------------------------------ *\
+|                                                                |
+|         functions to locate tracks                             |
+|                                                                |
+\* ------------------------------------------------------------ */
+
+
+/* Returns the track with the filename @name or NULL, if none can be
+ * found. This function also works if @filename is on the iPod. */
+Track *gp_track_by_filename (iTunesDB *itdb, gchar *filename)
+{
+    gchar *musicdir = NULL;
+    Track *result = NULL;
+
+    g_return_val_if_fail (itdb, NULL);
+    g_return_val_if_fail (filename, NULL);
+
+    if (itdb->usertype & GP_ITDB_TYPE_IPOD)
+    {
+	gchar *mountpoint = get_itdb_prefs_string (itdb, KEY_MOUNTPOINT);
+	g_return_val_if_fail (mountpoint, NULL);
+	musicdir = itdb_get_music_dir (mountpoint);
+	if (!musicdir)
+	{
+	    /* FIXME: guess */
+	    musicdir = g_build_filename (mountpoint, "iPod_Control",
+					 "Music", NULL);
+	}
+	g_free (mountpoint);
+    }
+    if ((itdb->usertype & GP_ITDB_TYPE_IPOD) &&
+	(musicdir != NULL) &&
+	(strncmp (filename, musicdir, strlen (musicdir)) == 0))
+    {   /* handle track on iPod (in music dir) */
+	GList *gl;
+	for (gl=itdb->tracks; gl&&!result; gl=gl->next)
+	{
+	    Track *track = gl->data;
+	    gchar *ipod_path;
+	    g_return_val_if_fail (track, NULL);
+	    ipod_path = itdb_filename_on_ipod (track);
+	    if (ipod_path)
+	    {
+		if (strcasecmp (ipod_path, filename) == 0)
+		{
+		    result = track;
+		}
+		g_free (ipod_path);
+	    }
+	}
+    }
+    else
+    {   /* handle track on local filesystem */
+	GList *gl;
+	for (gl=itdb->tracks; gl&&!result; gl=gl->next)
+	{
+	    Track *track = gl->data;
+	    ExtraTrackData *etr;
+	    g_return_val_if_fail (track, NULL);
+	    etr = track->userdata;
+	    g_return_val_if_fail (etr, NULL);
+	    if (etr->pc_path_locale)
+	    {
+		if (strcmp (etr->pc_path_locale, filename) == 0)
+		    result = track;
+	    }
+	}
+    }
+    g_free (musicdir);
+    return result;
+}
+
+
+/* Find @track in repository @itdb by the following methods and return
+   the matches:
+
+   1) DND origin data
+   2) filename matches
+   3) SHA1 match 
+
+   If DND origin data is available and valid only one track is
+   returned. Otherwise all tracks matching the filename and the SHA1
+   are returned.
+
+   If DND origin data is found to be invalid it is deleted.
+
+   Return value: a GList with matching tracks. You must call
+   g_list_free() on the list when it is no longer needed.
+*/
+GList *gp_itdb_find_same_tracks (iTunesDB *itdb, Track *track)
+{
+    ExtraTrackData *etr;
+    Track *itr;
+    GList *tracks = NULL;
+
+    g_return_val_if_fail (itdb, NULL);
+    g_return_val_if_fail (track, NULL);
+
+    etr = track->userdata;
+    g_return_val_if_fail (etr, NULL);
+
+    if (itdb->id == etr->local_itdb_id)
+    {   /* we can probably find the original track from the DND data */
+	GList *gl;
+	for (gl=itdb->tracks; gl; gl=gl->next)
+	{
+	    itr = gl->data;
+	    g_return_val_if_fail (itr, NULL);
+	    if (itr->dbid == etr->local_track_dbid)
+	    {   /* found track */
+		tracks = g_list_prepend (tracks, itr);
+		return tracks;
+	    }
+	}
+	/* DND origin data is no longer valid */
+	etr->local_itdb_id = 0;
+	etr->local_track_dbid = 0;
+    }
+
+    /* No luck so far -- let's get filename matches */
+    tracks = gp_itdb_pc_path_hash_find_tracks (itdb, etr->pc_path_utf8);
+
+    /* And also try SHA1 match */
+    itr = sha1_sha1_exists (itdb, etr->sha1_hash);
+
+    if (itr)
+    {   /* insert into tracks list if not already present */
+	if (!g_list_find (tracks, itr))
+	{
+	    tracks = g_list_prepend (tracks, itr);
+	}
+    }
+
+    return tracks;
+}
+
+
+/* Find @track in all local repositories and return a list.
+
+   This function calls gp_itdb_find_same_tracks() for each local
+   repository and concatenates the results into one list.
+
+   Return value: a GList with matching tracks. You must call
+   g_list_free() on the list when it is no longer needed.
+*/
+GList *gp_itdb_find_same_tracks_in_local_itdbs (Track *track)
+{
+    GList *gl, *tracks=NULL;
+    struct itdbs_head *ih = gp_get_itdbs_head (gtkpod_window);
+
+    g_return_val_if_fail (ih, NULL);
+    g_return_val_if_fail (track, NULL);
+
+    for (gl=ih->itdbs; gl; gl=gl->next)
+    {
+	iTunesDB *itdb = gl->data;
+	g_return_val_if_fail (itdb, tracks);
+	if (itdb->usertype & GP_ITDB_TYPE_LOCAL)
+	{
+	    GList *addtracks = gp_itdb_find_same_tracks (itdb, track);
+	    tracks = g_list_concat (tracks, addtracks);
+	}
+    }
+    return tracks;
+}
+
+
+
+/* Find @track in all repositories (local and iPod) and return a list.
+
+   This function calls gp_itdb_find_same_tracks() for each
+   repository and concatenates the results into one list.
+
+   Return value: a GList with matching tracks. You must call
+   g_list_free() on the list when it is no longer needed.
+*/
+GList *gp_itdb_find_same_tracks_in_itdbs (Track *track)
+{
+    GList *gl, *tracks=NULL;
+    struct itdbs_head *ih = gp_get_itdbs_head (gtkpod_window);
+
+    g_return_val_if_fail (ih, NULL);
+    g_return_val_if_fail (track, NULL);
+
+    for (gl=ih->itdbs; gl; gl=gl->next)
+    {
+	GList *addtracks;
+	iTunesDB *itdb = gl->data;
+	g_return_val_if_fail (itdb, tracks);
+	addtracks = gp_itdb_find_same_tracks (itdb, track);
+	tracks = g_list_concat (tracks, addtracks);
+    }
+    return tracks;
+}
+
+
+
+/* ------------------------------------------------------------ *\
+|                                                                |
+|         functions for local path hashtable                     |
+|                                                                |
+\* ------------------------------------------------------------ */
+
+/* set up hash table for local filenames */
+void gp_itdb_pc_path_hash_init (ExtraiTunesDBData *eitdb)
+{
+    g_return_if_fail (eitdb);
+
+    if (!eitdb->pc_path_hash)
+    {
+	eitdb->pc_path_hash = g_hash_table_new_full (
+	    g_str_hash, g_str_equal,
+	    g_free, NULL);
+    }
+}
+
+
+/* function for destroying hash value, used when destroying the hash
+ * table in gp_itdb_local_path_hash_destroy() below. */
+static void pc_path_hash_free_value (gpointer key,
+					gpointer value,
+					gpointer userdata)
+{
+    g_list_free (value);
+}
+
+
+/* free all memory associated with the local_path_hash */
+void gp_itdb_pc_path_hash_destroy (ExtraiTunesDBData *eitdb)
+{
+    g_return_if_fail (eitdb);
+
+    if (eitdb->pc_path_hash)
+    {
+	g_hash_table_foreach (eitdb->pc_path_hash,
+			      pc_path_hash_free_value,
+			      NULL);
+	g_hash_table_destroy (eitdb->pc_path_hash);
+	eitdb->pc_path_hash = NULL;
+    }
+}
+
+
+/* Add track to filehash. This function must only be called once for
+ * each track. */
+void gp_itdb_pc_path_hash_add_track (Track *track)
+{
+    iTunesDB *itdb;
+    ExtraTrackData *etr;
+    ExtraiTunesDBData *eitdb;
+
+    g_return_if_fail (track);
+    etr = track->userdata;
+    g_return_if_fail (etr);
+
+    itdb = track->itdb;
+    g_return_if_fail (itdb);
+
+    eitdb = itdb->userdata;
+    g_return_if_fail (eitdb);
+    g_return_if_fail (eitdb->pc_path_hash);
+
+    g_return_if_fail (track);
+    etr = track->userdata;
+    g_return_if_fail (etr);
+
+    /* This is only to detect programming errors */
+    g_return_if_fail (!etr->pc_path_hashed);
+
+    if (etr->pc_path_utf8 && *etr->pc_path_utf8)
+    {   /* add to hash table */
+	GList *tracks;
+	tracks = g_hash_table_lookup (eitdb->pc_path_hash, etr->pc_path_utf8);
+	tracks = g_list_prepend (tracks, track);
+	g_hash_table_replace (eitdb->pc_path_hash,
+			      g_strdup (etr->pc_path_utf8),
+			      tracks);
+	/* This is only to detect programming errors */
+	etr->pc_path_hashed = TRUE;
+    }
+}
+
+/* used in the next two functions */
+struct pc_path_hash_find_track_data
+{
+    Track *track;
+    gchar *key;
+};
+
+
+/* Used in the next function. Return TRUE and the current key if
+   td->track is contained in the list for key */
+static gboolean pc_path_hash_find_track (gpointer key,
+					 gpointer value,
+					 gpointer user_data)
+{
+    GList *tracks = value;
+    struct pc_path_hash_find_track_data *td = user_data;
+
+    if (g_list_find (tracks, td->track))
+    {
+	td->key = g_strdup (key);
+	return TRUE;
+    }
+    return FALSE;
+}
+
+
+
+/* remove track from filehash */
+void gp_itdb_pc_path_hash_remove_track (Track *track)
+{
+    struct pc_path_hash_find_track_data td;
+    ExtraTrackData *etr;
+    iTunesDB *itdb;
+    ExtraiTunesDBData *eitdb;
+    GList *tracks;
+
+    g_return_if_fail (track);
+    etr = track->userdata;
+    g_return_if_fail (etr);
+
+    itdb = track->itdb;
+    g_return_if_fail (itdb);
+
+    eitdb = itdb->userdata;
+    g_return_if_fail (eitdb);
+    g_return_if_fail (eitdb->pc_path_hash);
+
+    if (!etr->pc_path_hashed)	return;
+
+    if (etr->pc_path_utf8 && *etr->pc_path_utf8)
+    {   /* try lookup with filename */
+	GList *tracks;
+	tracks = g_hash_table_lookup (eitdb->pc_path_hash, etr->pc_path_utf8);
+	if (tracks)
+	{   /* filename exists */
+	    GList *link = g_list_find (tracks, track);
+	    if (link)
+	    {   /* track found */
+		tracks = g_list_remove_link (tracks, link);
+		if (tracks)
+		{   /* still tracks left under this filename */
+		    g_hash_table_replace (eitdb->pc_path_hash,
+					  g_strdup (etr->pc_path_utf8),
+					  tracks);
+		}
+		else
+		{   /* no more tracks left under this filename */
+		    g_hash_table_remove (eitdb->pc_path_hash,
+					 etr->pc_path_utf8);
+		}
+		etr->pc_path_hashed = FALSE;
+		return;
+	    }
+	}
+    }
+
+    /* We didn't find the track by filename, or now filename is
+     * available any more) -> search through the list */
+    td.track = track;
+    td.key = NULL;
+    tracks = g_hash_table_find (eitdb->pc_path_hash,
+				pc_path_hash_find_track,
+				&td);
+    if (tracks)
+    {
+	tracks = g_list_remove (tracks, track);
+	if (tracks)
+	{   /* still tracks left under this filename */
+	    g_hash_table_replace (eitdb->pc_path_hash,
+				  g_strdup (td.key),
+				  tracks);
+	}
+	else
+	{   /* no more tracks left under this filename */
+	    g_hash_table_remove (eitdb->pc_path_hash,
+				 td.key);
+	}
+	etr->pc_path_hashed = FALSE;
+	g_free (td.key);
+    }
+}
+
+
+/* Return all tracks with @filename (@filename in UTF8).
+   You must g_list_free the returned list when it is not longer needed. */
+GList *gp_itdb_pc_path_hash_find_tracks (iTunesDB *itdb, const gchar *filename)
+{
+    ExtraiTunesDBData *eitdb;
+    GList *tracks = NULL;
+
+    g_return_val_if_fail (itdb, NULL);
+    eitdb = itdb->userdata;
+    g_return_val_if_fail (eitdb, NULL);
+    g_return_val_if_fail (eitdb->pc_path_hash, NULL);
+
+    if (filename && *filename)
+	tracks = g_hash_table_lookup (eitdb->pc_path_hash, filename);
+
+    return g_list_copy (tracks);
+}
+
+
+
+/* ------------------------------------------------------------ *\
+|                                                                |
+|         functions to retrieve information from tracks          |
+|                                                                |
+\* ------------------------------------------------------------ */
+
+/* return the address of the UTF8 field @t_item. @t_item is one of
+ * (the applicable) T_* defined in track.h */
+gchar **track_get_item_pointer (Track *track, T_item t_item)
+{
+    gchar **result = NULL;
+    ExtraTrackData *etr;
+
+    g_return_val_if_fail (track, NULL);
+    etr = track->userdata;
+    g_return_val_if_fail (etr, NULL);
+
+    switch (t_item)
+    {
+    case T_ALBUM:
+	result = &track->album;
+	break;
+    case T_ARTIST:
+	result = &track->artist;
+	break;
+    case T_TITLE:
+	result = &track->title;
+	break;
+    case T_GENRE:
+	result = &track->genre;
+	break;
+    case T_COMMENT:
+	result = &track->comment;
+	break;
+    case T_COMPOSER:
+	result = &track->composer;
+	break;
+    case T_FILETYPE:
+	result = &track->filetype;
+	break;
+    case T_IPOD_PATH:
+	result = &track->ipod_path;
+	break;
+    case T_PC_PATH:
+	result = &etr->pc_path_utf8;
+	break;
+    case T_YEAR:
+	result = &etr->year_str;
+	break;
+    case T_GROUPING:
+	result = &track->grouping;
+	break;
+    case T_CATEGORY:
+	result = &track->category;
+	break;
+    case T_DESCRIPTION:
+	result = &track->description;
+	break;
+    case T_PODCASTURL:
+	result = &track->podcasturl;
+	break;
+    case T_PODCASTRSS:
+	result = &track->podcastrss;
+	break;
+    case T_SUBTITLE:
+	result = &track->subtitle;
+	break;
+    case T_THUMB_PATH:
+	result = &etr->thumb_path_utf8;
+	break;
+    case T_TV_SHOW:
+        result = &track->tvshow;
+        break;
+    case T_TV_EPISODE:
+        result = &track->tvepisode;
+        break;
+    case T_TV_NETWORK:
+        result = &track->tvnetwork;
+        break;
+    case T_ALBUMARTIST:
+	result = &track->albumartist;
+	break;
+    case T_SORT_ARTIST:
+	result = &track->sort_artist;
+	break;
+    case T_SORT_TITLE:
+	result = &track->sort_title;
+	break;
+    case T_SORT_ALBUM:
+	result = &track->sort_album;
+	break;
+    case T_SORT_ALBUMARTIST:
+	result = &track->sort_albumartist;
+	break;
+    case T_SORT_COMPOSER:
+	result = &track->sort_composer;
+	break;
+    case T_SORT_TVSHOW:
+	result = &track->sort_tvshow;
+	break;
+    case T_ALL:
+    case T_IPOD_ID:
+    case T_TRACK_NR:
+    case T_TRANSFERRED:
+    case T_SIZE:
+    case T_TRACKLEN:
+    case T_STARTTIME:
+    case T_STOPTIME:
+    case T_BITRATE:
+    case T_SAMPLERATE:
+    case T_BPM:
+    case T_PLAYCOUNT:
+    case T_RATING:
+    case T_TIME_ADDED:
+    case T_TIME_PLAYED:
+    case T_TIME_MODIFIED:
+    case T_TIME_RELEASED:
+    case T_VOLUME:
+    case T_SOUNDCHECK:
+    case T_CD_NR:
+    case T_COMPILATION:
+    case T_REMEMBER_PLAYBACK_POSITION:
+    case T_SKIP_WHEN_SHUFFLING:
+    case T_CHECKED:
+    case T_MEDIA_TYPE:
+    case T_SEASON_NR:
+    case T_EPISODE_NR:
+    case T_GAPLESS_TRACK_FLAG:
+    case T_ITEM_NUM:
+	g_return_val_if_reached (NULL);
+    }
+    return result;
+}
+
+
+
+
+
+
+
+/* return the UTF8 item @t_item. @t_item is one of
+   (the applicable) T_* defined in track.h */
+const gchar *track_get_item (Track *track, T_item t_item)
+{
+    gchar **ptr;
+
+    g_return_val_if_fail (track, NULL);
+
+    ptr = track_get_item_pointer (track, t_item);
+
+    if (ptr)     return *ptr;
+    else         return NULL;
+}
+
+
+/* Copy item @item from @frtrack to @totrack.
+   Return value:
+     TRUE: @totrack was changed
+     FALSE: @totrack is unchanged
+*/
+gboolean track_copy_item (Track *frtrack, Track *totrack, T_item item)
+{
+    gboolean changed = FALSE;
+    const gchar *fritem;
+    gchar **toitem_ptr;
+    ExtraTrackData *efrtr, *etotr;
+
+    g_return_val_if_fail (frtrack, FALSE);
+    g_return_val_if_fail (totrack, FALSE);
+    g_return_val_if_fail ((item > 0) && (item < T_ITEM_NUM), FALSE);
+
+    efrtr = frtrack->userdata;
+    etotr = totrack->userdata;
+    g_return_val_if_fail (efrtr, FALSE);
+    g_return_val_if_fail (etotr, FALSE);
+
+    if (frtrack == totrack) return FALSE;
+
+    switch (item)
+    {
+    case T_ALBUM:
+    case T_ARTIST:
+    case T_TITLE:
+    case T_GENRE:
+    case T_COMMENT:
+    case T_COMPOSER:
+    case T_FILETYPE:
+    case T_IPOD_PATH:
+    case T_PC_PATH:
+    case T_YEAR:
+    case T_GROUPING:
+    case T_CATEGORY:
+    case T_DESCRIPTION:
+    case T_PODCASTURL:
+    case T_PODCASTRSS:
+    case T_SUBTITLE:
+    case T_THUMB_PATH:
+    case T_TV_SHOW:
+    case T_TV_EPISODE:
+    case T_TV_NETWORK:
+    case T_ALBUMARTIST:
+    case T_SORT_ARTIST:
+    case T_SORT_TITLE:
+    case T_SORT_ALBUM:
+    case T_SORT_ALBUMARTIST:
+    case T_SORT_COMPOSER:
+    case T_SORT_TVSHOW:
+	fritem = track_get_item (frtrack, item);
+	toitem_ptr = track_get_item_pointer (totrack, item);
+	g_return_val_if_fail (fritem, FALSE);
+	g_return_val_if_fail (toitem_ptr, FALSE);
+	if ((*toitem_ptr == NULL) || (strcmp (fritem, *toitem_ptr) != 0))
+	{
+	    g_free (*toitem_ptr);
+	    *toitem_ptr = g_strdup (fritem);
+	    changed = TRUE;
+	}
+	if (item == T_YEAR)
+	{
+	    if (totrack->year != frtrack->year)
+	    {
+		totrack->year = frtrack->year;
+		changed = TRUE;
+	    }
+	}
+	/* handle items that have two entries */
+	if (item == T_PC_PATH)
+	{
+	    if ((etotr->pc_path_locale == NULL) ||
+		(strcmp (efrtr->pc_path_locale, etotr->pc_path_locale) != 0))
+	    {
+		g_free (etotr->pc_path_locale);
+		etotr->pc_path_locale = g_strdup (efrtr->pc_path_locale);
+		changed = TRUE;
+	    }
+	}
+	if (item == T_THUMB_PATH)
+	{
+	    if ((etotr->thumb_path_locale == NULL) ||
+		(strcmp (efrtr->thumb_path_locale, etotr->thumb_path_locale) != 0))
+	    {
+		g_free (etotr->thumb_path_locale);
+		etotr->thumb_path_locale = g_strdup (efrtr->thumb_path_locale);
+		changed = TRUE;
+	    }
+	}
+	break;
+    case T_IPOD_ID:
+	if (frtrack->id != totrack->id)
+	{
+	    totrack->id = frtrack->id;
+	    changed = TRUE;
+	}
+	break;
+    case T_TRACK_NR:
+	if (frtrack->track_nr != totrack->track_nr)
+	{
+	    totrack->track_nr = frtrack->track_nr;
+	    changed = TRUE;
+	}
+	if (frtrack->tracks != totrack->tracks)
+	{
+	    totrack->tracks = frtrack->tracks;
+	    changed = TRUE;
+	}
+	break;
+    case T_TRANSFERRED:
+	if (frtrack->transferred != totrack->transferred)
+	{
+	    totrack->transferred = frtrack->transferred;
+	    changed = TRUE;
+	}
+	break;
+    case T_SIZE:
+	if (frtrack->size != totrack->size)
+	{
+	    totrack->size = frtrack->size;
+	    changed = TRUE;
+	}
+	break;
+    case T_TRACKLEN:
+	if (frtrack->tracklen != totrack->tracklen)
+	{
+	    totrack->tracklen = frtrack->tracklen;
+	    changed = TRUE;
+	}
+	break;
+    case T_STARTTIME:
+	if (frtrack->starttime != totrack->starttime)
+	{
+	    totrack->starttime = frtrack->starttime;
+	    changed = TRUE;
+	}
+	break;
+    case T_STOPTIME:
+	if (frtrack->stoptime != totrack->stoptime)
+	{
+	    totrack->stoptime = frtrack->stoptime;
+	    changed = TRUE;
+	}
+	break;
+    case T_BITRATE:
+	if (frtrack->bitrate != totrack->bitrate)
+	{
+	    totrack->bitrate = frtrack->bitrate;
+	    changed = TRUE;
+	}
+	break;
+    case T_SAMPLERATE:
+	if (frtrack->samplerate != totrack->samplerate)
+	{
+	    totrack->samplerate = frtrack->samplerate;
+	    changed = TRUE;
+	}
+	break;
+    case T_BPM:
+	if (frtrack->BPM != totrack->BPM)
+	{
+	    totrack->BPM = frtrack->BPM;
+	    changed = TRUE;
+	}
+	break;
+    case T_PLAYCOUNT:
+	if (frtrack->playcount != totrack->playcount)
+	{
+	    totrack->playcount = frtrack->playcount;
+	    changed = TRUE;
+	}
+	break;
+    case T_RATING:
+	if (frtrack->rating != totrack->rating)
+	{
+	    totrack->rating = frtrack->rating;
+	    changed = TRUE;
+	}
+	break;
+    case T_TIME_ADDED:
+    case T_TIME_PLAYED:
+    case T_TIME_MODIFIED:
+    case T_TIME_RELEASED:
+	if (time_get_time (frtrack, item) !=
+	    time_get_time (totrack, item))
+	{
+	    time_set_time (totrack, time_get_time (frtrack, item), item);
+	    changed = TRUE;
+	}
+	break;
+    case T_VOLUME:
+	if (frtrack->volume != totrack->volume)
+	{
+	    totrack->volume = frtrack->volume;
+	    changed = TRUE;
+	}
+	break;
+    case T_SOUNDCHECK:
+	if (frtrack->soundcheck != totrack->soundcheck)
+	{
+	    totrack->soundcheck = frtrack->soundcheck;
+	    changed = TRUE;
+	}
+	break;
+    case T_CD_NR:
+	if (frtrack->cd_nr != totrack->cd_nr)
+	{
+	    totrack->cd_nr = frtrack->cd_nr;
+	    changed = TRUE;
+	}
+	if (frtrack->cds != totrack->cds)
+	{
+	    totrack->cds = frtrack->cds;
+	    changed = TRUE;
+	}
+	break;
+    case T_COMPILATION:
+	if (frtrack->compilation != totrack->compilation)
+	{
+	    totrack->compilation = frtrack->compilation;
+	    changed = TRUE;
+	}
+	break;
+    case T_REMEMBER_PLAYBACK_POSITION:
+	if (frtrack->remember_playback_position != totrack->remember_playback_position)
+	{
+	    totrack->remember_playback_position = frtrack->remember_playback_position;
+	    changed = TRUE;
+	}
+	break;
+    case T_SKIP_WHEN_SHUFFLING:
+	if (frtrack->skip_when_shuffling != totrack->skip_when_shuffling)
+	{
+	    totrack->skip_when_shuffling = frtrack->skip_when_shuffling;
+	    changed = TRUE;
+	}
+	break;
+    case T_CHECKED:
+	if (frtrack->checked != totrack->checked)
+	{
+	    totrack->checked = frtrack->checked;
+	    changed = TRUE;
+	}
+	break;
+    case T_MEDIA_TYPE:
+	if (frtrack->mediatype != totrack->mediatype)
+	{
+	    totrack->mediatype = frtrack->mediatype;
+	    changed = TRUE;
+	}
+	break;
+    case T_SEASON_NR:
+	if (frtrack->season_nr != totrack->season_nr)
+	{
+	    totrack->season_nr = frtrack->season_nr;
+	    changed = TRUE;
+	}
+	break;
+    case T_EPISODE_NR:
+	if (frtrack->episode_nr != totrack->episode_nr)
+	{
+	    totrack->episode_nr = frtrack->episode_nr;
+	    changed = TRUE;
+	}
+	break;
+    case T_GAPLESS_TRACK_FLAG:
+	if (frtrack->gapless_track_flag != totrack->gapless_track_flag)
+	{
+	    totrack->gapless_track_flag = frtrack->gapless_track_flag;
+	    changed = TRUE;
+	}
+	break;
+    case T_ITEM_NUM:
+    case T_ALL:
+	g_return_val_if_reached (FALSE);
+
+    }	
+    return changed;
+}
+
+
+/* return a pointer to the specified timestamp. @t_item is one of (the
+   applicable) T_* defined in track.h.  If the parameters are illegal,
+   "0" is returned. */
+time_t *track_get_timestamp_ptr (Track *track, T_item t_item)
+{
+    g_return_val_if_fail (track, NULL);
+
+    switch (t_item)
+    {
+    case T_TIME_PLAYED:
+	return &track->time_played;
+    case T_TIME_MODIFIED:
+	return &track->time_modified;
+    case T_TIME_RELEASED:
+	return &track->time_released;
+    case T_TIME_ADDED:
+	return &track->time_added;
+    default:
+	g_return_val_if_reached (0);
+    }
+}
+
+
+/* return the specified timestamp. @t_item is one of
+   (the * applicable) T_* defined in track.h. If the parameters are
+   illegal, "0" is returned. */
+time_t track_get_timestamp (Track *track, T_item t_item)
+{
+    time_t *ptr;
+    g_return_val_if_fail (track, 0);
+
+    ptr = track_get_timestamp_ptr (track, t_item);
+    if (ptr)  return *ptr;
+    else      return 0;
+}
+
+
+/* unified format for TRACKLEN, STARTTIME, STOPTIME */
+static gchar *track_get_length_string (gint32 length)
+{
+    return g_strdup_printf ("%d:%06.3f",
+			    length/60000,
+			    ((float)(length%60000)) / 1000);
+}
+
+
+/* Return text for display. g_free() after use. */
+gchar *track_get_text (Track *track, T_item item)
+{
+    gchar *text = NULL;
+    ExtraTrackData *etr;
+    iTunesDB *itdb;
+
+    g_return_val_if_fail ((item > 0) && (item < T_ITEM_NUM), NULL);
+    g_return_val_if_fail (track, NULL);
+    etr = track->userdata;
+    g_return_val_if_fail (etr, NULL);
+    itdb = track->itdb;
+    g_return_val_if_fail (itdb, NULL);
+
+    switch (item)
+    {
+    case T_TITLE:
+    case T_ARTIST:
+    case T_ALBUM:
+    case T_GENRE:
+    case T_COMPOSER:
+    case T_COMMENT:
+    case T_FILETYPE:
+    case T_GROUPING:
+    case T_CATEGORY:
+    case T_DESCRIPTION:
+    case T_PODCASTURL:
+    case T_PODCASTRSS:
+    case T_SUBTITLE:
+    case T_TV_SHOW:
+    case T_TV_EPISODE:
+    case T_TV_NETWORK:
+    case T_ALBUMARTIST:
+    case T_SORT_ARTIST:
+    case T_SORT_TITLE:
+    case T_SORT_ALBUM:
+    case T_SORT_ALBUMARTIST:
+    case T_SORT_COMPOSER:
+    case T_SORT_TVSHOW:
+	text = g_strdup (track_get_item (track, item));
+	break;
+    case T_TRACK_NR:
+	if (track->tracks == 0)
+	    text = g_strdup_printf ("%d", track->track_nr);
+	else
+	    text = g_strdup_printf ("%d/%d",
+				    track->track_nr, track->tracks);
+	break;
+    case T_CD_NR:
+	if (track->cds == 0)
+	    text = g_strdup_printf ("%d", track->cd_nr);
+	else
+	    text = g_strdup_printf ("%d/%d", track->cd_nr, track->cds);
+	break;
+    case T_IPOD_ID:
+	if (track->id != -1)
+	    text = g_strdup_printf ("%d", track->id);
+	else
+	    text = g_strdup ("--");
+	break;
+    case T_PC_PATH:
+	text = g_strdup (etr->pc_path_utf8);
+	break;
+    case T_IPOD_PATH:
+	if (itdb->usertype & GP_ITDB_TYPE_IPOD)
+	{
+	    text = g_strdup (track->ipod_path);
+	}
+	if (itdb->usertype & GP_ITDB_TYPE_LOCAL)
+	{
+	    text = g_strdup (_("Local Database"));
+	}
+	break;
+    case T_THUMB_PATH:
+	text = g_strdup (etr->thumb_path_utf8);
+	if (!text || (strlen (text) == 0))
+	{   /* no path set */
+	    g_free (text);
+	    text = NULL;
+	    if (track->artwork && track->artwork->thumbnails)
+	    {   /* artwork is set */
+		text = g_strdup (_("Embedded or filename was lost"));
+	    }
+	    else
+	    {
+		text = g_strdup (_("Artwork not set"));
+	    }
+	}
+	break;
+    case T_SIZE:
+	text = g_strdup_printf ("%d", track->size);
+	break;
+    case T_TRACKLEN:
+	text = track_get_length_string (track->tracklen);
+	break;
+    case T_STARTTIME:
+	text = track_get_length_string (track->starttime);
+	break;
+    case T_STOPTIME:
+	if (track->stoptime == 0)
+	    text = track_get_length_string (track->tracklen);
+	else
+	    text = track_get_length_string (track->stoptime);
+	break;
+    case T_BITRATE:
+	text = g_strdup_printf ("%dk", track->bitrate);
+	break;
+    case T_SAMPLERATE:
+	text = g_strdup_printf ("%d", track->samplerate);
+	break;
+    case T_BPM:
+	text = g_strdup_printf ("%d", track->BPM);
+	break;
+    case T_PLAYCOUNT:
+	text = g_strdup_printf ("%d", track->playcount);
+	break;
+    case T_YEAR:
+	text = g_strdup_printf ("%d", track->year);
+	break;
+    case T_RATING:
+	text = g_strdup_printf ("%d", track->rating/ITDB_RATING_STEP);
+	break;
+    case T_TIME_PLAYED:
+    case T_TIME_MODIFIED:
+    case T_TIME_ADDED:
+    case T_TIME_RELEASED:
+	text = time_field_to_string (track, item);
+	break;
+    case T_VOLUME:
+	text = g_strdup_printf ("%d", track->volume);
+	break;
+    case T_SOUNDCHECK:
+	text = g_strdup_printf ("%0.2f", soundcheck_to_replaygain (track->soundcheck));
+	break;
+    case T_SEASON_NR:
+        text = g_strdup_printf ("%d", track->season_nr);
+	break;
+    case T_EPISODE_NR:
+        text = g_strdup_printf ("%d", track->episode_nr);
+	break;
+    case T_MEDIA_TYPE:
+        text = g_strdup_printf ("%#.8x", track->mediatype);
+	break;
+    case T_TRANSFERRED:
+    case T_COMPILATION:
+    case T_REMEMBER_PLAYBACK_POSITION:
+    case T_SKIP_WHEN_SHUFFLING:
+    case T_ALL:
+    case T_CHECKED:
+    case T_ITEM_NUM:
+    case T_GAPLESS_TRACK_FLAG:
+	break;
+    }
+    return text;
+}
+
+
+/* unified scanner for TRACKLEN, STARTTIME, STOPTIME */
+static gint32 track_scan_length (const gchar *new_text)
+{
+    gint32 nr;
+    const gchar *str;
+
+    g_return_val_if_fail (new_text, 0);
+
+    str = strrchr (new_text, ':');
+    if (str)
+    {   /* MM:SS */
+	/* A simple cast to gint32 can sometimes produce a number
+	   that's "1" too small (14.9999999999 -> 14 instead of 15) ->
+	   add 0.1 */
+	nr = 1000 * (((gdouble)(60 * atoi (new_text))) + atof (str+1)) + 0.1;
+    }
+    else
+    {   /* SS */
+	nr = 1000 * atof (new_text) + 0.1;
+    }
+
+    return nr;
+}
+
+
+/* Set track data according to @new_text
+
+   Return value: TRUE, if the track data was modified, FALSE otherwise
+*/
+gboolean track_set_text (Track *track, const gchar *new_text, T_item item)
+{
+    gboolean changed = FALSE;
+    gchar **itemp_utf8;
+    const gchar *str;
+    ExtraTrackData *etr;
+    gint32 nr;
+    time_t t;
+
+    g_return_val_if_fail (track, FALSE);
+    g_return_val_if_fail (new_text, FALSE);
+
+    etr = track->userdata;
+    g_return_val_if_fail (etr, FALSE);
+
+
+    switch(item)
+    {
+    case T_TITLE:
+    case T_ALBUM:
+    case T_ARTIST:
+    case T_GENRE:
+    case T_COMPOSER:
+    case T_COMMENT:
+    case T_FILETYPE:
+    case T_GROUPING:
+    case T_CATEGORY:
+    case T_DESCRIPTION:
+    case T_PODCASTURL:
+    case T_PODCASTRSS:
+    case T_SUBTITLE:
+    case T_TV_SHOW:
+    case T_TV_EPISODE:
+    case T_TV_NETWORK:
+    case T_ALBUMARTIST:
+    case T_SORT_ARTIST:
+    case T_SORT_TITLE:
+    case T_SORT_ALBUM:
+    case T_SORT_ALBUMARTIST:
+    case T_SORT_COMPOSER:
+    case T_SORT_TVSHOW:
+        itemp_utf8 = track_get_item_pointer (track, item);
+        if (g_utf8_collate (*itemp_utf8, new_text) != 0)
+        {
+	    g_free (*itemp_utf8);
+	    *itemp_utf8 = g_strdup (new_text);
+	    changed = TRUE;
+        }
+        break;
+    case T_TRACK_NR:
+        nr = atoi (new_text);
+        if ((nr >= 0) && (nr != track->track_nr))
+        {
+	    track->track_nr = nr;
+	    changed = TRUE;
+        }
+	str = strrchr (new_text, '/');
+	if (str)
+	{
+	    nr = atoi (str+1);
+	    if ((nr >= 0) && (nr != track->tracks))
+	    {
+		track->tracks = nr;
+		changed = TRUE;
+	    }
+	}
+        break;
+    case T_CD_NR:
+        nr = atoi (new_text);
+        if ((nr >= 0) && (nr != track->cd_nr))
+        {
+	    track->cd_nr = nr;
+	    changed = TRUE;
+        }
+	str = strrchr (new_text, '/');
+	if (str)
+	{
+	    nr = atoi (str+1);
+	    if ((nr >= 0) && (nr != track->cds))
+	    {
+		track->cds = nr;
+		changed = TRUE;
+	    }
+	}
+        break;
+    case T_YEAR:
+        nr = atoi (new_text);
+        if ((nr >= 0) && (nr != track->year))
+        {
+	    g_free (etr->year_str);
+	    etr->year_str = g_strdup_printf ("%d", nr);
+	    track->year = nr;
+	    changed = TRUE;
+        }
+        break;
+    case T_PLAYCOUNT:
+        nr = atoi (new_text);
+        if ((nr >= 0) && (nr != track->playcount))
+        {
+	    track->playcount = nr;
+	    changed = TRUE;
+        }
+        break;
+    case T_RATING:
+        nr = atoi (new_text);
+        if ((nr >= 0) && (nr <= 5) && (nr != track->rating))
+        {
+	    track->rating = nr*ITDB_RATING_STEP;
+	    changed = TRUE;
+        }
+        break;
+    case T_TIME_ADDED:
+    case T_TIME_PLAYED:
+    case T_TIME_MODIFIED:
+    case T_TIME_RELEASED:
+	t = time_string_to_time (new_text);
+	if ((t != -1) && (t != time_get_time (track, item)))
+	{
+	    time_set_time (track, t, item);
+	    changed = TRUE;
+	}
+	break;
+    case T_VOLUME:
+        nr = atoi (new_text);
+        if (nr != track->volume)
+        {
+	    track->volume = nr;
+	    changed = TRUE;
+        }
+        break;
+    case T_SOUNDCHECK:
+	nr = replaygain_to_soundcheck (atof (new_text));
+/* 	printf("%d : %f\n", nr, atof (new_text)); */
+        if (nr != track->soundcheck)
+        {
+	    track->soundcheck = nr;
+	    changed = TRUE;
+        }
+        break;
+    case T_SIZE:
+        nr = atoi (new_text);
+        if (nr != track->size)
+        {
+	    track->size = nr;
+	    changed = TRUE;
+        }
+        break;
+    case T_BITRATE:
+        nr = atoi (new_text);
+        if (nr != track->bitrate)
+        {
+	    track->bitrate = nr;
+	    changed = TRUE;
+        }
+        break;
+    case T_SAMPLERATE:
+        nr = atoi (new_text);
+        if (nr != track->samplerate)
+        {
+	    track->samplerate = nr;
+	    changed = TRUE;
+        }
+        break;
+    case T_BPM:
+        nr = atoi (new_text);
+        if (nr != track->BPM)
+        {
+	    track->BPM = nr;
+	    changed = TRUE;
+        }
+        break;
+    case T_TRACKLEN:
+	nr = track_scan_length (new_text);
+	if (nr != track->tracklen)
+	{
+	    track->tracklen = nr;
+	    changed = TRUE;
+	}
+	break;
+    case T_STARTTIME:
+	nr = track_scan_length (new_text);
+	if (nr != track->starttime)
+	{
+	    track->starttime = nr;
+	    changed = TRUE;
+	    /* Set stoptime to 0 if stoptime is the same as tracklen */
+	    if (track->stoptime == track->tracklen)
+		track->stoptime = 0;
+	}
+	break;
+    case T_STOPTIME:
+	nr = track_scan_length (new_text);
+	/* if stoptime is identical to tracklen, set stoptime to 0 if
+	 * starttime is 0 as well */
+	if ((nr == track->tracklen) &&
+	    (track->starttime == 0))
+	{
+	    nr = 0;
+	}
+	if (nr != track->stoptime)
+	{
+	    track->stoptime = nr;
+	    changed = TRUE;
+	}
+	break;
+    case T_SEASON_NR:
+        nr = atoi (new_text);
+        if ((nr >= 0) && (nr != track->season_nr))
+        {
+	    track->season_nr = nr;
+	    changed = TRUE;
+        }
+        break;
+    case T_EPISODE_NR:
+        nr = atoi (new_text);
+        if ((nr >= 0) && (nr != track->episode_nr))
+        {
+	    track->episode_nr = nr;
+	    changed = TRUE;
+        }
+        break;
+    case T_MEDIA_TYPE:
+    case T_PC_PATH:
+    case T_IPOD_PATH:
+    case T_IPOD_ID:
+    case T_TRANSFERRED:
+    case T_COMPILATION:
+    case T_REMEMBER_PLAYBACK_POSITION:
+    case T_SKIP_WHEN_SHUFFLING:
+    case T_CHECKED:
+    case T_ALL:
+    case T_GAPLESS_TRACK_FLAG:
+    case T_ITEM_NUM:
+    case T_THUMB_PATH: // TODO: this should in fact be settable
+	gtkpod_warning ("Programming error: track_set_text() called with illegal argument (item: %d)\n", item);
+	break;
+    }
+
+    return changed;
+}
+
+
+
+
+/* Fills @size with the size and @num with the number of
+   non-transferred tracks. The size is in Bytes, minus the space taken
+   by tracks that will be overwritten. */
+/* @size and @num may be NULL */
+void gp_info_nontransferred_tracks (iTunesDB *itdb,
+				    gdouble *size, guint32 *num)
+{
+    GList *gl;
+
+    if (size) *size = 0;
+    if (num)  *num = 0;
+    g_return_if_fail (itdb);
+
+    for (gl = itdb->tracks; gl; gl=gl->next)
+    {
+	Track *tr = gl->data;
+	ExtraTrackData *etr;
+	g_return_if_fail (tr);
+	etr = tr->userdata;
+	g_return_if_fail (etr);
+	if (!tr->transferred)
+	{
+	    if (size)  *size += tr->size;
+	    if (num)   *num += 1;
+	}
+    }
+}
+
+
+
+
+
+/*------------------------------------------------------------------*\
+ *                                                                  *
+ *             DND to playlists                                     *
+ *                                                                  *
+\*------------------------------------------------------------------*/
+
+/* DND: add either a GList of tracks or an ASCII list of tracks to
+ * Playlist @pl */
+static void add_tracks_to_playlist (Playlist *pl,
+				    gchar *string, GList *tracks)
+{
+    void intern_add_track (Playlist *pl, Track *track)
+	{
+	    iTunesDB *from_itdb, *to_itdb;
+	    Playlist *to_mpl;
+	    from_itdb = track->itdb;
+	    g_return_if_fail (from_itdb);
+	    to_itdb = pl->itdb;
+	    to_mpl = itdb_playlist_mpl (to_itdb);
+
+/* 	    printf ("add tr %p to pl: %p\n", track, pl); */
+	    if (from_itdb == to_itdb)
+	    {   /* DND within the same itdb */
+
+		/* set flags to 'podcast' if adding to podcast list */
+		if (itdb_playlist_is_podcasts (pl))
+		    gp_track_set_flags_podcast (track);
+#if 0 /* initially iTunes didn't add podcasts to the MPL */
+		if (!itdb_playlist_contains_track (to_mpl, track))
+		{   /* add to MPL if not already present (will happen
+		     * if dragged from the podcasts playlist */
+		    gp_playlist_add_track (to_mpl, track, TRUE);
+		}
+#endif
+		if (!itdb_playlist_is_mpl (pl))
+		{
+		    /* add to designated playlist -- unless adding
+		     * to podcasts list and track already exists there */
+		    if (itdb_playlist_is_podcasts (pl) &&
+			g_list_find (pl->members, track))
+		    {
+			gchar *buf = get_track_info (track, FALSE);
+			gtkpod_warning (_("Podcast already present: '%s'\n\n"), buf);
+			g_free (buf);
+		    }
+		    else
+		    {
+			gp_playlist_add_track (pl, track, TRUE);
+		    }
+		}
+	    }
+	    else
+	    {   /* DND between different itdbs -- need to duplicate the
+		   track before inserting */
+		Track *duptr, *addtr;
+		ExtraTrackData *eduptr;
+		/* duplicate track */
+		duptr = itdb_track_duplicate (track);
+		eduptr = duptr->userdata;
+		g_return_if_fail (eduptr);
+
+		duptr->transferred = FALSE;
+
+		/* check if adding to iPod and track is on different iPod */
+		if ((from_itdb->usertype & GP_ITDB_TYPE_IPOD) &&
+		    (to_itdb->usertype & GP_ITDB_TYPE_IPOD))
+		{
+		    /* Check if track exists locally */
+		    if (!(eduptr->pc_path_locale &&
+			  g_file_test (eduptr->pc_path_locale, G_FILE_TEST_EXISTS)))
+		    {   /* No. Use iPod path as source */
+			g_free (eduptr->pc_path_locale);
+			g_free (eduptr->pc_path_utf8);
+			eduptr->pc_path_locale = itdb_filename_on_ipod (track);
+			eduptr->pc_path_utf8 = charset_to_utf8 (eduptr->pc_path_locale);
+		    }
+		    /* Remove old reference to iPod path */
+		    g_free (duptr->ipod_path);
+		    duptr->ipod_path = g_strdup ("");
+		}
+
+		if (!eduptr->pc_path_locale)
+		{
+		    gchar *buf;
+		    buf = get_track_info (track, FALSE);
+		    gtkpod_warning (_("Could not find source file for '%s'. Track not copied."));
+		    g_free (buf);
+		    itdb_track_free (duptr);
+		    return;
+		}
+
+		if ((from_itdb->usertype & GP_ITDB_TYPE_LOCAL) &&
+		    (to_itdb->usertype & GP_ITDB_TYPE_IPOD))
+		{   /* make sure the DND origin data is set correctly */
+		    eduptr->local_itdb_id = from_itdb->id;
+		    eduptr->local_track_dbid = track->dbid;
+		}
+
+		/* add to database -- if duplicate detection is on and the
+		   same track already exists in the database, the already
+		   existing track is returned and @duptr is freed */
+		addtr = gp_track_add (to_itdb, duptr);
+
+		/* set flags to 'podcast' if adding to podcast list */
+		if (itdb_playlist_is_podcasts (pl))
+		    gp_track_set_flags_podcast (addtr);
+
+		if (addtr == duptr)
+		{   /* no duplicate */
+#if 0 /* initially iTunes didn't add podcasts to the MPL */
+		    /* we need to add to the MPL if the track is no
+		       duplicate and will not be added to the podcasts
+		       playlist */
+		    if (!itdb_playlist_is_podcasts (pl))
+		    {   /* don't add to mpl if we add to the podcasts
+			   playlist */
+			gp_playlist_add_track (to_mpl, addtr, TRUE);
+		    }
+#else
+		    /* we need to add to the MPL if the track is no
+		       duplicate */
+		    gp_playlist_add_track (to_mpl, addtr, TRUE);
+#endif
+		}
+#if 0 /* initially iTunes didn't add podcasts to the MPL */
+		else
+		{   /* duplicate */
+		    /* we also need to add to the MPL if the track is a
+		       duplicate, does not yet exist in the MPL and will
+		       not be added to a podcast list (this happens if
+		       it's already in the podcast list) */
+		    if ((!itdb_playlist_contains_track (to_mpl, addtr)) &&
+			(!itdb_playlist_is_podcasts (pl)))
+		    {
+			gp_playlist_add_track (to_mpl, addtr, TRUE);
+		    }
+		}
+#endif
+		/* add to designated playlist (if not mpl) -- unless
+		 * adding to podcasts list and track already * exists
+		 * there */
+		if (!itdb_playlist_is_mpl (pl))
+		{
+		    if (itdb_playlist_is_podcasts (pl) &&
+			g_list_find (pl->members, addtr))
+		    {
+			gchar *buf = get_track_info (addtr, FALSE);
+			gtkpod_warning (_("Podcast already present: '%s'\n\n"), buf);
+			g_free (buf);
+		    }
+		    else
+		    {
+			gp_playlist_add_track (pl, addtr, TRUE);
+		    }
+		}
+	    }
+	}
+
+
+    g_return_if_fail (!(string && tracks));
+    g_return_if_fail (pl);
+    g_return_if_fail (pl->itdb);
+    g_return_if_fail (itdb_playlist_mpl (pl->itdb));
+    if (!(string || tracks)) return;
+
+    if (string)
+    {
+	Track *track;
+	gchar *str = string;
+	while(parse_tracks_from_string(&str, &track))
+	{
+	    g_return_if_fail (track);
+	    intern_add_track (pl, track);
+	}
+    }
+    if (tracks)
+    {
+	GList *gl;
+	for (gl=tracks; gl; gl=gl->next)
+	{
+	    Track *track = gl->data;
+	    g_return_if_fail (track);
+	    intern_add_track (pl, track);
+	}
+    }
+}
+
+
+/* DND: add a glist of tracks to Playlist @pl */
+void add_trackglist_to_playlist (Playlist *pl, GList *tracks)
+{
+	add_tracks_to_playlist (pl, NULL, tracks);
+}
+
+
+/* DND: add a list of tracks to Playlist @pl */
+void add_tracklist_to_playlist (Playlist *pl, gchar *string)
+{
+    add_tracks_to_playlist (pl, string, NULL);
+}
+
+/* DND: add a list of files to Playlist @pl.
+
+   @pl: playlist to add to or NULL. If NULL, a "New Playlist" will be
+   created and inserted at position @pl_pos for adding tracks and when
+   adding a playlist file, a playlist with the name of the playlist
+   file will be added.
+
+   @pl_pos: position to add playlist file, ignored if @pl!=NULL.
+
+   @trackaddfunc: passed on to add_track_by_filename() etc. */
+
+/* Return value: playlist to where the tracks were added. Note: when
+   adding playlist files, additional playlists may have been created */
+Playlist *add_text_plain_to_playlist (iTunesDB *itdb, Playlist *pl,
+				      gchar *str, gint pl_pos,
+				      AddTrackFunc trackaddfunc,
+				      gpointer data)
+{
+    gchar **files = NULL, **filesp = NULL;
+    Playlist *pl_playlist = pl; /* playlist for playlist file */
+    Playlist *pl_playlist_created = NULL;
+
+    g_return_val_if_fail (itdb, NULL);
+
+    if (!str)  return NULL;
+
+    /*   printf("pl: %x, pl_pos: %d\n%s\n", pl, pl_pos, str);*/
+
+    block_widgets ();
+
+    files = g_strsplit (str, "\n", -1);
+    if (files)
+    {
+	filesp = files;
+	while (*filesp)
+	{
+	    gboolean added = FALSE;
+	    gint file_len = -1;
+
+	    gchar *file = NULL;
+	    gchar *decoded_file = NULL;
+
+	    file = *filesp;
+	    /* file is in uri form (the ones we're looking for are
+	       file:///), file can include the \n or \r\n, which isn't
+	       a valid character of the filename and will cause the
+	       uri decode / file test to fail, so we'll cut it off if
+	       its there. */
+	    file_len = strlen (file);
+	    if (file_len && (file[file_len-1] == '\n'))
+	    {
+		file[file_len-1] = 0;
+		--file_len;
+	    }
+	    if (file_len && (file[file_len-1] == '\r'))
+	    {
+		file[file_len-1] = 0;
+		--file_len;
+	    }
+
+	    decoded_file = filename_from_uri (file, NULL, NULL);
+	    if (decoded_file != NULL)
+	    {
+		if (g_file_test (decoded_file, G_FILE_TEST_IS_DIR))
+		{   /* directory */
+		    if (!pl)
+		    {  /* no playlist yet -- create new one */
+			pl = add_new_pl_user_name (itdb, NULL, pl_pos);
+			if (!pl)  break; /* while (*filesp) */
+		    }
+		    add_directory_by_name (itdb, decoded_file, pl,
+					   prefs_get_int("add_recursively"),
+					   trackaddfunc, data);
+		    added = TRUE;
+		}
+		if (g_file_test (decoded_file, G_FILE_TEST_IS_REGULAR))
+		{   /* regular file */
+		    FileType ftype = determine_file_type (decoded_file);
+		    switch (ftype)
+		    {
+		    case FILE_TYPE_MP3:
+		    case FILE_TYPE_M4A:
+		    case FILE_TYPE_M4P:
+		    case FILE_TYPE_M4B:
+		    case FILE_TYPE_WAV:
+		    case FILE_TYPE_M4V:
+		    case FILE_TYPE_MP4:
+		    case FILE_TYPE_MOV:
+		    case FILE_TYPE_MPG:
+                    case FILE_TYPE_OGG:
+                    case FILE_TYPE_FLAC:
+			if (!pl)
+			{  /* no playlist yet -- create new one */
+			    pl = add_new_pl_user_name (itdb, NULL,
+						       pl_pos);
+			    if (!pl)  break; /* while (*filesp) */
+			}
+			add_track_by_filename (itdb, decoded_file, pl,
+					       prefs_get_int("add_recursively"),
+					       trackaddfunc, data);
+			added = TRUE;
+			break;
+		    case FILE_TYPE_M3U:
+		    case FILE_TYPE_PLS:
+			pl_playlist_created = add_playlist_by_filename (
+			    itdb, decoded_file,
+			    pl_playlist, pl_pos, trackaddfunc, data);
+			added = TRUE;
+			break;
+		    case FILE_TYPE_UNKNOWN:
+		    case FILE_TYPE_DIRECTORY:
+		    case FILE_TYPE_IMAGE:
+			break;
+		    }
+		}
+		g_free (decoded_file);
+	    }
+	    if (!added)
+	    {
+		if (strlen (*filesp) != 0)
+		    gtkpod_warning (_("drag and drop: ignored '%s'\n"), *filesp);
+	    }
+	    ++filesp;
+	}
+	g_strfreev (files);
+    }
+    /* display log of non-updated tracks */
+    display_non_updated (NULL, NULL);
+    /* display log updated tracks */
+    display_updated (NULL, NULL);
+    /* display log of detected duplicates */
+    gp_duplicate_remove (NULL, NULL);
+
+    release_widgets ();
+
+    if (pl) return pl;
+    if (pl_playlist_created) return pl_playlist_created;
+    return NULL;
+}
+
+/*------------------------------------------------------------------*\
+ *                                                                  *
+ * Functions setting default values on tracks                       *
+ *                                                                  *
+\*------------------------------------------------------------------*/
+
+/* set podcast-specific flags for @track */
+void gp_track_set_flags_podcast (Track *track)
+{
+    g_return_if_fail (track);
+    track->skip_when_shuffling = 0x01;         /* skip when shuffling */
+    track->remember_playback_position = 0x01;  /* remember playback
+						* position */
+    track->flag4 = 0x01;  /* Show Title/Album on the 'Now Playing' page */
+}
+
+/* set podcast-specific flags for @track */
+void gp_track_set_flags_default (Track *track)
+{
+    g_return_if_fail (track);
+    track->skip_when_shuffling = 0x00;  /* do not skip when shuffling */
+    track->remember_playback_position = 0x00;  /* do not remember
+						* playback position */
+    track->flag4 = 0x00;  /* Show Title/Album/Artist on the 'Now
+			     Playing' page */
+}
+
+
+/*------------------------------------------------------------------*\
+ *                                                                  *
+ *  Generic functions to "do" things on selected playlist / entry   *
+ *  / tracks                                                         *
+ *                                                                  *
+\*------------------------------------------------------------------*/
+
+/* Make a list of all selected tracks and call @do_func with that list
+   as argument */
+void gp_do_selected_tracks (void (*do_func)(GList *tracks))
+{
+    GList *selected_tracks = NULL;
+
+    g_return_if_fail (do_func);
+
+    /* I'm using ids instead of "Track *" -pointer because it would be
+     * possible that a track gets removed during the process */
+    selected_tracks = tm_get_selected_tracks ();
+    do_func (selected_tracks);
+    g_list_free (selected_tracks);
+}
+
+
+/* Make a list of all tracks in the currently selected entry of sort
+   tab @inst and call @do_func with that list as argument */
+void gp_do_selected_entry (void (*do_func)(GList *tracks), gint inst)
+{
+    GList *selected_tracks = NULL;
+    TabEntry *entry;
+    GList *gl;
+
+    g_return_if_fail (do_func);
+
+    g_return_if_fail ((inst >= 0) && (inst <= prefs_get_int("sort_tab_num")));
+
+    entry = st_get_selected_entry (inst);
+    if (entry == NULL)
+    {  /* no entry selected */
+	gtkpod_statusbar_message (_("No entry selected."));
+	return;
+    }
+    for (gl=entry->members; gl; gl=gl->next)
+    { /* make a list with all trackids in this entry */
+	Track *track = gl->data;
+	g_return_if_fail (track);
+	selected_tracks = g_list_append (selected_tracks, track);
+    }
+    do_func (selected_tracks);
+    g_list_free (selected_tracks);
+}
+
+
+/* Make a list of the tracks in the current playlist and call @do_func
+   with that list as argument */
+void gp_do_selected_playlist (void (*do_func)(GList *tracks))
+{
+    GList *selected_tracks = NULL;
+    Playlist *pl;
+    GList *gl;
+
+    g_return_if_fail (do_func);
+
+    pl = pm_get_selected_playlist();
+    if (!pl)
+    { /* no playlist selected */
+	message_sb_no_playlist_selected ();
+	return;
+    }
+    for (gl=pl->members; gl; gl=gl->next)
+    { /* make a list with all trackids in this entry */
+	Track *track = gl->data;
+	g_return_if_fail (track);
+	selected_tracks = g_list_append (selected_tracks, track);
+    }
+    do_func (selected_tracks);
+    g_list_free (selected_tracks);
+}
+
+
+/* return some sensible input about the "track". You must free the
+ * return string after use. */
+gchar *get_track_info (Track *track, gboolean prefer_filename)
+{
+    ExtraTrackData *etr;
+
+    g_return_val_if_fail (track, NULL);
+    etr = track->userdata;
+    g_return_val_if_fail (etr, NULL);
+
+    if (prefer_filename)
+    {
+	if (etr->pc_path_utf8 && strlen(etr->pc_path_utf8))
+	    return g_path_get_basename (etr->pc_path_utf8);
+    }
+    if ((track->title && strlen(track->title)))
+	return g_strdup (track->title);
+    if ((track->album && strlen(track->album)))
+	return g_strdup (track->album);
+    if ((track->artist && strlen(track->artist)))
+	return g_strdup (track->artist);
+    if ((track->composer && strlen(track->composer)))
+	return g_strdup (track->composer);
+    if (!prefer_filename)
+    {
+	if (etr->pc_path_utf8 && strlen(etr->pc_path_utf8))
+	    return g_path_get_basename (etr->pc_path_utf8);
+    }
+
+    return g_strdup_printf ("iPod ID: %d", track->id);
+}

Added: trunk/src/misc_track.h
===================================================================
--- trunk/src/misc_track.h	                        (rev 0)
+++ trunk/src/misc_track.h	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,78 @@
+/*
+|  Copyright (C) 2002-2007 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: misc_track.h 1055 2007-04-27 15:19:54Z jcsjcs $
+*/
+
+#ifndef __MISC_TRACK_H__
+#define __MISC_TRACK_H__
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "display.h"
+
+void gp_duplicate_remove (Track *oldtrack, Track *track);
+void gp_sha1_hash_tracks_itdb (iTunesDB *itdb);
+void gp_sha1_hash_tracks (void);
+void gp_sha1_free_hash (void);
+Track *gp_track_by_filename (iTunesDB *itdb, gchar *filename);
+
+void gp_itdb_pc_path_hash_init (ExtraiTunesDBData *eitdb);
+void gp_itdb_pc_path_hash_destroy (ExtraiTunesDBData *eitdb);
+void gp_itdb_pc_path_hash_add_track (Track *track);
+void gp_itdb_pc_path_hash_remove_track (Track *track);
+GList *gp_itdb_pc_path_hash_find_tracks (iTunesDB *itdb, const gchar *filename);
+GList *gp_itdb_find_same_tracks (iTunesDB *itdb, Track *track);
+GList *gp_itdb_find_same_tracks_in_itdbs (Track *track);
+GList *gp_itdb_find_same_tracks_in_local_itdbs (Track *track);
+
+gchar **track_get_item_pointer (Track *track, T_item t_item);
+const gchar *track_get_item (Track *track, T_item t_item);
+time_t *track_get_timestamp_ptr (Track *track, T_item t_item);
+time_t track_get_timestamp (Track *track, T_item t_item);
+gchar *track_get_text (Track *track, T_item item);
+gboolean track_set_text (Track *track,
+			 const gchar *new_text, T_item item);
+gboolean track_copy_item (Track *frtrack, Track *totrack, T_item item);
+void gp_info_nontransferred_tracks (iTunesDB *itdb,
+				    gdouble *size, guint32 *num);
+
+void add_tracklist_to_playlist (Playlist *pl, gchar *str);
+void add_trackglist_to_playlist (Playlist *pl, GList *tracks);
+Playlist *add_text_plain_to_playlist (iTunesDB *itdb, Playlist *pl,
+				      gchar *str, gint position,
+				      AddTrackFunc trackaddfunc,
+				      gpointer data);
+void gp_do_selected_tracks (void (*do_func)(GList *tracks));
+void gp_do_selected_entry (void (*do_func)(GList *tracks), gint inst);
+void gp_do_selected_playlist (void (*do_func)(GList *tracks));
+
+void gp_track_set_flags_podcast (Track *track);
+void gp_track_set_flags_default (Track *track);
+
+gchar *get_track_info (Track *track, gboolean prefer_filename);
+#endif

Added: trunk/src/mp3file.c
===================================================================
--- trunk/src/mp3file.c	                        (rev 0)
+++ trunk/src/mp3file.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,2776 @@
+/* Time-stamp: <2007-12-11 21:31:57 jcs>
+|
+|  Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: mp3file.c 1813 2007-12-11 12:34:20Z jcsjcs $
+*/
+
+
+#define LOCALDEBUG 0
+
+
+/* The code in the first section of this file is taken from the
+ * mp3info (http://www.ibiblio.org/mp3info/) project. Only the code
+ * needed for the playlength calculation has been extracted. */
+
+/* The code in the second section of this file is taken from the
+ * mpg123 code used in xmms-1.2.7 (Input/mpg123). Only the code needed
+ * for the playlength calculation has been extracted. */
+
+/* The code in the third section of this file is taken from the
+ * crc code used in libmad (crc.h). */
+
+/* The code in the last section of this file is original gtkpod
+ * code. */
+
+/****************
+ * Declarations *
+ ****************/
+
+#include <glib.h>
+#include <math.h>
+/*
+ * Description of each item of the TagList list
+ */
+typedef struct _File_Tag File_Tag;
+typedef struct _GainData GainData;
+typedef struct _GaplessData GaplessData;
+typedef struct _LameTag LameTag;
+
+struct _File_Tag
+{
+    gchar *title;          /* Title of track */
+    gchar *artist;         /* Artist name */
+    gchar *album;          /* Album name */
+    gchar *year;           /* Year of track */
+    gchar *trackstring;    /* Position of track in the album */
+    gchar *track_total;    /* The number of tracks for the album (ex: 12/20) */
+    gchar *genre;          /* Genre of song */
+    gchar *comment;        /* Comment */
+    gchar *composer;	   /* Composer */
+    guint32 songlen;       /* Length of file in ms */
+    gchar *cdnostring;    /* Position of disc in the album */
+    gchar *cdno_total;    /* The number of discs in the album (ex: 1/2) */
+    gchar *compilation;   /* The track is a member of a compilation */
+    gchar *podcasturl;    /* The following are mainly used for podcasts */
+    gchar *sort_artist;
+    gchar *sort_title;
+    gchar *sort_album;
+    gchar *sort_albumartist;
+    gchar *sort_composer;
+    gchar *description;
+    gchar *podcastrss;
+    gchar *time_released;
+    gchar *subtitle;
+    gchar *BPM;           /* beats per minute */
+    gchar *lyrics;        /* does not appear to be the full lyrics --
+			     only used to set the flag 'lyrics_flag'
+			     of the Track structure */
+};
+
+
+struct _GainData
+{
+  guint32 peak_signal;	  /* LAME Peak Signal * 0x800000             */
+  gdouble radio_gain;	  /* RadioGain in dB
+			     (as defined by www.replaygain.org)      */
+  gdouble audiophile_gain;/* AudiophileGain in dB 
+			     (as defined by www.replaygain.org)      */
+  gboolean peak_signal_set;    /* has the peak signal been set?      */
+  gboolean radio_gain_set;     /* has the radio gain been set?       */
+  gboolean audiophile_gain_set;/* has the audiophile gain been set?  */
+};
+
+struct _GaplessData
+{
+    guint32 pregap;       /* number of pregap samples */
+    guint64 samplecount;  /* number of actual music samples */
+    guint32 postgap;      /* number of postgap samples */
+    guint32 gapless_data; /* number of bytes from the first sync frame to the 8th to last frame */
+};
+
+#define LAME_TAG_SIZE 0x24
+#define INFO_TAG_CRC_SIZE 0xBE	/* number of bytes to pass to crc_compute */
+
+/* A structure to hold the various data found in a LAME info tag.
+ * Please see http://gabriel.mp3-tech.org/mp3infotag.html for full
+ * documentation.
+ */
+struct _LameTag
+{
+    gchar encoder[4];
+    gchar version_string[5];
+    guint8 info_tag_revision;
+    guint8 vbr_method;
+    guint8 lowpass;
+    float peak_signal_amplitude;
+    guint16 radio_replay_gain;
+    guint16 audiophile_replay_gain;
+    guint8 encoding_flags;
+    guint8 ath_type;
+    guint8 bitrate;
+    guint16 delay;
+    guint16 padding;
+    guint8 noise_shaping;
+    guint8 stereo_mode;
+    gboolean unwise_settings;
+    guint8 source_sample_frequency;
+    guint8 mp3_gain;
+    guint8 surround_info;
+    guint16 preset;
+    guint32 music_length;
+    guint16 music_crc;
+    guint16 info_tag_crc;
+    guint16 calculated_info_tag_crc;
+};
+
+/* This code is taken from the mp3info code. Only the code needed for
+ * the playlength calculation has been extracted */
+
+/*
+    mp3tech.c - Functions for handling MP3 files and most MP3 data
+		structure manipulation.
+
+    Copyright (C) 2000-2001  Cedric Tefft <cedric at earthling.net>
+
+    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., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+  ***************************************************************************
+
+  This file is based in part on:
+
+	* MP3Info 0.5 by Ricardo Cerqueira <rmc at rccn.net>
+	* MP3Stat 0.9 by Ed Sweetman <safemode at voicenet.com> and
+			 Johannes Overmann <overmann at iname.com>
+
+*/
+
+#include <ctype.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include "mp3file.h"
+#include "charset.h"
+#include "itdb.h"
+#include "file.h"
+#include "misc.h"
+
+
+/* MIN_CONSEC_GOOD_FRAMES defines how many consecutive valid MP3 frames
+   we need to see before we decide we are looking at a real MP3 file */
+#define MIN_CONSEC_GOOD_FRAMES 4
+#define FRAME_HEADER_SIZE 4
+#define MIN_FRAME_SIZE 21
+
+enum VBR_REPORT { VBR_VARIABLE, VBR_AVERAGE, VBR_MEDIAN };
+
+typedef struct {
+    gulong sync;
+    guint  version;
+    guint  layer;
+    guint  crc;
+    guint  bitrate;
+    guint  freq;
+    guint  padding;
+    guint  extension;
+    guint  mode;
+    guint  mode_extension;
+    guint  copyright;
+    guint  original;
+    guint  emphasis;
+} MP3Header;
+
+typedef struct {
+    gchar *filename;
+    FILE *file;
+    off_t datasize;
+    gint header_isvalid;
+    MP3Header header;
+    gint id3_isvalid;
+    gint vbr;
+    float vbr_average;
+    gint milliseconds;
+    gint frames;
+    gint badframes;
+} MP3Info;
+
+/* This is for xmms code */
+static guint get_track_time(gchar *path);
+
+
+/* This is for soundcheck code */
+gboolean mp3_read_lame_tag (gchar *path, LameTag *lt);
+
+/* ------------------------------------------------------------
+
+   start of first section
+
+   ------------------------------------------------------------ */
+void get_mp3_info(MP3Info *mp3);
+
+gint frequencies[3][4] = {
+   {22050,24000,16000,50000},  /* MPEG 2.0 */
+   {44100,48000,32000,50000},  /* MPEG 1.0 */
+   {11025,12000,8000,50000}    /* MPEG 2.5 */
+};
+
+/* "0" added by JCS */
+gint bitrate[2][3][16] = {
+  { /* MPEG 2.0 */
+    {0,32,48,56,64,80,96,112,128,144,160,176,192,224,256,0},/* layer 1 */
+    {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,0},     /* layer 2 */
+    {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,0}      /* layer 3 */
+  },
+
+  { /* MPEG 1.0 */
+    {0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,0},/* layer 1 */
+    {0,32,48,56,64,80,96,112,128,160,192,224,256,320,384,0},   /* layer 2 */
+    {0,32,40,48,56,64,80,96,112,128,160,192,224,256,320,0}     /* layer 3 */
+  }
+};
+
+gint frame_size_index[] = {24000, 72000, 72000};
+
+
+gchar *mode_text[] = {
+   "stereo", "joint stereo", "dual channel", "mono"
+};
+
+gchar *emphasis_text[] = {
+  "none", "50/15 microsecs", "reserved", "CCITT J 17"
+};
+
+
+static gint mp3file_header_bitrate(MP3Header *h) {
+    return bitrate[h->version & 1][3-h->layer][h->bitrate];
+}
+
+
+static gint mp3file_header_frequency(MP3Header *h) {
+    return frequencies[h->version][h->freq];
+}
+
+
+gint frame_length(MP3Header *header) {
+	return header->sync == 0xFFE ?
+		    (frame_size_index[3-header->layer]*((header->version&1)+1)*
+		    mp3file_header_bitrate(header)/(float)mp3file_header_frequency(header))+
+		    header->padding : 1;
+}
+
+/* Get next MP3 frame header.
+   Return codes:
+   positive value = Frame Length of this header
+   0 = No, we did not retrieve a valid frame header
+*/
+gint get_header(FILE *file,MP3Header *header)
+{
+    guchar buffer[FRAME_HEADER_SIZE];
+    gint fl;
+
+    if(fread(&buffer,FRAME_HEADER_SIZE,1,file)<1) {
+	header->sync=0;
+	return 0;
+    }
+    header->sync=(((gint)buffer[0]<<4) | ((gint)(buffer[1]&0xE0)>>4));
+    if(buffer[1] & 0x10) header->version=(buffer[1] >> 3) & 1;
+		    else header->version=2;
+    header->layer=(buffer[1] >> 1) & 3;
+    if (header->layer == 0)
+    {
+	header->layer = 1; /* sanity added by JCS */
+    }
+    if((header->sync != 0xFFE) || (header->layer != 1)) {
+	header->sync=0;
+	return 0;
+    }
+    header->crc=buffer[1] & 1;
+    header->bitrate=(buffer[2] >> 4) & 0x0F;
+    header->freq=(buffer[2] >> 2) & 0x3;
+    header->padding=(buffer[2] >>1) & 0x1;
+    header->extension=(buffer[2]) & 0x1;
+    header->mode=(buffer[3] >> 6) & 0x3;
+    header->mode_extension=(buffer[3] >> 4) & 0x3;
+    header->copyright=(buffer[3] >> 3) & 0x1;
+    header->original=(buffer[3] >> 2) & 0x1;
+    header->emphasis=(buffer[3]) & 0x3;
+
+    return ((fl=frame_length(header)) >= MIN_FRAME_SIZE ? fl : 0);
+}
+
+gint sameConstant(MP3Header *h1, MP3Header *h2) {
+    if((*(guint*)h1) == (*(guint*)h2)) return 1;
+
+    if((h1->version       == h2->version         ) &&
+       (h1->layer         == h2->layer           ) &&
+       (h1->crc           == h2->crc             ) &&
+       (h1->freq          == h2->freq            ) &&
+       (h1->mode          == h2->mode            ) &&
+       (h1->copyright     == h2->copyright       ) &&
+       (h1->original      == h2->original        ) &&
+       (h1->emphasis      == h2->emphasis        ))
+		return 1;
+    else return 0;
+}
+
+
+gint get_first_header(MP3Info *mp3, long startpos)
+{
+  gint k, l=0,c;
+  MP3Header h, h2;
+  long valid_start=0;
+
+  fseek(mp3->file,startpos,SEEK_SET);
+  while (1) {
+     while((c=fgetc(mp3->file)) != 255 && (c != EOF));
+     if(c == 255) {
+	ungetc(c,mp3->file);
+	valid_start=ftell(mp3->file);
+	if((l=get_header(mp3->file,&h))) {
+	  fseek(mp3->file,l-FRAME_HEADER_SIZE,SEEK_CUR);
+	  for(k=1; (k < MIN_CONSEC_GOOD_FRAMES) && (mp3->datasize-ftell(mp3->file) >= FRAME_HEADER_SIZE); k++) {
+	    if(!(l=get_header(mp3->file,&h2))) break;
+	    if(!sameConstant(&h,&h2)) break;
+	    fseek(mp3->file,l-FRAME_HEADER_SIZE,SEEK_CUR);
+	  }
+	  if(k == MIN_CONSEC_GOOD_FRAMES) {
+		fseek(mp3->file,valid_start,SEEK_SET);
+		memcpy(&(mp3->header),&h2,sizeof(MP3Header));
+		mp3->header_isvalid=1;
+		return 1;
+	  }
+	}
+     } else {
+	return 0;
+     }
+   }
+
+  return 0;
+}
+
+
+/* get_next_header() - read header at current position or look for
+   the next valid header if there isn't one at the current position
+*/
+gint get_next_header(MP3Info *mp3)
+{
+  gint l=0,c,skip_bytes=0;
+  MP3Header h;
+
+   while(1) {
+     while((c=fgetc(mp3->file)) != 255 && (ftell(mp3->file) < mp3->datasize)) skip_bytes++;
+     if(c == 255) {
+	ungetc(c,mp3->file);
+	if((l=get_header(mp3->file,&h))) {
+	  if(skip_bytes) mp3->badframes++;
+	  fseek(mp3->file,l-FRAME_HEADER_SIZE,SEEK_CUR);
+	  return 15-h.bitrate;
+	} else {
+		skip_bytes += FRAME_HEADER_SIZE;
+	}
+     } else {
+	  if(skip_bytes) mp3->badframes++;
+	  return 0;
+     }
+  }
+}
+
+
+void get_mp3_info(MP3Info *mp3)
+{
+  gint frame_type[15]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+  double milliseconds=0,total_rate=0;
+  gint frames=0,frame_types=0,frames_so_far=0;
+  gint vbr_median=-1;
+  guint bitrate;
+  gint counter=0;
+  MP3Header header;
+  struct stat filestat;
+  off_t data_start=0;
+
+
+  stat(mp3->filename,&filestat);
+  mp3->datasize=filestat.st_size;
+
+  if(get_first_header(mp3,0L)) {
+      data_start=ftell(mp3->file);
+      while((bitrate=get_next_header(mp3))) {
+	  if (bitrate < 15)  /* sanity added by JCS */
+	      frame_type[15-bitrate]++;
+	  frames++;
+      }
+      memcpy(&header,&(mp3->header),sizeof(MP3Header));
+      for(counter=0;counter<15;counter++) {
+	  if(frame_type[counter]) {
+	      float header_bitrate; /* introduced by JCS to speed up */
+	      frame_types++;
+	      header.bitrate=counter;
+	      frames_so_far += frame_type[counter];
+	      header_bitrate = mp3file_header_bitrate(&header);
+	      if (header_bitrate != 0)
+                 milliseconds += 8*(double)frame_length(&header)*(double)frame_type[counter]/header_bitrate;
+	      total_rate += header_bitrate*frame_type[counter];
+	      if((vbr_median == -1) && (frames_so_far >= frames/2))
+		  vbr_median=counter;
+	  }
+      }
+      mp3->milliseconds=(gint)(milliseconds+0.5);
+      mp3->header.bitrate=vbr_median;
+      mp3->vbr_average=total_rate/(float)frames;
+      mp3->frames=frames;
+      if(frame_types > 1) {
+	  mp3->vbr=1;
+      }
+  }
+}
+
+
+
+
+/* ------------------------------------------------------------
+
+	 xmms code
+
+
+   ------------------------------------------------------------ */
+
+/*
+|  Changed by Jorg Schuler <jcsjcs at users.sourceforge.net> to
+|  compile with the gtkpod project. 2003/04/01
+*/
+
+/* This code is taken from the mpg123 code used in xmms-1.2.7
+ * (Input/mpg123). Only the code needed for the playlength calculation
+ * has been extracted */
+
+#include "mp3file.h"
+#include <stdio.h>
+#include <string.h>
+
+#define FRAMES_FLAG     0x0001
+#define BYTES_FLAG      0x0002
+#define TOC_FLAG        0x0004
+#define VBR_SCALE_FLAG  0x0008
+
+#define         SBLIMIT                 32
+#define         SCALE_BLOCK             12
+#define         SSLIMIT                 18
+
+#define         MPG_MD_STEREO           0
+#define         MPG_MD_JOINT_STEREO     1
+#define         MPG_MD_DUAL_CHANNEL     2
+#define         MPG_MD_MONO             3
+#define MAXFRAMESIZE 1792
+#define real float
+
+struct bitstream_info
+{
+	int bitindex;
+	unsigned char *wordpointer;
+};
+
+struct bitstream_info bsi;
+
+real mpg123_muls[27][64];	/* also used by layer 1 */
+
+int tabsel_123[2][3][16] =
+{
+	{
+    {0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448,},
+       {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384,},
+       {0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320,}},
+
+	{
+       {0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256,},
+	    {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160,},
+	    {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160,}}
+};
+
+long mpg123_freqs[9] =
+{44100, 48000, 32000, 22050, 24000, 16000, 11025, 12000, 8000};
+
+/*
+ * structure to receive extracted header
+ */
+typedef struct
+{
+	int frames;		/* total bit stream frames from Xing header data */
+	int bytes;		/* total bit stream bytes from Xing header data */
+	unsigned char toc[100];	/* "table of contents" */
+} xing_header_t;
+
+struct al_table
+{
+	short bits;
+	short d;
+};
+
+struct frame
+{
+	struct al_table *alloc;
+	int (*synth) (real *, int, unsigned char *, int *);
+	int (*synth_mono) (real *, unsigned char *, int *);
+#ifdef USE_3DNOW
+	void (*dct36)(real *,real *,real *,real *,real *);
+#endif
+	int stereo;
+	int jsbound;
+	int single;
+	int II_sblimit;
+	int down_sample_sblimit;
+	int lsf;
+	int mpeg25;
+	int down_sample;
+	int header_change;
+	int lay;
+	int (*do_layer) (struct frame * fr);
+	int error_protection;
+	int bitrate_index;
+	int sampling_frequency;
+	int padding;
+	int extension;
+	int mode;
+	int mode_ext;
+	int copyright;
+	int original;
+	int emphasis;
+	int framesize;		/* computed framesize */
+};
+
+static guint32 convert_to_header(guint8 * buf)
+{
+
+	return (buf[0] << 24) + (buf[1] << 16) + (buf[2] << 8) + buf[3];
+}
+
+static int mpg123_head_check(unsigned long head)
+{
+	if ((head & 0xffe00000) != 0xffe00000)
+		return FALSE;
+	if (!((head >> 17) & 3))
+		return FALSE;
+	if (((head >> 12) & 0xf) == 0xf)
+		return FALSE;
+	if (!((head >> 12) & 0xf))
+		return FALSE;
+	if (((head >> 10) & 0x3) == 0x3)
+		return FALSE;
+	if (((head >> 19) & 1) == 1 && ((head >> 17) & 3) == 3 && ((head >> 16) & 1) == 1)
+		return FALSE;
+	if ((head & 0xffff0000) == 0xfffe0000)
+		return FALSE;
+
+	return TRUE;
+}
+
+
+/*
+ * the code a header and write the information
+ * into the frame structure
+ */
+static int mpg123_decode_header(struct frame *fr, unsigned long newhead)
+{
+    int ssize;
+
+	if (newhead & (1 << 20))
+	{
+		fr->lsf = (newhead & (1 << 19)) ? 0x0 : 0x1;
+		fr->mpeg25 = 0;
+	}
+	else
+	{
+		fr->lsf = 1;
+		fr->mpeg25 = 1;
+	}
+	fr->lay = 4 - ((newhead >> 17) & 3);
+	if (fr->mpeg25)
+	{
+		fr->sampling_frequency = 6 + ((newhead >> 10) & 0x3);
+	}
+	else
+		fr->sampling_frequency = ((newhead >> 10) & 0x3) + (fr->lsf * 3);
+	fr->error_protection = ((newhead >> 16) & 0x1) ^ 0x1;
+
+	fr->bitrate_index = ((newhead >> 12) & 0xf);
+	fr->padding = ((newhead >> 9) & 0x1);
+	fr->extension = ((newhead >> 8) & 0x1);
+	fr->mode = ((newhead >> 6) & 0x3);
+	fr->mode_ext = ((newhead >> 4) & 0x3);
+	fr->copyright = ((newhead >> 3) & 0x1);
+	fr->original = ((newhead >> 2) & 0x1);
+	fr->emphasis = newhead & 0x3;
+
+	fr->stereo = (fr->mode == MPG_MD_MONO) ? 1 : 2;
+
+	ssize = 0;
+
+	if (!fr->bitrate_index)
+		return (0);
+
+	switch (fr->lay)
+	{
+		case 1:
+/*			fr->do_layer = mpg123_do_layer1; */
+/*			mpg123_init_layer2();	/\* inits also shared tables with layer1 *\/ */
+			fr->framesize = (long) tabsel_123[fr->lsf][0][fr->bitrate_index] * 12000;
+			fr->framesize /= mpg123_freqs[fr->sampling_frequency];
+			fr->framesize = ((fr->framesize + fr->padding) << 2) - 4;
+			break;
+		case 2:
+/*			fr->do_layer = mpg123_do_layer2; */
+/*			mpg123_init_layer2();	/\* inits also shared tables with layer1 *\/ */
+			fr->framesize = (long) tabsel_123[fr->lsf][1][fr->bitrate_index] * 144000;
+			fr->framesize /= mpg123_freqs[fr->sampling_frequency];
+			fr->framesize += fr->padding - 4;
+			break;
+		case 3:
+/*			fr->do_layer = mpg123_do_layer3; */
+			if (fr->lsf)
+				ssize = (fr->stereo == 1) ? 9 : 17;
+			else
+				ssize = (fr->stereo == 1) ? 17 : 32;
+			if (fr->error_protection)
+				ssize += 2;
+			fr->framesize = (long) tabsel_123[fr->lsf][2][fr->bitrate_index] * 144000;
+			fr->framesize /= mpg123_freqs[fr->sampling_frequency] << (fr->lsf);
+			fr->framesize = fr->framesize + fr->padding - 4;
+			break;
+		default:
+			return (0);
+	}
+	if(fr->framesize > MAXFRAMESIZE)
+		return 0;
+	return 1;
+}
+
+#define GET_INT32BE(b) \
+(i = (b[0] << 24) | (b[1] << 16) | b[2] << 8 | b[3], b += 4, i)
+
+static int mpg123_get_xing_header(xing_header_t * xing, unsigned char *buf)
+{
+	int i, head_flags;
+	int id, mode;
+
+	memset(xing, 0, sizeof(xing_header_t));
+
+	/* get selected MPEG header data */
+	id = (buf[1] >> 3) & 1;
+	mode = (buf[3] >> 6) & 3;
+	buf += 4;
+
+	/* Skip the sub band data */
+	if (id)
+	{
+		/* mpeg1 */
+		if (mode != 3)
+			buf += 32;
+		else
+			buf += 17;
+	}
+	else
+	{
+		/* mpeg2 */
+		if (mode != 3)
+			buf += 17;
+		else
+			buf += 9;
+	}
+
+	if (strncmp(buf, "Xing", 4))
+		return 0;
+	buf += 4;
+
+	head_flags = GET_INT32BE(buf);
+
+	if (head_flags & FRAMES_FLAG)
+		xing->frames = GET_INT32BE(buf);
+	if (xing->frames < 1)
+		xing->frames = 1;
+	if (head_flags & BYTES_FLAG)
+		xing->bytes = GET_INT32BE(buf);
+
+	if (head_flags & TOC_FLAG)
+	{
+		for (i = 0; i < 100; i++)
+			xing->toc[i] = buf[i];
+		buf += 100;
+	}
+
+#ifdef XING_DEBUG
+	for (i = 0; i < 100; i++)
+	{
+		if ((i % 10) == 0)
+			fprintf(stderr, "\n");
+		fprintf(stderr, " %3d", xing->toc[i]);
+	}
+#endif
+
+	return 1;
+}
+
+static double mpg123_compute_tpf(struct frame *fr)
+{
+	const int bs[4] = {0, 384, 1152, 1152};
+	double tpf;
+
+	tpf = bs[fr->lay];
+	tpf /= mpg123_freqs[fr->sampling_frequency] << (fr->lsf);
+	return tpf;
+}
+
+static double mpg123_compute_bpf(struct frame *fr)
+{
+	double bpf;
+
+	switch (fr->lay)
+	{
+		case 1:
+			bpf = tabsel_123[fr->lsf][0][fr->bitrate_index];
+			bpf *= 12000.0 * 4.0;
+			bpf /= mpg123_freqs[fr->sampling_frequency] << (fr->lsf);
+			break;
+		case 2:
+		case 3:
+			bpf = tabsel_123[fr->lsf][fr->lay - 1][fr->bitrate_index];
+			bpf *= 144000;
+			bpf /= mpg123_freqs[fr->sampling_frequency] << (fr->lsf);
+			break;
+		default:
+			bpf = 1.0;
+	}
+
+	return bpf;
+}
+
+
+unsigned int mpg123_getbits(int number_of_bits)
+{
+	unsigned long rval;
+
+#ifdef DEBUG_GETBITS
+	fprintf(stderr, "g%d", number_of_bits);
+#endif
+
+	if(!number_of_bits)
+		return 0;
+
+#if 0
+	check_buffer_range(number_of_bits + bsi.bitindex);
+#endif
+
+	{
+		rval = bsi.wordpointer[0];
+		rval <<= 8;
+		rval |= bsi.wordpointer[1];
+		rval <<= 8;
+		rval |= bsi.wordpointer[2];
+
+		rval <<= bsi.bitindex;
+		rval &= 0xffffff;
+
+		bsi.bitindex += number_of_bits;
+
+		rval >>= (24-number_of_bits);
+
+		bsi.wordpointer += (bsi.bitindex >> 3);
+		bsi.bitindex &= 7;
+	}
+
+#ifdef DEBUG_GETBITS
+	fprintf(stderr,":%x ",rval);
+#endif
+
+	return rval;
+}
+
+
+void I_step_one(unsigned int balloc[], unsigned int scale_index[2][SBLIMIT], struct frame *fr)
+{
+	unsigned int *ba = balloc;
+	unsigned int *sca = (unsigned int *) scale_index;
+
+	if (fr->stereo)
+	{
+		int i;
+		int jsbound = fr->jsbound;
+
+		for (i = 0; i < jsbound; i++)
+		{
+			*ba++ = mpg123_getbits(4);
+			*ba++ = mpg123_getbits(4);
+		}
+		for (i = jsbound; i < SBLIMIT; i++)
+			*ba++ = mpg123_getbits(4);
+
+		ba = balloc;
+
+		for (i = 0; i < jsbound; i++)
+		{
+			if ((*ba++))
+				*sca++ = mpg123_getbits(6);
+			if ((*ba++))
+				*sca++ = mpg123_getbits(6);
+		}
+		for (i = jsbound; i < SBLIMIT; i++)
+			if ((*ba++))
+			{
+				*sca++ = mpg123_getbits(6);
+				*sca++ = mpg123_getbits(6);
+			}
+	}
+	else
+	{
+		int i;
+
+		for (i = 0; i < SBLIMIT; i++)
+			*ba++ = mpg123_getbits(4);
+		ba = balloc;
+		for (i = 0; i < SBLIMIT; i++)
+			if ((*ba++))
+				*sca++ = mpg123_getbits(6);
+	}
+}
+
+void I_step_two(real fraction[2][SBLIMIT], unsigned int balloc[2 * SBLIMIT],
+		unsigned int scale_index[2][SBLIMIT], struct frame *fr)
+{
+	int i, n;
+	int smpb[2 * SBLIMIT];	/* values: 0-65535 */
+	int *sample;
+	register unsigned int *ba;
+	register unsigned int *sca = (unsigned int *) scale_index;
+
+	if (fr->stereo)
+	{
+		int jsbound = fr->jsbound;
+		register real *f0 = fraction[0];
+		register real *f1 = fraction[1];
+
+		ba = balloc;
+		for (sample = smpb, i = 0; i < jsbound; i++)
+		{
+			if ((n = *ba++))
+				*sample++ = mpg123_getbits(n + 1);
+			if ((n = *ba++))
+				*sample++ = mpg123_getbits(n + 1);
+		}
+		for (i = jsbound; i < SBLIMIT; i++)
+			if ((n = *ba++))
+				*sample++ = mpg123_getbits(n + 1);
+
+		ba = balloc;
+		for (sample = smpb, i = 0; i < jsbound; i++)
+		{
+			if ((n = *ba++))
+				*f0++ = (real) (((-1) << n) + (*sample++) + 1) * mpg123_muls[n + 1][*sca++];
+			else
+				*f0++ = 0.0;
+			if ((n = *ba++))
+				*f1++ = (real) (((-1) << n) + (*sample++) + 1) * mpg123_muls[n + 1][*sca++];
+			else
+				*f1++ = 0.0;
+		}
+		for (i = jsbound; i < SBLIMIT; i++)
+		{
+			if ((n = *ba++))
+			{
+				real samp = (((-1) << n) + (*sample++) + 1);
+
+				*f0++ = samp * mpg123_muls[n + 1][*sca++];
+				*f1++ = samp * mpg123_muls[n + 1][*sca++];
+			}
+			else
+				*f0++ = *f1++ = 0.0;
+		}
+		for (i = fr->down_sample_sblimit; i < 32; i++)
+			fraction[0][i] = fraction[1][i] = 0.0;
+	}
+	else
+	{
+		register real *f0 = fraction[0];
+
+		ba = balloc;
+		for (sample = smpb, i = 0; i < SBLIMIT; i++)
+			if ((n = *ba++))
+				*sample++ = mpg123_getbits(n + 1);
+		ba = balloc;
+		for (sample = smpb, i = 0; i < SBLIMIT; i++)
+		{
+			if ((n = *ba++))
+				*f0++ = (real) (((-1) << n) + (*sample++) + 1) * mpg123_muls[n + 1][*sca++];
+			else
+				*f0++ = 0.0;
+		}
+		for (i = fr->down_sample_sblimit; i < 32; i++)
+			fraction[0][i] = 0.0;
+	}
+}
+
+static guint get_track_time_file(FILE * file)
+{
+	guint32 head;
+	guchar tmp[4], *buf;
+	struct frame frm;
+	xing_header_t xing_header;
+	double tpf, bpf;
+	guint32 len;
+
+	if (!file)
+		return -1;
+
+	fseek(file, 0, SEEK_SET);
+	if (fread(tmp, 1, 4, file) != 4)
+		return 0;
+	head = convert_to_header(tmp);
+	while (!mpg123_head_check(head))
+	{
+		head <<= 8;
+		if (fread(tmp, 1, 1, file) != 1)
+			return 0;
+		head |= tmp[0];
+	}
+	if (mpg123_decode_header(&frm, head))
+	{
+		buf = g_malloc(frm.framesize + 4);
+		fseek(file, -4, SEEK_CUR);
+		fread(buf, 1, frm.framesize + 4, file);
+		tpf = mpg123_compute_tpf(&frm);
+		if (mpg123_get_xing_header(&xing_header, buf))
+		{
+			g_free(buf);
+			return ((guint) (tpf * xing_header.frames * 1000));
+		}
+		g_free(buf);
+		bpf = mpg123_compute_bpf(&frm);
+		fseek(file, 0, SEEK_END);
+		len = ftell(file);
+		fseek(file, -128, SEEK_END);
+		fread(tmp, 1, 3, file);
+		if (!strncmp(tmp, "TAG", 3))
+			len -= 128;
+		return ((guint) ((guint)(len / bpf) * tpf * 1000));
+	}
+	return 0;
+}
+
+static guint get_track_time (gchar *path)
+{
+    guint result = 0;
+
+    if (path)
+    {
+	FILE *file = fopen (path, "r");
+	result = get_track_time_file (file);
+	if (file) fclose (file);
+    }
+    return result;
+}
+
+
+/* libid3tag stuff */
+
+#include <id3tag.h>
+#include "prefs.h"
+
+#ifndef ID3_FRAME_GROUP
+#define ID3_FRAME_GROUP "TPE2"
+#endif
+
+
+
+static const gchar* id3_get_binary (struct id3_tag *tag,
+				    char *frame_name,
+				    id3_length_t *len,
+				    int index)
+{
+    const id3_byte_t *binary = NULL;
+    struct id3_frame *frame;
+    union id3_field *field;
+
+    g_return_val_if_fail (len, NULL);
+
+    *len = 0;
+
+    frame = id3_tag_findframe (tag, frame_name, index);
+#if LOCALDEBUG
+    printf ("frame: %p\n", frame); 
+#endif
+
+    if (!frame) return NULL;
+
+#if LOCALDEBUG
+    printf (" nfields: %d\n", frame->nfields);
+    if (strncmp (frame_name, "APIC",  4) == 0)
+    {
+	field = id3_frame_field (frame, 2);
+	printf (" picture type: %ld\n", field->number.value);
+    }
+#endif
+
+
+#if 0
+/*-----------------*/
+/* just to show that this field (before last) contains the d8 ff e0 ff
+   part of the start of a jpeg file when the coverart war embedded by iTunes */
+
+    const id3_ucs4_t *string = NULL;
+    gchar *raw = NULL;
+
+    /* The last field contains the data */
+    field = id3_frame_field (frame, frame->nfields-2);
+
+#if LOCALDEBUG
+     printf (" field: %p\n", field);
+#endif
+
+    if (!field) return NULL;
+
+#if LOCALDEBUG
+     printf (" type: %d\n", field->type);
+#endif
+
+    switch (field->type)
+    {
+    case ID3_FIELD_TYPE_STRING:
+	string = id3_field_getstring (field);
+	break;
+    default:
+	break;
+    }
+  
+    /* ISO_8859_1 is just a "marker" -- most people just drop
+       whatever coding system they are using into it, so we use
+       charset_to_utf8() to convert to utf8 */
+
+    if (string)
+    {
+	raw = id3_ucs4_latin1duplicate (string);
+    }
+
+
+#if LOCALDEBUG
+    {
+	FILE *file;
+	printf (" string len: %d\n", raw?strlen(raw):0);
+	file = fopen ("/tmp/folder1.jpg", "w");
+	fwrite (raw, 1, raw?strlen(raw):0, file);
+	fclose (file);
+    }
+#endif
+    g_free (raw);
+
+/*-----------------*/
+#endif
+
+    /* The last field contains the data */
+    field = id3_frame_field (frame, frame->nfields-1);
+
+#if LOCALDEBUG
+     printf (" field: %p\n", field);
+#endif
+
+    if (!field) return NULL;
+
+#if LOCALDEBUG
+     printf (" type: %d\n", field->type);
+#endif
+
+    switch (field->type)
+    {
+    case ID3_FIELD_TYPE_BINARYDATA:
+	binary = id3_field_getbinarydata(field, len);
+	break;
+    default:
+	break;
+    }
+
+#if LOCALDEBUG
+    {
+	FILE *file;
+	printf (" binary len: %ld\n", *len);
+	file = fopen ("/tmp/folder2.jpg", "w");
+	fwrite (binary, 1, *len, file);
+	fclose (file);
+    }
+#endif
+
+
+
+    return binary;
+}
+
+
+
+static gchar* id3_get_string (struct id3_tag *tag, char *frame_name)
+{
+    const id3_ucs4_t *string = NULL;
+    const id3_byte_t *binary = NULL;
+    id3_length_t len = 0;
+    struct id3_frame *frame;
+    union id3_field *field;
+    gchar *utf8 = NULL;
+    enum id3_field_textencoding encoding = ID3_FIELD_TEXTENCODING_ISO_8859_1;
+
+    frame = id3_tag_findframe (tag, frame_name, 0);
+#if LOCALDEGUB
+    printf ("frame: %p\n", frame); 
+#endif
+
+    if (!frame) return NULL;
+
+    /* Find the encoding used for the field */
+    field = id3_frame_field (frame, 0);
+#if LOCALDEBUG
+    printf ("field: %p\n", field); 
+    printf ("type: %d\n", id3_field_type (field));
+#endif
+
+    if (field && (id3_field_type (field) == ID3_FIELD_TYPE_TEXTENCODING))
+    {
+	encoding = field->number.value;
+#if LOCALDEBUG
+	printf ("encoding: %d\n", encoding);
+#endif
+    }
+
+    /* The last field contains the data */
+    field = id3_frame_field (frame, frame->nfields-1);
+
+#if LOCALDEBUG
+     printf ("field: %p\n", field);
+#endif
+
+    if (!field) return NULL;
+
+#if LOCALDEBUG
+     printf ("type: %d\n", field->type);
+#endif
+
+
+    switch (field->type)
+    {
+    case ID3_FIELD_TYPE_STRINGLIST:
+	string = id3_field_getstrings (field, 0);
+	break;
+    case ID3_FIELD_TYPE_STRINGFULL:
+	string = id3_field_getfullstring (field);
+	break;
+    case ID3_FIELD_TYPE_BINARYDATA:
+	binary = id3_field_getbinarydata(field, &len);
+#if LOCALDEBUG
+	printf ("len: %ld\nbinary: %s\n", len, binary+1);
+#endif
+	if (len > 0)
+	    return charset_to_utf8 (binary+1);
+	break;
+    default:
+	break;
+    }
+
+/*     printf ("string: %p\n", string); */
+
+    if (!string) return NULL;
+
+    if (strcmp (frame_name, ID3_FRAME_GENRE) == 0)
+       string = id3_genre_name (string);
+
+    if (encoding == ID3_FIELD_TEXTENCODING_ISO_8859_1)
+    {
+	/* ISO_8859_1 is just a "marker" -- most people just drop
+	   whatever coding system they are using into it, so we use
+	   charset_to_utf8() to convert to utf8 */
+	id3_latin1_t *raw = id3_ucs4_latin1duplicate (string);
+	utf8 = charset_to_utf8 (raw);
+	g_free (raw);
+    }
+    else
+    {
+	/* Standard unicode is being used -- we won't have to worry
+	   about charsets then. */
+	utf8 = id3_ucs4_utf8duplicate (string);
+    }
+    return utf8;
+}
+
+static void id3_set_string (struct id3_tag *tag,
+			    const char *frame_name,
+			    const char *data,
+			    enum id3_field_textencoding encoding)
+{
+    int res;
+    struct id3_frame *frame;
+    union id3_field *field;
+    id3_ucs4_t *ucs4;
+
+    /* clear the frame, because of bug in libid3tag see
+       http://www.mars.org/mailman/public/mad-dev/2004-October/001113.html
+    */
+    while ((frame = id3_tag_findframe (tag, frame_name, 0)))
+    {
+	id3_tag_detachframe (tag, frame);
+        id3_frame_delete (frame);
+    }
+
+    if ((data == NULL) || (strlen(data) == 0))
+	return;
+
+    frame = id3_frame_new (frame_name);
+    id3_tag_attachframe (tag, frame);
+
+    /* Use the specified text encoding */
+    field = id3_frame_field (frame, 0);
+    id3_field_settextencoding(field, encoding);
+   
+    if (strcmp (frame_name, ID3_FRAME_COMMENT) == 0)
+    {
+	field = id3_frame_field (frame, 3);
+	field->type = ID3_FIELD_TYPE_STRINGFULL;
+    }
+    else
+    {
+	field = id3_frame_field (frame, 1);
+	field->type = ID3_FIELD_TYPE_STRINGLIST;
+    }
+
+
+    /* maybe could be optimized see
+       http://www.mars.org/mailman/public/mad-dev/2002-October/000739.html
+    */
+    if (strcmp (frame_name, ID3_FRAME_GENRE) == 0)
+    {
+	id3_ucs4_t *tmp_ucs4 = id3_utf8_ucs4duplicate ((id3_utf8_t *)data);
+	int index = id3_genre_number (tmp_ucs4);
+	if (index != -1)
+	{
+	    /* valid genre -- simply store the genre number */
+	    gchar *tmp = g_strdup_printf("%d", index);
+	    ucs4 = id3_latin1_ucs4duplicate (tmp);
+	    g_free (tmp);
+	}
+	else
+	{
+	    /* oups -- not a valid genre -- save the entire genre string */
+	    if (encoding == ID3_FIELD_TEXTENCODING_ISO_8859_1)
+	    {
+		/* we read 'ISO_8859_1' to stand for 'any locale
+		   charset' -- most programs seem to work that way */
+		id3_latin1_t *raw = charset_from_utf8 (data);
+		ucs4 = id3_latin1_ucs4duplicate (raw);
+		g_free (raw);
+	    }
+	    else
+	    {
+		/* Yeah! We use unicode encoding and won't have to
+		   worry about charsets */
+		ucs4 = tmp_ucs4;
+		tmp_ucs4 = NULL;
+	    }
+	}
+	g_free (tmp_ucs4);
+    }
+    else
+    {
+	if (encoding == ID3_FIELD_TEXTENCODING_ISO_8859_1)
+	{
+	    /* we read 'ISO_8859_1' to stand for 'any locale charset'
+	       -- most programs seem to work that way */
+	    id3_latin1_t *raw = charset_from_utf8 (data);
+	    ucs4 = id3_latin1_ucs4duplicate (raw);
+	    g_free (raw);
+	}
+	else
+	{
+	    /* Yeah! We use unicode encoding and won't have to
+	       worry about charsets */
+	    ucs4 = id3_utf8_ucs4duplicate ((id3_utf8_t *)data);
+	}
+    }
+
+    if (strcmp (frame_name, ID3_FRAME_COMMENT) == 0)
+	res = id3_field_setfullstring (field, ucs4);
+    else
+	res = id3_field_setstrings (field, 1, &ucs4);
+
+    g_free (ucs4);
+
+    if (res != 0)
+	g_print(_("Error setting ID3 field: %s\n"), frame_name);
+}
+
+
+/***
+ * Reads id3v1.x / id3v2 apic data
+ * @returns: TRUE on success, else FALSE.
+ */
+static gboolean id3_apic_read (const gchar *filename,
+			       guchar **image_data, gsize *image_data_len)
+{
+    struct id3_file *id3file;
+    struct id3_tag *id3tag;
+
+    g_return_val_if_fail (filename, FALSE);
+    g_return_val_if_fail (image_data, FALSE);
+    g_return_val_if_fail (image_data_len, FALSE);
+
+    *image_data = NULL;
+    *image_data_len = 0;
+
+    if (!(id3file = id3_file_open (filename, ID3_FILE_MODE_READONLY)))
+    {
+	gchar *fbuf = charset_to_utf8 (filename);
+	g_print(_("ERROR while opening file: '%s' (%s).\n"),
+		fbuf, g_strerror(errno));
+	g_free (fbuf);
+	return FALSE;
+    }
+
+    if ((id3tag = id3_file_tag(id3file)))
+    {
+	id3_length_t len;
+	const guchar *coverart = NULL;
+	int i;
+	struct id3_frame *frame;
+
+	/* Loop through APIC tags and set coverart.  The picture type should be
+	 * 3 -- Cover (front), but iTunes has been known to use 0 -- Other. */
+	for (i = 0; (frame = id3_tag_findframe(id3tag, "APIC", i)) != NULL; i++)
+	{
+	    union id3_field *field = id3_frame_field (frame, 2);
+	    int pictype = field->number.value;
+/*	    printf ("%s: found apic type %d\n", filename, pictype);*/
+
+	    /* We'll prefer type 3 (cover) over type 0 (other) */
+	    if (pictype == 3)
+	    {
+		coverart = id3_get_binary (id3tag, "APIC", &len, i);
+		break;
+	    }
+	    if ((pictype == 0) && !coverart)
+	    {
+		coverart = id3_get_binary (id3tag, "APIC", &len, i);
+	    }
+	}
+
+	if (coverart)
+	{   /* I guess iTunes is doing something wrong -- the
+	     * beginning of the coverart data ends up in a different
+	       field... We'll just add the missing data manually. */
+	    const guchar itunes_broken_jfif_marker[] =
+		{ 0x10, 'J', 'F', 'I', 'F'};
+	    if (len >= 5)
+	    {
+		if (strncmp (itunes_broken_jfif_marker, coverart,  5) == 0)
+		{
+		    const guchar itunes_missing_header[] =
+			{ 0xff, 0xd8, 0xff, 0xe0, 0x00 };
+		    *image_data = g_malloc (len+5);
+		    memcpy (*image_data, itunes_missing_header, 5);
+		    memcpy ((*image_data)+5, coverart, len);
+		    *image_data_len = len+5;
+		}
+	    }
+	    if (!*image_data)
+	    {
+		*image_data = g_malloc (len);
+		memcpy (*image_data, coverart, len);
+		*image_data_len = len;
+	    }
+#if LOCALDEBUG
+	    if (*image_data)
+	    {
+		FILE *file;
+		file = fopen ("/tmp/folder.jpg", "w");
+		fwrite (*image_data, 1, *image_data_len, file);
+		fclose (file);
+	    }
+#endif
+	}    
+    }
+    id3_file_close (id3file);
+    return TRUE;
+}
+
+/***
+ * Reads id3v1.x / id3v2 tag and load data into the Id3tag structure.
+ * If a tag entry exists (ex: title), we allocate memory, else value
+ * stays to NULL
+ * @returns: TRUE on success, else FALSE.
+ */
+gboolean id3_tag_read (const gchar *filename, File_Tag *tag)
+{
+    struct id3_file *id3file;
+    struct id3_tag *id3tag;
+    gchar* string;
+    gchar* string2;
+
+    g_return_val_if_fail (filename, FALSE);
+    g_return_val_if_fail (tag, FALSE);
+
+    memset (tag, 0, sizeof (File_Tag));
+
+    if (!(id3file = id3_file_open (filename, ID3_FILE_MODE_READONLY)))
+    {
+	gchar *fbuf = charset_to_utf8 (filename);
+	g_print(_("ERROR while opening file: '%s' (%s).\n"),
+		fbuf, g_strerror(errno));
+	g_free (fbuf);
+	return FALSE;
+    }
+
+    if ((id3tag = id3_file_tag(id3file)))
+    {
+	tag->title = id3_get_string (id3tag, ID3_FRAME_TITLE);
+	tag->artist = id3_get_string (id3tag, ID3_FRAME_GROUP);
+	if (!tag->artist || !*tag->artist)
+	{
+	    g_free (tag->artist);
+	    tag->artist = id3_get_string (id3tag, ID3_FRAME_ARTIST);
+	}
+	tag->album = id3_get_string (id3tag, ID3_FRAME_ALBUM);
+	tag->year = id3_get_string (id3tag, ID3_FRAME_YEAR);
+	tag->composer = id3_get_string (id3tag, "TCOM");
+	tag->comment = id3_get_string (id3tag, ID3_FRAME_COMMENT);
+	tag->genre = id3_get_string (id3tag, ID3_FRAME_GENRE);
+	tag->compilation = id3_get_string (id3tag, "TCMP");
+	tag->subtitle = id3_get_string (id3tag, "TIT3");
+	tag->lyrics = id3_get_string (id3tag, "USLT");
+	tag->podcasturl = id3_get_string (id3tag, "YTID");
+	tag->podcastrss = id3_get_string (id3tag, "YWFD");
+	tag->description = id3_get_string (id3tag, "YTDS");
+	tag->time_released = id3_get_string (id3tag, "YTDR");
+	tag->BPM = id3_get_string (id3tag, "TBPM");
+	tag->sort_artist = id3_get_string (id3tag, "TSOP");
+	tag->sort_album = id3_get_string (id3tag, "TSOA");
+	tag->sort_title = id3_get_string (id3tag, "TSOT");
+	tag->sort_albumartist = id3_get_string (id3tag, "TSO2");
+	tag->sort_composer = id3_get_string (id3tag, "TSOC");
+
+	string = id3_get_string (id3tag, "TLEN");
+	if (string)
+	{
+	    tag->songlen = (guint32) strtoul (string, 0, 10);
+	    g_free (string);
+	}
+
+	string = id3_get_string (id3tag, ID3_FRAME_TRACK);
+	if (string)
+	{
+	    string2 = strchr(string,'/');
+	    if (string2)
+	    {
+		tag->track_total = g_strdup_printf ("%.2d", atoi (string2+1));
+		*string2 = '\0';
+	    }
+	    tag->trackstring = g_strdup_printf ("%.2d", atoi (string));
+	    g_free(string);
+	}
+	
+	/* CD/disc number tag handling */
+	string = id3_get_string (id3tag, "TPOS");
+	if (string)
+	{
+	    string2 = strchr(string,'/');
+	    if (string2)
+	    {
+		tag->cdno_total = g_strdup_printf ("%.2d", atoi (string2+1));
+		*string2 = '\0';
+	    }
+	    tag->cdnostring = g_strdup_printf ("%.2d", atoi (string));
+	    g_free(string);
+	}
+    }
+
+    id3_file_close (id3file);
+    return TRUE;
+}
+
+
+
+static enum id3_field_textencoding get_encoding_of (struct id3_tag *tag, const char *frame_name)
+{
+    struct id3_frame *frame;
+    enum id3_field_textencoding encoding = -1;
+
+    frame = id3_tag_findframe (tag, frame_name, 0);
+    if (frame)
+    {
+	union id3_field *field = id3_frame_field (frame, 0);
+	if (field && (id3_field_type (field) == ID3_FIELD_TYPE_TEXTENCODING))
+	    encoding = field->number.value;
+    }
+    return encoding;
+}
+
+/* Find out which encoding is being used. If in doubt, return
+ * latin1. This code assumes that the same encoding is used in all
+ * fields.  */
+static enum id3_field_textencoding get_encoding (struct id3_tag *tag)
+{
+    enum id3_field_textencoding enc;
+
+    enc = get_encoding_of (tag, ID3_FRAME_TITLE);
+    if (enc != -1) return enc;
+    enc = get_encoding_of (tag, ID3_FRAME_ARTIST);
+    if (enc != -1) return enc;
+    enc = get_encoding_of (tag, ID3_FRAME_ALBUM);
+    if (enc != -1) return enc;
+    enc = get_encoding_of (tag, "TCOM");
+    if (enc != -1) return enc;
+    enc = get_encoding_of (tag, ID3_FRAME_COMMENT);
+    if (enc != -1) return enc;
+    enc = get_encoding_of (tag, ID3_FRAME_YEAR);
+    if (enc != -1) return enc;
+    return ID3_FIELD_TEXTENCODING_ISO_8859_1;
+}
+
+
+/* I'm not really sure about this: The original TAG identifier was
+   "TID", but no matter what I do I end up writing "YTID" */
+void set_uncommon_tag (struct id3_tag *id3tag,
+		       const gchar *id,
+		       const gchar *text,
+		       enum id3_field_textencoding encoding)
+{
+#if 0
+    struct id3_frame *frame;
+
+    frame = id3_tag_findframe (id3tag, id, 0);
+	union id3_field *field;
+	frame->flags = 0;
+	field = id3_frame_field (frame, 0);
+	    if (field)
+	    {
+		string1 = g_strdup_printf ("%c%s", '\0',
+					   track->podcasturl);
+		id3_field_setbinarydata (field, string1,
+					 strlen(track->podcasturl)+1);
+		g_free (string1);
+	    }
+
+#endif
+}
+
+
+
+/**
+ * Write the ID3 tags to the file.
+ * @returns: TRUE on success, else FALSE.
+ */
+gboolean mp3_write_file_info (gchar *filename, Track *track)
+{
+    struct id3_tag* id3tag;
+    struct id3_file* id3file;
+    gint error = 0;
+
+    id3file = id3_file_open (filename, ID3_FILE_MODE_READWRITE);
+    if (!id3file)
+    {
+	gchar *fbuf = charset_to_utf8 (filename);
+	g_print(_("ERROR while opening file: '%s' (%s).\n"),
+		fbuf, g_strerror(errno));
+	g_free (fbuf);
+	return FALSE;
+    }
+
+    if ((id3tag = id3_file_tag(id3file)))
+    {
+	char *string1;
+
+	enum id3_field_textencoding encoding;
+
+	/* use the same coding as before... */
+	encoding = get_encoding (id3tag);
+	/* ...unless it's ISO_8859_1 and prefs say we should use
+	   unicode (i.e. ID3v2.4) */
+	if (prefs_get_int("id3_write_id3v24") &&
+	    (encoding == ID3_FIELD_TEXTENCODING_ISO_8859_1))
+	    encoding = ID3_FIELD_TEXTENCODING_UTF_8;
+
+	/* always render id3v1 to prevent dj studio from crashing */
+	id3_tag_options(id3tag, ID3_TAG_OPTION_ID3V1, ~0);
+
+        /* turn off frame compression and crc information to let
+	   itunes read tags see
+	   http://www.mars.org/mailman/public/mad-dev/2002-October/000742.html
+	*/
+	id3_tag_options(id3tag, ID3_TAG_OPTION_COMPRESSION, 0);
+	id3_tag_options(id3tag, ID3_TAG_OPTION_CRC, 0);
+
+	id3_set_string (id3tag, ID3_FRAME_TITLE, track->title, encoding);
+	id3_set_string (id3tag, ID3_FRAME_ARTIST, track->artist, encoding);
+	id3_set_string (id3tag, ID3_FRAME_ALBUM, track->album, encoding);
+	id3_set_string (id3tag, ID3_FRAME_GENRE, track->genre, encoding);
+	id3_set_string (id3tag, ID3_FRAME_COMMENT, track->comment, encoding);
+	id3_set_string (id3tag, "TIT3", track->subtitle, encoding);
+	id3_set_string (id3tag, "TSOP", track->sort_artist, encoding);
+	id3_set_string (id3tag, "TSOA", track->sort_album, encoding);
+	id3_set_string (id3tag, "TSOT", track->sort_title, encoding);
+	id3_set_string (id3tag, "TSO2", track->sort_albumartist, encoding);
+	id3_set_string (id3tag, "TSOC", track->sort_composer, encoding);
+
+	set_uncommon_tag (id3tag, "YTID", track->podcasturl, encoding);
+	set_uncommon_tag (id3tag, "YTDS", track->description, encoding);
+	set_uncommon_tag (id3tag, "YWFD", track->podcastrss, encoding);
+
+	id3_set_string (id3tag, "TCOM", track->composer, encoding);
+
+	string1 = g_strdup_printf("%d", track->year);
+	id3_set_string(id3tag, ID3_FRAME_YEAR, string1, encoding);
+	g_free(string1);
+
+	string1 = g_strdup_printf("%d", track->BPM);
+	id3_set_string(id3tag, "TBPM", string1, encoding);
+	g_free(string1);
+
+	if (track->tracks)
+	    string1 = g_strdup_printf ("%d/%d",
+				       track->track_nr, track->tracks);
+	else
+	    string1 = g_strdup_printf ("%d", track->track_nr);
+	id3_set_string (id3tag, ID3_FRAME_TRACK, string1, encoding);
+	g_free(string1);
+
+	if (track->cds)
+	    string1 = g_strdup_printf ("%d/%d",
+				       track->cd_nr, track->cds);
+	else
+	    string1 = g_strdup_printf ("%d", track->cd_nr);
+	id3_set_string (id3tag, "TPOS", string1, encoding);
+	g_free(string1);
+        
+       string1 = g_strdup_printf ("%d", track->compilation);
+       id3_set_string (id3tag, "TCMP", string1, encoding);
+       g_free(string1);
+    } 
+
+    if (id3_file_update(id3file) != 0)
+    {
+	gchar *fbuf = charset_to_utf8 (filename);
+	g_print(_("ERROR while writing tag to file: '%s' (%s).\n"),
+		fbuf, g_strerror(errno));
+	g_free (fbuf);
+	return FALSE;
+    }
+
+    id3_file_close (id3file);
+
+    if (error) return FALSE;
+    else       return TRUE;
+}
+
+
+/*
+ * Code used to calculate the CRC-16 of the info tag.  Used to check the
+ * validity of the data read from the lame tag.
+ * Code taken from the libmad project, licensed under GPL
+ */
+
+static
+unsigned short const crc_table[256] = {
+  0x0000, 0xc0c1, 0xc181, 0x0140, 0xc301, 0x03c0, 0x0280, 0xc241,
+  0xc601, 0x06c0, 0x0780, 0xc741, 0x0500, 0xc5c1, 0xc481, 0x0440,
+  0xcc01, 0x0cc0, 0x0d80, 0xcd41, 0x0f00, 0xcfc1, 0xce81, 0x0e40,
+  0x0a00, 0xcac1, 0xcb81, 0x0b40, 0xc901, 0x09c0, 0x0880, 0xc841,
+  0xd801, 0x18c0, 0x1980, 0xd941, 0x1b00, 0xdbc1, 0xda81, 0x1a40,
+  0x1e00, 0xdec1, 0xdf81, 0x1f40, 0xdd01, 0x1dc0, 0x1c80, 0xdc41,
+  0x1400, 0xd4c1, 0xd581, 0x1540, 0xd701, 0x17c0, 0x1680, 0xd641,
+  0xd201, 0x12c0, 0x1380, 0xd341, 0x1100, 0xd1c1, 0xd081, 0x1040,
+
+  0xf001, 0x30c0, 0x3180, 0xf141, 0x3300, 0xf3c1, 0xf281, 0x3240,
+  0x3600, 0xf6c1, 0xf781, 0x3740, 0xf501, 0x35c0, 0x3480, 0xf441,
+  0x3c00, 0xfcc1, 0xfd81, 0x3d40, 0xff01, 0x3fc0, 0x3e80, 0xfe41,
+  0xfa01, 0x3ac0, 0x3b80, 0xfb41, 0x3900, 0xf9c1, 0xf881, 0x3840,
+  0x2800, 0xe8c1, 0xe981, 0x2940, 0xeb01, 0x2bc0, 0x2a80, 0xea41,
+  0xee01, 0x2ec0, 0x2f80, 0xef41, 0x2d00, 0xedc1, 0xec81, 0x2c40,
+  0xe401, 0x24c0, 0x2580, 0xe541, 0x2700, 0xe7c1, 0xe681, 0x2640,
+  0x2200, 0xe2c1, 0xe381, 0x2340, 0xe101, 0x21c0, 0x2080, 0xe041,
+
+  0xa001, 0x60c0, 0x6180, 0xa141, 0x6300, 0xa3c1, 0xa281, 0x6240,
+  0x6600, 0xa6c1, 0xa781, 0x6740, 0xa501, 0x65c0, 0x6480, 0xa441,
+  0x6c00, 0xacc1, 0xad81, 0x6d40, 0xaf01, 0x6fc0, 0x6e80, 0xae41,
+  0xaa01, 0x6ac0, 0x6b80, 0xab41, 0x6900, 0xa9c1, 0xa881, 0x6840,
+  0x7800, 0xb8c1, 0xb981, 0x7940, 0xbb01, 0x7bc0, 0x7a80, 0xba41,
+  0xbe01, 0x7ec0, 0x7f80, 0xbf41, 0x7d00, 0xbdc1, 0xbc81, 0x7c40,
+  0xb401, 0x74c0, 0x7580, 0xb541, 0x7700, 0xb7c1, 0xb681, 0x7640,
+  0x7200, 0xb2c1, 0xb381, 0x7340, 0xb101, 0x71c0, 0x7080, 0xb041,
+
+  0x5000, 0x90c1, 0x9181, 0x5140, 0x9301, 0x53c0, 0x5280, 0x9241,
+  0x9601, 0x56c0, 0x5780, 0x9741, 0x5500, 0x95c1, 0x9481, 0x5440,
+  0x9c01, 0x5cc0, 0x5d80, 0x9d41, 0x5f00, 0x9fc1, 0x9e81, 0x5e40,
+  0x5a00, 0x9ac1, 0x9b81, 0x5b40, 0x9901, 0x59c0, 0x5880, 0x9841,
+  0x8801, 0x48c0, 0x4980, 0x8941, 0x4b00, 0x8bc1, 0x8a81, 0x4a40,
+  0x4e00, 0x8ec1, 0x8f81, 0x4f40, 0x8d01, 0x4dc0, 0x4c80, 0x8c41,
+  0x4400, 0x84c1, 0x8581, 0x4540, 0x8701, 0x47c0, 0x4680, 0x8641,
+  0x8201, 0x42c0, 0x4380, 0x8341, 0x4100, 0x81c1, 0x8081, 0x4040
+};
+
+unsigned short crc_compute(char const *data, unsigned int length,
+			   unsigned short init)
+{
+  register unsigned int crc;
+
+  for (crc = init; length >= 8; length -= 8) {
+    crc = crc_table[(crc ^ *data++) & 0xff] ^ (crc >> 8);
+    crc = crc_table[(crc ^ *data++) & 0xff] ^ (crc >> 8);
+    crc = crc_table[(crc ^ *data++) & 0xff] ^ (crc >> 8);
+    crc = crc_table[(crc ^ *data++) & 0xff] ^ (crc >> 8);
+    crc = crc_table[(crc ^ *data++) & 0xff] ^ (crc >> 8);
+    crc = crc_table[(crc ^ *data++) & 0xff] ^ (crc >> 8);
+    crc = crc_table[(crc ^ *data++) & 0xff] ^ (crc >> 8);
+    crc = crc_table[(crc ^ *data++) & 0xff] ^ (crc >> 8);
+  }
+
+  switch (length) {
+  case 7: crc = crc_table[(crc ^ *data++) & 0xff] ^ (crc >> 8);
+  case 6: crc = crc_table[(crc ^ *data++) & 0xff] ^ (crc >> 8);
+  case 5: crc = crc_table[(crc ^ *data++) & 0xff] ^ (crc >> 8);
+  case 4: crc = crc_table[(crc ^ *data++) & 0xff] ^ (crc >> 8);
+  case 3: crc = crc_table[(crc ^ *data++) & 0xff] ^ (crc >> 8);
+  case 2: crc = crc_table[(crc ^ *data++) & 0xff] ^ (crc >> 8);
+  case 1: crc = crc_table[(crc ^ *data++) & 0xff] ^ (crc >> 8);
+  case 0: break;
+  }
+
+  return crc;
+}
+
+
+/*
+ * Code to read the ReplayGain Values stored by LAME in its own tag.
+ *
+ * Most of the relevant information has been extracted from them LAME sources
+ * (http://lame.sourceforge.net/).
+ * The "Mp3 info Tag rev 1 specifications - draft 0"
+ * (http://gabriel.mp3-tech.org/mp3infotag.html) by Gabriel Bouvigne describes
+ * the actual Tag (except for small changes).
+ * Details on the actual ReplayGain fields have been obtained from
+ * http://www.replaygain.org .
+ *
+ * Apart from that, some information has been derived from phwip's LameTag
+ * (http://www.silisoftware.com/applets/?scriptname=LameTag)
+ *
+ * 
+ * Code to read the ReplayGain Values stored in an Ape tag.
+ *
+ * Info on Lyrics3 V2.00 can be found at:
+ * http://www.id3.org/lyrics3200.html
+ * On the actual Ape Tag V2.0:
+ * http://www.personal.uni-jena.de/~pfk/mpp/sv8/apetag.html
+ *
+ * Copyright (C) 2004 Jens Taprogge <jens.taprogge at post.rwth-aachen.de>
+ *
+ * Provided under GPL according to Jens Taprogge. (JCS -- 12 March 2004)
+ */
+
+#define TAG_FOOTER		0x10
+#define LAME_OFFSET		0x74
+#define SIDEINFO_MPEG1_MONO	17
+#define SIDEINFO_MPEG1_MULTI	32
+#define SIDEINFO_MPEG2_MONO	9
+#define SIDEINFO_MPEG2_MULTI	17
+#define ID3V1_SIZE		0x80
+#define APE_FOOTER_SIZE 	0x20
+#define LYRICS_FOOTER_SIZE 	0x0f
+
+
+static gint lame_vcmp(gchar a[5], gchar b[5]) {
+	int r;
+
+	r = strncmp(a, b, 4);
+	if (r) return r;
+
+	if (a[4] == b[4]) return 0;
+
+	/* check for '.': indicates subminor version */
+	if (a[4] == '.') return 1;
+	if (b[4] == '.') return -1;
+	
+	/* check for alpha or beta versions */
+	if (a[4] == ' ') return 1;
+	if (b[4] == ' ') return -1;
+
+	/* check for alpha, beta etc. indicated by a, b... */
+	return strncmp(&a[4], &b[4], 1);
+}
+
+
+/* buf[] must be declared unsigned -- otherwise the casts, shifts and
+   additions below produce funny results */             
+static void read_lame_replaygain(unsigned char buf[],
+				 GainData *gd, int gain_adjust) {
+	char oc, nc;
+	gint gain;
+
+	g_return_if_fail (gd);
+
+	/* buf[0] and buf[1] are a bit field:
+	   3 bits: name  (mask: 0xe0 = 11100000)
+	   3 bits: originator (mask: 0x1c = 00011100)
+	   1 bit: negative if set (mask: 0x02 = 00000010)
+	   9 bits: value
+	*/
+
+	/* check originator */
+	oc = (buf[0] & 0x1c) >> 2;
+	if ((oc <= 0) || (oc > 3)) return;
+
+	/* check name code */
+	nc = buf[0] & 0xe0;
+	if (!((nc == 0x20) || (nc == 0x40))) return;
+	
+	gain = ((((guint)buf[0]) & 0x1) << 8) + buf[1];
+	
+	/* This would be a value of -0.
+	 * That value however is illegal by current standards and reserved for
+	 * future use. */
+	if ((!gain) && (buf[0] & 0x02)) return;
+	
+	if (buf[0] & 2) gain = -gain;
+	
+	gain += gain_adjust;
+
+	switch (nc) {
+		case 0x20:
+			if (gd->radio_gain_set) return;
+			gd->radio_gain = (gdouble)gain / 10;
+			gd->radio_gain_set = TRUE;
+/*			printf("radio_gain (lame): %i\n", gd->radio_gain); */
+			break;
+		case 0x40:
+			if (gd->audiophile_gain_set) return;
+			gd->audiophile_gain = (gdouble)gain / 10;
+			gd->audiophile_gain_set = TRUE;
+/*			printf("audiophile_gain (lame): %i\n", 
+					gd->audiophile_gain);*/
+			break;
+	}
+}
+
+
+static inline guint32 parse_ape_uint32(char *buf) {
+	return (buf[0] & 0xff) | (buf[1] & 0xff) << 8 
+		| (buf[2] & 0xff) << 16 | (buf[3] & 0xff) << 24;
+}
+
+static inline guint32 parse_lame_uint32(char *buf) {
+	return (buf[0] & 0xff) << 24 | (buf[1] & 0xff) << 16 
+		| (buf[2] & 0xff) << 8 | (buf[3] & 0xff);
+}
+
+static inline guint16 parse_lame_uint16(char *buf) {
+	return (buf[0] & 0xff) << 8 | (buf[1] & 0xff);
+}
+
+/* 
+ * mp3_get_track_lame_replaygain - read the specified file and scan for LAME Tag
+ * ReplayGain information.
+ *
+ * @path: localtion of the file
+ * @track: structure holding track information
+ *
+ * FIXME: Are there other encoders writing a LAME Tag using a different magic
+ * string?
+ * TODO: Check CRC.
+ */
+
+gboolean mp3_get_track_lame_replaygain (gchar *path, GainData *gd)
+{
+	g_return_val_if_fail (path, FALSE);
+
+	LameTag lt;
+	if (!mp3_read_lame_tag (path, &lt))
+	    goto rg_fail;
+	int gain_adjust = 0;
+
+	g_return_val_if_fail (gd, FALSE);
+
+	gd->radio_gain = 0;
+	gd->audiophile_gain = 0;
+	gd->peak_signal = 0;
+	gd->radio_gain_set = FALSE;
+	gd->audiophile_gain_set = FALSE;
+	gd->peak_signal_set = FALSE;
+	
+	if (lame_vcmp(lt.version_string, "3.90") < 0) {
+/*		fprintf(stderr, "Old lame version (%c%c%c%c%c). Not used.\n",
+				version[0], version[1], version[2], version[3], version[4]); */
+		goto rg_fail;
+	}
+		
+	/* Don't know when fixed-point PeakSingleAmplitude
+	 * was introduced exactly. 3.94b will be used for now.) */
+	if ((lame_vcmp(lt.version_string, "3.94b") >= 0)) {
+		if ((!gd->peak_signal_set) && lt.peak_signal_amplitude) {
+			gd->peak_signal = lt.peak_signal_amplitude;
+			gd->peak_signal_set = TRUE;
+/*			printf("peak_signal (lame): %f\n", (double)
+					gd->peak_signal / 0x800000);*/
+		}
+	} else {
+		float f = *((float *) (void *) (&lt.peak_signal_amplitude)) * 0x800000;
+		gd->peak_signal = (guint32) f;
+		/* I would like to see an example of that. */
+/*		printf("peak_signal (lame floating point): %f. PLEASE report.\n", 
+				(double) gd->peak_signal / 0x800000);*/
+	}
+
+	/*
+	 * Versions prior to 3.95.1 used a reference volume of 83dB.
+	 * (As compared to the currently used 89dB.)
+	 */
+	if ((lame_vcmp(lt.version_string, "3.95.") < 0)) {
+		gain_adjust = 60;
+/*		fprintf(stderr, "Old lame version (%c%c%c%c%c). Adjusting gain.\n",
+				version[0], version[1], version[2], version[3], version[4]); */
+	}
+
+	unsigned char ubuf[2];
+	/* radio gain */
+	memcpy(ubuf,&lt.radio_replay_gain,2);
+	read_lame_replaygain (ubuf, gd, gain_adjust);
+
+	/* audiophile gain */
+	memcpy(ubuf,&lt.audiophile_replay_gain,2);
+	read_lame_replaygain (ubuf, gd, gain_adjust);
+
+	return TRUE;
+
+rg_fail:
+	return FALSE;
+}
+
+/* 
+ * mp3_get_track_ape_replaygain - read the specified file and scan for Ape Tag
+ * ReplayGain information.
+ *
+ * @path: localtion of the file
+ * @track: structure holding track information
+ *
+ * The function only modifies the gains if they have not previously been set.
+ */
+
+gboolean mp3_get_track_ape_replaygain(gchar *path, GainData *gd)
+{
+	/* The Ape Tag is located a t the end of the file. Or at least that
+	 * seems where it can most likely be found. Either it is at the very end
+	 * or before a trailing ID3v1 Tag. Sometimes a Lyrics3 Tag is placed
+	 * between the ID3v1 and the Ape Tag.
+	 * If you find files that have the Tags located in different
+	 * positions please let me know. */
+
+	FILE *file = NULL;
+	char buf[16];
+	char *dbuf = NULL, *ep;
+
+	int offset = 0;
+	int i;
+	int pos = 0, pos2 = 0;
+	guint32 version;
+	guint32 data_length;
+	guint32 entry_length = 0;
+	guint32 entries;
+	double d;
+
+	g_return_val_if_fail (gd, FALSE);
+	g_return_val_if_fail (path, FALSE);
+
+	file = fopen (path, "r");
+
+	if (!file)
+	    goto rg_fail;
+
+	/* check for ID3v1 Tag */
+	if (fseek(file, -ID3V1_SIZE, SEEK_END) ||
+			fread(&buf, 1, 3, file) != 3)
+		goto rg_fail;
+	if (!strncmp(buf, "TAG", 3)) offset -= ID3V1_SIZE;
+
+	/* check for Lyrics3 Tag */
+	if (fseek(file, -9 + offset, SEEK_END) ||
+			fread(&buf, 1, 9, file) != 9)
+		goto rg_fail;
+	if (!strncmp(buf, "LYRICS200", 9)) {
+		if (fseek(file, -LYRICS_FOOTER_SIZE + offset, SEEK_END) ||
+				fread(&buf, 1, 9, file) != 9)
+			goto rg_fail;
+		data_length = buf[0] - '0';
+		for (i = 1; i < 6; i++) {
+			data_length *= 10;
+			data_length += buf[i] - '0';
+		}
+		if (fseek(file, -LYRICS_FOOTER_SIZE - data_length + offset,
+					SEEK_END) ||
+				fread(&buf, 1, 11, file) != 11)
+			goto rg_fail;
+		if (!strncmp(buf, "LYRICSBEGIN", 11)) 
+			offset -= LYRICS_FOOTER_SIZE + data_length;
+	}
+
+	/* check for APE Tag */
+	if (fseek(file, -APE_FOOTER_SIZE + offset, SEEK_END) ||
+			fread(&buf, 1, 8, file) != 8)
+		goto rg_fail;
+	if (strncmp(buf, "APETAGEX", 8)) goto rg_fail;
+
+	/* Check the version of the tag. 1000 and 2000 (v1.0 and 2.0) are the
+	 * only ones I know about. Make suer things do not break in the future.
+	 * */
+	if (fread(&buf, 1, 4, file) != 4)
+		goto rg_fail;
+	version = parse_ape_uint32(buf);
+	if (version != 1000 && version != 2000)
+		goto rg_fail;
+
+	/* determine data length */
+	if (fread(&buf, 1, 4, file) != 4)
+		goto rg_fail;
+	data_length = parse_ape_uint32(buf) - APE_FOOTER_SIZE;
+
+	/* determine number of entries */
+	if (fread(&buf, 1, 4, file) != 4)
+		goto rg_fail;
+	entries = parse_ape_uint32(buf);
+
+	/* seek to first entry and read the whole buffer*/
+	if (fseek(file, -APE_FOOTER_SIZE + offset - data_length, SEEK_END))
+		goto rg_fail;
+	if (!(dbuf = malloc(data_length)))
+		goto rg_fail;
+	if (fread(dbuf, 1, data_length, file) != data_length)
+		goto rg_fail;
+	
+	for (i = 0; i < entries; i++) {
+		if (gd->radio_gain_set && gd->peak_signal_set) break;
+		pos = pos2 + entry_length;
+		if (pos > data_length - 10) break;
+		
+		entry_length = parse_ape_uint32(&dbuf[pos]); pos += 4;
+		pos += 4;
+		
+		pos2 = pos;
+		while (dbuf[pos2] && pos2 < data_length) pos2++;
+		if (pos2 == data_length) break;
+		pos2++;
+		
+		if (entry_length + 1 > sizeof(buf))
+			continue;
+/* 		printf ("%s:%d:%d\n",&dbuf[pos], pos2, pos); */
+		if (!gd->radio_gain_set && !strcasecmp(&dbuf[pos],
+					"REPLAYGAIN_TRACK_GAIN")) {
+			memcpy(buf, &dbuf[pos2], entry_length);
+			buf[entry_length] = '\0';
+			
+			d = g_ascii_strtod(buf, &ep);
+/* 			printf("%f\n", d); */
+			if ((ep == buf + entry_length - 3) 
+					&& (!strncasecmp(ep, " dB", 3))) {
+			    gd->radio_gain = d;
+				gd->radio_gain_set = TRUE;
+/*				printf("radio_gain (ape): %i\n", gd->radio_gain);*/
+			}
+			
+			continue;
+		}
+		if (!gd->peak_signal_set && !strcasecmp(&dbuf[pos],
+					"REPLAYGAIN_TRACK_PEAK")) {
+			memcpy(buf, &dbuf[pos2], entry_length);
+			buf[entry_length] = '\0';
+			
+			d = g_ascii_strtod(buf, &ep);
+			if (ep == buf + entry_length) {
+				d *= 0x800000;
+				gd->peak_signal = (guint32) floor(d + 0.5);
+				gd->peak_signal_set = TRUE;
+/*				printf("peak_signal (ape): %f\n", (double) gd->peak_signal / 0x800000);*/
+			}
+
+			continue;
+		}
+	}
+
+	free(dbuf);
+	fclose(file);
+	return TRUE;
+
+rg_fail:
+	if (dbuf)
+		free(dbuf);
+	if (file)
+		fclose(file);
+	return FALSE;
+}
+
+
+/* ----------------------------------------------------------------------
+
+	      mp3gain code
+
+---------------------------------------------------------------------- */
+
+#include <sys/wait.h>
+#include <fcntl.h>
+
+
+
+
+
+
+/** 
+ * mp3_read_soundcheck:
+ *
+ * try to read the ReplayGain values from the LAME or Ape Tags and set
+ * the track's soundcheck field accordingly.
+ *
+ * @path: localtion of the file
+ * @track: structure holding track information
+ *
+ * The function always rereads the gain from the file.
+ *
+ * Returns TRUE if the soundcheck field could be set.
+ */
+gboolean mp3_read_soundcheck (gchar *path, Track *track)
+{
+    GainData gd;
+
+    g_return_val_if_fail (track, FALSE);
+
+    memset (&gd, 0, sizeof (GainData));
+
+    gd.radio_gain_set = FALSE;
+    gd.audiophile_gain_set = FALSE;
+    gd.peak_signal_set = FALSE;
+
+    mp3_get_track_lame_replaygain (path, &gd);
+    if (gd.radio_gain_set)
+    {
+	track->soundcheck = replaygain_to_soundcheck (gd.radio_gain);
+	return TRUE;
+    }
+
+    mp3_get_track_ape_replaygain (path, &gd);
+    if (gd.radio_gain_set)
+    {
+	track->soundcheck = replaygain_to_soundcheck (gd.radio_gain);
+	return TRUE;
+    }
+
+    return FALSE;
+}
+
+
+
+
+
+/* ----------------------------------------------------------------------
+
+	      From here starts original gtkpod code
+
+---------------------------------------------------------------------- */
+
+/* mpeg audio slot size in bytes */
+int slotsize[3] = {4,1,1}; /* layer 1, layer 2, layer 3 */
+
+int samplesperframe[2][3] = {
+  { /* MPEG 2.0 */
+    384,1152,576 /* layer 1, layer 2, layer 3 */
+  },
+
+  { /* MPEG 1.0 */
+    384,1152,1152 /* layer 1, layer 2, layer 3 */
+  }
+};
+
+
+/* 
+ * mp3_read_lame_tag - read the data from the lame tag (if it exists)
+ *
+ * @path: location of the file
+ * @lt: pointer to structure to be filled
+ */
+gboolean mp3_read_lame_tag (gchar *path, LameTag *lt)
+{
+    unsigned char ubuf[LAME_TAG_SIZE];
+    int sideinfo;
+
+    unsigned char full_info_tag[INFO_TAG_CRC_SIZE];
+
+    g_return_val_if_fail (path, FALSE);
+
+    /* Attempt to open the file */
+    FILE *file = fopen (path, "r");
+    if (!file)
+	goto lt_fail;
+
+    MP3Info *mp3i = NULL;
+    mp3i = g_malloc0 (sizeof (MP3Info));
+    mp3i->filename = path;
+    mp3i->file = file;
+    get_mp3_info (mp3i);
+
+    /* use get_first_header() to seek to the first mp3 header */
+    get_first_header (mp3i, 0);
+
+    if (fread (full_info_tag, 1, INFO_TAG_CRC_SIZE, mp3i->file) != INFO_TAG_CRC_SIZE)
+	goto lt_fail;
+    fseek(mp3i->file, -INFO_TAG_CRC_SIZE, SEEK_CUR);
+
+    MP3Header h;
+    if (!get_header (mp3i->file, &h))
+	goto lt_fail;
+
+    /* Determine offset of Xing header based on sideinfo size */
+    if (h.version & 0x1)
+    {
+	sideinfo = (h.mode & 0x2) ?
+	    SIDEINFO_MPEG1_MONO : SIDEINFO_MPEG1_MULTI;
+    }
+    else
+    {
+	sideinfo = (h.mode & 0x2) ?
+	    SIDEINFO_MPEG2_MONO : SIDEINFO_MPEG2_MULTI;
+    }
+
+    if (fseek (mp3i->file, sideinfo, SEEK_CUR) ||
+	(fread (&ubuf[0], 1, 4, mp3i->file) != 4))
+	goto lt_fail;
+
+    /* Is this really a Xing or Info Header? 
+     * FIXME: Apparently (according to madplay sources) there is a different
+     * possible location for the Xing header ("due to an unfortunate
+     * historical event"). I do not thing we need to care though since
+     * ReplayGain information is only contained in recent files.  */
+    if (strncmp (ubuf, "Xing", 4) && strncmp (ubuf, "Info", 4))
+	goto lt_fail;
+
+    /* Determine the offset of the LAME tag based on contents of the Xing header */
+    int flags;
+    fread (&flags, 4, 1, mp3i->file);
+    int toskip = 0;
+    if (flags | 0x1)
+    {				/* frames field is set */
+	toskip += 4;
+    }
+    if (flags | 0x2)
+    {				/* bytes field is set */
+	toskip += 4;
+    }
+    if (flags | 0x4)
+    {				/* TOC field is set */
+	toskip += 100;
+    }
+    if (flags | 0x8)
+    {				/* quality field is set */
+	toskip += 4;
+    }
+
+    /* Check for LAME Tag */
+    if (fseek (mp3i->file, toskip, SEEK_CUR) || (fread (ubuf, 1, LAME_TAG_SIZE, mp3i->file) != LAME_TAG_SIZE))
+	goto lt_fail;
+    if (strncmp (ubuf, "LAME", 4))
+	goto lt_fail;
+
+    strncpy(lt->encoder, &ubuf[0x0], 4);
+
+    strncpy(lt->version_string, &ubuf[0x4], 5);
+
+    lt->info_tag_revision = (ubuf[0x9] >> 4);
+    lt->vbr_method = (ubuf[0x9] & 0xf);
+    lt->lowpass = ubuf[0xa];
+
+    memcpy(&lt->peak_signal_amplitude,&ubuf[0xb],4);
+    memcpy(&lt->radio_replay_gain,&ubuf[0xf],2);
+    memcpy(&lt->audiophile_replay_gain,&ubuf[0x11],2);
+
+    lt->encoding_flags = ubuf[0x13] >> 4;
+    lt->ath_type = ubuf[0x13] & 0xf;
+
+    lt->bitrate = ubuf[0x14];
+
+    lt->delay = (ubuf[0x15] << 4) + (ubuf[0x16] >> 4);
+    lt->padding = ((ubuf[0x16] & 0xf) << 8) + ubuf[0x17];
+
+    lt->noise_shaping = ubuf[0x18] & 0x3;
+    lt->stereo_mode = (ubuf[0x18] >> 2) & 0x7;
+    lt->unwise_settings = (ubuf[0x18] >> 5) & 0x1;
+    lt->source_sample_frequency = (ubuf[0x18] >> 6) & 0x3;
+
+    lt->mp3_gain = ubuf[0x19];
+
+    lt->surround_info = (ubuf[0x1a] >> 3) & 0x7;
+    lt->preset = ((ubuf[0x1a] & 0x7) << 8) + ubuf[0x1b];
+
+    lt->music_length = parse_lame_uint32(&ubuf[0x1c]);
+
+    lt->music_crc = parse_lame_uint16(&ubuf[0x20]);
+    lt->info_tag_crc = parse_lame_uint16(&ubuf[0x22]);
+
+    lt->calculated_info_tag_crc = crc_compute(full_info_tag, INFO_TAG_CRC_SIZE, 0x0000);
+
+    fclose(file);
+    return (lt->calculated_info_tag_crc == lt->info_tag_crc);
+
+  lt_fail:
+    if (file)
+	fclose(file);
+    return FALSE;
+
+}
+
+
+/* 
+ * mp3_get_track_gapless - read the specified file and calculate gapless
+ * information: totalsamples and gapless_data
+ *
+ * @mp3i: MP3Info of the file; should already have run get_mp3_info() on it
+ * @gd: structure holding gapless information; should have pregap and
+ * 	postgap already filled
+ */
+
+gboolean mp3_get_track_gapless (MP3Info *mp3i, GaplessData *gd)
+{
+    int i;
+
+    g_return_val_if_fail (mp3i, FALSE);
+    g_return_val_if_fail (gd, FALSE);
+
+    /* use get_first_header() to seek to the first mp3 header */
+    get_first_header (mp3i, 0);
+
+    int xing_header_offset = ftell (mp3i->file);
+
+    get_header(mp3i->file, &(mp3i->header));
+
+    int mysamplesperframe = samplesperframe[mp3i->header.version & 1][3 - mp3i->header.layer];
+
+    /* jump to the end of the frame with the xing header */
+    if (fseek (mp3i->file, xing_header_offset + frame_length (&(mp3i->header)), SEEK_SET))
+	goto gp_fail;
+
+    /* counts bytes from the start of the 1st sync frame */
+    int totaldatasize = frame_length (&(mp3i->header));
+
+    /* keeps track of the last 8 frame sizes */
+    int lastframes[8];
+
+    /* counts number of music frames */
+    int totalframes = 0;
+
+    /* quickly parse the file, reading only frame headers */
+    int l = 0;
+    while ((l = get_header (mp3i->file, &(mp3i->header))) != 0)
+    {
+	lastframes[totalframes%8] = l;
+	totaldatasize += l;
+	totalframes++;
+
+	if (fseek (mp3i->file, l - FRAME_HEADER_SIZE, SEEK_CUR))
+	    goto gp_fail;
+    }
+
+    int finaleight = 0;
+    for (i = 0; i < 8; i++)
+    {
+	finaleight += lastframes[i];
+    }
+
+    /* For some reason, iTunes appears to add an extra frames worth of
+     * samples to the samplecount for CBR files.  CBR files don't currently
+     * (2 Jul 07) play gaplessly whether uploaded from iTunes or gtkpod,
+     * even with apparently correct values, but we will attempt to emulate
+     * iTunes' behavior */
+    if (mp3i->vbr == 0) // CBR
+	totalframes++;
+
+    /* all but last eight frames */
+    gd->gapless_data = totaldatasize - finaleight;
+    /* total samples minus pre/postgap */
+    gd->samplecount = totalframes * mysamplesperframe - gd->pregap - gd->postgap;
+
+    return TRUE;
+
+
+  gp_fail:
+    return FALSE;
+
+}
+
+
+/** 
+ * mp3_read_gapless:
+ *
+ * try to read the gapless values from the LAME Tag and set
+ * the track's pregap, postgap, samplecount, and gapless_data fields
+ * accordingly.
+ *
+ * @path: location of the file
+ * @track: structure holding track information
+ *
+ * The function always rereads the data from the file.
+ *
+ * Returns TRUE if all four gapless fields could be
+ * set. etrack->tchanged is set to TRUE if data has been changed,
+ * FALSE otherwise.
+ */
+
+gboolean mp3_read_gapless (gchar *path, Track *track) {
+    MP3Info *mp3i=NULL;
+    FILE *file;
+
+    GaplessData gd;
+    ExtraTrackData *etr;
+
+    g_return_val_if_fail (track, FALSE);
+
+    etr = track->userdata;
+
+    memset (&gd, 0, sizeof (GaplessData));
+
+
+    g_return_val_if_fail (path, FALSE);
+
+    /* Attempt to open the file */
+    file = fopen (path, "r");
+    if (file)
+    {
+	mp3i = g_malloc0 (sizeof (MP3Info));
+	mp3i->filename = path;
+	mp3i->file = file;
+	get_mp3_info (mp3i);
+
+	/* Try the LAME tag for pregap and postgap */
+	LameTag lt;
+	if (mp3_read_lame_tag (path, &lt)) {
+	    gd.pregap = lt.delay;
+	    gd.postgap = lt.padding;
+	} else {
+	    /* insert non-LAME methods of finding pregap and postgap */
+	    fclose(file);
+	    return FALSE;
+	}
+	    
+	mp3_get_track_gapless (mp3i, &gd);
+	    
+	etr->tchanged = FALSE;
+
+	if ((gd.pregap) && (gd.samplecount) && (gd.postgap) && (gd.gapless_data))
+	{
+	    if ((track->pregap != lt.delay) ||
+		(track->samplecount != gd.samplecount) ||
+		(track->postgap != lt.padding) ||
+		(track->gapless_data != gd.gapless_data) ||
+		(track->gapless_track_flag == FALSE))
+	    {
+		etr->tchanged = TRUE;
+		track->pregap = lt.delay;
+		track->samplecount = gd.samplecount;
+		track->postgap = lt.padding;
+		track->gapless_data = gd.gapless_data;
+		track->gapless_track_flag = TRUE;
+	    }
+	}
+	fclose(file);
+	return TRUE;
+    }
+    return FALSE;
+}
+
+
+/* Read ID3 tags of filename @name into track structure @track */
+/* Return value: TRUE if tags could be read, FALSE if an error
+   occured */
+gboolean id3_read_tags (const gchar *name, Track *track)
+{
+    File_Tag filetag;
+
+    g_return_val_if_fail (name && track, FALSE);
+
+    if (id3_tag_read (name, &filetag))
+    {
+	guchar *image_data = NULL;
+	gsize image_data_len = 0;
+
+	if (filetag.album)
+	{
+	    track->album = filetag.album;
+	}
+
+	if (filetag.artist)
+	{
+	    track->artist = filetag.artist;
+	}
+
+	if (filetag.title)
+	{
+	    track->title = filetag.title;
+	}
+
+	if (filetag.genre)
+	{
+	    track->genre = filetag.genre;
+	}
+
+	if (filetag.composer)
+	{
+	    track->composer = filetag.composer;
+	}
+
+	if (filetag.comment)
+	{
+	    track->comment = filetag.comment;
+	}
+
+	if (filetag.podcasturl)
+	{
+	    track->podcasturl = filetag.podcasturl;
+	}
+
+	if (filetag.podcastrss)
+	{
+	    track->podcastrss = filetag.podcastrss;
+	}
+
+	if (filetag.subtitle)
+	{
+	    track->subtitle = filetag.subtitle;
+	}
+
+	if (filetag.description)
+	{
+	    track->description = filetag.description;
+	}
+
+	if (filetag.sort_artist)
+	{
+	    track->sort_artist = filetag.sort_artist;
+	}
+
+	if (filetag.sort_title)
+	{
+	    track->sort_title = filetag.sort_title;
+	}
+
+	if (filetag.sort_album)
+	{
+	    track->sort_album = filetag.sort_album;
+	}
+
+	if (filetag.sort_albumartist)
+	{
+	    track->sort_albumartist = filetag.sort_albumartist;
+	}
+
+	if (filetag.sort_composer)
+	{
+	    track->sort_composer = filetag.sort_composer;
+	}
+
+	if (filetag.year == NULL)
+	{
+	    track->year = 0;
+	}
+	else
+	{
+	    track->year = atoi(filetag.year);
+	    g_free (filetag.year);
+	}
+
+	if (filetag.trackstring == NULL)
+	{
+	    track->track_nr = 0;
+	}
+	else
+	{
+	    track->track_nr = atoi(filetag.trackstring);
+	    g_free (filetag.trackstring);
+	}
+
+	if (filetag.track_total == NULL)
+	{
+	    track->tracks = 0;
+	}
+	else
+	{
+	    track->tracks = atoi(filetag.track_total);
+	    g_free (filetag.track_total);
+	}
+	/* CD/disc number handling */
+	if (filetag.cdnostring == NULL)
+	{
+	    track->cd_nr = 0;
+	}
+	else
+	{
+	    track->cd_nr = atoi(filetag.cdnostring);
+	    g_free (filetag.cdnostring);
+	}
+	
+	if (filetag.cdno_total == NULL)
+	{
+	    track->cds = 0;
+	}
+	else
+	{
+	    track->cds = atoi(filetag.cdno_total);
+	    g_free (filetag.cdno_total);
+	}
+
+	if (filetag.compilation == NULL)
+	{
+	    track->compilation = 0;
+	}
+	else
+	{
+	    track->compilation = atoi(filetag.compilation);
+	    g_free (filetag.compilation);
+	}
+
+	if (filetag.BPM == NULL)
+	{
+	    track->BPM = 0;
+	}
+	else
+	{
+	    track->BPM = atoi(filetag.BPM);
+	    g_free (filetag.BPM);
+	}
+
+	if (filetag.lyrics)
+	{
+	    track->lyrics_flag = 0x01;
+	    g_free (filetag.lyrics);
+	}
+	else
+	{
+	    track->lyrics_flag = 0x00;
+	}
+
+	if (prefs_get_int("coverart_apic") &&
+	    (id3_apic_read (name, &image_data, &image_data_len) == TRUE))
+	{
+	    if (image_data)
+	    {
+		gp_track_set_thumbnails_from_data (track,
+						   image_data,
+						   image_data_len);
+		g_free (image_data);
+	    }
+	}
+	return TRUE;
+    }
+    return FALSE;
+}
+    
+
+/* ----------------------------------------------------------------------
+
+	      From here starts original gtkpod code
+
+---------------------------------------------------------------------- */
+
+/* Return a Track structure with all information read from the mp3
+   file filled in */
+Track *mp3_get_file_info (gchar *name)
+{
+    Track *track = NULL;
+    MP3Info *mp3i=NULL;
+    FILE *file;
+
+    g_return_val_if_fail (name, NULL);
+
+    /* Attempt to open the file */
+    file = fopen (name, "r");
+    if (file)
+    {
+	mp3i = g_malloc0 (sizeof (MP3Info));
+	mp3i->filename = name;
+	mp3i->file = file;
+	get_mp3_info (mp3i);
+	mp3i->file = NULL;
+	fclose (file);
+    }
+    else
+    {
+	gchar *fbuf = charset_to_utf8 (name);
+    	gtkpod_warning(_("ERROR while opening file: '%s' (%s).\n"),
+		       fbuf, g_strerror(errno));
+	g_free (fbuf);
+	return NULL;
+    }
+
+    track = gp_track_new ();
+    track->filetype = g_strdup ("MPEG audio file");
+
+    if (prefs_get_int("readtags"))
+    {
+	id3_read_tags (name, track);
+    }
+
+    mp3_read_soundcheck (name, track);
+
+    mp3_read_gapless (name, track);
+
+    /* Get additional info (play time and bitrate */
+    if (mp3i)
+    {
+	track->tracklen = mp3i->milliseconds;
+	track->bitrate = (gint)(mp3i->vbr_average);
+ 	track->samplerate = mp3file_header_frequency (&mp3i->header);
+	g_free (mp3i);
+    }
+    /* Fall back to xmms code if tracklen is 0 */
+    if (track->tracklen == 0)
+    {
+	track->tracklen = get_track_time (name);
+	if (track->tracklen)
+	    track->bitrate = (float)track->size*8/track->tracklen;
+    }
+
+    if (track->tracklen == 0)
+    {
+	/* Tracks with zero play length are ignored by iPod... */
+	gtkpod_warning (_("File \"%s\" has zero play length. Ignoring.\n"),
+			name);
+	gp_track_free (track);
+	track = NULL;
+    }
+    return track;
+}

Added: trunk/src/mp3file.h
===================================================================
--- trunk/src/mp3file.h	                        (rev 0)
+++ trunk/src/mp3file.h	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,41 @@
+/* Time-stamp: <2007-07-14 15:55:29 jcs>
+|
+|  Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: mp3file.h 1646 2007-07-14 06:58:44Z jcsjcs $
+*/
+
+#ifndef MP3FILEH_INCLUDED
+#define MP3FILEH_INCLUDED 1
+
+#include "itdb.h"
+
+gboolean mp3_write_file_info (gchar *filename, Track *track);
+Track *mp3_get_file_info (gchar *name);
+gboolean mp3_read_soundcheck (gchar *path, Track *track);
+gboolean mp3_read_gapless (gchar *path, Track *track);
+
+gboolean id3_read_tags (const gchar *name, Track *track);
+#endif

Added: trunk/src/mp4file.c
===================================================================
--- trunk/src/mp4file.c	                        (rev 0)
+++ trunk/src/mp4file.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,568 @@
+/* Time-stamp: <2007-06-23 02:49:08 jcs>
+|
+|  Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: mp4file.c 1740 2007-10-27 02:48:08Z jcsjcs $
+*/
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "charset.h"
+#include "itdb.h"
+#include "misc.h"
+#include "prefs.h"
+#include "mp4file.h"
+
+
+
+/* ------------------------------------------------------------
+
+   Info on how to implement new file formats.
+
+   You need to supply a function
+
+   Track *xxx_get_file_info (gchar *filename)
+
+   that returns a new Track structure with as many of the following
+   fields filled in (in UTF8):
+
+   gchar   *album;            /+ album (utf8)          +/
+   gchar   *artist;           /+ artist (utf8)         +/
+   gchar   *title;            /+ title (utf8)          +/
+   gchar   *genre;            /+ genre (utf8)          +/
+   gchar   *comment;          /+ comment (utf8)        +/
+   gchar   *composer;         /+ Composer (utf8)       +/
+   gchar   *filetype;         /+ Format description (utf8)   +/
+   gchar   *charset;          /+ charset used for tags       +/
+   gchar   *description;      /+ Description text (podcasts) +/
+   gchar   *podcasturl;       /+ URL/Title (podcasts)        +/
+   gchar   *podcastrss;       /+ Podcast RSS                 +/
+   gchar   *subtitle;         /+ Subtitle (podcasts)         +/
+   guint32 time_released;     /+ For podcasts: release date as
+				 displayed next to the title in the
+				 Podcast playlist  +/
+   gint32  cd_nr;             /+ CD number             +/
+   gint32  cds;               /+ number of CDs         +/
+   gint32  track_nr;          /+ track number          +/
+   gint32  tracks;            /+ number of tracks      +/
+   gint32  year;              /+ year                  +/
+   gint32  tracklen;          /+ Length of track in ms +/
+   gint32  bitrate;           /+ bitrate in kbps       +/
+   guint16 samplerate;        /+ e.g.: CD is 44100     +/
+   guint32 peak_signal;	      /+ LAME Peak Signal * 0x800000         +/
+   gboolean compilation;      /+ Track is part of a compilation CD   +/
+   gboolean lyrics_flag;
+   gint16 bpm;
+
+   If prefs_get_int("readtags") returns FALSE you only should fill in
+   tracklen, bitrate, samplerate, soundcheck and filetype
+
+   If prefs_get_int("coverart_apic") returns TRUE you should try to
+   read APIC coverart data from the tags and set it with
+   gp_set_thumbnails_from_data().
+
+   Please note that the iPod will only play as much of the track as
+   specified in "tracklen".
+
+   You don't have to fill in the value for charset if you use the
+   default charset (i.e. you use charset_to_utf8() to convert to
+   UTF8). Otherwise please specify the charset used.
+
+   When an error occurs, the function returns NULL and logs an error
+   message using gtkpod_warning().
+
+   You need to add your handler to get_track_info_from_file() in
+   file.c
+
+
+   You also have to write a function to write TAGs back to the
+   file. That function should be named
+
+   gboolean xxx_write_file_info (gchar *filename, Track *track)
+
+   and return TRUE on success or FALSE on error. In that case it
+   should log an error message using gtkpod_warning().
+
+   You need to add your handler to file_write_info() in file.c
+
+
+   Finally, you may want to provide a function that can
+   read and set the soundcheck field: 
+
+   gboolean xxx_read_soundcheck (gchar *filename, Track *track)
+
+   and return TRUE when the soundcheck value could be determined.
+
+   You need to add your handler to read_soundcheck() in file.c.
+
+   ------------------------------------------------------------ */
+
+
+
+#ifdef HAVE_LIBMP4V2
+/* Use mp4v2 from the mpeg4ip project to handle mp4 (m4a, m4p, m4b) files
+   (http://mpeg4ip.sourceforge.net/) */
+/* Copyright note: code for mp4_get_file_info() is based on
+ * mp4info.cpp of the mpeg4ip project */
+
+/* define metadata bug is present (see note at mp4_write_file_info()) */
+#define MP4V2_HAS_METADATA_BUG TRUE
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <inttypes.h>
+#include <stdlib.h>
+#include <string.h>
+#include "mp4.h"
+
+#ifndef FREEFORM_ACCEPTS_EXTRA_ARG
+/* Version 1.6 of libmp4v2 introduces an index argument for MP4GetMetadataFreeForm. For C++ sources it defaults
+   to 0, but in C we have to specify it on our own. 
+*/
+#define MP4GetMetadataFreeForm(mp4File, name, pValue, pValueSize, owner)  MP4GetMetadataFreeForm(mp4File, name, pValue, pValueSize)
+#endif
+
+#ifndef COVERART_ACCEPTS_EXTRA_ARG
+/* Version 1.6 of libmp4v2 introduces an index argument for MP4GetMetadataCoverart. For C++ sources it defaults
+   to NULL, but in C we have to specify it on our own. 
+*/
+#define MP4GetMetadataCoverArt(hFile, coverArt, size, index) MP4GetMetadataCoverArt(hFile, coverArt, size)
+#endif
+
+static gboolean mp4_scan_soundcheck (MP4FileHandle mp4File, Track *track)
+{
+    gboolean success = FALSE;
+    u_int8_t *ppValue;
+    u_int32_t pValueSize;
+
+
+    g_return_val_if_fail (mp4File != MP4_INVALID_FILE_HANDLE, FALSE);
+
+    if (MP4GetMetadataFreeForm(mp4File, "iTunNORM",
+			       &ppValue, &pValueSize, NULL))
+    {
+	gchar *str;
+	guint sc1=0, sc2=0;
+	str = g_malloc0((pValueSize+1)*sizeof(gchar));
+	memcpy(str, ppValue, pValueSize*sizeof(gchar));
+	/* This field consists of a number of hex numbers
+	   represented in ASCII, e.g. " 00000FA7 00000B3F
+	   000072CF 00006AB6 0001CF53 00016310 0000743A
+	   00007C1F 00023DD5 000162E2". iTunes seems to
+	   choose the larger one of the first two numbers
+	   as the value for track->soundcheck */
+	sscanf (str, "%x %x", &sc1, &sc2);
+	g_free (str);
+	if (sc1 > sc2)
+	    track->soundcheck = sc1;
+	else
+	    track->soundcheck = sc2;
+	success = TRUE;
+    }
+
+    if (MP4GetMetadataFreeForm(mp4File, "replaygain_track_gain",
+			       &ppValue, &pValueSize, NULL))
+    {
+	gchar *str;
+	gdouble rg;
+	str = g_malloc0((pValueSize+1)*sizeof(gchar));
+	memcpy(str, ppValue, pValueSize*sizeof(gchar));
+	rg = g_strtod (str, NULL);
+	track->soundcheck = replaygain_to_soundcheck (rg);
+	g_free (str);
+
+	success = TRUE;
+    }
+
+    return success;
+}
+
+
+gboolean mp4_read_soundcheck (gchar *mp4FileName, Track *track)
+{
+    gboolean success = FALSE;
+    MP4FileHandle mp4File;
+
+    g_return_val_if_fail (mp4FileName, FALSE);
+    g_return_val_if_fail (track, FALSE);
+
+    mp4File = MP4Read(mp4FileName, 0);
+
+    if (mp4File != MP4_INVALID_FILE_HANDLE)
+    {
+	MP4TrackId trackId;
+	const char *trackType;
+	u_int32_t track_cur, tracks_num;
+	gboolean audio_or_video_found = FALSE;
+
+	tracks_num = MP4GetNumberOfTracks (mp4File, NULL,  0);
+
+	for (track_cur=0; track_cur < tracks_num; ++track_cur)
+	{
+	    trackId = MP4FindTrackId(mp4File, track_cur, NULL, 0);
+	    trackType = MP4GetTrackType(mp4File, trackId);
+
+	    if (trackType &&
+		((strcmp(trackType, MP4_AUDIO_TRACK_TYPE) == 0) ||
+		 (strcmp(trackType, MP4_VIDEO_TRACK_TYPE) == 0) ||
+		 (strcmp(trackType, MP4_OD_TRACK_TYPE) == 0)))
+	    {
+		audio_or_video_found = TRUE;
+		success = mp4_scan_soundcheck (mp4File, track);
+	    }
+	    if (audio_or_video_found) break;
+	}
+	if (!audio_or_video_found)
+	{
+	    gchar *filename = charset_to_utf8 (mp4FileName);
+	    gtkpod_warning (
+		_("'%s' does not appear to be a mp4 audio or video file.\n"),
+		filename);
+	    g_free (filename);
+	}
+	MP4Close(mp4File);
+    }
+    else
+    {
+	gchar *filename = charset_to_utf8 (mp4FileName);
+	gtkpod_warning (
+	    _("Could not open '%s' for reading, or file is not an mp4 file.\n"),
+	    filename);
+	g_free (filename);
+    }
+
+    return success;
+}
+
+
+
+Track *mp4_get_file_info (gchar *mp4FileName)
+{
+    Track *track = NULL;
+    MP4FileHandle mp4File;
+
+    g_return_val_if_fail (mp4FileName, NULL);
+
+    mp4File = MP4Read(mp4FileName, 0);
+
+    if (mp4File != MP4_INVALID_FILE_HANDLE)
+    {
+	MP4TrackId trackId;
+	const char *trackType;
+	u_int32_t track_cur, tracks_num;
+	gboolean audio_or_video_found = FALSE;
+/*	gboolean artwork_found = FALSE; not used yet */
+
+	tracks_num = MP4GetNumberOfTracks (mp4File, NULL,  0);
+
+	for (track_cur=0; track_cur < tracks_num; ++track_cur)
+	{
+	    trackId = MP4FindTrackId(mp4File, track_cur, NULL, 0);
+	    trackType = MP4GetTrackType(mp4File, trackId);
+	    if (trackType &&
+		(audio_or_video_found == FALSE) &&
+		((strcmp(trackType, MP4_AUDIO_TRACK_TYPE) == 0) ||
+		 (strcmp(trackType, MP4_VIDEO_TRACK_TYPE) == 0) ||
+		 (strcmp(trackType, MP4_OD_TRACK_TYPE) == 0)))
+	    {
+		gchar *value;
+		guint16 numvalue, numvalue2;
+		MP4Duration trackDuration = MP4GetTrackDuration(mp4File, trackId);
+		double msDuration = 
+		    (double)MP4ConvertFromTrackDuration(mp4File, trackId,
+							trackDuration,
+							MP4_MSECS_TIME_SCALE);
+		guint32 avgBitRate = MP4GetTrackBitRate(mp4File, trackId);
+		guint32 samplerate = MP4GetTrackTimeScale(mp4File, trackId);
+		
+		track = gp_track_new ();
+		
+		track->tracklen = msDuration;
+		track->bitrate = avgBitRate/1000;
+		track->samplerate = samplerate;
+		value = strrchr (mp4FileName, '.');
+		if (value)
+		{
+		    if (g_strcasecmp (value, ".m4a") == 0)
+			track->filetype = g_strdup ("AAC audio file");
+		    if (g_strcasecmp (value, ".m4p") == 0)
+			track->filetype = g_strdup ("Protected AAC audio file");
+		    if (g_strcasecmp (value, ".m4b") == 0)
+			track->filetype = g_strdup ("AAC audio book file");
+		    if (g_strcasecmp (value, ".mp4") == 0)
+			track->filetype = g_strdup ("MP4 video file");
+		}
+		if (prefs_get_int("readtags"))
+		{
+		    if (MP4GetMetadataName(mp4File, &value) && value != NULL)
+		    {
+			track->title = charset_to_utf8 (value);
+			g_free(value);
+		    }
+		    if (MP4GetMetadataArtist(mp4File, &value) && value != NULL)
+		    {
+			track->artist = charset_to_utf8 (value);
+			g_free(value);
+		    }
+		    if (MP4GetMetadataWriter(mp4File, &value) && value != NULL)
+		    {
+			track->composer = charset_to_utf8 (value);
+			g_free(value);
+		    }
+		    if (MP4GetMetadataComment(mp4File, &value) && value != NULL)
+		    {
+			track->comment = charset_to_utf8 (value);
+			g_free(value);
+		    }
+		    if (MP4GetMetadataYear(mp4File, &value) && value != NULL)
+		    {
+			track->year = atoi (value);
+			g_free(value);
+		    }
+		    if (MP4GetMetadataAlbum(mp4File, &value) && value != NULL)
+		    {
+			track->album = charset_to_utf8 (value);
+			g_free(value);
+		    }
+		    if (MP4GetMetadataTrack(mp4File, &numvalue, &numvalue2))
+		    {
+			track->track_nr = numvalue;
+			track->tracks = numvalue2;
+		    }
+		    if (MP4GetMetadataDisk(mp4File, &numvalue, &numvalue2))
+		    {
+			track->cd_nr = numvalue;
+			track->cds = numvalue2;
+		    }
+		    if (MP4GetMetadataGrouping(mp4File, &value) && value != NULL)
+		    {
+			track->grouping = charset_to_utf8 (value);
+			g_free (value);
+		    }
+		    if (MP4GetMetadataGenre(mp4File, &value) && value != NULL)
+		    {
+			track->genre = charset_to_utf8 (value);
+			g_free(value);
+		    }
+		    if (MP4GetMetadataTempo (mp4File, &numvalue))
+		    {
+			track->BPM = numvalue;
+		    }
+		}
+		mp4_scan_soundcheck (mp4File, track);
+		audio_or_video_found = TRUE;
+
+		if (prefs_get_int("coverart_apic"))
+		{
+		    u_int8_t *image_data;
+		    u_int32_t image_data_len;
+		    if (MP4GetMetadataCoverArt (mp4File,
+						&image_data, &image_data_len, 0))
+		    {
+			if (image_data)
+			{
+/*			    FILE *file = fopen ("/tmp/tttt", "w");
+			    fwrite (image_data, 1, image_data_len, file);
+			    fclose (file);*/
+			    gp_track_set_thumbnails_from_data (track,
+							       image_data,
+							       image_data_len);
+			    g_free (image_data);
+			}
+		    }
+		}
+	    }
+	}
+	if (!audio_or_video_found)
+	{
+	    gchar *filename = charset_to_utf8 (mp4FileName);
+	    gtkpod_warning (
+		_("'%s' does not appear to be a mp4 audio or video file.\n"),
+		filename);
+	    g_free (filename);
+	}
+	MP4Close(mp4File);
+    }
+    else
+    {
+	gchar *filename = charset_to_utf8 (mp4FileName);
+	gtkpod_warning (
+	    _("Could not open '%s' for reading, or file is not an mp4 file.\n"),
+	    filename);
+	g_free (filename);
+    }
+
+    return track;
+}
+
+
+gboolean mp4_write_file_info (gchar *mp4FileName, Track *track)
+{
+    gboolean result = TRUE;
+    MP4FileHandle mp4File = MP4Modify(mp4FileName, 0, FALSE);
+
+    if (mp4File != MP4_INVALID_FILE_HANDLE)
+    {
+	MP4TrackId trackId;
+	const char *trackType;
+
+	trackId = MP4FindTrackId(mp4File, 0, NULL, 0);
+	trackType = MP4GetTrackType(mp4File, trackId);
+	if (trackType && ((strcmp(trackType, MP4_AUDIO_TRACK_TYPE) == 0)||(strcmp(trackType, MP4_VIDEO_TRACK_TYPE) == 0)))
+	{
+	    gchar *value;
+
+#if MP4V2_HAS_METADATA_BUG
+	    /* It could have been so easy. But: due to a bug in mp4v2
+	     * you have to delete all meta data before modifying
+	     * it. Therefore we have to read it first to avoid data
+	     * loss. (Bug present in mpeg4ip-1.0RC1.) */
+/*	    gchar *m_name = NULL, *m_artist = NULL;
+	    gchar *m_writer = NULL, *m_comment = NULL;
+	    gchar *m_year = NULL;
+	    gchar *m_album = NULL, *m_genre = NULL;*/
+	    gchar *m_tool = NULL;
+/*	    guint16 m_track, m_tracks, m_disk, m_disks; */
+	    guint16 m_tempo;
+	    guint8 *m_covert = NULL, m_cpl;
+	    guint32 m_size;
+/*	    gboolean has_track = MP4GetMetadataTrack (mp4File,
+						      &m_track, &m_tracks);
+	    gboolean has_disk = MP4GetMetadataDisk (mp4File,
+	    &m_disk, &m_disks);*/
+	    gboolean has_tempo = MP4GetMetadataTempo (mp4File,
+						      &m_tempo);
+	    gboolean has_compilation = MP4GetMetadataCompilation (mp4File,
+								  &m_cpl);
+/*	    MP4GetMetadataName (mp4File, &m_name);
+	    MP4GetMetadataArtist (mp4File, &m_artist);
+	    MP4GetMetadataWriter (mp4File, &m_writer);
+	    MP4GetMetadataComment (mp4File, &m_comment);
+	    MP4GetMetadataYear (mp4File, &m_year);
+	    MP4GetMetadataAlbum (mp4File, &m_album);
+	    MP4GetMetadataGenre (mp4File, &m_genre);*/
+	    MP4GetMetadataTool (mp4File, &m_tool);
+	    MP4GetMetadataCoverArt (mp4File, &m_covert, &m_size, 0);
+	    MP4MetadataDelete (mp4File);
+#endif
+	    value = charset_from_utf8 (track->title);
+	    MP4SetMetadataName (mp4File, value);
+	    g_free (value);
+
+	    value = charset_from_utf8 (track->artist);
+	    MP4SetMetadataArtist (mp4File, value);
+	    g_free (value);
+
+	    value = charset_from_utf8 (track->composer);
+	    MP4SetMetadataWriter (mp4File, value);
+	    g_free (value);
+
+	    value = charset_from_utf8 (track->comment);
+	    MP4SetMetadataComment (mp4File, value);
+	    g_free (value);
+
+	    value = g_strdup_printf ("%d", track->year);
+	    MP4SetMetadataYear (mp4File, value);
+	    g_free (value);
+
+	    value = charset_from_utf8 (track->album);
+	    MP4SetMetadataAlbum (mp4File, value);
+	    g_free (value);
+
+	    MP4SetMetadataTrack (mp4File, track->track_nr, track->tracks);
+
+	    MP4SetMetadataDisk (mp4File, track->cd_nr, track->cds);
+
+	    MP4SetMetadataTempo (mp4File, track->BPM);
+
+	    value = charset_from_utf8 (track->grouping);
+	    MP4SetMetadataGrouping (mp4File, value);
+	    g_free (value);
+
+	    value = charset_from_utf8 (track->genre);
+	    MP4SetMetadataGenre (mp4File, value);
+	    g_free (value);
+
+#if MP4V2_HAS_METADATA_BUG
+	    if (has_tempo) MP4SetMetadataTempo (mp4File, m_tempo);
+	    if (has_compilation) MP4SetMetadataCompilation (mp4File, m_cpl);
+	    if (m_tool)     MP4SetMetadataTool (mp4File, m_tool);
+	    if (m_covert)   MP4SetMetadataCoverArt (mp4File, m_covert, m_size);
+/*	    g_free (m_name);
+	    g_free (m_artist);
+	    g_free (m_writer);
+	    g_free (m_comment);
+	    g_free (m_year);
+	    g_free (m_album);
+	    g_free (m_genre);*/
+	    g_free (m_tool);
+	    g_free (m_covert);
+#endif
+	}
+	else
+	{
+	    gchar *filename = charset_to_utf8 (mp4FileName);
+	    gtkpod_warning (_("'%s' does not appear to be a mp4 audio file.\n"),
+			    filename);
+	    g_free (filename);
+	    result = FALSE;
+	}
+	MP4Close (mp4File);
+    }
+    else
+    {
+	gchar *filename = charset_to_utf8 (mp4FileName);
+	gtkpod_warning (
+	    _("Could not open '%s' for writing, or file is not an mp4 file.\n"),
+	    filename);
+	g_free (filename);
+	result = FALSE;
+    }
+
+    return result;
+}
+
+#else
+/* We don't support mp4 without the mp4v2 library */
+Track *mp4_get_file_info (gchar *name)
+{
+    gtkpod_warning (_("Import of '%s' failed: m4a/m4p/m4b not supported without the mp4v2 library. You must compile the gtkpod source together with the mp4v2 library.\n"), name);
+    return NULL;
+}
+
+gboolean mp4_write_file_info (gchar *filename, Track *track)
+{
+    gtkpod_warning (_("m4a/m4p/m4b metadata update for '%s' failed: m4a/m4p/m4b not supported without the mp4v2 library. You must compile the gtkpod source together with the mp4v2 library.\n"), filename);
+    return FALSE;
+}
+
+gboolean mp4_read_soundcheck (gchar *filename, Track *track)
+{
+    gtkpod_warning (_("m4a/m4p/m4b soundcheck update for '%s' failed: m4a/m4p/m4b not supported without the mp4v2 library. You must compile the gtkpod source together with the mp4v2 library.\n"), filename);
+    return FALSE;
+}
+#endif

Added: trunk/src/mp4file.h
===================================================================
--- trunk/src/mp4file.h	                        (rev 0)
+++ trunk/src/mp4file.h	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,38 @@
+/* Time-stamp: <2006-06-11 14:39:42 jcs>
+|
+|  Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: mp4file.h 829 2006-06-11 16:04:51Z jcsjcs $
+*/
+
+#ifndef MP4FILEH_INCLUDED
+#define MP4FILEH_INCLUDED 1
+
+#include "itdb.h"
+
+gboolean mp4_write_file_info (gchar *filename, Track *track);
+Track *mp4_get_file_info (gchar *name);
+gboolean mp4_read_soundcheck (gchar *filename, Track *track);
+#endif

Added: trunk/src/oggfile.c
===================================================================
--- trunk/src/oggfile.c	                        (rev 0)
+++ trunk/src/oggfile.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,163 @@
+/* Time-stamp: <2007-06-18 00:48:50 jcs>
+|
+|  Copyright (C) 2007 Marc d[r]eadlock <m.dreadlock at gmail com>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: oggfile.c 1553 2007-06-17 15:51:24Z jcsjcs $
+*/
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "charset.h"
+#include "itdb.h"
+#include "misc.h"
+#include "oggfile.h"
+
+/* Info on how to implement new file formats: see mp3file.c for more info */
+
+#ifdef HAVE_LIBVORBISFILE
+/* Ogg/Vorbis library (www.xiph.org) */
+#include <sys/types.h>
+#include <sys/param.h>
+#include <inttypes.h>
+#include <stdlib.h>
+#include <string.h>
+#include "vorbis/vorbisfile.h"
+#include "prefs.h"
+
+Track *ogg_get_file_info (gchar *oggFileName)
+{
+    Track *track = NULL;
+    FILE *file= NULL;
+
+    file=fopen(oggFileName, "rb");
+    
+    if (file == NULL)
+    {
+	gchar *filename = charset_to_utf8 (oggFileName);
+	gtkpod_warning (
+	    _("Could not open '%s' for reading.\n"),
+	    filename);
+	g_free (filename);
+    }
+    else
+    {
+        OggVorbis_File oggFile;
+        if (ov_open(file, &oggFile, NULL , 0)!=0)
+        {
+	    gchar *filename=NULL;
+            filename= charset_to_utf8 (oggFileName);
+	    gtkpod_warning (_("'%s' does not appear to be an ogg audio file.\n"),
+			    filename);
+	    g_free (filename);
+	    fclose(file);
+	}
+        else
+        {
+	    track = gp_track_new ();
+	    track->description = g_strdup ("OGG audio file");
+            vorbis_info *vi=ov_info(&oggFile,-1);
+            /*FIXME: if (!vi) */
+            track->bitrate=vi->bitrate_nominal/1000;
+            track->samplerate=vi->rate;
+            track->tracklen=(ov_time_total(&oggFile,-1))*1000; /* in seconds */
+	    if (prefs_get_int("readtags"))
+	    {
+                vorbis_comment *vc=ov_comment(&oggFile,-1);
+                if (vc) {
+                    char *str;
+                    if ((str=vorbis_comment_query(vc,"artist",0))!=NULL){
+                        track->artist=charset_to_utf8(str);
+                    }
+                    if ((str=vorbis_comment_query(vc,"album",0))!=NULL){
+                        track->album=charset_to_utf8(str);
+                    }
+                    if ((str=vorbis_comment_query(vc,"title",0))!=NULL){
+                        track->title=charset_to_utf8(str);
+                    }
+                    if ((str=vorbis_comment_query(vc,"genre",0))!=NULL){
+                        track->genre=charset_to_utf8(str);
+                    }
+                    if ((str=vorbis_comment_query(vc,"year",0))!=NULL){
+                        track->year=atoi(str);
+                    }
+                    if ((str=vorbis_comment_query(vc,"tracknumber",0))!=NULL){
+		        track->track_nr = atoi(str);
+                    }
+                    if ((str=vorbis_comment_query(vc,"composer",0))!=NULL){
+		        track->composer = charset_to_utf8(str);
+                    }
+                    if ((str=vorbis_comment_query(vc,"comment",0))!=NULL){
+		        track->comment = charset_to_utf8(str);
+                    }
+                    if ((str=vorbis_comment_query(vc,"tracks",0))!=NULL){
+		        track->tracks = atoi(str);
+                    }
+                    if ((str=vorbis_comment_query(vc,"cdnr",0))!=NULL){
+		        track->cd_nr = atoi(str);
+                    }
+                    if ((str=vorbis_comment_query(vc,"cds",0))!=NULL){
+		        track->cds = atoi(str);
+                    }
+		    /* I'm not sure if "bpm" is correct */ 
+                    if ((str=vorbis_comment_query(vc,"bpm",0))!=NULL){
+		        track->BPM = atoi(str);
+                    }
+                }
+                    
+            }
+            ov_clear(&oggFile); /* performs the fclose(file); */
+            /* TODO: immediate conversion if thread ? */
+	}
+    }
+    
+    return track;
+}
+
+gboolean ogg_write_file_info (gchar *oggFileName, Track *track)
+{
+    gboolean result=FALSE;
+    /*FIXME: seems to be not easy with common API. all other projects 
+     * are using vcedit.ch from vorbis-tools (vorbiscomment). Maybe 
+     * using a library could help. LibTag looks good... */
+    printf("Not supported yet\n");
+    return result;
+}
+
+#else
+/* We don't support ogg without the vorbisfile library */
+Track *ogg_get_file_info (gchar *name)
+{
+    gtkpod_warning (_("Import of '%s' failed: ogg not supported without the ogg library. You must compile the gtkpod source together with the ogg library.\n"), name);
+    return NULL;
+}
+
+gboolean ogg_write_file_info (gchar *filename, Track *track)
+{
+    gtkpod_warning (_("ogg metadata update for '%s' failed: ogg not supported without the ogg library. You must compile the gtkpod source together with the ogg library.\n"), filename);
+    return FALSE;
+}
+#endif

Added: trunk/src/oggfile.h
===================================================================
--- trunk/src/oggfile.h	                        (rev 0)
+++ trunk/src/oggfile.h	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,36 @@
+/* Time-stamp: <2005-01-07 23:51:33 jcs>
+|
+|  Copyright (C) 2002-2003 Jorg Schuler <jcsjcs at users.sourceforge.net>
+|  Part of the gtkpod project.
+|
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: oggfile.h 954 2007-01-16 09:45:00Z jcsjcs $
+*/
+
+#ifndef OGGFILEH_INCLUDED
+#define OGGFILEH_INCLUDED 1
+
+#include "itdb.h"
+
+gboolean ogg_write_file_info (gchar *filename, Track *track);
+Track *ogg_get_file_info (gchar *name);
+#endif

Added: trunk/src/podcast.c
===================================================================
--- trunk/src/podcast.c	                        (rev 0)
+++ trunk/src/podcast.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,29 @@
+/* Time-stamp: <2006-05-21 12:26:45 jcs>
+|
+|  Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+|
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: podcast.c 756 2006-05-21 03:46:45Z jcsjcs $
+*/
+

Added: trunk/src/podcast.h
===================================================================
--- trunk/src/podcast.h	                        (rev 0)
+++ trunk/src/podcast.h	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,33 @@
+/* Time-stamp: <2006-05-21 12:26:46 jcs>
+|
+|  Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+|
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: podcast.h 756 2006-05-21 03:46:45Z jcsjcs $
+*/
+
+#ifndef __PODCAST_H__
+#define __PODCAST_H__
+
+#endif

Added: trunk/src/prefs.c
===================================================================
--- trunk/src/prefs.c	                        (rev 0)
+++ trunk/src/prefs.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,2324 @@
+/*
+|  Copyright (C) 2002-2007 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Copyright (C) 2006 James Liggett <jrliggett at cox.net>
+|  Part of the gtkpod project.
+|
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: prefs.c 1776 2007-11-12 22:38:00Z phantom_sf $
+*/
+
+/* -------------------------------------------------------------------
+ *
+ * HOWTO add a new_option to the prefs dialog
+ *
+ * - add the desired option to the prefs window using glade-2
+ *
+ * - set the default value of new_option in set_default_preferences() in prefs.c
+ *
+ * - add a callback on_new_option_*() to prefs_windows.c to set the
+ *   new value.
+ *   The value is applied to the actual prefs when pressing the "OK"
+ *   or "Apply" button in the prefs window.
+ *
+ * - add code to prefs_window_create() in prefs_window.c to set the
+ *   correct state of the option in the prefs window.
+ *
+ * - if you want new_option to be a command line option as well, add
+ *   code to usage() and read_commandline().
+ *
+ * - for environment variables, add code to read_environment().
+ *
+ * ---------------------------------------------------------------- */
+
+/* ----------------------------------------------------------------
+ *
+ * The prefs module should be thread safe. The hash table is locked
+ * before each read or write access.
+ *
+ * The temp_prefs module is not thread-safe. If necessary a locking
+ * mechanism can be implemented.
+ *
+ * ---------------------------------------------------------------- */
+
+
+
+
+/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>.
+   Ditto for AIX 3.2 and <stdlib.h>.  */
+#ifndef _NO_PROTO
+# define _NO_PROTO
+#endif
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <glib/gstdio.h>
+#ifdef HAVE_GETOPT_LONG_ONLY
+#  include <getopt.h>
+#else
+#  include "getopt.h"
+#endif
+
+#include "clientserver.h"
+#include "misc.h"
+#include "prefs.h"
+
+/*
+ * Data global to this module only
+ */
+
+/* End-of-list marker for variable-length lists */
+#define LIST_END_MARKER "----++++----"
+
+struct temp_prefs_save
+{
+    GIOChannel *gio;
+    GError **error;
+    gboolean success;
+};
+
+struct sub_data
+{
+    TempPrefs *temp_prefs;
+    TempPrefs *temp_prefs_orig;
+    const gchar *subkey;
+    const gchar *subkey2;
+    gboolean exists;
+};
+
+/* Pointer to preferences hash table */
+static GHashTable *prefs_table = NULL;
+static GMutex *prefs_table_mutex = NULL;
+
+/*
+ * Functions used by this module only
+ */
+void discard_prefs (void);
+
+/* Different paths that can be set in the prefs window */
+typedef enum
+{
+    PATH_PLAY_NOW = 0,
+    PATH_PLAY_ENQUEUE,
+    PATH_MP3GAIN,
+    PATH_SYNC_CONTACTS,
+    PATH_SYNC_CALENDAR,
+    PATH_MSERV_MUSIC_ROOT,
+    PATH_MSERV_TRACKINFO_ROOT,
+    PATH_SYNC_NOTES,
+    PATH_AACGAIN,
+    PATH_NUM
+} PathType;
+
+/* enum for reading of options */
+enum {
+  GP_HELP,
+  GP_PLAYCOUNT,
+  GP_MOUNT,
+  GP_PRINT_HASH,
+};
+
+
+/* Lock the prefs table. If the table is already locked the calling
+ * thread will remain blocked until the lock is released by the other thread. */
+static void lock_prefs_table ()
+{
+    g_return_if_fail (prefs_table_mutex);
+    g_mutex_lock (prefs_table_mutex);
+}
+
+/* Unlock the prefs table again. */
+static void unlock_prefs_table ()
+{
+    g_return_if_fail (prefs_table_mutex);
+    g_mutex_unlock (prefs_table_mutex);
+}
+
+
+/* Set default preferences */
+static void set_default_preferences()
+{
+    int i;
+    gchar *str;
+
+    prefs_set_int("update_existing", FALSE);
+    prefs_set_int("id3_write", FALSE);
+    prefs_set_int("id3_write_id3v24", FALSE);
+    prefs_set_int(KEY_SYNC_DELETE_TRACKS, TRUE);
+    prefs_set_int(KEY_SYNC_CONFIRM_DELETE, TRUE);
+    prefs_set_int(KEY_SYNC_SHOW_SUMMARY, TRUE);
+    prefs_set_int("show_duplicates", TRUE);
+    prefs_set_int("show_non_updated", TRUE);
+    prefs_set_int("show_updated", TRUE);
+    prefs_set_int("photo_library_confirm_delete", TRUE);
+    prefs_set_int("mserv_report_probs", TRUE);
+    prefs_set_int("delete_ipod", TRUE);
+    prefs_set_int("delete_file", TRUE);
+    prefs_set_int("delete_local_file", TRUE);
+    prefs_set_int("delete_database", TRUE);
+    prefs_set_string("initial_mountpoint", "/mnt/ipod");
+    prefs_set_string ("path_play_now", "xmms %s");
+    prefs_set_string ("path_play_enqueue", "xmms -e %s");
+    prefs_set_string ("path_mserv_trackinfo_root", "/var/lib/mserv/trackinfo/");
+
+    str = g_build_filename (SCRIPTDIR, "convert-ogg2mp3.sh", NULL);
+    prefs_set_string ("path_conv_ogg", str);
+    g_free (str);
+    prefs_set_int ("convert_ogg", TRUE);
+
+    str = g_build_filename (SCRIPTDIR, "convert-flac2mp3.sh", NULL);
+    prefs_set_string ("path_conv_flac", str);
+    g_free (str);
+    prefs_set_int ("convert_flac", TRUE);
+
+    str = g_build_filename (SCRIPTDIR, "convert-wav2mp3.sh", NULL);
+    prefs_set_string ("path_conv_wav", str);
+    g_free (str);
+    prefs_set_int ("convert_wav", FALSE);
+
+
+    /* Set sorting tab defaults */
+    for (i = 0; i < SORT_TAB_MAX; i++)
+    {
+	prefs_set_int_index("st_autoselect", i, TRUE);
+	prefs_set_int_index("st_category", i, (i < ST_CAT_NUM ? i : 0));
+	prefs_set_int_index("sp_or", i, FALSE);
+	prefs_set_int_index("sp_rating_cond", i, FALSE);
+	prefs_set_int_index("sp_playcount_cond", i, FALSE);
+	prefs_set_int_index("sp_played_cond", i, FALSE);
+	prefs_set_int_index("sp_modified_cond", i, FALSE);
+	prefs_set_int_index("sp_added_cond", i, FALSE);
+	prefs_set_int_index("sp_rating_state", i, 0);
+	prefs_set_string_index("sp_played_state", i, ">4w");
+	prefs_set_string_index("sp_modified_state", i, "<1d");
+	prefs_set_string_index("sp_added_state", i, "<1d");
+	prefs_set_int_index("sp_playcount_low", i, 0);
+	prefs_set_int_index("sp_playcount_high", i, -1);
+	prefs_set_int_index("sp_autodisplay", i, FALSE);
+    }
+    
+    prefs_set_int("sort_tab_num", 2);
+    
+    /* Set colum preferences */
+    for (i = 0; i < TM_NUM_COLUMNS; i++)
+    {
+	prefs_set_int_index("tm_col_width", i, 80);
+	prefs_set_int_index("col_visible", i, FALSE);
+	prefs_set_int_index("col_order", i, i);
+    }
+		
+    for (i = 0; i < TM_NUM_TAGS_PREFS; i++)
+	prefs_set_int_index("tag_autoset", i, FALSE);
+		
+    prefs_set_int_index("tag_autoset", TM_COLUMN_TITLE, TRUE);
+    
+    prefs_set_int_index("col_visible", TM_COLUMN_ARTIST, TRUE);
+    prefs_set_int_index("col_visible", TM_COLUMN_ALBUM, TRUE);
+    prefs_set_int_index("col_visible", TM_COLUMN_TITLE, TRUE);
+    prefs_set_int_index("col_visible", TM_COLUMN_GENRE, TRUE);
+    prefs_set_int_index("col_visible", TM_COLUMN_PLAYCOUNT, TRUE);
+    prefs_set_int_index("col_visible", TM_COLUMN_RATING, TRUE);
+
+    /* Set pane positions--Let gtk worry about position */
+    for (i = 0; i < PANED_NUM; i++)
+	prefs_set_int_index("paned_pos_", i, -1);
+	
+    prefs_set_int("mpl_autoselect", TRUE);
+	
+    /* Set window sizes */
+    prefs_set_int("size_gtkpod.x", 600);
+    prefs_set_int("size_gtkpod.y", 500);
+    prefs_set_int("size_cal.x", 500);
+    prefs_set_int("size_cal.y", 300);
+    prefs_set_int("size_conf_sw.x", 300);
+    prefs_set_int("size_conf_sw.y", 300);
+    prefs_set_int("size_conf.x", 300);
+    prefs_set_int("size_conf.y", -1);
+    prefs_set_int("size_dirbr.x", 300);
+    prefs_set_int("size_dirbr.y", 400);
+    prefs_set_int("size_prefs.x", -1);
+    prefs_set_int("size_prefs.y", 480);
+    prefs_set_int("size_info.x", 510);
+    prefs_set_int("size_info.y", 300);
+
+    /* size of file dialog if there is not a details textview */
+    prefs_set_int("size_file_dialog.x", 320);
+    prefs_set_int("size_file_dialog.y", 140);
+
+    /* size of file dialog if there is a details textview */
+    prefs_set_int("size_file_dialog_details.x", 320);
+    prefs_set_int("size_file_dialog_details.y", 140);
+
+    prefs_set_int("readtags", TRUE);
+    prefs_set_int("write_extended_info", TRUE);
+    prefs_set_int("parsetags", FALSE);
+    prefs_set_int("parsetags_overwrite", FALSE);
+    prefs_set_string("parsetags_template", "%a - %A/%T %t.mp3;%t.wav");
+    prefs_set_int("coverart_apic", TRUE);
+    prefs_set_int("coverart_file", TRUE);
+    prefs_set_string("coverart_template", "%A;folder.jpg");
+    prefs_set_int("mserv_use", FALSE);
+    prefs_set_string("mserv_username", "");
+    prefs_set_int("startup_messages", TRUE);
+    prefs_set_int("add_recursively", TRUE);
+    prefs_set_int("info_window", FALSE);
+    prefs_set_int("last_prefs_page", 0);
+    prefs_set_int("multi_edit_title", TRUE);
+    prefs_set_int("multi_edit", FALSE);
+    prefs_set_int("not_played_track", TRUE);
+    prefs_set_int("misc_track_nr", 25);
+    prefs_set_int("update_charset", FALSE);
+    prefs_set_int("display_tooltips_main", TRUE);
+    prefs_set_int("display_tooltips_prefs", TRUE);
+    prefs_set_int("display_toolbar", TRUE);
+    prefs_set_int("toolbar_style", GTK_TOOLBAR_BOTH);
+    prefs_set_int("sha1", TRUE);
+    prefs_set_string("export_template", "%o;%a - %t.mp3;%t.wav");
+    prefs_set_int("file_dialog_details_expanded", FALSE);
+
+    /* Set last browsed directory */
+    str = g_get_current_dir();
+
+    if (str)
+    {
+	prefs_set_string("last_dir_browsed", str);
+	g_free(str);
+    }
+    else
+	prefs_set_string("last_dir_browsed", g_get_home_dir());
+    
+    /* Set sorting prefs */
+    prefs_set_int("case_sensitive", FALSE);
+    prefs_set_int("tm_autostore", FALSE);
+    prefs_set_int("st_sort", SORT_NONE);
+    prefs_set_int("pm_sort", SORT_NONE);
+    prefs_set_int("tm_sortcol", TM_COLUMN_TITLE);
+    prefs_set_int("tm_sort", SORT_NONE);
+}
+
+/* Initialize default variable-length list entries */
+static void set_default_list_entries()
+{
+    if (!prefs_get_string_value_index("sort_ign_string_", 0, NULL))
+    {
+	prefs_set_string_index("sort_ign_string_", 0, "a ");
+	prefs_set_string_index("sort_ign_string_", 1, "an ");
+	prefs_set_string_index("sort_ign_string_", 2, LIST_END_MARKER);
+    }
+}
+
+/* A printf-like function that outputs in the system locale */
+static void locale_fprintf(FILE *fp, const gchar *format, ...)
+{
+    gchar *utf8_string; /* Raw UTF-8 string */
+    gchar *locale_string;  /* String in system locale format */
+    va_list format_list;  /* Printf-like formatting arguments */
+	
+    /* Create the locale format string based on the given format */
+    va_start(format_list, format);
+    utf8_string = g_strdup_vprintf(format, format_list);
+    va_end(format_list);
+	
+    locale_string = g_locale_from_utf8 (utf8_string, -1, NULL, NULL, NULL);
+	
+    if (fp)
+	fprintf(fp, "%s", locale_string);
+	
+    g_free(utf8_string);
+    g_free(locale_string);
+}
+
+/* Print commandline usage information */
+static void usage(FILE *fp)
+{
+  locale_fprintf(fp, _("gtkpod version %s usage:\n"), VERSION);
+  locale_fprintf(fp, _("  -h, --help:   display this message\n"));
+  locale_fprintf(fp, _("  -p <file>:    increment playcount for file by one\n"));
+  locale_fprintf(fp, _("  --hash <file>:print gtkpod hash for file\n"));
+  locale_fprintf(fp, _("  -m path:      define the mountpoint of your iPod\n"));
+  locale_fprintf(fp, _("  --mountpoint: same as '-m'.\n"));
+  locale_fprintf(fp, _("  -a:           import database automatically after start.\n"));
+  locale_fprintf(fp, _("  --auto:       same as '-a'.\n"));
+}
+
+/* Parse commandline based options */
+static void read_commandline(int argc, char *argv[])
+{
+    int option; /* Code returned by getopt */
+	
+    /* The options data structure. The format is standard getopt. */
+    struct option const options[] =
+	{
+	    { "h",           no_argument,	NULL, GP_HELP },
+	    { "help",        no_argument,	NULL, GP_HELP },
+	    { "p",           required_argument, NULL, GP_PLAYCOUNT },
+	    { "hash",        required_argument, NULL, GP_PRINT_HASH },
+	    { "m",           required_argument,	NULL, GP_MOUNT },
+	    { "mountpoint",  required_argument,	NULL, GP_MOUNT },
+	    { 0, 0, 0, 0 }
+	};
+	
+    /* Handle commandline options */
+    while ((option = getopt_long_only(argc, argv, "", options, NULL)) != -1)
+    {
+	switch (option)
+	{
+	case GP_HELP:
+	    usage(stdout);
+	    exit(0);
+	    break;
+	case GP_PLAYCOUNT:
+	    client_playcount(optarg);
+	    exit(0);
+	    break;
+	case GP_PRINT_HASH:
+	    print_sha1_hash (optarg);
+	    exit(0);
+	    break;
+	case GP_MOUNT:
+	    prefs_set_string("initial_mountpoint", optarg);
+	    break;
+	default:
+	    locale_fprintf(stderr, "Unknown option: %s\n", argv[optind]);
+	    usage(stderr);
+	    exit(1);
+	    break;
+	};
+    }
+}
+
+/* Read options from environment variables */
+static void read_environment()
+{
+    gchar *buf; 
+  
+    buf = convert_filename(getenv("IPOD_MOUNTPOINT"));
+    if (buf)
+	prefs_set_string("initial_mountpoint", buf);
+    g_free(buf);
+}
+ 
+/* Create a full numbered key from a base key string and a number.
+ * Free returned string. */
+static gchar *create_full_key(const gchar *base_key, gint index)
+{
+    if (base_key)
+	return g_strdup_printf("%s%i", base_key, index);
+    else 
+	return NULL;
+}
+
+/* Remove key present in the temp prefs tree from the hash table */
+static gboolean flush_key (gpointer key, gpointer value, gpointer user_data)
+{
+    g_return_val_if_fail (prefs_table, FALSE);
+
+    g_hash_table_remove (prefs_table, key);
+
+    return FALSE;
+}
+
+
+/* Copy key data from the temp prefs tree to the hash table (or to
+ * sub_data->temp_prefs_orig if non-NULL). The old key is removed. */
+static gboolean subst_key (gpointer key, gpointer value, gpointer user_data)
+{
+    struct sub_data *sub_data = user_data;
+    gint len;
+
+    g_return_val_if_fail (key && value && user_data, FALSE);
+    g_return_val_if_fail (sub_data->subkey && sub_data->subkey2, FALSE);
+    if (!sub_data->temp_prefs_orig)
+	g_return_val_if_fail (prefs_table, FALSE);
+    if (sub_data->temp_prefs_orig)
+	g_return_val_if_fail (sub_data->temp_prefs_orig->tree, FALSE);
+
+    len = strlen (sub_data->subkey);
+
+    if (strncmp (key, sub_data->subkey, len) == 0)
+    {
+	gchar *new_key = g_strdup_printf ("%s%s",
+					  sub_data->subkey2,
+					  ((gchar *)key)+len);
+	if (sub_data->temp_prefs_orig)
+	{
+	    g_tree_remove (sub_data->temp_prefs_orig->tree, key);
+	    g_tree_insert (sub_data->temp_prefs_orig->tree,
+			   new_key, g_strdup(value));
+	}
+	else
+	{
+	    g_hash_table_remove (prefs_table, key);
+	    g_hash_table_insert (prefs_table, new_key, g_strdup(value));
+	}
+    }
+    return FALSE;
+}
+
+/* return TRUE if @key starts with @subkey */
+static gboolean match_subkey (gpointer key, gpointer value, gpointer subkey)
+{
+    g_return_val_if_fail (key && subkey, FALSE);
+
+    if (strncmp (key, subkey, strlen (subkey)) == 0)  return TRUE;
+    return FALSE;
+}
+
+
+/* return TRUE and set sub_data->exists to TRUE if @key starts with
+ * @subkey */
+static gboolean check_subkey (gpointer key, gpointer value, gpointer user_data)
+{
+    struct sub_data *sub_data = user_data;
+
+    g_return_val_if_fail (key && user_data, TRUE);
+    g_return_val_if_fail (sub_data->subkey, TRUE);
+
+    if (strncmp (key, sub_data->subkey, strlen (sub_data->subkey)) == 0)
+    {
+	sub_data->exists = TRUE;
+	return TRUE;
+    }
+    return FALSE;
+}
+
+
+
+/* Add key/value to temp_prefs if it matches subkey -- called by
+ * prefs_create_subset() and temp_prefs_create_subset() */
+static gboolean get_subset (gpointer key, gpointer value, gpointer user_data)
+{
+    struct sub_data *sub_data = user_data;
+
+    g_return_val_if_fail (key && value && user_data, TRUE);
+    g_return_val_if_fail (sub_data->subkey && sub_data->temp_prefs, TRUE);
+
+    if (strncmp (key, sub_data->subkey,
+		 strlen (sub_data->subkey)) == 0)
+    {  /* match */
+	temp_prefs_set_string (sub_data->temp_prefs, key, value);
+    }
+    return FALSE; /* continue traversal (g_tree), ignored for g_hash */
+}
+
+
+/* Copy a variable-length list to the prefs table */
+static gboolean copy_list(gpointer key, gpointer value, gpointer user_data)
+{
+	prefs_apply_list((gchar*)key, (GList*)value);
+	return FALSE;
+}
+ 
+/* Callback that writes pref table data to a file */
+static void write_key(gpointer key, gpointer value, gpointer user_data)
+{
+    FILE *fp;  /* file pointer passed in through user_data */
+	
+    /* Write out each key and value to the given file */
+    fp = (FILE*)user_data;
+	
+    if (fp)
+	fprintf(fp, "%s=%s\n", (gchar*)key, (gchar*)value);
+}
+
+/* Gets a string that contains ~/.gtkpod/ If the folder doesn't exist,
+ * create it. Free the string when you are done with it.
+ * If the folder wasn't found, and couldn't be created, return NULL */
+gchar *prefs_get_cfgdir()
+{
+    gchar *folder;  /* Folder path */
+	
+    /* Create the folder path. If the folder doesn't exist, create it. */
+    folder = g_build_filename(g_get_home_dir(), ".gtkpod", NULL);
+	
+    if (!g_file_test(folder, G_FILE_TEST_IS_DIR))
+    {
+	if ((g_mkdir(folder, 0777)) == -1)
+	{
+	    printf(_("Couldn't create ~/.gtkpod\n"));
+	    return NULL;
+	}
+    }
+	
+    return folder;
+}
+
+
+/* get @key and @value from a string like "key=value" */
+static gboolean read_prefs_get_key_value (const gchar *buf,
+					  gchar **key, gchar **value)
+{
+    size_t len;  /* string length */
+    const gchar *buf_start; /* Pointer to where actual useful data starts in line */
+
+    g_return_val_if_fail (buf && key && value, FALSE);
+
+    /* Strip out any comments (lines that begin with ; or #) */
+    if ((buf[0] == ';') || (buf[0] == '#')) 
+	return FALSE;
+
+    /* Find the key and value, and look for malformed lines */
+    buf_start = strchr (buf, '=');
+
+    if ((!buf_start) || (buf_start == buf))
+    {
+	printf("Parse error reading prefs: %s", buf);
+	return FALSE;
+    }
+
+    /* Find the key name */
+    *key = g_strndup (buf, (buf_start - buf));
+
+    /* Strip whitespace */
+    g_strstrip (*key);
+
+    /* Find the value string */
+    *value = strdup (buf_start+1);
+
+    /* remove newline */
+    len = strlen (*value);
+    if ((len > 0) && ((*value)[len - 1] == 0x0a))
+	(*value)[len - 1] = 0;
+
+    /* Don't strip whitespace! If there is any, there's a reason for it. */
+    /* g_strstrip (*value); */
+
+    return TRUE;
+}
+
+
+/* Read preferences from a file */
+static void read_prefs_from_file(FILE *fp)
+{
+    gchar buf[PATH_MAX];  /* Buffer that contains one line */
+    gchar *key;  /* Pref value key */
+    gchar *value; /* Pref value */
+
+
+    g_return_if_fail (prefs_table && fp);
+
+    while (fgets(buf, PATH_MAX, fp))
+    {
+	if (read_prefs_get_key_value (buf, &key, &value))
+	{
+	    g_hash_table_insert (prefs_table, key, value);
+	}
+    }
+}
+
+/* Write prefs to file */
+static void write_prefs_to_file(FILE *fp)
+{
+    lock_prefs_table ();
+
+    if (!prefs_table)
+    {
+	unlock_prefs_table ();
+	g_return_if_reached ();
+    }
+
+    g_hash_table_foreach(prefs_table, write_key, (gpointer)fp);
+
+    unlock_prefs_table ();
+}
+
+/* Load preferences, first loading the defaults, and then overwrite that with
+ * preferences in the user home folder. */
+static void load_prefs()
+{
+    gchar *filename; /* Config path to open */
+    gchar *config_dir;  /* Directory where config is (usually ~/.gtkpod) */
+    FILE *fp;
+	
+    /* Start by initializing the prefs to their default values */
+    set_default_preferences();
+	
+    /* and then override those values with those found in the home folder. */
+    config_dir = prefs_get_cfgdir();
+	
+    if (config_dir)
+    {
+	filename = g_build_filename(config_dir, "prefs", NULL);
+		
+	if (filename)
+	{
+	    fp = fopen(filename, "r");
+			
+	    if (fp)
+	    {
+		read_prefs_from_file(fp);
+		fclose(fp);
+	    }
+			
+	    g_free(filename);
+	}
+		
+	g_free(config_dir);
+    }
+	
+    /* Finally, initialize variable-length lists. Do this after everything else
+     * so that list defaults don't hang out in the table after prefs have been
+     * read from the file. */
+    set_default_list_entries();
+}
+
+/* Save preferences to user home folder (~/.gtkpod/prefs) */
+void prefs_save ()
+{
+    gchar *filename;  /* Path of file to write to */
+    gchar *config_dir;   /* Folder where prefs file is */
+    FILE *fp;  /* File pointer */
+	
+    /* Open $HOME/.gtkpod/prefs, and write prefs */
+    config_dir = prefs_get_cfgdir();
+	
+    if (config_dir)
+    {
+	filename = g_build_filename(config_dir, "prefs", NULL);
+		
+	if (filename)
+	{
+	    fp = fopen(filename, "w");
+
+	    if (fp)
+	    {
+		write_prefs_to_file(fp);
+		fclose(fp);
+	    }
+		
+	    g_free(filename);
+	}
+		
+	g_free(config_dir);
+    }
+}
+
+
+static gboolean temp_prefs_save_fe (gchar *key, gchar *value,
+				    struct temp_prefs_save *tps)
+{
+    gchar *buf;
+    GIOStatus status;
+
+    buf=g_strdup_printf ("%s=%s\n", key, value);
+    status = g_io_channel_write_chars (tps->gio, buf, -1, NULL, tps->error);
+    g_free (buf);
+    if (status != G_IO_STATUS_NORMAL)
+    {
+	tps->success = FALSE;
+	return TRUE;  /* stop traversal */
+    }
+    return FALSE;
+}
+
+
+/* Save @temp_prefs to @filename in the same manner as prefs_save is
+ * saving to ~/.gtkpod/prefs. @error: location where to store
+ * information about errors or NULL.
+ * 
+ * Return value: TRUE on success, FALSE if an error occured, in which
+ * case @error will be set accordingly.
+ */
+gboolean temp_prefs_save (TempPrefs *temp_prefs,
+			  const gchar *filename,
+			  GError **error)
+{
+    GIOChannel *gio;
+    struct temp_prefs_save tps;
+
+    g_return_val_if_fail (temp_prefs && filename, FALSE);
+
+    gio = g_io_channel_new_file (filename, "w", error);
+    tps.gio = gio;
+    tps.error = error;
+    tps.success = TRUE;
+    if (gio)
+    {
+	g_tree_foreach (temp_prefs->tree, (GTraverseFunc)temp_prefs_save_fe, &tps);
+	g_io_channel_unref (gio);
+    }
+
+    return tps.success;
+}
+
+
+TempPrefs *temp_prefs_load (const gchar *filename, GError **error)
+{
+    GIOChannel *gio;
+    TempPrefs *temp_prefs = NULL;
+
+    g_return_val_if_fail (filename, NULL);
+
+    gio = g_io_channel_new_file (filename, "r", error);
+    if (gio)
+    {
+	GIOStatus status;
+
+	temp_prefs = temp_prefs_create ();
+
+	do
+	{
+	    gchar *line;
+
+	    status = g_io_channel_read_line (gio, &line, NULL, NULL, error);
+	    if (status == G_IO_STATUS_NORMAL)
+	    {
+		gchar *key, *value;
+		if (read_prefs_get_key_value (line, &key, &value))
+		{
+		    temp_prefs_set_string (temp_prefs, key, value);
+		}
+		g_free (line);
+	    }
+	} while (status == G_IO_STATUS_NORMAL);
+
+	g_io_channel_unref (gio);
+
+	if (status != G_IO_STATUS_EOF)
+	{
+	    temp_prefs_destroy (temp_prefs);
+	    temp_prefs = NULL;
+	}
+    }
+
+    return temp_prefs;
+}
+
+
+/* Removes already existing list keys from the prefs table */
+static void wipe_list(const gchar *key)
+{
+    gchar *full_key; /* Complete key, with its number suffix */
+    guint i;  /* Loop counter */
+	
+    /* Go through the prefs table, starting at key<number>, delete it and go 
+     * through key<number+1>... until there are no keys left */
+	
+    for (i = 0;;i++)
+    {
+	full_key = create_full_key(key, i);
+		
+	if (g_hash_table_remove(prefs_table, full_key))
+	{
+	    g_free(full_key);
+	    continue;
+	}
+	else /* We got all the unneeded keys, leave the loop... */
+	{
+	    g_free(full_key);
+	    break;
+	}
+    }		
+}
+
+/* Delete and rename keys */
+static void cleanup_keys()
+{
+    gchar *buf;
+    gchar *sp = NULL;
+    gint int_buf;
+    gint i;
+    gint x, y, p;  /* Window position */
+    float version=0;
+
+    /* Get version */
+    version = prefs_get_double("version");
+
+    /* rename mountpoint to initial_mountpoint */
+    if (prefs_get_string_value(KEY_MOUNTPOINT, &buf))
+    {
+	prefs_set_string("initial_mountpoint", buf);
+	g_free(buf);
+	prefs_set_string(KEY_MOUNTPOINT, NULL);
+    }
+  
+    /* rename coverart to coverart_file */
+    if (prefs_get_string_value("coverart", &buf))
+    {
+	prefs_set_string("coverart_file", buf);
+	g_free(buf);
+	prefs_set_string("coverart", NULL);
+    }
+  
+    /* rename tm_sort_ to tm_sort */
+    if (prefs_get_string_value("tm_sort_", &buf))
+    {
+	prefs_set_string("tm_sort", buf);
+	g_free(buf);
+	prefs_set_string("tm_sort_", NULL);
+    }
+
+    /* rename md5 to sha1 */
+    if (prefs_get_string_value("md5", &buf))
+    {
+	prefs_set_string("sha1", buf);
+	g_free(buf);
+	prefs_set_string("md5", NULL);
+    }
+
+    /* Convert old path numbered keys to named ones */
+  
+    /* Play Now */
+    if (prefs_get_string_value_index("path", PATH_PLAY_NOW, &buf))
+    {
+	prefs_set_string("path_play_now", buf);
+	prefs_set_string_index("path", PATH_PLAY_NOW, NULL);
+	if (version < 0.87)
+	{  /* default changed from "xmms -p %s" to "xmms
+	      %s" which avoids xmms from hanging --
+	      thanks to Chris Vine */
+	    if (strcmp (buf, "xmms -p %s") == 0)
+	    {
+		prefs_set_string ("path_play_now", "xmms %s");
+	    }
+	}
+	g_free(buf);
+    }
+  
+    if (prefs_get_string_value_index("toolpath", PATH_PLAY_NOW, &buf))
+    {
+	prefs_set_string("path_play_now", buf);
+	g_free(buf);
+	prefs_set_string_index("toolpath", PATH_PLAY_NOW, NULL);
+    }
+  
+    /* Enqueue */
+    if (prefs_get_string_value_index("path", PATH_PLAY_ENQUEUE, &buf))
+    {
+	prefs_set_string("path_play_enqueue", buf);
+	g_free(buf);
+	prefs_set_string_index("path", PATH_PLAY_ENQUEUE, NULL);
+    }
+  
+    if (prefs_get_string_value_index("toolpath", PATH_PLAY_ENQUEUE, &buf))
+    {
+	prefs_set_string("path_play_enqueue", buf);
+	g_free(buf);
+	prefs_set_string_index("toolpath", PATH_PLAY_ENQUEUE, NULL);
+    }
+  
+    /* MP3 Gain */
+    if (prefs_get_string_value_index("path", PATH_MP3GAIN, &buf))
+    {
+	prefs_set_string("path_mp3gain", buf);
+	g_free(buf);
+	prefs_set_string_index("path", PATH_MP3GAIN, NULL);
+    }
+  
+    if (prefs_get_string_value_index("toolpath", PATH_MP3GAIN, &buf))
+    {
+	prefs_set_string("path_mp3gain", buf);
+	g_free(buf);
+	prefs_set_string_index("toolpath", PATH_MP3GAIN, NULL);
+    }
+  
+    /* Sync contacts */
+    if (prefs_get_string_value_index("path", PATH_SYNC_CONTACTS, &buf))
+    {
+	prefs_set_string("itdb_0_path_sync_contacts", buf);
+	g_free(buf);
+	prefs_set_string_index("path", PATH_SYNC_CONTACTS, NULL);
+    }
+  
+    if (prefs_get_string_value_index("toolpath", PATH_SYNC_CONTACTS, &buf))
+    {
+	prefs_set_string("itdb_0_path_sync_contacts", buf);
+	g_free(buf);
+	prefs_set_string_index("toolpath", PATH_SYNC_CONTACTS, NULL);
+    }
+  
+    /* Sync calendar */
+    if (prefs_get_string_value_index("path", PATH_SYNC_CALENDAR, &buf))
+    {
+	prefs_set_string("itdb_0_path_sync_calendar", buf);
+	g_free(buf);
+	prefs_set_string_index("path", PATH_SYNC_CALENDAR, NULL);
+    }
+  
+    if (prefs_get_string_value_index("toolpath", PATH_SYNC_CALENDAR, &buf))
+    {
+	prefs_set_string("itdb_0_path_sync_calendar", buf);
+	g_free(buf);
+	prefs_set_string_index("toolpath", PATH_SYNC_CALENDAR, NULL);
+    }
+  
+    /* Sync notes */
+    if (prefs_get_string_value_index("path", PATH_SYNC_NOTES, &buf))
+    {
+	prefs_set_string("itdb_0_path_sync_notes", buf);
+	g_free(buf);
+	prefs_set_string_index("path", PATH_SYNC_NOTES, NULL);
+    }
+  
+    if (prefs_get_string_value_index("toolpath", PATH_SYNC_NOTES, &buf))
+    {
+	prefs_set_string("itdb_0_path_sync_notes", buf);
+	g_free(buf);
+	prefs_set_string_index("toolpath", PATH_SYNC_NOTES, NULL);
+    }
+  
+    /* MSERV music root */
+    if (prefs_get_string_value_index("path", PATH_MSERV_MUSIC_ROOT, &buf))
+    {
+	prefs_set_string("path_mserv_music_root", buf);
+	g_free(buf);
+	prefs_set_string_index("path", PATH_MSERV_MUSIC_ROOT, NULL);
+    }
+  
+    if (prefs_get_string_value_index("toolpath", PATH_MSERV_MUSIC_ROOT, &buf))
+    {
+	prefs_set_string("path_mserv_music_root", buf);
+	g_free(buf);
+	prefs_set_string_index("toolpath", PATH_MSERV_MUSIC_ROOT, NULL);
+    }
+  
+    /* MSERV track info root */
+    if (prefs_get_string_value_index("path", PATH_MSERV_TRACKINFO_ROOT, &buf))
+    {
+	prefs_set_string("path_mserv_trackinfo_root", buf);
+	g_free(buf);
+	prefs_set_string_index("path", PATH_MSERV_TRACKINFO_ROOT, NULL);
+    }
+  
+    if (prefs_get_string_value_index("toolpath", PATH_MSERV_TRACKINFO_ROOT, &buf))
+    {
+	prefs_set_string("path_mserv_trackinfo_root", buf);
+	g_free(buf);
+	prefs_set_string_index("toolpath", PATH_MSERV_TRACKINFO_ROOT, NULL);
+    }
+
+    /* If there's an extra (PATH_NUM) key, delete it */
+    prefs_set_string_index("path", PATH_NUM, NULL);
+    prefs_set_string_index("toolpath", PATH_NUM, NULL);
+
+    /* Ignore/remove some keys */
+    prefs_set_string("play_now_path", NULL);
+    prefs_set_string("sync_remove", NULL);
+    prefs_set_string("sync_remove_confirm", NULL);
+    prefs_set_string("show_sync_dirs", NULL);
+    prefs_set_string("play_enqueue_path", NULL);
+    prefs_set_string("mp3gain_path", NULL);
+    prefs_set_string("statusbar_timeout", NULL);
+    prefs_set_string("offline", NULL);
+    prefs_set_string("time_format", NULL);
+    prefs_set_string("id3_all", NULL);
+    prefs_set_string("pm_autostore", NULL);
+    prefs_set_string("backups", NULL);
+    prefs_set_string("save_sorted_order", NULL);
+    prefs_set_string("fix_path", NULL);
+    prefs_set_string("write_gaintag", NULL);
+    prefs_set_string("automount", NULL);
+    prefs_set_string("display_artcovers", NULL);
+    prefs_set_string("block_display", NULL);
+    prefs_set_string("tmp_disable_sort", NULL);
+    prefs_set_string("size_file_dialog.x", NULL);
+    prefs_set_string("size_file_dialog.y", NULL);
+    prefs_set_string("size_file_dialog_details.x", NULL);
+    prefs_set_string("size_file_dialog_details.y", NULL);
+    prefs_set_string("autoimport", NULL);
+    prefs_set_string("auto_import", NULL);
+
+    /* sp_created_cond renamed to sp_added_cond */
+    for (i = 0; i < SORT_TAB_MAX; i++)
+    {
+	if (prefs_get_int_value_index("sp_created_cond", i, &int_buf))
+	{
+	    prefs_set_int_index("sp_added_cond", i, int_buf);
+	    prefs_set_string("sp_created_cond", NULL);
+	}
+    }
+  
+    /* sp_created_state renamed to sp_added_state */
+    for (i = 0; i < SORT_TAB_MAX; i++)
+    {
+	if (prefs_get_int_value_index("sp_created_state", i, &int_buf))
+	{
+	    prefs_set_int_index("sp_added_state", i, int_buf);
+	    prefs_set_string("sp_created_state", NULL);
+	}
+    }
+  
+    /* sm_col_width renamed to tm_col_width */
+    for (i = 0; i < TM_NUM_COLUMNS; i++)
+    {
+	if (prefs_get_int_value_index("sm_col_width", i, &int_buf))
+	{
+	    prefs_set_int_index("tm_col_width", i, int_buf);
+	    prefs_set_string_index("sm_col_width", i, NULL);
+	}
+    }
+  
+    /* handle version changes in prefs */
+    if (version == 0.0)
+    {
+	/* most likely prefs file written by V0.50 */
+	/* I added two new PANED elements since V0.50 --> shift */
+	for (i=PANED_NUM_ST-1; i>=0; --i)
+	{
+	    prefs_set_int_index("paned_pos_", PANED_NUM_GLADE + i,
+				prefs_get_int_index("paned_pos_", PANED_NUM_GLADE + i - 2));
+	}
+	prefs_set_int_index("paned_pos_", PANED_STATUS1, -1);
+	prefs_set_int_index("paned_pos_", PANED_STATUS2, -1);
+    }
+
+    /* set statusbar paned to a decent value if unset */
+    if (prefs_get_int_index("paned_pos_", PANED_STATUS1) == -1)
+    {
+	x = prefs_get_int("size_gtkpod.x");
+	/* set to about 2/3 of the window width */
+	if (x>0)   
+	    prefs_set_int_index("paned_pos_", PANED_STATUS1, 20*x/30);
+    }
+  
+    if (prefs_get_int_index("paned_pos_", PANED_STATUS2) == -1)
+    {
+	x = prefs_get_int("size_gtkpod.x");
+	y = prefs_get_int("size_gtkpod.y");
+	p = prefs_get_int_index("paned_pos_", PANED_STATUS1);
+	/* set to about half of the remaining window */
+	if (x>0)   
+	    prefs_set_int_index("paned_pos_", PANED_STATUS2, (x-p)/2 );
+    }
+
+    /* Changed layout of info window between 0.72 and 0.73 */
+    if (version < 0.73)
+    {
+	prefs_set_string("size_info.x", NULL);
+	prefs_set_string("size_info.y", NULL);
+    }
+    
+    /* not_played_song renamed to not_played_track */
+    if (prefs_get_int_value("not_played_song", &int_buf))
+    {
+	prefs_set_int("not_played_track", int_buf);
+	prefs_set_string("not_played_song", NULL);
+    }
+
+    /* misc_song_nr renamed to misc_track_nr */
+    if (prefs_get_int_value("misc_song_nr", &int_buf))
+    {
+	prefs_set_int("misc_track_nr", int_buf);
+	prefs_set_string("misc_song_nr", NULL);
+    }
+
+    /* sm_autostore renamed to tm_autostore */
+    if (prefs_get_int_value("sm_autostore", &int_buf))
+    {
+	prefs_set_int("tm_autostore", int_buf);
+	prefs_set_string("sm_autostore", NULL);
+    }
+
+    /* sm_sortcol renamed to tm_sortcol */
+    if (prefs_get_int_value("sm_sortcol", &int_buf))
+    {
+	prefs_set_int("tm_sortcol", int_buf);
+	prefs_set_string("sm_sortcol", NULL);
+    }
+
+    /* sm_sort_ renamed to tm_sort */
+    if (prefs_get_int_value("sm_sort_", &int_buf))
+    {
+	prefs_set_int("tm_sort", int_buf);
+	prefs_set_string("sm_sort_", NULL);
+    }
+
+    /* filename_format renamed to export_template */
+    if (prefs_get_string_value("filename_format", &buf))
+    {
+	prefs_set_string("export_template", buf);
+	g_free(buf);
+	prefs_set_string("filename_format", NULL);
+    }
+
+    /* This string was a wrong autoconvert--just ignore it */
+    buf = prefs_get_string("export_template");
+    
+    if (buf && strcmp(buf, "%a - %a/%T - %T.mp3") == 0)
+	prefs_set_string("export_template", NULL);
+
+    g_free (buf);
+
+    /* We changed the meaning of the %x in export_template */
+    if (version < 0.72)
+    {
+	/* changed the meaning of the %x in export_template */
+	if (sp) while (*sp)
+	{
+	    if (sp[0] == '%')
+	    {
+		switch (sp[1]) {
+		case 'A':
+		    sp[1] = 'a';
+		    break;
+		case 'd':
+		    sp[1] = 'A';
+		    break;
+		case 'n':
+		    sp[1] = 't';
+		    break;
+		case 't':
+		    sp[1] = 'T';
+		    break;
+		default:
+		    break;
+		}
+	    }
+	}
+    }
+
+    /* For versions < 0.91, remove all itdb keys */
+    if (version < 0.91)
+	prefs_flush_subkey("itdb_");
+
+    /* rename convert scripts */
+    if (version <= 0.99001)
+    {
+
+	const gchar **keyp;
+	const gchar *keys[] =
+	    {"path_conv_m4a", "path_conv_wav", "path_conv_mp3",
+	     "path_conv_ogg", "path_conv_flac", NULL};
+
+	for (keyp=keys; *keyp; ++keyp)
+	{
+	    buf = prefs_get_string (*keyp);
+	    if (buf)
+	    {
+		const gchar *needles[] =
+		    { "convert-flac2mp3.sh", "convert-m4a2mp3.sh",
+		      "convert-ogg2mp3.sh", "convert-wav2mp3.sh",
+		      "convert-flac2m4a.sh", "convert-m4a2m4a.sh",
+		      "convert-ogg2m4a.sh", "convert-wav2m4a.sh", NULL };
+		const gchar *replacements[] =
+		    { "convert-2mp3.sh    ", "convert-2mp3.sh   ",
+		      "convert-2mp3.sh   ", "convert-2mp3.sh   " ,
+		      "convert-2m4a.sh    ", "convert-2m4a.sh   ",
+		      "convert-2m4a.sh   ", "convert-2m4a.sh   " };
+		const gchar **needlep;
+		const gchar **replp;
+		replp = replacements;
+		for (needlep=needles; *needlep; ++needlep, ++replp)
+		{
+		    gchar *bufp = strstr (buf, *needlep);
+		    if (bufp)
+		    {
+			g_memmove (bufp, *replp, strlen (*replp));
+			prefs_set_string (*keyp, buf);
+			break;
+		    }
+		}
+		g_free (buf);
+	    }
+	}
+    }
+
+    prefs_set_string ("version", VERSION);
+}
+
+/* Initialize the prefs table and read configuration */
+void prefs_init (int argc, char *argv[])
+{
+    if (!prefs_table_mutex)
+	prefs_table_mutex = g_mutex_new ();
+
+    lock_prefs_table ();
+
+    /* Create the prefs hash table */
+    prefs_table = g_hash_table_new_full(g_str_hash, g_str_equal, g_free,
+					g_free);
+
+    unlock_prefs_table ();
+
+    /* Load preferences */
+    load_prefs();
+
+    /* Clean up old prefs keys */
+    cleanup_keys();
+	
+    /* Read environment variables */
+    read_environment(); 
+	
+    /* Read commandline arguments */
+    read_commandline(argc, argv);  
+}
+
+/* Delete the hash table */
+void prefs_shutdown ()
+{
+    lock_prefs_table ();
+
+    if (!prefs_table)
+    {
+	unlock_prefs_table ();
+	g_return_if_reached ();
+    }
+
+    /* Delete the prefs hash table */
+    g_hash_table_destroy(prefs_table);
+    prefs_table = NULL;
+
+    unlock_prefs_table ();
+
+    /* We can't free the prefs_table_mutex in a thread-safe way */
+}
+
+/* Create the temp prefs tree */
+/* Free the returned structure with delete_temp_prefs() */
+TempPrefs *temp_prefs_create ()
+{
+    TempPrefs *temp_prefs;  /* Returned temp prefs structure */
+
+    temp_prefs = (TempPrefs*)g_malloc(sizeof(TempPrefs));
+
+    temp_prefs->tree = g_tree_new_full((GCompareDataFunc)strcmp, NULL,
+				       g_free, g_free);
+
+    return temp_prefs;	
+}
+
+/* Delete temp prefs */
+void temp_prefs_destroy (TempPrefs *temp_prefs)
+{
+    g_return_if_fail (temp_prefs);
+    g_return_if_fail (temp_prefs->tree);
+
+    g_tree_destroy(temp_prefs->tree);
+    g_free(temp_prefs);
+}
+
+/* Copy key data from the temp prefs tree to the hash table */
+static gboolean copy_key (gpointer key, gpointer value, gpointer user_data)
+{
+    prefs_set_string(key, value);
+	
+    return FALSE;
+}
+
+/* Copy the data from the temp prefs tree to the permanent prefs table */
+void temp_prefs_apply (TempPrefs *temp_prefs)
+{
+    g_return_if_fail (temp_prefs);
+    g_return_if_fail (temp_prefs->tree);
+
+    g_tree_foreach (temp_prefs->tree, copy_key, NULL);
+}
+
+
+/* Create a temp_prefs tree containing a subset of keys in the
+   permanent prefs table (those starting with @subkey */
+static TempPrefs *prefs_create_subset_unlocked (const gchar *subkey)
+{
+    struct sub_data sub_data;
+
+    g_return_val_if_fail (prefs_table, NULL);
+
+    sub_data.temp_prefs = temp_prefs_create ();
+    sub_data.subkey = subkey;
+
+    g_hash_table_foreach (prefs_table, (GHFunc)get_subset, &sub_data);
+
+    return sub_data.temp_prefs;
+}
+
+/* Create a temp_prefs tree containing a subset of keys in the
+   permanent prefs table (those starting with @subkey */
+TempPrefs *prefs_create_subset (const gchar *subkey)
+{
+    TempPrefs *temp_prefs;
+
+    lock_prefs_table ();
+
+    temp_prefs = prefs_create_subset_unlocked (subkey);
+
+    unlock_prefs_table ();
+
+    return temp_prefs;
+}
+
+
+/* Create a temp_prefs tree containing a subset of keys in the
+   permanent prefs table (those starting with @subkey */
+TempPrefs *temp_prefs_create_subset (TempPrefs *temp_prefs,
+				     const gchar *subkey)
+{
+    struct sub_data sub_data;
+
+    g_return_val_if_fail (temp_prefs, NULL);
+    g_return_val_if_fail (temp_prefs->tree, NULL);
+
+    sub_data.temp_prefs = temp_prefs_create ();
+    sub_data.subkey = subkey;
+
+    g_tree_foreach (temp_prefs->tree, get_subset, &sub_data);
+
+    return sub_data.temp_prefs;
+}
+
+
+/* Remove all keys in the temp prefs tree from the permanent prefs
+   table */
+void temp_prefs_flush (TempPrefs *temp_prefs)
+{
+    g_return_if_fail (temp_prefs);
+    g_return_if_fail (temp_prefs->tree);
+
+    lock_prefs_table ();
+
+    g_tree_foreach (temp_prefs->tree, flush_key, NULL);
+
+    unlock_prefs_table ();
+}
+
+/* Return the number of keys stored in @temp_prefs */
+gint temp_prefs_size (TempPrefs *temp_prefs)
+{
+    g_return_val_if_fail (temp_prefs, 0);
+    g_return_val_if_fail (temp_prefs->tree, 0);
+
+    return g_tree_nnodes (temp_prefs->tree);
+}
+
+
+/* Returns TRUE if at least one key starting with @subkey exists */
+gboolean temp_prefs_subkey_exists (TempPrefs *temp_prefs,
+				   const gchar *subkey)
+{
+    struct sub_data sub_data;
+
+    g_return_val_if_fail (temp_prefs && subkey, FALSE);
+
+    sub_data.temp_prefs = NULL;
+    sub_data.subkey = subkey;
+    sub_data.exists = FALSE;
+
+    g_tree_foreach (temp_prefs->tree, check_subkey, &sub_data);
+
+    return sub_data.exists;
+}
+
+
+/* Special functions */
+
+/* Remove all keys that start with @subkey */
+void prefs_flush_subkey (const gchar *subkey)
+{
+    lock_prefs_table ();
+
+    if (!prefs_table)
+    {
+	unlock_prefs_table ();
+	g_return_if_reached ();
+    }
+
+    g_hash_table_foreach_remove (prefs_table, match_subkey, (gchar *)subkey);
+
+    unlock_prefs_table ();
+}
+
+
+/* Rename all keys that start with @subkey_old in such a way that they
+   start with @subkey_new */
+void prefs_rename_subkey (const gchar *subkey_old, const gchar *subkey_new){
+    struct sub_data sub_data;
+
+    g_return_if_fail (subkey_old);
+    g_return_if_fail (subkey_new);
+
+    lock_prefs_table ();
+
+    if (!prefs_table)
+    {
+	unlock_prefs_table ();
+	g_return_if_reached ();
+    }
+
+    sub_data.temp_prefs = prefs_create_subset_unlocked (subkey_old);
+    sub_data.temp_prefs_orig = NULL;
+
+    if (temp_prefs_size (sub_data.temp_prefs) > 0)
+    {
+	sub_data.subkey = subkey_old;
+	sub_data.subkey2 = subkey_new;
+	g_tree_foreach (sub_data.temp_prefs->tree, subst_key, &sub_data);
+    }
+
+    temp_prefs_destroy (sub_data.temp_prefs);
+
+    unlock_prefs_table ();
+}
+
+
+/* Rename all keys that start with @subkey_old in such a way that they
+   start with @subkey_new */
+void temp_prefs_rename_subkey (TempPrefs *temp_prefs,
+			       const gchar *subkey_old,
+			       const gchar *subkey_new)
+{
+    struct sub_data sub_data;
+
+    g_return_if_fail (temp_prefs);
+    g_return_if_fail (subkey_old);
+    g_return_if_fail (subkey_new);
+
+    sub_data.temp_prefs_orig = temp_prefs;
+    sub_data.temp_prefs = temp_prefs_create_subset (temp_prefs,
+						    subkey_old);
+
+    if (temp_prefs_size (sub_data.temp_prefs) > 0)
+    {
+	sub_data.subkey = subkey_old;
+	sub_data.subkey2 = subkey_new;
+	g_tree_foreach (sub_data.temp_prefs->tree, subst_key, &sub_data);
+    }
+
+    temp_prefs_destroy (sub_data.temp_prefs);
+}
+
+/* Functions for non-numbered pref keys */
+
+/* Set a string value with the given key, or remove key if @value is
+   NULL */
+void prefs_set_string(const gchar *key, const gchar *value)
+{
+    g_return_if_fail (key);
+
+    lock_prefs_table ();
+
+    if (!prefs_table)
+    {
+	unlock_prefs_table ();
+	g_return_if_reached ();
+    }
+
+    if (value)
+	g_hash_table_insert (prefs_table,
+			     g_strdup(key), g_strdup(value));
+    else
+	g_hash_table_remove (prefs_table, key);
+
+    unlock_prefs_table ();
+}
+
+/* Set a key value to a given integer */
+void prefs_set_int(const gchar *key, const gint value)
+{
+    gchar *strvalue; /* String value converted from integer */
+
+    lock_prefs_table ();
+
+    if (!prefs_table)
+    {
+	unlock_prefs_table ();
+	g_return_if_reached ();
+    }
+
+    strvalue = g_strdup_printf("%i", value);
+    g_hash_table_insert(prefs_table, g_strdup(key), strvalue);
+
+    unlock_prefs_table ();
+}
+
+/* Set a key to an int64 value */
+void prefs_set_int64(const gchar *key, const gint64 value)
+{
+    gchar *strvalue; /* String value converted from int64 */
+	
+    lock_prefs_table ();
+
+    if (!prefs_table)
+    {
+	unlock_prefs_table ();
+	g_return_if_reached ();
+    }
+
+    strvalue = g_strdup_printf("%" G_GINT64_FORMAT, value);
+    g_hash_table_insert(prefs_table, g_strdup(key), strvalue);	
+
+    unlock_prefs_table ();
+}
+
+void prefs_set_double(const gchar *key, gdouble value)
+{
+    gchar *strvalue; /* String value converted from integer */
+
+    lock_prefs_table ();
+
+    if (!prefs_table)
+    {
+	unlock_prefs_table ();
+	g_return_if_reached ();
+    }
+
+    strvalue = g_strdup_printf("%f", value);
+    g_hash_table_insert(prefs_table, g_strdup(key), strvalue);
+
+    unlock_prefs_table ();
+}
+
+/* Get a string value associated with a key. Free returned string. */
+gchar *prefs_get_string(const gchar *key)
+{
+    gchar *string = NULL;
+
+    lock_prefs_table ();
+
+    g_return_val_if_fail (prefs_table, (unlock_prefs_table(), NULL));
+
+    string = g_strdup(g_hash_table_lookup(prefs_table, key));
+
+    unlock_prefs_table ();
+
+    return string;
+}
+
+/* Use this if you need to know if the given key actually exists */
+/* The value parameter can be NULL if you don't need the value itself. */
+gboolean prefs_get_string_value(const gchar *key, gchar **value)
+{
+    const gchar *string;  /* String value from prefs table */
+    gboolean valid = FALSE;
+
+    lock_prefs_table ();
+
+    g_return_val_if_fail (prefs_table, (unlock_prefs_table(), FALSE));
+
+    string = g_hash_table_lookup(prefs_table, key);
+		
+    if (value)
+	*value = g_strdup (string);
+    if (string)
+	valid = TRUE;
+
+    unlock_prefs_table ();
+
+    return valid;
+}
+
+/* Get an integer value from a key */
+gint prefs_get_int(const gchar *key)
+{
+    gchar *string; /* Hash value string */
+    gint value;  /* Returned value */
+	
+    value = 0;
+	
+    lock_prefs_table ();
+
+    g_return_val_if_fail (prefs_table, (unlock_prefs_table(), value));
+
+    string = g_hash_table_lookup(prefs_table, key);
+		
+    if (string)
+	value = atoi(string);
+
+    unlock_prefs_table ();
+
+    return value;
+}
+
+/* Use this if you need to know if the given key actually exists */
+/* The value parameter can be NULL if you don't need the value itself. */
+gboolean prefs_get_int_value(const gchar *key, gint *value)
+{
+    gchar *string;  /* String value from prefs table */
+    gboolean valid = FALSE;
+
+    lock_prefs_table ();
+
+    g_return_val_if_fail (prefs_table, (unlock_prefs_table(), FALSE));
+
+    string = g_hash_table_lookup(prefs_table, key);
+
+    if (value)
+    {
+	if (string)
+	    *value = atoi(string);
+	else
+	    *value = 0;
+    }
+
+    if (string)
+	valid = TRUE;
+
+    unlock_prefs_table ();
+
+    return valid;
+}
+
+/* Get a 64 bit integer value from a key */
+gint64 prefs_get_int64(const gchar *key)
+{
+    gchar *string;  /* Key value string */
+    gint64 value;  /* Returned value */
+	
+    value = 0;
+
+    lock_prefs_table ();
+
+    g_return_val_if_fail (prefs_table, (unlock_prefs_table(), value));
+
+    string = g_hash_table_lookup(prefs_table, key);
+
+    if (string)
+	value = g_ascii_strtoull(string, NULL, 10);
+
+    unlock_prefs_table ();
+	
+    return value;
+}
+
+/* Get a 64 bit integer value from a key */
+/* Use this if you need to know if the given key actually exists */
+/* The value parameter can be NULL if you don't need the value itself. */
+gboolean prefs_get_int64_value(const gchar *key, gint64 *value)
+{
+    gchar *string;  /* String value from prefs table */
+    gboolean valid = FALSE;
+
+    lock_prefs_table ();
+
+    g_return_val_if_fail (prefs_table, (unlock_prefs_table(), FALSE));
+
+    string = g_hash_table_lookup(prefs_table, key);
+		
+    if (value)
+    {
+	if (string)
+	    *value = g_ascii_strtoull(string, NULL, 10);
+	else
+	    *value = 0;
+    }
+
+    if (string)
+	valid = TRUE;
+
+    unlock_prefs_table ();
+
+    return valid;
+}
+
+gdouble prefs_get_double(const gchar *key)
+{
+    gchar *string;  /* Key value string */
+    gdouble value;  /* Returned value */
+	
+    value = 0;
+
+    lock_prefs_table ();
+
+    g_return_val_if_fail (prefs_table, (unlock_prefs_table(), value));
+
+    string = g_hash_table_lookup(prefs_table, key);
+
+    if (string)
+	value = g_ascii_strtod(string, NULL);
+
+    unlock_prefs_table ();
+	
+    return value;
+}
+
+gboolean prefs_get_double_value(const gchar *key, gdouble *value)
+{
+    gchar *string;  /* String value from prefs table */
+    gboolean valid = FALSE;
+
+    lock_prefs_table ();
+
+    g_return_val_if_fail (prefs_table, (unlock_prefs_table(), FALSE));
+
+    string = g_hash_table_lookup(prefs_table, key);
+
+    if (value)
+    {
+	if (string)
+	    *value = g_ascii_strtod(string, NULL);
+	else
+	    *value = 0;
+    }
+
+    if (string)
+	valid = TRUE;
+
+    unlock_prefs_table ();
+
+    return valid;
+}
+
+/* Functions for numbered pref keys */
+
+/* Set a string value with the given key */
+void prefs_set_string_index(const gchar *key, const guint index, 
+			    const gchar *value)
+{
+    gchar *full_key; /* Complete numbered key */
+	
+    full_key = create_full_key(key, index);
+    prefs_set_string(full_key, value);
+	
+    g_free(full_key);
+}
+
+/* Set a key value to a given integer */
+void prefs_set_int_index(const gchar *key, const guint index, 
+			 const gint value)
+{
+    gchar *full_key; /* Complete numbered key */
+	
+    full_key = create_full_key(key, index);
+    prefs_set_int(full_key, value);
+	
+    g_free(full_key);
+}
+
+/* Set a key to an int64 value */
+void prefs_set_int64_index(const gchar *key, const guint index, 
+			   const gint64 value)
+{
+    gchar *full_key; /* Complete numbered key */
+	
+    full_key = create_full_key(key, index);
+    prefs_set_int64(full_key, value);
+	
+    g_free(full_key);
+}
+
+/* Set a key to a gdouble value */
+void prefs_set_double_index(const gchar *key, guint index,
+			     gdouble value)
+{
+    gchar *full_key; /* Complete numbered key */
+	
+    full_key = create_full_key(key, index);
+    prefs_set_double(full_key, value);
+	
+    g_free(full_key);
+}
+
+/* Get a string value associated with a key. Free returned string. */
+gchar *prefs_get_string_index(const gchar *key, const guint index)
+{	
+    gchar *full_key; /* Complete numbered key */
+    gchar *string;  /* Return string */
+	
+    full_key = create_full_key(key, index);
+    string = prefs_get_string(full_key);
+	
+    g_free(full_key);
+    return string;
+}
+
+/* Get a string value associated with a key. Free returned string. */
+/* Use this if you need to know if the given key actually exists */
+gboolean prefs_get_string_value_index(const gchar *key, const guint index, 
+				      gchar **value)
+{
+    gchar *full_key; /* Complete numbered key */
+    gboolean ret; /* Return value */
+	
+    full_key = create_full_key(key, index);
+    ret = prefs_get_string_value(full_key, value);
+	
+    g_free(full_key);
+    return ret;
+}
+
+/* Get an integer value from a key */
+gint prefs_get_int_index(const gchar *key, const guint index)
+{
+    gchar *full_key; /* Complete numbered key */
+    gint value;  /* Returned integer value */
+
+    full_key = create_full_key(key, index);
+    value = prefs_get_int(full_key);
+	
+    g_free(full_key);
+    return value;
+}
+
+/* Get an integer value from a key */
+/* Use this if you need to know if the given key actually exists */
+gboolean prefs_get_int_value_index(const gchar *key, const guint index,  
+				   gint *value)
+{
+    gchar *full_key; /* Complete numbered key */
+    gboolean ret; /* Return value */
+	
+    full_key = create_full_key(key, index);
+    ret = prefs_get_int_value(full_key, value);
+	
+    g_free(full_key);
+    return ret;
+}
+
+/* Get a 64 bit integer value from a key */
+gint64 prefs_get_int64_index(const gchar *key, const guint index)
+{
+    gchar *full_key; /* Complete numbered key */
+    gint64 value; /* Return value */
+	
+    full_key = create_full_key(key, index);
+    value = prefs_get_int64(full_key);
+	
+    g_free(full_key);
+    return value;
+}
+
+/* Get a 64 bit integer value from a key */
+/* Use this if you need to know if the given key actually exists */
+gboolean prefs_get_int64_value_index(const gchar *key, const guint index, 
+				     gint64 *value)
+{
+    gchar *full_key; /* Complete numbered key */
+    gboolean ret; /* Return value */
+	
+    full_key = create_full_key(key, index);
+    ret = prefs_get_int64_value(full_key, value);
+	
+    g_free(full_key);
+    return ret;
+}
+
+gdouble prefs_get_double_index(const gchar *key, guint index)
+{
+    gchar *full_key; /* Complete numbered key */
+    gdouble value; /* Return value */
+	
+    full_key = create_full_key(key, index);
+    value = prefs_get_double(full_key);
+	
+    g_free(full_key);
+    return value;
+}
+
+gboolean prefs_get_double_value_index(const gchar *key, guint index,
+				      gdouble *value)
+{
+    gchar *full_key; /* Complete numbered key */
+    gboolean ret; /* Return value */
+	
+    full_key = create_full_key(key, index);
+    ret = prefs_get_double_value(full_key, value);
+	
+    g_free(full_key);
+    return ret;
+}
+
+/* Add string value with the given key to temp prefs. Note: use
+ * temp_prefs_remove_key() to remove key from the temp prefs. Setting
+ * it to NULL will not remove the key. It will instead remove the key
+ * in the main prefs table when you call temp_prefs_apply(). */
+void temp_prefs_set_string (TempPrefs *temp_prefs, const gchar *key, 
+			   const gchar *value)
+{
+    g_return_if_fail (temp_prefs && temp_prefs->tree);
+    g_return_if_fail (key);
+
+    g_tree_insert (temp_prefs->tree, g_strdup(key), g_strdup(value));
+}
+
+/* Add string value with the given key to temp prefs. Remove the key
+ * if @value is NULL. */
+void temp_prefs_remove_key (TempPrefs *temp_prefs, const gchar *key)
+{
+    g_return_if_fail (temp_prefs && temp_prefs->tree);
+    g_return_if_fail (key);
+
+    g_tree_remove (temp_prefs->tree, key);
+}
+
+/* Add an integer value to temp prefs */
+void temp_prefs_set_int(TempPrefs *temp_prefs, const gchar *key, 
+			const gint value)
+{
+    gchar *strvalue; /* String value converted from integer */
+
+    g_return_if_fail (temp_prefs && temp_prefs->tree);
+    g_return_if_fail (key);
+
+    strvalue = g_strdup_printf("%i", value);
+    g_tree_insert(temp_prefs->tree, g_strdup(key), strvalue);
+}
+
+/* Add an int64 to temp prefs */
+void temp_prefs_set_int64(TempPrefs *temp_prefs, const gchar *key, 
+			  const gint64 value)
+{
+    gchar *strvalue; /* String value converted from int64 */
+	
+    g_return_if_fail (temp_prefs && temp_prefs->tree);
+    g_return_if_fail (key);
+
+    strvalue = g_strdup_printf("%" G_GINT64_FORMAT, value);
+    g_tree_insert(temp_prefs->tree, g_strdup(key), strvalue);
+}
+
+void temp_prefs_set_double(TempPrefs *temp_prefs, const gchar *key,
+			   gdouble value)
+{
+    gchar *strvalue; /* String value converted from int64 */
+	
+    g_return_if_fail (temp_prefs && temp_prefs->tree);
+    g_return_if_fail (key);
+
+    strvalue = g_strdup_printf("%fu", value);
+    g_tree_insert(temp_prefs->tree, g_strdup(key), strvalue);
+}
+
+/* Get a string value associated with a key. Free returned string. */
+gchar *temp_prefs_get_string(TempPrefs *temp_prefs, const gchar *key)
+{	
+    g_return_val_if_fail (temp_prefs && temp_prefs->tree, NULL);
+    g_return_val_if_fail (key, NULL);
+
+    return g_strdup (g_tree_lookup (temp_prefs->tree, key));
+}
+
+/* Use this if you need to know if the given key actually exists */
+/* The value parameter can be NULL if you don't need the value itself. */
+gboolean temp_prefs_get_string_value(TempPrefs *temp_prefs,
+				     const gchar *key, gchar **value)
+{
+    gchar *string;  /* String value from prefs table */
+	
+    g_return_val_if_fail (temp_prefs && temp_prefs->tree, FALSE);
+    g_return_val_if_fail (key, FALSE);
+
+    string = g_tree_lookup (temp_prefs->tree, key);
+
+    if (value)
+	*value = g_strdup (string);
+
+    if (string)
+	return TRUE;
+    else
+	return FALSE;
+}
+
+/* Get an integer value from a key */
+gint temp_prefs_get_int(TempPrefs *temp_prefs, const gchar *key)
+{
+    gchar *string; /* Hash value string */
+    gint value;  /* Returned value */
+	
+    g_return_val_if_fail (temp_prefs && temp_prefs->tree, 0);
+    g_return_val_if_fail (key, 0);
+
+    value = 0;
+	
+    string = g_tree_lookup (temp_prefs->tree, key);
+		
+    if (string)
+	value = atoi(string);
+
+    return value;
+}
+
+/* Use this if you need to know if the given key actually exists */
+/* The value parameter can be NULL if you don't need the value itself. */
+gboolean temp_prefs_get_int_value(TempPrefs *temp_prefs,
+				  const gchar *key, gint *value)
+{
+    gchar *string;  /* String value from prefs table */
+	
+    g_return_val_if_fail (temp_prefs && temp_prefs->tree, FALSE);
+    g_return_val_if_fail (key, FALSE);
+
+    string = g_tree_lookup (temp_prefs->tree, key);
+
+    if (value)
+    {
+	if (string)
+	    *value = atoi(string);
+	else
+	    *value = 0;
+    }
+
+    if (string)
+	return TRUE;
+    else
+	return FALSE;
+}
+
+gdouble temp_prefs_get_double(TempPrefs *temp_prefs,
+			      const gchar *key)
+{
+    gchar *string; /* Hash value string */
+    gdouble value;  /* Returned value */
+	
+    g_return_val_if_fail (temp_prefs && temp_prefs->tree, 0);
+    g_return_val_if_fail (key, 0);
+
+    value = 0.0f;
+	
+    string = g_tree_lookup (temp_prefs->tree, key);
+		
+    if (string)
+	value = g_ascii_strtod(string, NULL);
+
+    return value;    
+}
+
+gboolean temp_prefs_get_double_value(TempPrefs *temp_prefs,
+				    const gchar *key, gdouble *value)
+{
+    gchar *string;  /* String value from prefs table */
+	
+    g_return_val_if_fail (temp_prefs && temp_prefs->tree, FALSE);
+    g_return_val_if_fail (key, FALSE);
+
+    string = g_tree_lookup (temp_prefs->tree, key);
+
+    if (value)
+    {
+	if (string)
+	    *value = g_ascii_strtod(string, NULL);
+	else
+	    *value = 0;
+    }
+
+    if (string)
+	return TRUE;
+    else
+	return FALSE;
+}
+
+/* Functions for numbered pref keys */
+
+/* Set a string value with the given key */
+void temp_prefs_set_string_index(TempPrefs *temp_prefs, const gchar *key,
+				 const guint index, const gchar *value)
+{
+    gchar *full_key; /* Complete numbered key */
+	
+    g_return_if_fail (temp_prefs && temp_prefs->tree);
+    g_return_if_fail (key);
+
+    full_key = create_full_key(key, index);
+    temp_prefs_set_string(temp_prefs, full_key, value);
+	
+    g_free(full_key);
+}
+
+/* Set a key value to a given integer */
+void temp_prefs_set_int_index(TempPrefs *temp_prefs, const gchar *key,
+			      const guint index, const gint value)
+{
+    gchar *full_key; /* Complete numbered key */
+
+    g_return_if_fail (temp_prefs && temp_prefs->tree);
+    g_return_if_fail (key);
+
+    full_key = create_full_key(key, index);
+    temp_prefs_set_int(temp_prefs, full_key, value);
+
+    g_free(full_key);
+}
+
+/* Set a key to an int64 value */
+void temp_prefs_set_int64_index(TempPrefs *temp_prefs, const gchar *key,  
+				const guint index, const gint64 value)
+{
+    gchar *full_key; /* Complete numbered key */
+
+    g_return_if_fail (temp_prefs && temp_prefs->tree);
+    g_return_if_fail (key);
+
+    full_key = create_full_key(key, index);
+    temp_prefs_set_int64(temp_prefs, full_key, value);
+
+    g_free(full_key);
+}
+
+/* Functions for variable-length lists */
+
+/* Create a tree that contains lists that need to be rebuilt */
+/* Free the returned structure with destroy_temp_lists */
+TempLists *temp_lists_create()
+{
+    TempLists *temp_lists;  /* Allocated temp list structure */
+	
+    temp_lists = (TempLists*)g_malloc(sizeof(TempLists));
+	
+
+    temp_lists->tree = g_tree_new_full((GCompareDataFunc)strcmp, NULL,
+				       g_free,
+				       (GDestroyNotify)prefs_free_list);
+    return temp_lists;
+}
+
+/* Destroys the list tree */
+void temp_lists_destroy(TempLists *temp_lists)
+{
+    if (temp_lists)
+    {
+	if (temp_lists->tree)
+	    g_tree_destroy(temp_lists->tree);
+		
+	g_free(temp_lists);
+    }
+}
+
+/* Add a list with the given key prefix to a temp list tree */
+void temp_list_add(TempLists *temp_lists, const gchar *key, GList *list)
+{
+    if (temp_lists)
+    {
+	if (temp_lists->tree)
+	    g_tree_insert(temp_lists->tree, g_strdup(key), list);
+    }
+}
+		
+/* Copy the items of the lists in the given tree to the prefs table */
+void temp_lists_apply(TempLists *temp_lists)
+{
+    if (temp_lists)
+    {
+	if (temp_lists->tree)
+	    g_tree_foreach(temp_lists->tree, copy_list, NULL);
+    }
+}
+
+/* Copy one list to the prefs table. Useful for lists not changed by a window */
+void prefs_apply_list(gchar *key, GList *list)
+{
+    GList *node;  /* Current list node */
+    guint i;  /* Counter */
+	
+    i = 0;
+	
+    if (prefs_table)
+    {
+	/* Clean the existing list */
+	wipe_list(key);
+		
+	node = list;
+		
+	/* Add the new list items to the table */
+	while (node)
+	{
+	    g_hash_table_insert(prefs_table, create_full_key(key, i), 
+				g_strdup(node->data));
+				
+	    node = g_list_next(node);
+	    i++;
+	}
+		
+	/* Add the end marker */
+	g_hash_table_insert(prefs_table, create_full_key(key, i),
+			    g_strdup(LIST_END_MARKER));
+    }
+}
+
+/* Get the items in a variable-length list from the prefs table */
+GList *prefs_get_list(const gchar *key)
+{
+    guint end_marker_hash;  /* Hash value of the list end marker */
+    guint item_hash;  /* Hash value of current list string */
+    gchar *item_string;  /* List item string */
+    guint i;  /* Counter */
+    GList *list;  /* List that contains items */
+	
+    /* Go through each key in the table until we find the end marker */
+    end_marker_hash = g_str_hash(LIST_END_MARKER);
+    list = NULL;
+	
+    for (i = 0;;i++)
+    {
+	item_string = prefs_get_string_index(key, i);
+		
+	if (item_string)
+	{
+	    item_hash = g_str_hash(item_string);
+			
+	    if (item_hash != end_marker_hash)
+	    {
+		list = g_list_append(list, item_string);
+		continue;
+	    }
+	    else
+	    {
+		g_free(item_string);
+		break;
+	    }
+	}
+    }
+	
+    return list;
+}
+
+/* Free a list and its strings */
+void prefs_free_list(GList *list)
+{
+    GList *node;  /* Current list node */
+	
+    node = list;
+	
+    /* Go through the list, freeing the strings */
+	
+    while (node)
+    {
+	if (node->data)
+	    g_free(node->data);
+		
+	node = g_list_next(node);
+    }
+	
+    g_list_free(list);
+}
+
+/* Creates a list from lines in a GtkTextBuffer. Free the list when done. */
+GList *get_list_from_buffer(GtkTextBuffer *buffer)
+{
+    GtkTextIter start_iter; /* Start of buffer text */
+    GtkTextIter end_iter; /* End of buffer text */
+    gchar *text_buffer; /* Raw text buffer */
+    gchar **string_array; /* Contains each line of the buffer */
+    gchar **string_iter;  /* Pointer for iterating through the string vector */
+    GList *list; /* List that contains each string */
+	
+    list = NULL;
+	
+    /* Grab the text from the buffer, and then split it up by lines */
+    gtk_text_buffer_get_start_iter(buffer, &start_iter);
+    gtk_text_buffer_get_end_iter(buffer, &end_iter);
+	
+    text_buffer = gtk_text_buffer_get_text(buffer, &start_iter, &end_iter, FALSE);
+    string_array = g_strsplit(text_buffer, "\n", -1);
+    string_iter = string_array;
+	
+    /* Go through each string and put it in the list */
+    while (*string_iter)
+    {
+	if (strlen(*string_iter) != 0)
+	    list = g_list_append(list, g_strdup(*string_iter));
+		
+	string_iter++;
+    }
+    
+    return list;
+}

Added: trunk/src/prefs.h
===================================================================
--- trunk/src/prefs.h	                        (rev 0)
+++ trunk/src/prefs.h	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,206 @@
+/*
+|  Copyright (C) 2002-2007 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Copyright (C) 2006 James Liggett <jrliggett at cox.net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: prefs.h 1596 2007-06-26 14:33:01Z dforsi $
+*/
+
+#ifndef __PREFS_H__
+#define __PREFS_H__
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <gtk/gtk.h>
+#include "prefs_window.h"
+#include "display.h"
+
+
+
+/* Not sure where to put these (maybe prefkeys.h?): prefs keys used */
+/* repository.c */
+extern const gchar *KEY_CONCAL_AUTOSYNC;
+extern const gchar *KEY_SYNC_DELETE_TRACKS;
+extern const gchar *KEY_SYNC_CONFIRM_DIRS;
+extern const gchar *KEY_SYNC_CONFIRM_DELETE;
+extern const gchar *KEY_SYNC_SHOW_SUMMARY;
+extern const gchar *KEY_MOUNTPOINT;
+extern const gchar *KEY_IPOD_MODEL;
+extern const gchar *KEY_FILENAME;
+extern const gchar *KEY_PATH_SYNC_CONTACTS;
+extern const gchar *KEY_PATH_SYNC_CALENDAR;
+extern const gchar *KEY_PATH_SYNC_NOTES;
+extern const gchar *KEY_SYNCMODE;
+extern const gchar *KEY_MANUAL_SYNCDIR;
+extern const gchar *KEY_DISPLAY_COVERART;
+
+/* New prefs backend. Will replace the stuff above */
+
+/* 
+ * Wrapper data types for temp preferences
+ */
+
+/* A wrapper around a GTree for regular temporary preferences */
+typedef struct 
+{
+	GTree *tree;
+} TempPrefs;
+
+/* A wrapper around a GTree for variable-length list */
+typedef struct 
+{
+	GTree *tree;
+} TempLists;
+
+/* Preferences setup and cleanup */
+void prefs_init (int argc, char *argv[]);
+void prefs_save (void);
+void prefs_shutdown (void);
+
+/*
+ * Functions that are used to manipulate preferences.
+ * The preferences table shouldn't be modified directly.
+ */
+
+/* Functions that set preference values */
+
+void prefs_set_string(const gchar *key, const gchar *value);
+void prefs_set_int(const gchar *key, const gint value);
+void prefs_set_int64(const gchar *key, const gint64 value);
+void prefs_set_double(const gchar *key, gdouble value);
+
+/* The index parameter is used for numbered preference keys.
+ * (i.e. pref0, pref1, etc) */
+void prefs_set_string_index(const gchar *key, const guint index,
+			    const gchar *value);
+void prefs_set_int_index(const gchar *key, const guint index,
+			 const gint value);
+void prefs_set_int64_index(const gchar *key, guint index,
+			   const gint64 value);
+void prefs_set_double_index(const gchar *key, guint index,
+			    gdouble value);
+
+/* Functions that get preference values */
+gchar *prefs_get_string(const gchar *key);
+gboolean prefs_get_string_value(const gchar *key, gchar **value);
+gint prefs_get_int(const gchar *key);
+gboolean prefs_get_int_value(const gchar *key, gint *value);
+gint64 prefs_get_int64(const gchar *key);
+gboolean prefs_get_int64_value(const gchar *key, gint64 *value);
+gdouble prefs_get_double(const gchar *key);
+gboolean prefs_get_double_value(const gchar *key, gdouble *value);
+
+/* Numbered prefs functions */
+gchar *prefs_get_string_index(const gchar *key, const guint index);
+gboolean prefs_get_string_value_index(const gchar *key,
+				      const guint index, gchar **value);
+gint prefs_get_int_index(const gchar *key, const guint index);
+gboolean prefs_get_int_value_index(const gchar *key, const guint index,
+				   gint *value);
+gint64 prefs_get_int64_index(const gchar *key, const guint index);
+gboolean prefs_get_int64_value_index(const gchar *key,
+				     const guint index, gint64 *value);
+gdouble prefs_get_double_index(const gchar *key,
+			       guint index);
+gboolean prefs_get_double_value_index(const gchar *key, guint index,
+				      gdouble *value);
+/* Special functions */
+TempPrefs *prefs_create_subset (const gchar *subkey);
+void prefs_flush_subkey (const gchar *subkey);
+void prefs_rename_subkey (const gchar *subkey_old, const gchar *subkey_new);
+void temp_prefs_rename_subkey (TempPrefs *temp_prefs,
+			       const gchar *subkey_old,
+			       const gchar *subkey_new);
+gboolean temp_prefs_subkey_exists (TempPrefs *temp_prefs,
+				   const gchar *subkey);
+
+/* 
+ * Temp prefs functions
+ */
+TempPrefs *temp_prefs_create (void);
+TempPrefs *temp_prefs_load (const gchar *filename, GError **error);
+gboolean temp_prefs_save (TempPrefs *temp_prefs,
+			  const gchar *filename,
+			  GError **error);
+TempPrefs *temp_prefs_create_subset (TempPrefs *temp_prefs,
+				     const gchar *subkey);
+void temp_prefs_destroy (TempPrefs *temp_prefs);
+void temp_prefs_apply (TempPrefs *temp_prefs);
+void temp_prefs_flush(TempPrefs *temp_prefs);
+gint temp_prefs_size (TempPrefs *temp_prefs);
+
+/*
+ * Functions that add various types of info to the temp prefs tree.
+ */
+void temp_prefs_remove_key (TempPrefs *temp_prefs, const gchar *key);
+void temp_prefs_set_string(TempPrefs *temp_prefs, const gchar *key,
+			   const gchar *value);
+void temp_prefs_set_int(TempPrefs *temp_prefs, const gchar *key,
+			const gint value);
+void temp_prefs_set_int64(TempPrefs *temp_prefs, const gchar *key,
+			  const gint64 value);
+void temp_prefs_set_double(TempPrefs *temp_prefs, const gchar *key,
+			   gdouble value);
+
+/*
+ * Functions that retrieve various types of info from the temp prefs tree.
+ */
+gchar *temp_prefs_get_string(TempPrefs *temp_prefs, const gchar *key);
+gboolean temp_prefs_get_string_value(TempPrefs *temp_prefs,
+				     const gchar *key, gchar **value);
+gint temp_prefs_get_int(TempPrefs *temp_prefs, const gchar *key);
+gboolean temp_prefs_get_int_value(TempPrefs *temp_prefs,
+				  const gchar *key, gint *value);
+gdouble temp_prefs_get_double(TempPrefs *temp_prefs, const gchar *key);
+gboolean temp_prefs_get_double_value(TempPrefs *temp_prefs, const gchar *key,
+				    gdouble *value);
+
+/* Numbered preferences functions */
+void temp_prefs_set_string_index(TempPrefs *temp_prefs, const gchar *key,
+				 const guint index, const gchar *value);
+void temp_prefs_set_int_index(TempPrefs *temp_prefs, const gchar *key,
+			      const guint index, const gint value);
+void temp_prefs_set_int64_index(TempPrefs *temp_prefs, const gchar *key,
+				const guint index, const gint64 value);
+void temp_prefs_set_double_index(TempPrefs *temp_prefs, const gchar *key,
+				 guint index, gdouble value);
+
+
+/* 
+ * Functions for variable-length lists
+ */
+ 
+TempLists *temp_lists_create (void);
+void temp_lists_destroy(TempLists *temp_lists);
+void temp_list_add(TempLists *temp_lists, const gchar *key, GList *list);
+void temp_lists_apply(TempLists *temp_lists);
+void prefs_apply_list(gchar *key, GList *list);
+GList *prefs_get_list(const gchar *key);
+void prefs_free_list(GList *list);
+GList *get_list_from_buffer(GtkTextBuffer *buffer);
+
+gchar *prefs_get_cfgdir (void);
+#endif

Added: trunk/src/prefs_window.c
===================================================================
--- trunk/src/prefs_window.c	                        (rev 0)
+++ trunk/src/prefs_window.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,2407 @@
+/*
+|  Copyright (C) 2002 Corey Donohoe <atmos at atmos.org>
+|  Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+|
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: prefs_window.c 1776 2007-11-12 22:38:00Z phantom_sf $
+*/
+
+#include <stdio.h>
+#include <string.h>
+#include "charset.h"
+#include "display_itdb.h"
+#include "info.h"
+#include "fileselection.h"
+#include "sha1.h"
+/*#include "md5.h"*/
+#include "misc.h"
+#include "misc_track.h"
+#include "prefs.h"
+#include "prefs_window.h"
+#include "repository.h"
+
+
+GladeXML *prefs_window_xml;
+GladeXML *sort_window_xml;
+
+static GtkWidget *prefs_window = NULL;
+static GtkWidget *sort_window = NULL;
+
+/* New prefs temp handling */
+static TempPrefs *temp_prefs;
+static TempLists *temp_lists;
+static TempPrefs *sort_temp_prefs;
+static TempLists *sort_temp_lists;
+
+/* keeps the check buttons for "Select Entry 'All' in Sorttab %d" */
+static GtkWidget *autoselect_widget[SORT_TAB_MAX];
+
+static void prefs_window_set_st_autoselect (guint32 inst, gboolean autoselect);
+static void prefs_window_set_autosettags (gint category, gboolean autoset);
+static void prefs_window_set_sort_tab_num (gint num);
+
+/* Some declarations */
+static void standard_toggle_toggled (GtkToggleButton *togglebutton,
+				     const gchar *key);
+
+static void on_convert_toggle_toggled (GtkToggleButton *togglebutton,
+				     gpointer not_used);
+
+static const gchar *convert_names[] =
+{
+    "convert_ogg",
+    "convert_flac",
+    "convert_m4a",
+    "convert_mp3",
+    "convert_wav",
+    NULL
+};
+
+/* Definition of path button names.
+   path_fileselector_titles[] specifies the title for the file
+   chooser. path_type[] specifies whether to browse for dirs or for
+   files.
+*/
+static const gchar *path_button_names[] =
+{
+    "play_now_path_button",
+    "play_enqueue_path_button",
+    "mp3gain_path_button",
+    "aacgain_path_button",
+    "mserv_music_root_button",
+    "mserv_trackinfo_root_button",
+    "path_conv_ogg_button",
+    "path_conv_flac_button",
+    "path_conv_m4a_button",
+    "path_conv_mp3_button",
+    "path_conv_wav_button",
+    NULL
+};
+static const gchar *path_key_names[] =
+{
+    "path_play_now",
+    "path_play_enqueue",
+    "path_mp3gain",
+    "aacgain_path",
+    "path_mserv_music_root",
+    "path_mserv_trackinfo_root",
+    "path_conv_ogg",
+    "path_conv_flac",
+    "path_conv_m4a",
+    "path_conv_mp3",
+    "path_conv_wav",
+    NULL
+};
+const gchar *path_entry_names[] =
+{
+    "play_now_path_entry",
+    "play_enqueue_path_entry",
+    "mp3gain_path_entry",
+    "aacgain_path_entry",
+    "mserv_music_root_entry",
+    "mserv_trackinfo_root_entry",
+    "path_conv_ogg_entry",
+    "path_conv_flac_entry",
+    "path_conv_m4a_entry",
+    "path_conv_mp3_entry",
+    "path_conv_wav_entry",
+    NULL
+};
+static const gchar *path_fileselector_titles[] =
+{
+    N_("Please select command for 'Play Now'"),
+    N_("Please select command for 'Enqueue'"),
+    N_("Please select the mp3gain executable"),
+    N_("Please select the aacgain executable"),
+    N_("Select the mserv music root directory"),
+    N_("Select the mserv trackinfo root directory"),
+    N_("Select the ogg/vorbis converter command"),
+    N_("Select the flac converter command"),
+    N_("Select the m4a converter command."),
+    N_("Select the mp3 converter command."),
+    N_("Select the wav converter command."),
+    NULL
+};
+static const GtkFileChooserAction path_type[] =
+{
+    GTK_FILE_CHOOSER_ACTION_OPEN,  /* select file */
+    GTK_FILE_CHOOSER_ACTION_OPEN,
+    GTK_FILE_CHOOSER_ACTION_OPEN,
+    GTK_FILE_CHOOSER_ACTION_OPEN,
+    GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, /* select folder */
+    GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+    GTK_FILE_CHOOSER_ACTION_OPEN,
+    GTK_FILE_CHOOSER_ACTION_OPEN,
+    GTK_FILE_CHOOSER_ACTION_OPEN,
+    GTK_FILE_CHOOSER_ACTION_OPEN,
+    GTK_FILE_CHOOSER_ACTION_OPEN,
+    -1
+};
+
+static void on_cfg_st_autoselect_toggled (GtkToggleButton *togglebutton,
+					  gpointer         user_data)
+{
+    prefs_window_set_st_autoselect (
+	GPOINTER_TO_UINT(user_data),
+	gtk_toggle_button_get_active(togglebutton));
+}
+
+static void on_cfg_autosettags_toggled (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+    prefs_window_set_autosettags (
+	GPOINTER_TO_UINT(user_data),
+	gtk_toggle_button_get_active(togglebutton));
+}
+
+
+/* one of the "..." buttons has been pressed -> open a file chooser
+   dialog and let the user select a file or directory */
+static void on_path_button_pressed (GtkButton *button, gpointer user_data)
+{
+    gint i = GPOINTER_TO_INT (user_data);
+    gchar *oldpath, *newpath;
+    gchar *fallback = NULL;
+    gchar *text = NULL;
+
+    g_return_if_fail (temp_prefs);
+
+    oldpath = temp_prefs_get_string (temp_prefs, path_key_names[i]);
+    if (!oldpath)
+    {
+	oldpath = prefs_get_string (path_key_names[i]);
+    }
+
+    /* initialize fallback path with something reasonable */
+    if ((strcmp (path_key_names[i], "path_conv_ogg") == 0) ||
+	(strcmp (path_key_names[i], "path_conv_flac") == 0))
+    {
+	fallback = g_strdup (SCRIPTDIR);
+	text = g_markup_printf_escaped (_("<i>Have a look at the scripts provided in '%s'. If you write a new script or improve an existing one, please send it to jcsjcs at users.sourceforge.net for inclusion into the next release.</i>"), SCRIPTDIR);
+    }
+
+    switch (path_type[i])
+    {
+    case GTK_FILE_CHOOSER_ACTION_OPEN:
+	/* script */
+	newpath = fileselection_select_script (
+	    oldpath,
+	    fallback,
+	    _(path_fileselector_titles[i]),
+	    text);
+	break;
+    case GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER:
+	/* directory */
+	newpath = fileselection_get_file_or_dir (
+	    _(path_fileselector_titles[i]),
+	    oldpath,
+	    GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
+	break;
+    default:
+	g_return_if_reached ();
+    }
+    g_free (oldpath);
+    g_free (fallback);
+    g_free (text);
+
+    if (newpath)
+    {
+	GtkWidget *w = gtkpod_xml_get_widget (prefs_window_xml,
+					      path_entry_names[i]);
+	if (w)
+	{
+	    gchar *newpath_utf8 = g_filename_to_utf8 (newpath, -1, NULL, NULL, NULL);
+	    gtk_entry_set_text(GTK_ENTRY(w), newpath_utf8);
+	    g_free (newpath_utf8);
+	}
+	g_free (newpath);
+    }
+}
+
+
+static void on_path_entry_changed (GtkEditable     *editable,
+				   gpointer         user_data)
+{
+    gint i = GPOINTER_TO_INT (user_data);
+    gchar *buf = gtk_editable_get_chars(editable, 0, -1);
+
+    temp_prefs_set_string (temp_prefs, path_key_names[i], buf);
+    g_free (buf);
+}
+
+/* turn the prefs window insensitive (if it's open) */
+void prefs_window_block (void)
+{
+    if (prefs_window)
+	gtk_widget_set_sensitive (prefs_window, FALSE);
+}
+
+/* turn the prefs window sensitive (if it's open) */
+void prefs_window_release (void)
+{
+    if (prefs_window)
+	gtk_widget_set_sensitive (prefs_window, TRUE);
+}
+
+
+/* make the tooltips visible or hide it depending on the value set in
+ * the prefs (tooltips_prefs) */
+void prefs_window_show_hide_tooltips (void)
+{
+    GtkTooltips *tt;
+    GtkTooltipsData *tooltipsdata;
+
+    if (!prefs_window)   return; /* we may get called even when window
+				    is not open */
+    tooltipsdata = gtk_tooltips_data_get (gtkpod_xml_get_widget (prefs_window_xml, "cfg_write_extended"));
+    g_return_if_fail (tooltipsdata);
+    tt = tooltipsdata->tooltips;
+    g_return_if_fail (tt);
+    if (prefs_get_int("display_tooltips_prefs")) gtk_tooltips_enable (tt);
+    else                                     gtk_tooltips_disable (tt);
+}
+
+static void convert_table_set_children_initial_sensitivity (GtkTable *table)
+{
+    GList *list_item;
+    GtkTableChild *child;
+
+    list_item = table->children;
+    while (list_item) {
+        child = (GtkTableChild*)list_item->data;
+        gtk_widget_set_sensitive (child->widget, 
+                                     GTK_IS_TOGGLE_BUTTON (child->widget));
+        list_item = g_list_next (list_item);
+    }
+}
+
+enum {
+    TRACK_COLUMNS_TEXT,
+    TRACK_COLUMNS_INT,
+    TRACK_N_COLUMNS
+};
+
+typedef enum {
+    HIDE,
+    SHOW
+} TrackColumnsType;
+
+
+static gint visible_cols_sort (GtkTreeModel *model,
+			       GtkTreeIter *a,
+			       GtkTreeIter *b,
+			       gpointer user_data)
+{
+    gchar *str1, *str2;
+    gint result;
+
+    gtk_tree_model_get (model, a, TRACK_COLUMNS_TEXT, &str1, -1);
+    gtk_tree_model_get (model, b, TRACK_COLUMNS_TEXT, &str2, -1);
+
+    result = g_utf8_collate (str1, str2);
+
+    g_free (str1);
+    g_free (str2);
+
+    return result;
+}
+
+
+static GtkWidget *visible_cols_get_treeview (TrackColumnsType type)
+{
+    GtkWidget *w=NULL;
+
+    switch (type)
+    {
+    case HIDE:
+	w = gtkpod_xml_get_widget (prefs_window_xml, "track_cols_hide_tv");
+	break;
+    case SHOW:
+	w = gtkpod_xml_get_widget (prefs_window_xml, "track_cols_show_tv");
+	break;
+    default:
+	g_return_val_if_reached (NULL);
+    }
+
+    return w;
+}
+
+static GtkWidget *visible_cols_get_treeview_other (TrackColumnsType type)
+{
+    GtkWidget *w=NULL;
+
+    switch (type)
+    {
+    case SHOW:
+	w = gtkpod_xml_get_widget (prefs_window_xml, "track_cols_hide_tv");
+	break;
+    case HIDE:
+	w = gtkpod_xml_get_widget (prefs_window_xml, "track_cols_show_tv");
+	break;
+    default:
+	g_return_val_if_reached (NULL);
+    }
+
+    return w;
+}
+
+
+static void setup_visible_cols_liststore (TrackColumnsType type)
+{
+    GtkTreeSelection *selection;
+    GtkWidget *treeview;
+    GtkListStore *store;
+    GtkTreeIter iter;
+    GtkTreeViewColumn *column;
+    GtkCellRenderer *renderer;
+    gint i;
+
+    treeview = visible_cols_get_treeview (type);
+
+    store = gtk_list_store_new (TRACK_N_COLUMNS, G_TYPE_STRING, G_TYPE_INT);
+
+    column = gtk_tree_view_column_new ();
+
+    renderer = gtk_cell_renderer_text_new ();
+    gtk_tree_view_column_pack_start (column, renderer, TRUE);
+
+    gtk_tree_view_column_set_attributes (column, renderer,
+					 "text", TRACK_COLUMNS_TEXT, NULL);
+
+    gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
+    gtk_tree_view_set_model (GTK_TREE_VIEW (treeview),
+			    (GTK_TREE_MODEL (store)));
+
+    selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
+
+    gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE);
+
+    g_object_unref (G_OBJECT (store));
+
+    for (i=0; i<TM_NUM_COLUMNS; ++i)
+    {
+	gint visible;
+	visible = prefs_get_int_index("col_visible", i);
+	if (((type == HIDE) && visible) || ((type == SHOW) && !visible))
+	    continue;
+	gtk_list_store_append (store, &iter);
+	gtk_list_store_set(store, &iter,
+			   TRACK_COLUMNS_TEXT, gettext (get_tm_string (i)),
+			   TRACK_COLUMNS_INT, i, -1);
+    }
+    /* sort model alphabetically */
+    gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE (store),
+					     visible_cols_sort,
+					     NULL,
+					     NULL);
+    gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store),
+					  GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID,
+					  GTK_SORT_ASCENDING);
+}
+
+
+static void visible_cols_move (GtkButton *button, gpointer data)
+{
+    GtkTreeSelection *selection_from, *selection_to;
+    gchar *text;
+    gint index;
+    TrackColumnsType type;
+    GtkWidget *treeview_from, *treeview_to;
+    GtkTreeModel *model_from, *model_to;
+    GList *gl, *selected_paths, *selected_refs=NULL;
+
+    type = GPOINTER_TO_INT (data);
+
+    treeview_from = visible_cols_get_treeview_other (type);
+    model_from = gtk_tree_view_get_model (GTK_TREE_VIEW (treeview_from));
+    selection_from = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview_from));
+
+    treeview_to = visible_cols_get_treeview (type);
+    model_to = gtk_tree_view_get_model (GTK_TREE_VIEW (treeview_to));
+    selection_to = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview_to));
+
+    /* unselect the "to" selection */
+    gtk_tree_selection_unselect_all (selection_to);
+
+    /* Get a list of paths */
+    selected_paths = gtk_tree_selection_get_selected_rows (selection_from,
+							   &model_from);
+
+    /* Since we are modifying the model as we go along, we cannot use
+       paths -> convert the paths into references */
+    for (gl=selected_paths; gl; gl=gl->next)
+    {
+	selected_refs = g_list_append (selected_refs,
+				       gtk_tree_row_reference_new (model_from,
+								   gl->data));
+	gtk_tree_path_free (gl->data);
+    }
+    g_list_free (selected_paths);
+
+    for (gl=selected_refs; gl; gl=gl->next)
+    {
+	GtkTreeIter iter;
+	GtkTreePath *path_from = gtk_tree_row_reference_get_path (gl->data);
+	if (gtk_tree_model_get_iter (model_from, &iter, path_from))
+	{
+	    GtkTreePath *path_to;
+	    gtk_tree_model_get (model_from, &iter,
+				TRACK_COLUMNS_TEXT, &text,
+				TRACK_COLUMNS_INT, &index, -1);
+	    gtk_list_store_remove (GTK_LIST_STORE (model_from), &iter);
+	    gtk_list_store_append (GTK_LIST_STORE (model_to), &iter);
+	    gtk_list_store_set (GTK_LIST_STORE (model_to), &iter,
+				TRACK_COLUMNS_TEXT, text, -1);
+	    /* select all newly moved items */
+	    gtk_tree_selection_select_iter (selection_to, &iter);
+	    /* make newly moved item visible */
+	    path_to = gtk_tree_model_get_path (model_to, &iter);
+	    gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (treeview_to),
+					  path_to, NULL,
+					  FALSE, 0, 0);
+	    gtk_tree_path_free (path_to);
+	    temp_prefs_set_int_index(temp_prefs, "col_visible", index, type);
+	}
+	gtk_tree_path_free (path_from);
+	gtk_tree_row_reference_free (gl->data);
+    }
+    g_list_free (selected_refs);
+}
+
+
+static gboolean visible_cols_double_clicked (GtkWidget      *widget,
+					     GdkEventButton *event,
+					     gpointer        user_data)
+{
+    TrackColumnsType type;
+
+    type = GPOINTER_TO_INT (user_data);
+
+    switch (event->type)
+    {
+    case GDK_2BUTTON_PRESS:
+	/* pretend the "show/hide" button was pressed */
+	visible_cols_move (NULL, user_data);
+	/* don't propagate event */
+	return TRUE;
+    default:
+	/* propagate event */
+	return FALSE;
+    }
+}
+
+
+/* Note that the tooltips are not currently used.  Gtk+ >= 2.11.6 has a new
+ * tooltip API which allows tooltips in treeview cells.  Prior to that, various
+ * hacks are required.  See the patch in http://bugzilla.gnome.org/130983 for
+ * one possible method. -- tmz */
+static void setup_visible_cols (GtkTooltips *tt)
+{
+    GtkWidget *hide_button;
+    GtkWidget *show_button;
+
+    setup_visible_cols_liststore (HIDE);
+    setup_visible_cols_liststore (SHOW);
+
+    hide_button = gtkpod_xml_get_widget (prefs_window_xml,
+					 "track_cols_hide_button");
+    show_button = gtkpod_xml_get_widget (prefs_window_xml,
+					 "track_cols_show_button");
+
+    /* connect signals */
+    g_signal_connect (hide_button, "clicked",
+		      G_CALLBACK (visible_cols_move), GINT_TO_POINTER(HIDE));
+    g_signal_connect (show_button, "clicked",
+		      G_CALLBACK (visible_cols_move), GINT_TO_POINTER(SHOW));
+
+
+    g_signal_connect (visible_cols_get_treeview (HIDE), "button-press-event",
+		      G_CALLBACK (visible_cols_double_clicked),
+		      GINT_TO_POINTER (SHOW));
+    g_signal_connect (visible_cols_get_treeview (SHOW), "button-press-event",
+		      G_CALLBACK (visible_cols_double_clicked),
+		      GINT_TO_POINTER (HIDE));
+
+}
+
+
+/**
+ * create_gtk_prefs_window
+ * Create, Initialize, and Show the preferences window
+ * allocate a static cfg struct for temporary variables
+ *
+ * If the window is already open, it is raised to the front and @page
+ * is selected (unless it's -1).
+ *
+ * @page: -1 for 'last page'.
+ */
+void
+prefs_window_create (gint page)
+{
+    gint i;
+    gint defx, defy;
+    GtkWidget *w = NULL;
+    GtkTooltips *tt;
+    GtkTooltipsData *tooltipsdata;
+    GtkToolbarStyle toolbar_style;
+    gchar *buf = NULL;
+    /* List of standard toggle widget names */
+    const gchar *toggle_widget_names[] = {
+	"sync_confirm_dirs_toggle",
+	"sync_delete_tracks_toggle",
+	"sync_show_summary_toggle",
+	"file_convert_display_log_button",
+	"file_convert_background_transfer_button",
+	NULL
+    };
+    /* ... and corresponding keys */
+    const gchar *toggle_key_names[] = {
+	KEY_SYNC_CONFIRM_DIRS,
+	KEY_SYNC_DELETE_TRACKS,
+	KEY_SYNC_SHOW_SUMMARY,
+	FILE_CONVERT_DISPLAY_LOG,
+	FILE_CONVERT_BACKGROUND_TRANSFER,
+	NULL
+    };
+
+    if (prefs_window)
+    {   /* prefs window already open -- raise to the top */
+	gdk_window_raise (prefs_window->window);
+	if (page != -1)
+	{
+	    g_return_if_fail (prefs_window_xml);
+	    if ((w = gtkpod_xml_get_widget (prefs_window_xml, "notebook")))
+	    {
+		gtk_notebook_set_current_page (GTK_NOTEBOOK (w), page);
+	    }
+	}
+	return;
+    }
+		
+    /* Initialize temp prefs structures */
+    temp_prefs = temp_prefs_create();
+    temp_lists = temp_lists_create();
+
+    prefs_window_xml = glade_xml_new (xml_file, "prefs_window", NULL);
+    glade_xml_signal_autoconnect (prefs_window_xml);
+
+    prefs_window = gtkpod_xml_get_widget(prefs_window_xml,"prefs_window");
+
+    g_return_if_fail (prefs_window);
+		
+    tooltipsdata = gtk_tooltips_data_get (gtkpod_xml_get_widget (prefs_window_xml, "cfg_write_extended"));
+    g_return_if_fail (tooltipsdata);
+    tt = tooltipsdata->tooltips;
+    g_return_if_fail (tt);
+
+    defx = prefs_get_int("size_prefs.x");
+    defy = prefs_get_int("size_prefs.y");
+    if (defx == 0)
+	defx = 500;
+    if (defy == 0)
+	defy = 600;
+
+    gtk_window_set_default_size (GTK_WINDOW (prefs_window), defx, defy);
+
+    /* Code to add subscriptions list box */
+
+    /* Set up standard toggles */
+    for (i=0; toggle_widget_names[i]; ++i)
+    {
+	w = gtkpod_xml_get_widget (prefs_window_xml,
+				   toggle_widget_names[i]);
+	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w),
+				      prefs_get_int (toggle_key_names[i]));
+	g_signal_connect (w, "toggled",
+			  G_CALLBACK (standard_toggle_toggled),
+			  (gpointer)toggle_key_names[i]);
+    }
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "sync_confirm_delete_toggle");
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+				 prefs_get_int (KEY_SYNC_CONFIRM_DELETE));
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "sync_confirm_delete_toggle2");
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+				 prefs_get_int (KEY_SYNC_CONFIRM_DELETE));
+
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "charset_combo");
+    charset_init_combo (GTK_COMBO (w));
+    
+    w = gtkpod_xml_get_widget (prefs_window_xml, "cfg_sha1tracks");
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+				 prefs_get_int("sha1"));
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "cfg_update_existing");
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+				 prefs_get_int("update_existing"));
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "cfg_show_duplicates");
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+				 prefs_get_int("show_duplicates"));
+    if (!prefs_get_int("sha1")) gtk_widget_set_sensitive (w, FALSE);
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "cfg_show_updated");
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+				 prefs_get_int("show_updated"));
+    if (!prefs_get_int("update_existing")) gtk_widget_set_sensitive (w, FALSE);
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "cfg_show_non_updated");
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+				 prefs_get_int("show_non_updated"));
+    if (!prefs_get_int("update_existing")) gtk_widget_set_sensitive (w, FALSE);
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "cfg_display_toolbar");
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+				 prefs_get_int("display_toolbar"));
+
+    toolbar_style = prefs_get_int("toolbar_style");
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "cfg_toolbar_style_icons");
+    if (toolbar_style == GTK_TOOLBAR_ICONS)
+	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), TRUE);
+    if (!prefs_get_int("display_toolbar")) gtk_widget_set_sensitive (w, FALSE);
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "cfg_toolbar_style_text");
+    if (toolbar_style == GTK_TOOLBAR_TEXT)
+	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), TRUE);
+    if (!prefs_get_int("display_toolbar")) gtk_widget_set_sensitive (w, FALSE);
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "cfg_toolbar_style_both");
+    if (toolbar_style == GTK_TOOLBAR_BOTH)
+	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), TRUE);
+    if (!prefs_get_int("display_toolbar")) gtk_widget_set_sensitive (w, FALSE);
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "cfg_display_tooltips_main");
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+				 prefs_get_int("display_tooltips_main"));
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "cfg_display_tooltips_prefs");
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+				 prefs_get_int("display_tooltips_prefs"));
+		
+    w = gtkpod_xml_get_widget (prefs_window_xml, "cfg_multi_edit");
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+				 prefs_get_int("multi_edit"));
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "cfg_not_played_track");
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+				 prefs_get_int("not_played_track"));
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "cfg_misc_track_nr");
+    gtk_spin_button_set_range (GTK_SPIN_BUTTON (w), 0, 0xffffffff);
+    gtk_spin_button_set_value (GTK_SPIN_BUTTON (w),
+			       prefs_get_int("misc_track_nr"));
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "cfg_multi_edit_title");
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+				 prefs_get_int("multi_edit_title"));
+    gtk_widget_set_sensitive (w, prefs_get_int("multi_edit"));
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "cfg_update_charset");
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+				 prefs_get_int("update_charset"));
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "cfg_id3_write");
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+				 prefs_get_int("id3_write"));
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "cfg_id3_write_id3v24");
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+				 prefs_get_int("id3_write_id3v24"));
+    if (!prefs_get_int("id3_write")) gtk_widget_set_sensitive (w, FALSE);
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "cfg_write_charset");
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+				 prefs_get_int("write_charset"));
+    if (!prefs_get_int("id3_write")) gtk_widget_set_sensitive (w, FALSE);
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "cfg_add_recursively");
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+				 prefs_get_int("add_recursively"));
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "cfg_delete_track_from_playlist");
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+				 prefs_get_int("delete_track"));
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "cfg_delete_track_from_ipod");
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+				 prefs_get_int("delete_ipod"));
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "cfg_track_local_file_deletion");
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+				 prefs_get_int("delete_local_file"));
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "cfg_track_database_deletion");
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+				 prefs_get_int("delete_database"));
+    
+    w = gtkpod_xml_get_widget (prefs_window_xml, "photo_library_confirm_delete_toggle");
+        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+    				 prefs_get_int("photo_library_confirm_delete"));
+        
+
+#if 0
+    /* last.fm -- disabled, we'll hide the prefs window */
+    int x = prefs_get_int("lastfm_active");
+    GtkWidget *u = gtkpod_xml_get_widget (prefs_window_xml, "lastfm_username");
+    GtkWidget *p = gtkpod_xml_get_widget (prefs_window_xml, "lastfm_password");
+    w = gtkpod_xml_get_widget (prefs_window_xml, "lastfm_active");
+
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), x);
+    gtk_entry_set_text(GTK_ENTRY(u), prefs_get_string("lastfm_username"));
+    gtk_entry_set_text(GTK_ENTRY(p), prefs_get_string("lastfm_password"));
+    gtk_widget_set_sensitive (u, x);
+    gtk_widget_set_sensitive (p, x);
+# else
+    w = gtkpod_xml_get_widget (prefs_window_xml, "labelfm");
+    gtk_widget_hide(w);
+    w = gtkpod_xml_get_widget (prefs_window_xml, "scrolledwindowfm");
+    gtk_widget_hide(w);
+#endif
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "autoselect_hbox");
+    for (i=0; i<SORT_TAB_MAX; ++i)
+    {
+	GtkWidget *as;
+	gint padding;
+	    
+	buf = g_strdup_printf ("%d", i+1);
+	as = gtk_check_button_new_with_mnemonic (buf);
+	autoselect_widget[i] = as;
+	gtk_widget_show (as);
+	if (i==0) padding = 0;
+	else      padding = 5;
+	gtk_box_pack_start (GTK_BOX (w), as, FALSE, FALSE, padding);
+	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(as),
+				     prefs_get_int_index("st_autoselect", i));
+	g_signal_connect ((gpointer)as,
+			  "toggled",
+			  G_CALLBACK (on_cfg_st_autoselect_toggled),
+			  GUINT_TO_POINTER(i));
+	g_free (buf);
+    }
+    /* connect signals for path entrys and selectors */
+    for (i=0; path_button_names[i]; ++i)
+    {
+	gchar *path;
+	/* "" is not a valid button name -> skip */
+	if (strlen (path_button_names[i]) == 0) continue;
+	/* Otherwise connect handler */
+	w = gtkpod_xml_get_widget (prefs_window_xml, path_button_names[i]);
+	g_signal_connect ((gpointer)w,
+			  "clicked",
+			  G_CALLBACK (on_path_button_pressed),
+			  GUINT_TO_POINTER(i));
+
+	w = gtkpod_xml_get_widget (prefs_window_xml, path_entry_names[i]);
+
+	path = prefs_get_string (path_key_names[i]);
+	if (path)
+	{
+	    gtk_entry_set_text(GTK_ENTRY(w), path);
+	    g_free (path);
+	}
+	g_signal_connect ((gpointer)w,
+			  "changed",
+			  G_CALLBACK (on_path_entry_changed),
+			  GUINT_TO_POINTER(i));
+    }
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "cfg_mpl_autoselect");
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+				 prefs_get_int("mpl_autoselect"));
+
+    for (i=0; i<TM_NUM_TAGS_PREFS; ++i)
+    {
+	buf = g_strdup_printf ("tag_autoset%d", i);
+	if((w = gtkpod_xml_get_widget (prefs_window_xml, buf)))
+	{
+	    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+					 prefs_get_int_index("tag_autoset", i));
+	    /* glade makes a "GTK_OBJECT (i)" which segfaults
+	       because "i" is not a GTK object. So we have to set up
+	       the signal handlers ourselves */
+	    g_signal_connect ((gpointer)w,
+			      "toggled",
+			      G_CALLBACK (on_cfg_autosettags_toggled),
+			      GUINT_TO_POINTER(i));
+	}
+	g_free (buf);
+    }
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "readtags");
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+				 prefs_get_int("readtags"));
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "parsetags");
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+				 prefs_get_int("parsetags"));
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "parsetags_overwrite");
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+				 prefs_get_int("parsetags_overwrite"));
+    gtk_widget_set_sensitive (w, prefs_get_int("parsetags"));
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "parsetags_template");
+    gtk_widget_set_sensitive (w, prefs_get_int("parsetags"));
+    buf = prefs_get_string("parsetags_template");
+    if (buf)
+    {
+	gtk_entry_set_text(GTK_ENTRY(w), buf);
+	g_free(buf);
+    }
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "coverart_apic");
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+				 prefs_get_int("coverart_apic"));
+
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "coverart_file");
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+				 prefs_get_int("coverart_file"));
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "coverart_template");
+    buf = prefs_get_string("coverart_template");
+    if (buf)
+    {
+	gtk_entry_set_text(GTK_ENTRY(w), buf);
+	g_free(buf);
+    }
+    gtk_widget_set_sensitive (w, prefs_get_int("coverart_file"));
+
+    setup_visible_cols (tt);
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "cfg_write_extended");
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+				 prefs_get_int("write_extended_info"));
+
+
+    if ((w = gtkpod_xml_get_widget (prefs_window_xml, "cfg_sort_tab_num_sb")))
+    {
+	gtk_spin_button_set_range (GTK_SPIN_BUTTON (w),
+				   0, SORT_TAB_MAX);
+	gtk_spin_button_set_value (GTK_SPIN_BUTTON (w),
+				   prefs_get_int("sort_tab_num"));
+	prefs_window_set_sort_tab_num (prefs_get_int("sort_tab_num"));
+    }
+    if ((w = gtkpod_xml_get_widget (prefs_window_xml, "cfg_group_compilations")))
+    {
+	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+				     prefs_get_int("group_compilations"));
+    }
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "cfg_startup_messages");
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+				 prefs_get_int("startup_messages"));
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "cfg_mserv_use");
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+				 prefs_get_int("mserv_use"));
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "cfg_mserv_report_probs");
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+				 prefs_get_int("mserv_report_probs"));
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "mserv_username_entry");
+    buf = prefs_get_string("mserv_username");
+    if (buf)
+    {
+	gtk_entry_set_text(GTK_ENTRY(w), buf);
+	g_free(buf);
+    }
+    w = gtkpod_xml_get_widget (prefs_window_xml, "notebook");
+    if (page == -1)
+    {
+	gtk_notebook_set_current_page (GTK_NOTEBOOK (w),
+				       prefs_get_int("last_prefs_page"));
+    }
+    else
+    {
+	gtk_notebook_set_current_page (GTK_NOTEBOOK (w), page);
+    }
+    
+    w = gtkpod_xml_get_widget (prefs_window_xml, "exclude_file_mask_entry");
+    buf = prefs_get_string("exclude_file_mask");
+    if (buf)
+    {
+	gtk_entry_set_text(GTK_ENTRY(w), buf);
+	g_free(buf);
+    }
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "convert_table");
+    convert_table_set_children_initial_sensitivity (GTK_TABLE (w));
+    for (i=0; convert_names[i]; ++i)
+    {
+         w = gtkpod_xml_get_widget (prefs_window_xml, convert_names[i]);
+         g_signal_connect ((gpointer)w,
+			      "toggled",
+			      G_CALLBACK (on_convert_toggle_toggled),
+			      NULL);
+         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(w), prefs_get_int (convert_names[i]) );
+
+    }
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "file_convert_max_threads_num_spinbutton");
+    gtk_spin_button_set_value (GTK_SPIN_BUTTON(w),
+			       prefs_get_int (FILE_CONVERT_MAX_THREADS_NUM));
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "file_convert_maxdirsize_spinbutton");
+    gtk_spin_button_set_value (GTK_SPIN_BUTTON(w),
+			       prefs_get_double (FILE_CONVERT_MAXDIRSIZE));
+
+    w = gtkpod_xml_get_widget (prefs_window_xml, "file_convert_cachedir_entry");
+    buf = prefs_get_string (FILE_CONVERT_CACHEDIR);
+    if (buf)
+	gtk_entry_set_text (GTK_ENTRY(w), buf);
+    g_free (buf);
+
+
+    prefs_window_show_hide_tooltips ();
+    gtk_widget_show(prefs_window);
+
+
+
+}
+
+
+/**
+ * save_gtkpod_prefs_window
+ * UI has requested preferences update(by clicking ok on the prefs window)
+ * Frees the tmpcfg variable
+ */
+static void
+prefs_window_set(void)
+{
+   if (temp_prefs)
+   {
+     /* Update the display if we changed the number of sort tabs */
+     if (temp_prefs_get_int_value(temp_prefs, "sort_tab_num", NULL))
+      st_show_visible();
+
+     /* Set up/free sha1 hash table if changed */
+     if (temp_prefs_get_int_value(temp_prefs, "sha1", NULL))
+	 setup_sha1();
+   }
+  
+   /* Need this in case user reordered column order (we don't
+    * catch the reorder signal) */
+   tm_store_col_order ();
+
+   tm_show_preferred_columns();
+   st_show_visible();
+   display_show_hide_tooltips();
+   display_show_hide_toolbar();
+
+   /* update file_conversion data */
+   file_convert_prefs_changed ();
+}
+
+/* save current window size */
+void prefs_window_update_default_sizes (void)
+{
+    if (prefs_window)
+    {
+	gint defx, defy;
+	gtk_window_get_size (GTK_WINDOW (prefs_window), &defx, &defy);
+	prefs_set_int("size_prefs.x", defx);
+	prefs_set_int("size_prefs.y", defy);
+    }
+}
+
+
+/**
+ * cancel_gtk_prefs_window
+ * UI has requested preference changes be ignored -- write back the
+ * original values
+ * Frees the tmpcfg and origcfg variable
+ */
+void
+prefs_window_cancel(void)
+{
+    /* "save" (i.e. reset) original configs */
+    prefs_window_set ();
+
+    /* save current window size */
+    prefs_window_update_default_sizes ();
+
+    /* close the window */
+    if(prefs_window)
+	gtk_widget_destroy(prefs_window);
+    prefs_window = NULL;
+}
+
+/* when window is deleted, we keep the currently applied prefs and
+   save the notebook page */
+void prefs_window_delete(void)
+{
+    gint defx, defy;
+    GtkWidget *nb;
+	
+    /* Delete temp prefs structures */
+    temp_prefs_destroy(temp_prefs);
+    temp_prefs = NULL;
+    temp_lists_destroy(temp_lists);
+    temp_lists = NULL;
+
+    /* save current notebook page */
+    nb = gtkpod_xml_get_widget (prefs_window_xml, "notebook");
+    prefs_set_int("last_prefs_page", gtk_notebook_get_current_page (
+		  GTK_NOTEBOOK (nb)));
+
+    /* save current window size */
+    gtk_window_get_size (GTK_WINDOW (prefs_window), &defx, &defy);
+    prefs_set_int("size_prefs.x", defx);
+    prefs_set_int("size_prefs.y", defy);
+
+    /* close the window */
+    if(prefs_window)
+	gtk_widget_destroy(prefs_window);
+    prefs_window = NULL;
+}
+
+/* apply the current settings and close the window */
+/* Frees the tmpcfg and origcfg variable */
+void
+prefs_window_ok (void)
+{
+    prefs_window_apply ();
+
+    /* close the window */
+    if(prefs_window)
+	gtk_widget_destroy(prefs_window);
+    prefs_window = NULL;
+}
+
+
+/* apply the current settings, don't close the window */
+void
+prefs_window_apply (void)
+{
+    gint defx, defy;
+    GtkWidget *nb;
+
+    /* Commit temp prefs to prefs table */
+    temp_prefs_apply(temp_prefs);
+    temp_lists_apply(temp_lists);
+  
+    /* save current settings */
+    prefs_window_set ();
+
+    /* save current notebook page */
+    nb = gtkpod_xml_get_widget (prefs_window_xml, "notebook");
+    prefs_set_int("last_prefs_page", gtk_notebook_get_current_page (
+		  GTK_NOTEBOOK (nb)));
+
+    /* save current window size */
+    gtk_window_get_size (GTK_WINDOW (prefs_window), &defx, &defy);
+    prefs_set_int("size_prefs.x", defx);
+    prefs_set_int("size_prefs.y", defy);
+}
+
+
+
+/* -----------------------------------------------------------------
+
+   Callbacks
+
+   ----------------------------------------------------------------- */
+
+
+void
+on_sorting_clicked                     (GtkButton       *button,
+					gpointer         user_data)
+{
+    sort_window_create ();
+}
+
+
+void
+on_edit_repository_clicked           (GtkButton       *button,
+				      gpointer         user_data)
+{
+    iTunesDB *itdb = gp_get_selected_itdb();
+
+    if (itdb)
+    {
+	repository_edit (itdb, NULL);
+    }
+    else
+    {
+	message_sb_no_itdb_selected ();
+    }
+}
+
+void
+on_calendar_contact_notes_options_clicked (GtkButton       *button,
+					   gpointer         user_data)
+{
+    iTunesDB *itdb = gp_get_ipod_itdb();
+
+    /* no iPod itdb selected -> try to use the first iPod itdb */
+    if (!itdb)
+    {
+	struct itdbs_head *itdbs_head;
+
+	g_return_if_fail (gtkpod_window);
+	itdbs_head = g_object_get_data (G_OBJECT (gtkpod_window),
+					"itdbs_head");
+	if (itdbs_head)
+	{
+	    GList *gl;
+	    for (gl=itdbs_head->itdbs; gl; gl=gl->next)
+	    {
+		iTunesDB *itdbgl = gl->data;
+		g_return_if_fail (itdbgl);
+		if (itdbgl->usertype & GP_ITDB_TYPE_IPOD)
+		    break;
+	    }
+	    if (gl)
+	    {
+		itdb = gl->data;
+	    }
+	}
+    }
+
+    if (itdb)
+    {
+	repository_edit (itdb, NULL);
+    }
+    else
+    {
+	message_sb_no_ipod_itdb_selected ();
+    }
+}
+
+
+gboolean
+on_prefs_window_delete_event           (GtkWidget       *widget,
+					GdkEvent        *event,
+					gpointer         user_data)
+{
+  prefs_window_delete ();
+  gtkpod_statusbar_message(_("Preferences not updated"));
+  return FALSE;
+}
+
+
+void
+on_prefs_ok_clicked                    (GtkButton       *button,
+					gpointer         user_data)
+{
+    prefs_window_ok();
+}
+
+
+void
+on_prefs_cancel_clicked                (GtkButton       *button,
+					gpointer         user_data)
+{
+    prefs_window_cancel();
+    gtkpod_statusbar_message(_("Preferences not updated"));
+}
+
+
+void
+on_prefs_apply_clicked                 (GtkButton       *button,
+					gpointer         user_data)
+{
+    prefs_window_apply ();
+    gtkpod_statusbar_message(_("Preferences applied"));
+}
+
+
+void on_file_convert_max_threads_num_spinbutton_value_changed (
+    GtkSpinButton *spinbutton,
+    gpointer       user_data)
+{
+    temp_prefs_set_int (temp_prefs, FILE_CONVERT_MAX_THREADS_NUM,
+			gtk_spin_button_get_value_as_int (spinbutton));
+}
+
+void on_file_convert_maxdirsize_spinbutton_value_changed (
+    GtkSpinButton *spinbutton,
+    gpointer       user_data)
+{
+    temp_prefs_set_double (temp_prefs, FILE_CONVERT_MAXDIRSIZE,
+			   gtk_spin_button_get_value (spinbutton));
+}
+
+
+void
+on_cfg_sha1tracks_toggled                (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+    gboolean val = gtk_toggle_button_get_active(togglebutton);
+    GtkWidget *w = gtkpod_xml_get_widget (prefs_window_xml, "cfg_show_duplicates");
+
+    temp_prefs_set_int(temp_prefs, "sha1", val);
+    if(w)	gtk_widget_set_sensitive (w, val);
+}
+
+void
+on_cfg_update_existing_toggled         (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+    gboolean val = gtk_toggle_button_get_active (togglebutton);
+    GtkWidget *w;
+
+    temp_prefs_set_int(temp_prefs, "update_existing", val);
+
+    if((w = gtkpod_xml_get_widget (prefs_window_xml, "cfg_show_updated")))
+	gtk_widget_set_sensitive (w, val);
+    if((w = gtkpod_xml_get_widget (prefs_window_xml, "cfg_show_non_updated")))
+	gtk_widget_set_sensitive (w, val);
+}
+
+void
+on_cfg_id3_write_toggled                (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+    gboolean val = gtk_toggle_button_get_active (togglebutton);
+    GtkWidget *w;
+
+    temp_prefs_set_int(temp_prefs, "id3_write", val);
+    if((w = gtkpod_xml_get_widget (prefs_window_xml, "cfg_id3_write_id3v24")))
+	gtk_widget_set_sensitive (w, val);
+    if((w = gtkpod_xml_get_widget (prefs_window_xml, "cfg_write_charset")))
+	gtk_widget_set_sensitive (w, val);
+}
+
+
+void
+on_cfg_id3_write_id3v24_toggled            (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+    temp_prefs_set_int(temp_prefs,"id3_write_id3v24",
+                       gtk_toggle_button_get_active (togglebutton));
+}
+
+
+void
+on_cfg_write_extended_info_toggled     (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+    temp_prefs_set_int(temp_prefs, "write_extended_info",
+		       gtk_toggle_button_get_active(togglebutton));
+}
+
+void
+on_cfg_delete_track_from_playlist_toggled (GtkToggleButton *togglebutton,
+					   gpointer         user_data)
+{
+	temp_prefs_set_int(temp_prefs, "delete_file",
+                     gtk_toggle_button_get_active(togglebutton));
+}
+
+
+void
+on_cfg_delete_track_from_ipod_toggled  (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+	temp_prefs_set_int(temp_prefs, "delete_ipod", 
+                     gtk_toggle_button_get_active(togglebutton));
+}
+
+void
+on_cfg_track_local_file_deletion_toggled (GtkToggleButton *togglebutton,
+					  gpointer         user_data)
+{
+	temp_prefs_set_int(temp_prefs, "delete_local_file",
+                     gtk_toggle_button_get_active(togglebutton));
+}
+
+void
+on_cfg_track_database_deletion_toggled (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+	temp_prefs_set_int(temp_prefs, "delete_database",
+                     gtk_toggle_button_get_active(togglebutton));
+}
+
+static void standard_toggle_toggled (GtkToggleButton *togglebutton,
+				     const gchar *key)
+{
+    g_return_if_fail (key);
+
+    temp_prefs_set_int (temp_prefs, key, 
+			gtk_toggle_button_get_active (togglebutton));
+}
+
+static void on_convert_toggle_toggled (GtkToggleButton *togglebutton,
+				     gpointer not_used)
+{
+    GtkTable *parent;
+    GList *list_item;
+    GtkTableChild *child;
+    guint16 row = 0;
+    gboolean active;
+
+    parent = (GtkTable*)gtk_widget_get_parent (GTK_WIDGET (togglebutton));    
+    g_return_if_fail (GTK_IS_TABLE (parent));
+
+    /* Find row of togglebutton */
+    list_item = parent->children;
+    while (list_item) {
+        child = (GtkTableChild*)list_item->data;
+        if (child->widget == (GtkWidget*)togglebutton) {
+            row = child->top_attach;
+            break;
+        }
+        list_item = g_list_next (list_item);
+    }
+
+    active = gtk_toggle_button_get_active (togglebutton);
+
+    temp_prefs_set_int (temp_prefs, gtk_widget_get_name (GTK_WIDGET (togglebutton)), 
+			active);
+
+    /* set sensitivity of all widgets on togglebuttons row, except togglebutton */
+    list_item = parent->children;
+    while (list_item) {
+        child = (GtkTableChild*)list_item->data;
+        if (child->top_attach == row && child->widget != (GtkWidget*)togglebutton) 
+            gtk_widget_set_sensitive (child->widget, active);
+        list_item = g_list_next (list_item);
+    }
+}
+
+
+void
+on_sync_confirm_delete_toggled     (GtkToggleButton *togglebutton,
+				    gpointer         user_data)
+{
+    GtkToggleButton *w;
+    gboolean active = gtk_toggle_button_get_active(togglebutton);
+
+    temp_prefs_set_int(temp_prefs, KEY_SYNC_CONFIRM_DELETE, active);
+		       
+
+    w = GTK_TOGGLE_BUTTON(
+	gtkpod_xml_get_widget (prefs_window_xml,
+			       "sync_confirm_delete_toggle"));
+    if (w != togglebutton)
+	gtk_toggle_button_set_active(w, active);
+
+    w = GTK_TOGGLE_BUTTON(
+	gtkpod_xml_get_widget (prefs_window_xml,
+			       "sync_confirm_delete_toggle2"));
+    if (w != togglebutton)
+	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), active);
+}
+
+void
+on_photo_library_confirm_delete_toggled (GtkToggleButton *togglebutton,
+    gpointer         user_data)
+{
+	temp_prefs_set_int(temp_prefs, "photo_library_confirm_delete",
+	                     gtk_toggle_button_get_active(togglebutton));
+}
+
+void
+on_charset_combo_entry_changed          (GtkEditable     *editable,
+					gpointer         user_data)
+{
+    gchar *descr, *charset;
+
+    descr = gtk_editable_get_chars (editable, 0, -1);
+    charset = charset_from_description (descr);
+    temp_prefs_set_string(temp_prefs, "charset", charset);
+    g_free (descr);
+    g_free (charset);
+}
+
+void prefs_window_set_st_autoselect (guint32 inst, gboolean autoselect)
+{
+    if ((inst >= 0) && (inst < SORT_TAB_MAX))
+    {
+      temp_prefs_set_int_index(temp_prefs, "st_autoselect", inst, 
+                               autoselect);
+    }
+}
+
+void
+on_cfg_mpl_autoselect_toggled          (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+    temp_prefs_set_int(temp_prefs, "mpl_autoselect", 
+		       gtk_toggle_button_get_active(togglebutton));
+}
+
+void prefs_window_set_autosettags (gint category, gboolean autoset)
+{
+    if (category < TM_NUM_TAGS_PREFS)
+			temp_prefs_set_int_index(temp_prefs, "tag_autoset", category, autoset);
+}
+
+void
+on_readtags_toggled                    (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+    temp_prefs_set_int(temp_prefs, "readtags",
+		       gtk_toggle_button_get_active(togglebutton));
+}
+
+void
+on_parsetags_toggled                   (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+    gboolean val = gtk_toggle_button_get_active(togglebutton);
+    GtkWidget *w;
+
+    temp_prefs_set_int(temp_prefs, "parsetags", val);
+    w = gtkpod_xml_get_widget (prefs_window_xml, "parsetags_overwrite");
+    gtk_widget_set_sensitive (w, val);
+    w = gtkpod_xml_get_widget (prefs_window_xml, "parsetags_template");
+    gtk_widget_set_sensitive (w, val);
+}
+
+void
+on_parsetags_overwrite_toggled         (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+    temp_prefs_set_int(temp_prefs, "parsetags_overwrite",
+		       gtk_toggle_button_get_active(togglebutton));
+}
+
+void
+on_parsetags_template_changed             (GtkEditable     *editable,
+					   gpointer         user_data)
+{
+    temp_prefs_set_string(temp_prefs, "parsetags_template",
+			  gtk_editable_get_chars (editable,0, -1));
+}
+
+void
+on_coverart_file_toggled                   (GtkToggleButton *togglebutton,
+					    gpointer         user_data)
+{
+    gboolean val = gtk_toggle_button_get_active(togglebutton);
+    GtkWidget *w;
+
+    temp_prefs_set_int(temp_prefs, "coverart_file", val);
+    w = gtkpod_xml_get_widget (prefs_window_xml, "coverart_template");
+    gtk_widget_set_sensitive (w, val);
+}
+
+void
+on_coverart_apic_toggled                   (GtkToggleButton *togglebutton,
+					    gpointer         user_data)
+{
+    gboolean val = gtk_toggle_button_get_active(togglebutton);
+    GtkWidget *w;
+
+    temp_prefs_set_int(temp_prefs, "coverart_apic", val);
+    w = gtkpod_xml_get_widget (prefs_window_xml, "coverart_template");
+    gtk_widget_set_sensitive (w, val);
+}
+
+void
+on_coverart_template_changed             (GtkEditable     *editable,
+					gpointer         user_data)
+{
+    temp_prefs_set_string(temp_prefs, "coverart_template",
+			  gtk_editable_get_chars (editable,0, -1));
+}
+
+void
+on_cfg_show_duplicates_toggled         (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+	temp_prefs_set_int(temp_prefs, "show_duplicates", 
+                     gtk_toggle_button_get_active (togglebutton));
+
+}
+
+
+void
+on_cfg_show_updated_toggled            (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+    temp_prefs_set_int(temp_prefs, "show_updated",
+                       gtk_toggle_button_get_active (togglebutton));
+}
+
+
+void
+on_cfg_show_non_updated_toggled        (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+    temp_prefs_set_int(temp_prefs, "show_non_updated", 
+                       gtk_toggle_button_get_active (togglebutton));
+}
+
+void
+on_cfg_display_tooltips_main_toggled   (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+    temp_prefs_set_int(temp_prefs, "display_tooltips_main",
+		       gtk_toggle_button_get_active  (togglebutton));
+}
+
+void
+on_cfg_display_tooltips_prefs_toggled  (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+    temp_prefs_set_int(temp_prefs, "display_tooltips_prefs",
+		       gtk_toggle_button_get_active  (togglebutton));
+}
+
+void
+on_cfg_display_toolbar_toggled         (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+    gboolean val = gtk_toggle_button_get_active (togglebutton);
+    GtkWidget *w1 = gtkpod_xml_get_widget (prefs_window_xml, "cfg_toolbar_style_icons");
+    GtkWidget *w2 = gtkpod_xml_get_widget (prefs_window_xml, "cfg_toolbar_style_text");
+    GtkWidget *w3 = gtkpod_xml_get_widget (prefs_window_xml, "cfg_toolbar_style_both");
+
+    temp_prefs_set_int(temp_prefs, "display_toolbar", val);
+
+    if (w1) gtk_widget_set_sensitive (w1, val);
+    if (w2) gtk_widget_set_sensitive (w2, val);
+    if (w3) gtk_widget_set_sensitive (w3, val);
+}
+
+void
+on_cfg_multi_edit_toggled              (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+    gboolean val = gtk_toggle_button_get_active (togglebutton);
+    GtkWidget *w = gtkpod_xml_get_widget  (prefs_window_xml, "cfg_multi_edit_title");
+
+    temp_prefs_set_int(temp_prefs, "multi_edit", val);
+    gtk_widget_set_sensitive (w, val);
+}
+
+
+void
+on_cfg_multi_edit_title_toggled        (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+    temp_prefs_set_int(temp_prefs, "multi_edit_title",
+		       gtk_toggle_button_get_active(togglebutton));
+}
+
+void
+on_cfg_update_charset_toggled          (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+    temp_prefs_set_int(temp_prefs, "update_charset",
+		       gtk_toggle_button_get_active (togglebutton));
+}
+
+void
+on_cfg_write_charset_toggled           (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+    temp_prefs_set_int(temp_prefs, "write_charset",
+		       gtk_toggle_button_get_active(togglebutton));
+}
+
+void
+on_cfg_add_recursively_toggled         (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+    temp_prefs_set_int(temp_prefs, "add_recursively",
+		       gtk_toggle_button_get_active (togglebutton));
+}
+
+void
+on_cfg_not_played_track_toggled         (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+    temp_prefs_set_int(temp_prefs, "not_played_track",
+		       gtk_toggle_button_get_active(togglebutton));
+}
+
+void
+on_cfg_misc_track_nr_value_changed      (GtkSpinButton   *spinbutton,
+					gpointer         user_data)
+{
+    temp_prefs_set_int(temp_prefs, "misc_track_nr",
+		       gtk_spin_button_get_value  (spinbutton));
+}
+
+static void prefs_window_set_sort_tab_num (gint num)
+{
+    gint i;
+
+    temp_prefs_set_int(temp_prefs, "sort_tab_num", num);
+    for (i=0; i<SORT_TAB_MAX; ++i)
+    {   /* make all checkboxes with i<num sensitive, the others
+	   insensitive */
+	gtk_widget_set_sensitive (autoselect_widget[i], i<num);
+    }
+}
+
+void
+on_cfg_sort_tab_num_sb_value_changed   (GtkSpinButton   *spinbutton,
+					gpointer         user_data)
+{
+    prefs_window_set_sort_tab_num (
+	gtk_spin_button_get_value (spinbutton));
+}
+
+void
+on_cfg_group_compilations_toggled      (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+    temp_prefs_set_int(temp_prefs, "group_compilations",
+		       gtk_toggle_button_get_active (togglebutton));
+}
+
+void
+on_cfg_toolbar_style_both_toggled      (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+    if (gtk_toggle_button_get_active (togglebutton))
+    {
+	temp_prefs_set_int(temp_prefs, "toolbar_style",  
+			   GTK_TOOLBAR_BOTH);
+    }
+}
+
+
+void
+on_cfg_toolbar_style_text_toggled      (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+    if (gtk_toggle_button_get_active (togglebutton))
+    {
+	temp_prefs_set_int(temp_prefs, "toolbar_style",
+			   GTK_TOOLBAR_TEXT);
+    }
+}
+
+
+void
+on_cfg_toolbar_style_icons_toggled      (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+    if (gtk_toggle_button_get_active (togglebutton))
+    {
+	temp_prefs_set_int(temp_prefs, "toolbar_style",
+			   GTK_TOOLBAR_ICONS);
+    }
+}
+
+void prefs_window_set_toolbar_style (GtkToolbarStyle style)
+{
+}
+
+void
+on_cfg_startup_messages                (GtkToggleButton *togglebutton,
+                                        gpointer         user_data)
+{
+	temp_prefs_set_int(temp_prefs, "startup_messages",
+			   gtk_toggle_button_get_active (togglebutton));
+}
+
+void
+on_mserv_from_file_playlist_menu_activate
+                                        (GtkMenuItem     *menuitem,
+                                        gpointer         user_data)
+{
+    gp_do_selected_playlist (mserv_from_file_tracks);
+}
+
+
+void
+on_mserv_use_toggled                   (GtkToggleButton *togglebutton,
+                                        gpointer         user_data)
+{
+    temp_prefs_set_int(temp_prefs, "mserv_use",
+		       gtk_toggle_button_get_active(togglebutton));
+}
+
+void
+on_mserv_report_probs_toggled          (GtkToggleButton *togglebutton,
+                                        gpointer         user_data)
+{
+    temp_prefs_set_int(temp_prefs, "mserv_report_probs", 
+                       gtk_toggle_button_get_active (togglebutton));
+}
+
+void
+on_mserv_username_entry_changed              (GtkEditable     *editable,
+					      gpointer         user_data)
+{
+    gchar *val = gtk_editable_get_chars (editable,0, -1);
+
+    if (!val) return;
+    temp_prefs_set_string(temp_prefs, "mserv_username", val);
+    g_free(val);
+}
+
+/* last.fm callbacks */
+void
+on_lastfm_active_toggled              (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+#if 0
+    int x = gtk_toggle_button_get_active(togglebutton);
+    GtkWidget *u = gtkpod_xml_get_widget  (prefs_window_xml, "lastfm_username");
+    GtkWidget *p = gtkpod_xml_get_widget  (prefs_window_xml, "lastfm_password");
+    temp_prefs_set_int(temp_prefs, "lastfm_active", x);
+
+    gtk_widget_set_sensitive (u, x);
+    gtk_widget_set_sensitive (p, x);
+#endif
+}
+
+void
+on_lastfm_username_entry_changed          (GtkEditable     *editable,
+					gpointer         user_data)
+{
+#if 0
+    gchar *uname;
+    uname = gtk_editable_get_chars (editable, 0, -1);
+    temp_prefs_set_string(temp_prefs, "lastfm_username", uname);
+    g_free (uname);
+#endif
+}
+
+void
+on_lastfm_password_entry_changed          (GtkEditable     *editable,
+					gpointer         user_data)
+{
+#if 0
+    gchar *upass, *upass_old;
+
+    upass = gtk_editable_get_chars (editable, 0, -1);
+    upass_old = prefs_get_string ("lastfm_password");
+
+    if (!upass_old || (strcmp (upass, upass_old) != 0))
+    {
+	unsigned char sig[16];
+	unsigned char md5[64];
+	gint i;
+
+	md5_buffer((const char *)upass, strlen(upass), sig);
+
+	for (i=0; i<16; ++i)
+	{
+	    snprintf (&md5[i*2], 3, "%02x", sig[i]);
+	}
+
+	temp_prefs_set_string(temp_prefs, "lastfm_password", md5);
+    }
+    g_free (upass);
+    g_free (upass_old);
+#endif
+}
+
+
+/* ------------------------------------------------------------ *\
+ *                                                              *
+ * Sort-Prefs Window                                            *
+ *                                                              *
+\* ------------------------------------------------------------ */
+
+/* the following checkboxes exist */
+static const gint sort_ign_fields[] = {
+    T_TITLE, T_ARTIST,
+    T_ALBUM, T_COMPOSER,
+    -1
+};
+
+
+/* Copy the current ignore fields and ignore strings into scfg */
+static void sort_window_read_sort_ign ()
+{
+    gint i;
+    GtkTextView *tv;
+    GtkTextBuffer *tb;
+    GList *sort_ign_strings;
+    GList *current;
+    gchar *buf;
+
+
+    /* read sort field states */
+    for (i=0; sort_ign_fields[i] != -1; ++i)
+    {
+	buf = g_strdup_printf ("sort_ign_field_%d",
+				      sort_ign_fields[i]);
+	GtkWidget *w = gtkpod_xml_get_widget (sort_window_xml, buf);
+	g_return_if_fail (w);
+	prefs_set_int( buf,
+	     gtk_toggle_button_get_active (
+		GTK_TOGGLE_BUTTON (w)));
+	g_free (buf);
+    }
+    
+    /* Read sort ignore strings */
+    tv = GTK_TEXT_VIEW (gtkpod_xml_get_widget (sort_window_xml,
+					      "sort_ign_strings"));
+    g_return_if_fail (tv);
+    tb = gtk_text_view_get_buffer (tv);
+    g_return_if_fail (tb);
+
+    sort_ign_strings = get_list_from_buffer(tb);
+    current = sort_ign_strings;
+    
+    /* Add a trailing whitespace to strings */
+    while (current)
+    {
+	g_strstrip(current->data);
+	
+        if (strlen(current->data) != 0)
+	{
+	    buf = g_strdup_printf("%s ",(gchar *) current->data);
+	    g_free(current->data);
+	    current->data = buf;
+	}
+
+	current = g_list_next(current);
+    }
+	
+    temp_list_add(sort_temp_lists, "sort_ign_string_", sort_ign_strings);
+}
+
+/**
+ * sort_window_create
+ * Create, Initialize, and Show the sorting preferences window
+ * allocate a static sort struct for temporary variables
+ */
+void sort_window_create (void)
+{
+    if (sort_window)
+    {  /* sort options already open --> simply raise to the top */
+	gdk_window_raise(sort_window->window);
+    }
+    else
+    {
+	GList *collist = NULL;
+	GList *sort_ign_strings;
+	GList *current;  /* current sort ignore item */
+	GtkWidget *w;
+	GtkTextView *tv;
+	GtkTextBuffer *tb;
+	gint i;
+	GtkTextIter ti;
+	gchar *str;
+
+	sort_temp_prefs = temp_prefs_create();
+	sort_temp_lists = temp_lists_create();
+
+	sort_window_xml = glade_xml_new (xml_file, "sort_window", NULL);
+	glade_xml_signal_autoconnect (sort_window_xml);
+
+	sort_window = gtkpod_xml_get_widget (sort_window_xml, "sort_window");
+
+	/* label the ignore-field checkbox-labels */
+	for (i=0; sort_ign_fields[i] != -1; ++i)
+	{
+	    gchar *buf = g_strdup_printf ("sort_ign_field_%d",
+					  sort_ign_fields[i]);
+	    GtkWidget *w = gtkpod_xml_get_widget (sort_window_xml, buf);
+	    g_return_if_fail (w);
+	    gtk_button_set_label (
+		GTK_BUTTON (w),
+		gettext (get_t_string (sort_ign_fields[i])));
+	    gtk_toggle_button_set_active (
+		GTK_TOGGLE_BUTTON (w),
+		prefs_get_int (buf));
+	    /* set tooltip if available */
+/* 	    if (tm_col_tooltips[sort_ign_fields[i]]) */
+/* 	    { */
+/* 		gtk_tooltips_set_tip ( */
+/* 		    tt, w, */
+/* 		    gettext (tm_col_tooltips[sort_ign_fields[i]]), */
+/* 		    NULL); */
+/* 	    } */
+	    g_free (buf);
+	}
+	/* set the ignore strings */
+	tv = GTK_TEXT_VIEW (gtkpod_xml_get_widget (sort_window_xml,
+						  "sort_ign_strings"));
+	tb = gtk_text_view_get_buffer (tv);
+	if (!tb)
+	{   /* text buffer doesn't exist yet */
+	    tb = gtk_text_buffer_new (NULL);
+	    gtk_text_view_set_buffer(tv, tb);
+	    gtk_text_view_set_editable(tv, FALSE);
+	    gtk_text_view_set_cursor_visible(tv, FALSE);
+	}
+	
+	sort_ign_strings = prefs_get_list("sort_ign_string_");
+	current = sort_ign_strings;
+	while (current)
+	{
+	    str = (gchar *)current->data;
+	    current = g_list_next(current);
+
+	    /* append new text to the end */
+	    gtk_text_buffer_get_end_iter (tb, &ti);
+	    gtk_text_buffer_insert (tb, &ti, str, -1);
+	    /* append newline */
+	    gtk_text_buffer_get_end_iter (tb, &ti);
+	    gtk_text_buffer_insert (tb, &ti, "\n", -1);
+	}
+	
+	prefs_free_list(sort_ign_strings);
+
+	sort_window_read_sort_ign ();
+
+	/* Set Sort-Column-Combo */
+	/* create the list in the order of the columns displayed */
+	tm_store_col_order ();
+	for (i=0; i<TM_NUM_COLUMNS; ++i)
+	{   /* first the visible columns */
+	    TM_item col = prefs_get_int_index("col_order", i);
+	    if (col != -1)
+	    {
+		if (prefs_get_int_index("col_visible", col))
+		    collist = g_list_append (collist,
+					     gettext (get_tm_string (col)));
+	    }
+	}
+	for (i=0; i<TM_NUM_COLUMNS; ++i)
+	{   /* first the visible columns */
+	    TM_item col = prefs_get_int_index("col_order", i);
+	    if (col != -1)
+	    {
+		if (!prefs_get_int_index("col_visible", col))
+		    collist = g_list_append (collist,
+					     gettext (get_tm_string (col)));
+	    }
+	}
+	w = gtkpod_xml_get_widget (sort_window_xml, "sort_combo");
+	gtk_combo_set_popdown_strings (GTK_COMBO (w), collist);
+	g_list_free (collist);
+	collist = NULL;
+
+	sort_window_update ();
+
+	sort_window_show_hide_tooltips ();
+	gtk_widget_show (sort_window);
+    }
+}
+
+
+
+/* Update sort_window's settings (except for ignore list and ignore
+ * fields) */
+void sort_window_update (void)
+{
+    if (sort_window)
+    {
+	gchar *str;
+	GtkWidget *w = NULL;
+
+	switch (prefs_get_int("pm_sort"))
+	{
+	case SORT_ASCENDING:
+	    w = gtkpod_xml_get_widget (sort_window_xml, "pm_ascend");
+	    break;
+	case SORT_DESCENDING:
+	    w = gtkpod_xml_get_widget (sort_window_xml, "pm_descend");
+	    break;
+	case SORT_NONE:
+	    w = gtkpod_xml_get_widget (sort_window_xml, "pm_none");
+	    break;
+	}
+	if (w)
+	    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), TRUE);
+
+	w = NULL;
+	switch (prefs_get_int("st_sort"))
+	{
+	case SORT_ASCENDING:
+	    w = gtkpod_xml_get_widget (sort_window_xml, "st_ascend");
+	    break;
+	case SORT_DESCENDING:
+	    w = gtkpod_xml_get_widget (sort_window_xml, "st_descend");
+	    break;
+	case SORT_NONE:
+	    w = gtkpod_xml_get_widget (sort_window_xml, "st_none");
+	    break;
+	}
+	if (w)
+	    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), TRUE);
+
+	switch (prefs_get_int("tm_sort"))
+	{
+	case SORT_ASCENDING:
+	    w = gtkpod_xml_get_widget (sort_window_xml, "tm_ascend");
+	    break;
+	case SORT_DESCENDING:
+	    w = gtkpod_xml_get_widget (sort_window_xml, "tm_descend");
+	    break;
+	case SORT_NONE:
+	    w = gtkpod_xml_get_widget (sort_window_xml, "tm_none");
+	    break;
+	}
+	if (w)
+	    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), TRUE);
+
+	w = gtkpod_xml_get_widget (sort_window_xml, "tm_autostore");
+	if (w)
+	    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+					 prefs_get_int("tm_autostore"));
+
+	if((w = gtkpod_xml_get_widget (sort_window_xml, "cfg_case_sensitive")))
+	{
+	    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
+					 prefs_get_int("case_sensitive"));
+	}
+	/* set standard entry in combo */
+	str = gettext (get_tm_string (prefs_get_int("tm_sortcol")));
+	w = gtkpod_xml_get_widget (sort_window_xml, "sort_combo");
+	gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (w)->entry), str);
+    }
+}
+
+
+/* turn the sort window insensitive (if it's open) */
+void sort_window_block (void)
+{
+    if (sort_window)
+	gtk_widget_set_sensitive (sort_window, FALSE);
+}
+
+/* turn the sort window sensitive (if it's open) */
+void sort_window_release (void)
+{
+    if (sort_window)
+	gtk_widget_set_sensitive (sort_window, TRUE);
+}
+
+
+/* make the tooltips visible or hide it depending on the value set in
+ * the prefs (tooltips_prefs) */
+void sort_window_show_hide_tooltips (void)
+{
+    if (sort_window)
+    {
+	GtkTooltips *tt;
+	GtkTooltipsData *tooltips_data;
+	tooltips_data = gtk_tooltips_data_get (gtkpod_xml_get_widget (sort_window_xml, "sort_combo-entry"));
+	tt = tooltips_data->tooltips;
+	if (tt)
+	{
+	    if (prefs_get_int("display_tooltips_prefs")) 
+		gtk_tooltips_enable (tt);
+	    else                                     
+		gtk_tooltips_disable (tt);
+	}
+	else
+	{
+	    g_warning ("***tt is NULL***");
+	}
+    }
+}
+
+
+/* get the sort_column selected in the combo */
+static TM_item sort_window_get_sort_col (void)
+{
+    const gchar *str;
+    GtkWidget *w;
+    gint i = -1;
+
+    w = gtkpod_xml_get_widget (sort_window_xml, "sort_combo");
+    str = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO (w)->entry));
+    /* Check which string is selected in the combo */
+    if (str)
+	for (i=0; get_tm_string (i); ++i)
+	    if (strcmp (gettext (get_tm_string (i)), str) == 0)  break;
+    if ((i<0) || (i>= TM_NUM_COLUMNS))
+    {
+	fprintf (stderr,
+		 "Programming error: cal_get_category () -- item not found.\n");
+	/* set to something reasonable at least */
+	i = TM_COLUMN_TITLE;
+    }
+
+    return i;
+}
+
+
+/* Prepare keys to be copied to prefs table */
+static void sort_window_set ()
+{
+    gint val; /* A value from temp prefs */
+    TM_item sortcol_new;
+    TM_item sortcol_old;
+
+    sortcol_old = prefs_get_int("tm_sortcol");
+    sortcol_new = sort_window_get_sort_col();
+    prefs_set_int("tm_sortcol", sortcol_new);
+
+    /* update compare string keys */
+    compare_string_fuzzy_generate_keys ();
+
+    /* if sort type has changed, initialize display */
+    if (temp_prefs_get_int_value(sort_temp_prefs, "pm_sort", &val))
+	pm_sort (val);
+    if (temp_prefs_get_int_value(sort_temp_prefs, "st_sort", &val))
+	st_sort (val);
+    if (temp_prefs_get_int_value(sort_temp_prefs, "tm_sort", NULL) ||
+	(sortcol_old != sortcol_new))
+    {
+	tm_sort_counter (-1);
+	tm_sort (prefs_get_int("tm_sortcol"), prefs_get_int("tm_sort"));
+    }
+    /* if auto sort was changed to TRUE, store order */
+    if (!temp_prefs_get_int(sort_temp_prefs, "tm_autostore"))
+	tm_rows_reordered ();
+
+}
+
+
+/* -----------------------------------------------------------------
+
+   Callbacks
+
+   ----------------------------------------------------------------- */
+
+void
+on_st_ascend_toggled                   (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+    if (gtk_toggle_button_get_active(togglebutton))
+	sort_window_set_st_sort (SORT_ASCENDING);
+}
+
+
+void
+on_st_descend_toggled                  (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+    if (gtk_toggle_button_get_active(togglebutton))
+	sort_window_set_st_sort (SORT_DESCENDING);
+}
+
+
+void
+on_st_none_toggled                     (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+    if (gtk_toggle_button_get_active(togglebutton))
+	sort_window_set_st_sort (SORT_NONE);
+}
+
+
+void
+on_pm_ascend_toggled                   (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+    if (gtk_toggle_button_get_active(togglebutton))
+	sort_window_set_pm_sort (SORT_ASCENDING);
+}
+
+
+void
+on_pm_descend_toggled                  (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+    if (gtk_toggle_button_get_active(togglebutton))
+	sort_window_set_pm_sort (SORT_DESCENDING);
+}
+
+
+void
+on_pm_none_toggled                     (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+    if (gtk_toggle_button_get_active(togglebutton))
+	sort_window_set_pm_sort (SORT_NONE);
+}
+
+
+void
+on_tm_ascend_toggled                   (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+    if (gtk_toggle_button_get_active(togglebutton))
+	sort_window_set_tm_sort (SORT_ASCENDING);
+}
+
+
+void
+on_tm_descend_toggled                  (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+    if (gtk_toggle_button_get_active(togglebutton))
+	sort_window_set_tm_sort (SORT_DESCENDING);
+}
+
+
+void
+on_tm_none_toggled                     (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+    if (gtk_toggle_button_get_active(togglebutton))
+	sort_window_set_tm_sort (SORT_NONE);
+}
+
+void
+on_tm_autostore_toggled                (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+    sort_window_set_tm_autostore (gtk_toggle_button_get_active(togglebutton));
+}
+
+
+void
+on_sort_case_sensitive_toggled         (GtkToggleButton *togglebutton,
+					gpointer         user_data)
+{
+    sort_window_set_case_sensitive(
+	gtk_toggle_button_get_active(togglebutton));
+}
+
+
+void
+on_sort_apply_clicked                  (GtkButton       *button,
+					gpointer         user_data)
+{
+    sort_window_apply ();
+}
+
+
+void
+on_sort_cancel_clicked                 (GtkButton       *button,
+					gpointer         user_data)
+{
+    sort_window_cancel ();
+}
+
+
+void
+on_sort_ok_clicked                     (GtkButton       *button,
+					gpointer         user_data)
+{
+    sort_window_ok ();
+}
+
+
+gboolean
+on_sort_window_delete_event            (GtkWidget       *widget,
+					GdkEvent        *event,
+					gpointer         user_data)
+{
+    sort_window_delete ();
+    return FALSE;
+}
+
+
+
+/**
+ * sort_window_cancel
+ * UI has requested sort prefs changes be ignored -- write back the
+ * original values
+ */
+void sort_window_cancel (void)
+{
+    /* close the window */
+    if(sort_window)
+	gtk_widget_destroy(sort_window);
+    sort_window = NULL;
+}
+
+/* when window is deleted, we keep the currently applied prefs */
+void sort_window_delete(void)
+{
+    temp_prefs_destroy(sort_temp_prefs);
+    sort_temp_prefs = NULL;
+    temp_lists_destroy(sort_temp_lists);
+    sort_temp_lists = NULL;
+
+    /* close the window */
+    if(sort_window)
+	gtk_widget_destroy(sort_window);
+    sort_window = NULL;
+}
+
+/* apply the current settings and close the window */
+void sort_window_ok (void)
+{
+    /* update the sort ignore strings */
+    sort_window_read_sort_ign ();
+
+    temp_prefs_apply(sort_temp_prefs);
+    temp_lists_apply(sort_temp_lists);
+
+    /* save current settings */
+    sort_window_set ();
+  
+    /* close the window */
+    if(sort_window)
+	gtk_widget_destroy(sort_window);
+    sort_window = NULL;
+}
+
+
+/* apply the current settings, don't close the window */
+void sort_window_apply (void)
+{
+    /* update the sort ignore strings */
+    sort_window_read_sort_ign ();
+
+    temp_prefs_apply(sort_temp_prefs);
+    temp_lists_apply(sort_temp_lists);
+
+    /* save current settings */
+    sort_window_set ();
+}
+
+void sort_window_set_tm_autostore (gboolean val)
+{
+    temp_prefs_set_int(sort_temp_prefs, "tm_autostore", val);
+}
+
+void sort_window_set_pm_sort (gint val)
+{
+    temp_prefs_set_int(sort_temp_prefs, "pm_sort", val);
+}
+
+void sort_window_set_st_sort (gint val)
+{
+    temp_prefs_set_int(sort_temp_prefs, "st_sort", val);
+}
+
+void sort_window_set_tm_sort (gint val)
+{
+    temp_prefs_set_int(sort_temp_prefs, "tm_sort", val);
+}
+
+void sort_window_set_case_sensitive (gboolean val)
+{
+    temp_prefs_set_int(sort_temp_prefs, "case_sensitive",
+		       val);
+}
+
+void on_exclude_file_mask_entry_changed (GtkEditable	*editable,
+					 gpointer	user_data)
+{
+    gchar *buf = gtk_editable_get_chars(editable, 0, -1);
+
+    temp_prefs_set_string (temp_prefs, "exclude_file_mask", buf);
+    g_free (buf);
+}
+

Added: trunk/src/prefs_window.h
===================================================================
--- trunk/src/prefs_window.h	                        (rev 0)
+++ trunk/src/prefs_window.h	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,66 @@
+/* Time-stamp: <2006-05-21 12:24:56 jcs>
+|
+|  Copyright (C) 2002 Corey Donohoe <atmos at atmos.org>
+|  Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: prefs_window.h 812 2006-06-10 08:29:44Z freethinkerjim $
+*/
+#ifndef _GTKPOD_PREFS_WINDOW_H
+#define _GTKPOD_PREFS_WINDOW_H
+
+#include <gtk/gtk.h>
+#include "prefs.h"
+extern const gchar *path_entry_names[];
+
+void prefs_window_update_default_sizes (void);
+void prefs_window_block (void);
+void prefs_window_release (void);
+void prefs_window_show_hide_tooltips (void);
+void prefs_window_ok (void);
+void prefs_window_apply (void);
+void prefs_window_cancel (void);
+void prefs_window_create (gint page);
+void prefs_window_delete (void);
+
+void sort_window_create (void);
+void sort_window_block (void);
+void sort_window_release (void);
+void sort_window_show_hide_tooltips (void);
+void sort_window_ok (void);
+void sort_window_apply (void);
+void sort_window_cancel (void);
+void sort_window_create (void);
+void sort_window_delete (void);
+void sort_window_set_pm_autostore (gboolean val);
+void sort_window_set_tm_autostore (gboolean val);
+void sort_window_set_pm_sort (gint val);
+void sort_window_set_st_sort (gint val);
+void sort_window_set_tm_sort (gint val);
+void sort_window_set_case_sensitive (gboolean val);
+void sort_window_update (void);
+
+void create_subs_treeview (void);
+#endif
+

Added: trunk/src/repository.c
===================================================================
--- trunk/src/repository.c	                        (rev 0)
+++ trunk/src/repository.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,2548 @@
+/* Time-stamp: <2007-01-16 17:55:41 jcs>
+|
+|  Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+| 
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+| 
+|  iTunes and iPod are trademarks of Apple
+| 
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: repository.c 954 2007-01-16 09:45:00Z jcsjcs $
+*/
+
+/* This file provides functions for the edit repositories/playlist
+ * option window */
+
+#include <stdlib.h>
+#include <string.h>
+#include <gtk/gtk.h>
+#include "display_itdb.h"
+#include "fileselection.h"
+#include "info.h"
+#include "ipod_init.h"
+#include "misc.h"
+#include "prefs.h"
+#include "repository.h"
+#include "syncdir.h"
+
+/* print local debug message */
+#define LOCAL_DEBUG 0
+
+/* List with all repository edit windows (we only allow one, however) */
+static GList *repwins = NULL;
+
+struct _RepWin
+{
+    GladeXML *xml;           /* XML info                             */
+    GtkWidget *window;       /* pointer to repository window         */
+    iTunesDB *itdb;          /* currently displayed repository       */
+    gint itdb_index;         /* index number of itdb                 */
+    Playlist *playlist;      /* currently displayed playlist         */
+    Playlist *next_playlist; /* playlist to display next (or NULL)   */
+    TempPrefs *temp_prefs;   /* changes made so far                  */
+    TempPrefs *extra_prefs;  /* changes to non-prefs items (e.g.
+				live-update                          */
+};
+
+typedef struct _RepWin RepWin;
+
+typedef enum
+{
+    IPOD_SYNC_CONTACTS,
+    IPOD_SYNC_CALENDAR,
+    IPOD_SYNC_NOTES
+} iPodSyncType;
+
+
+/* string constants for window widgets used more than once */
+static const gchar *PLAYLIST_COMBO="playlist_combo";
+static const gchar *REPOSITORY_COMBO="repository_combo";
+static const gchar *MOUNTPOINT_LABEL="mountpoint_label";
+static const gchar *MOUNTPOINT_ENTRY="mountpoint_entry";
+static const gchar *MOUNTPOINT_BUTTON="mountpoint_button";
+static const gchar *BACKUP_LABEL="backup_label";
+static const gchar *BACKUP_ENTRY="backup_entry";
+static const gchar *BACKUP_BUTTON="backup_button";
+static const gchar *IPOD_MODEL_LABEL="ipod_model_label";
+static const gchar *IPOD_MODEL_COMBO="ipod_model_combo";
+static const gchar *IPOD_MODEL_ENTRY="ipod_model_entry--not-a-glade-name";
+static const gchar *LOCAL_PATH_LABEL="local_path_label";
+static const gchar *LOCAL_PATH_BUTTON="local_path_button";
+static const gchar *LOCAL_PATH_ENTRY="local_path_entry";
+static const gchar *STANDARD_PLAYLIST_VBOX="standard_playlist_vbox";
+static const gchar *SPL_VBOX="spl_vbox";
+static const gchar *SPL_LIVE_UPDATE_TOGGLE="spl_live_update_toggle";
+static const gchar *SYNC_PLAYLIST_MODE_NONE_RADIO="sync_playlist_mode_none_radio";
+static const gchar *SYNC_PLAYLIST_MODE_AUTOMATIC_RADIO="sync_playlist_mode_automatic_radio";
+static const gchar *SYNC_PLAYLIST_MODE_MANUAL_RADIO="sync_playlist_mode_manual_radio";
+static const gchar *MANUAL_SYNCDIR_ENTRY="manual_syncdir_entry";
+static const gchar *MANUAL_SYNCDIR_BUTTON="manual_syncdir_button";
+static const gchar *DELETE_REPOSITORY_CHECKBUTTON="delete_repository_checkbutton";
+static const gchar *DELETE_REPOSITORY_BUTTON="delete_repository_button";
+static const gchar *REPOSITORY_VBOX="repository_vbox";
+static const gchar *IPOD_SYNC_LABEL="ipod_sync_label";
+static const gchar *IPOD_SYNC_CONTACTS_LABEL="ipod_sync_contacts_label";
+static const gchar *IPOD_SYNC_CONTACTS_ENTRY="ipod_sync_contacts_entry";
+static const gchar *IPOD_SYNC_CONTACTS_BUTTON="ipod_sync_contacts_button";
+static const gchar *IPOD_SYNC_CALENDAR_LABEL="ipod_sync_calendar_label";
+static const gchar *IPOD_SYNC_CALENDAR_ENTRY="ipod_sync_calendar_entry";
+static const gchar *IPOD_SYNC_CALENDAR_BUTTON="ipod_sync_calendar_button";
+static const gchar *IPOD_SYNC_NOTES_LABEL="ipod_sync_notes_label";
+static const gchar *IPOD_SYNC_NOTES_ENTRY="ipod_sync_notes_entry";
+static const gchar *IPOD_SYNC_NOTES_BUTTON="ipod_sync_notes_button";
+static const gchar *IPOD_CONCAL_AUTOSYNC_TOGGLE="ipod_concal_autosync_toggle";
+static const gchar *SYNC_OPTIONS_HBOX="sync_options_hbox";
+static const gchar *PLAYLIST_SYNC_DELETE_TRACKS_TOGGLE="playlist_sync_delete_tracks_toggle";
+static const gchar *PLAYLIST_SYNC_CONFIRM_DELETE_TOGGLE="playlist_sync_confirm_delete_toggle";
+static const gchar *PLAYLIST_SYNC_SHOW_SUMMARY_TOGGLE="playlist_sync_show_summary_toggle";
+static const gchar *UPDATE_PLAYLIST_BUTTON="update_playlist_button";
+static const gchar *UPDATE_ALL_PLAYLISTS_BUTTON="update_all_playlists_button";
+static const gchar *NEW_REPOSITORY_BUTTON="new_repository_button";
+
+/* string constants for preferences */
+static const gchar *KEY_REPOSITORY_WINDOW_DEFX="repository_window_defx";
+static const gchar *KEY_REPOSITORY_WINDOW_DEFY="repository_window_defy";
+
+/* some private key names used several times */
+static const gchar *KEY_LIVEUPDATE="liveupdate";
+
+/* some public key names used several times */
+const gchar *KEY_CONCAL_AUTOSYNC="concal_autosync";
+const gchar *KEY_SYNC_DELETE_TRACKS="sync_delete_tracks";
+const gchar *KEY_SYNC_CONFIRM_DELETE="sync_confirm_delete";
+const gchar *KEY_SYNC_CONFIRM_DIRS="sync_confirm_dirs";
+const gchar *KEY_SYNC_SHOW_SUMMARY="sync_show_summary";
+const gchar *KEY_MOUNTPOINT="mountpoint";
+const gchar *KEY_BACKUP="filename";
+const gchar *KEY_IPOD_MODEL="ipod_model";
+const gchar *KEY_FILENAME="filename";
+const gchar *KEY_PATH_SYNC_CONTACTS="path_sync_contacts";
+const gchar *KEY_PATH_SYNC_CALENDAR="path_sync_calendar";
+const gchar *KEY_PATH_SYNC_NOTES="path_sync_notes";
+const gchar *KEY_SYNCMODE="syncmode";
+const gchar *KEY_MANUAL_SYNCDIR="manual_syncdir";
+
+
+
+/* Declarations */
+static void update_buttons (RepWin *repwin);
+static void repwin_free (RepWin *repwin);
+static void init_repository_combo (RepWin *repwin);
+static void init_playlist_combo (RepWin *repwin);
+static void select_repository (RepWin *repwin,
+			       iTunesDB *itdb, Playlist *playlist);
+static void create_repository (RepWin *repwin);
+
+
+
+/* ------------------------------------------------------------
+ *
+ *        Helper functions to retrieve widgets.
+ *
+ * ------------------------------------------------------------ */
+/* shortcut to reference widgets when repwin->xml is already set */
+#define GET_WIDGET(a) repository_xml_get_widget (repwin->xml,a)
+
+
+/* This is quite dirty: MODEL_ENTRY is not a real widget
+   name. Instead it's the entry of a ComboBoxEntry -- hide this from
+   the application */
+GtkWidget *repository_xml_get_widget (GladeXML *xml, const gchar *name)
+{
+    if (name == IPOD_MODEL_ENTRY)
+    {
+	GtkWidget *cb = gtkpod_xml_get_widget (xml, IPOD_MODEL_COMBO);
+	return gtk_bin_get_child (GTK_BIN (cb));
+    }
+    else
+    {
+	return gtkpod_xml_get_widget (xml, name);
+    }
+}
+
+
+
+/* Store the window size */
+static void store_window_state (RepWin *repwin)
+{
+    gint defx, defy;
+
+    g_return_if_fail (repwin);
+
+    gtk_window_get_size (GTK_WINDOW (repwin->window), &defx, &defy);
+    prefs_set_int (KEY_REPOSITORY_WINDOW_DEFX, defx);
+    prefs_set_int (KEY_REPOSITORY_WINDOW_DEFY, defy);
+}
+
+
+/* ------------------------------------------------------------
+ *
+ *        Helper functions for prefs interfaceing.
+ *
+ * ------------------------------------------------------------ */
+
+
+/* Get prefs string -- either from repwin->temp_prefs or from the main
+   prefs system. Return an empty string if no value was set. */
+/* Free string after use */
+static gchar *get_current_prefs_string (RepWin *repwin, const gchar *key)
+{
+    gchar *value;
+
+    g_return_val_if_fail (repwin && key, NULL);
+
+    value = temp_prefs_get_string (repwin->temp_prefs, key);
+    if (value == NULL)
+    {
+	value = prefs_get_string (key);
+    }
+    if (value == NULL)
+    {
+	value = g_strdup ("");
+    }
+    return value;
+}
+
+
+/* Get integer prefs value -- either from repwin->temp_prefs or from
+   the main prefs system. Return 0 if no value was set. */
+/* Free string after use */
+static gint get_current_prefs_int (RepWin *repwin, const gchar *key)
+{
+    gint value;
+
+    g_return_val_if_fail (repwin && key, 0);
+
+    if (!temp_prefs_get_int_value (repwin->temp_prefs, key, &value))
+    {
+	value = prefs_get_int (key);
+    }
+    return value;
+}
+
+
+
+
+/* ------------------------------------------------------------
+ *
+ *        Callback functions (buttons, entries...)
+ *
+ * ------------------------------------------------------------ */
+
+
+/* Compare the value of @str with the value stored for @key in the
+   prefs system. If values differ, store @str for @key in
+
+   @repwin->temp_prefs, otherwise remove a possibly existing entry
+   @key in @repwin->temp_prefs.
+
+   Return value: TRUE if a new string was set, FALSE if no new string
+   was set, or the new string was identical to the one stored in the
+   prefs system. */
+
+/* Attention: g_frees() @key and @str for you */
+static gboolean finish_string_storage (RepWin *repwin,
+				       gchar *key, gchar *str)
+{
+    gchar *prefs_str;
+    gboolean result;
+
+    g_return_val_if_fail (repwin && key && str, FALSE);
+
+    prefs_str = prefs_get_string (key);
+
+    if ((!prefs_str && (strlen (str) > 0)) ||
+	(prefs_str && (strcmp (str, prefs_str) != 0)))
+    {   /* value has changed with respect to the value stored in the
+	   prefs */
+#       if LOCAL_DEBUG
+	printf ("setting '%s' to '%s'\n", key, str);
+#       endif
+	temp_prefs_set_string (repwin->temp_prefs, key, str);
+	result = TRUE;
+    }
+    else
+    {   /* value has not changed -- remove key from temp prefs (in
+	   case it exists */
+#       if LOCAL_DEBUG
+	printf ("removing '%s'.\n", key);
+#       endif
+	temp_prefs_remove_key (repwin->temp_prefs, key);
+	result = FALSE;
+    }
+    update_buttons (repwin);
+    g_free (key);
+    g_free (str);
+    g_free (prefs_str);
+    return result;
+}
+
+
+/* Retrieve the current text in @editable and call
+   finish_string_storage()
+
+   Return value: see finish_string_storage() */
+static gboolean finish_editable_storage (RepWin *repwin,
+					 gchar *key,
+					 GtkEditable *editable)
+{
+    gchar *str;
+
+    g_return_val_if_fail (repwin && key && editable, FALSE);
+
+    str = gtk_editable_get_chars (editable, 0, -1);
+    return finish_string_storage (repwin, key, str);
+}
+
+/* Compare the value of @val with the value stored for @key in the
+   prefs system. If values differ, store @val for @key in
+   @repwin->temp_prefs, otherwise remove a possibly existing entry
+   @key in @repwin->temp_prefs. */
+/* Attention: g_frees() @key for you */
+static void finish_int_storage (RepWin *repwin,
+				gchar *key, gint val)
+{
+    gint prefs_val;
+
+    g_return_if_fail (repwin && key);
+
+    /* defaults to '0' if not set */
+    prefs_val = prefs_get_int (key);
+    if (prefs_val != val)
+    {   /* value has changed with respect to the value stored in the
+	   prefs */
+#       if LOCAL_DEBUG
+	printf ("setting '%s' to '%d'\n", key, val);
+#       endif
+	temp_prefs_set_int (repwin->temp_prefs, key, val);
+    }
+    else
+    {   /* value has not changed -- remove key from temp prefs (in
+	   case it exists */
+#       if LOCAL_DEBUG
+	printf ("removing '%s'.\n", key);
+#       endif
+	temp_prefs_remove_key (repwin->temp_prefs, key);
+    }
+    update_buttons (repwin);
+    g_free (key);
+}
+
+
+/* text in standard text entry has changed */
+static void standard_itdb_entry_changed (GtkEditable *editable,
+					 RepWin *repwin)
+{
+    const gchar *keybase;
+    gchar *key;
+
+    g_return_if_fail (repwin);
+
+    keybase = g_object_get_data (G_OBJECT (editable), "key");
+    g_return_if_fail (keybase);
+
+    key = get_itdb_prefs_key (repwin->itdb_index, keybase);
+
+    finish_editable_storage (repwin, key, editable);
+}
+
+
+/* text for manual_syncdir has changed */
+static void manual_syncdir_changed (GtkEditable *editable,
+				    RepWin *repwin)
+{
+    gchar *key;
+    gchar changed;
+
+    g_return_if_fail (repwin);
+
+    key = get_playlist_prefs_key (repwin->itdb_index, repwin->playlist,
+				  KEY_MANUAL_SYNCDIR);
+
+    changed = finish_editable_storage (repwin, key, editable);
+
+    if (changed)
+    {
+	gtk_toggle_button_set_active (
+	    GTK_TOGGLE_BUTTON (GET_WIDGET (SYNC_PLAYLIST_MODE_MANUAL_RADIO)),
+	    TRUE);
+    }
+}
+
+
+/* sync_playlist_mode_none was toggled */
+static void sync_playlist_mode_none_toggled (GtkToggleButton *togglebutton,
+						 RepWin *repwin)
+{
+    gchar *key;
+
+    g_return_if_fail (repwin);
+
+    key = get_playlist_prefs_key (repwin->itdb_index, repwin->playlist,
+				  KEY_SYNCMODE);
+
+    if (gtk_toggle_button_get_active (togglebutton))
+    {
+	finish_int_storage (repwin, key,
+			    SYNC_PLAYLIST_MODE_NONE);
+	update_buttons (repwin);
+    }
+}
+
+
+/* sync_playlist_mode_none was toggled */
+static void sync_playlist_mode_manual_toggled (GtkToggleButton *togglebutton,
+						   RepWin *repwin)
+{
+    gchar *key;
+
+    g_return_if_fail (repwin);
+
+    key = get_playlist_prefs_key (repwin->itdb_index, repwin->playlist,
+				  KEY_SYNCMODE);
+
+    if (gtk_toggle_button_get_active (togglebutton))
+    {
+	finish_int_storage (repwin, key,
+			    SYNC_PLAYLIST_MODE_MANUAL);
+	update_buttons (repwin);
+    }
+}
+
+
+/* sync_playlist_mode_none was toggled */
+static void sync_playlist_mode_automatic_toggled (GtkToggleButton *togglebutton,
+						      RepWin *repwin)
+{
+    gchar *key;
+
+    g_return_if_fail (repwin);
+
+    key = get_playlist_prefs_key (repwin->itdb_index, repwin->playlist,
+				  KEY_SYNCMODE);
+
+    if (gtk_toggle_button_get_active (togglebutton))
+    {
+	finish_int_storage (repwin, key,
+			    SYNC_PLAYLIST_MODE_AUTOMATIC);
+	update_buttons (repwin);
+    }
+}
+
+
+static void standard_itdb_checkbutton_toggled (GtkToggleButton *togglebutton,
+					       RepWin *repwin)
+{
+    const gchar *keybase;
+    gchar *key;
+
+    g_return_if_fail (repwin);
+
+    keybase = g_object_get_data (G_OBJECT (togglebutton), "key");
+    g_return_if_fail (keybase);
+    key = get_itdb_prefs_key (repwin->itdb_index, keybase);
+    finish_int_storage (repwin, key,
+			gtk_toggle_button_get_active (togglebutton));
+}
+
+
+static void standard_playlist_checkbutton_toggled (GtkToggleButton *togglebutton,
+						   RepWin *repwin)
+{
+    const gchar *keybase;
+    gboolean active;
+    gchar *key;
+
+    g_return_if_fail (repwin);
+    g_return_if_fail (repwin->playlist);
+
+    keybase = g_object_get_data (G_OBJECT (togglebutton), "key");
+    g_return_if_fail (keybase);
+    key = get_playlist_prefs_key (repwin->itdb_index, repwin->playlist,
+				  keybase);
+    active = gtk_toggle_button_get_active (togglebutton);
+
+    /* Check if this is the liveupdate toggle which needs special
+     * treatment. */
+    if (keybase == KEY_LIVEUPDATE)
+    {
+	if (active == repwin->playlist->splpref.liveupdate)
+	    temp_prefs_remove_key (repwin->extra_prefs, key);
+	else
+	    temp_prefs_set_int (repwin->extra_prefs, key, active);
+
+	update_buttons (repwin);
+	return;
+    }
+	
+    finish_int_storage (repwin, key, active);
+}
+
+
+/* delete_repository_checkbutton was toggled */
+static void delete_repository_checkbutton_toggled (GtkToggleButton *togglebutton,
+						   RepWin *repwin)
+{
+    g_return_if_fail (repwin);
+    g_return_if_fail (repwin->temp_prefs);
+
+    if (!gtk_toggle_button_get_active (togglebutton))
+    {   /* Un-delete if necessary */
+	gchar *key = get_itdb_prefs_key (repwin->itdb_index, "deleted");
+
+	temp_prefs_remove_key (repwin->extra_prefs, key);
+	g_free (key);
+    }
+    update_buttons (repwin);
+}
+
+
+
+/* delete_repository_button was clicked */
+static void delete_repository_button_clicked (GtkButton *button,
+					      RepWin *repwin)
+{
+    gchar *key;
+
+    g_return_if_fail (repwin);
+
+    key = get_itdb_prefs_key (repwin->itdb_index, "deleted");
+
+    temp_prefs_set_int (repwin->extra_prefs, key, TRUE);
+    g_free (key);
+    update_buttons (repwin);
+}
+
+
+/* mountpoint browse button was clicked */
+static void mountpoint_button_clicked (GtkButton *button, RepWin *repwin)
+{
+    gchar *key, *old_dir, *new_dir;
+
+    g_return_if_fail (repwin);
+
+    key = get_itdb_prefs_key (repwin->itdb_index, KEY_MOUNTPOINT);
+    old_dir = get_current_prefs_string (repwin, key);
+    g_free (key);
+
+    new_dir = fileselection_get_file_or_dir (
+	_("Select mountpoint"),
+	old_dir,
+	GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
+
+    g_free (old_dir);
+
+    if (new_dir)
+    {
+	gtk_entry_set_text (GTK_ENTRY (GET_WIDGET (MOUNTPOINT_ENTRY)),
+			    new_dir);
+	g_free (new_dir);
+    }
+}
+
+
+/* mountpoint browse button was clicked */
+static void backup_button_clicked (GtkButton *button, RepWin *repwin)
+{
+    gchar *key, *old_backup, *new_backup;
+
+    g_return_if_fail (repwin);
+
+    key = get_itdb_prefs_key (repwin->itdb_index, KEY_FILENAME);
+    old_backup = get_current_prefs_string (repwin, key);
+    g_free (key);
+
+    new_backup = fileselection_get_file_or_dir (
+	_("Set backup file"),
+	old_backup,
+	GTK_FILE_CHOOSER_ACTION_SAVE);
+
+    g_free (old_backup);
+
+    if (new_backup)
+    {
+	gtk_entry_set_text (GTK_ENTRY (GET_WIDGET (BACKUP_ENTRY)),
+			    new_backup);
+	g_free (new_backup);
+    }
+}
+
+
+/* mountpoint browse button was clicked */
+static void new_repository_button_clicked (GtkButton *button,
+					   RepWin *repwin)
+{
+    g_return_if_fail (repwin);
+
+    create_repository (repwin);
+}
+
+
+/* mountpoint browse button was clicked */
+static void manual_syncdir_button_clicked (GtkButton *button,
+					   RepWin *repwin)
+{
+    gchar *key, *old_dir, *new_dir;
+
+    g_return_if_fail (repwin);
+
+    key = get_playlist_prefs_key (repwin->itdb_index, repwin->playlist,
+				  KEY_MANUAL_SYNCDIR);
+
+    old_dir = get_current_prefs_string (repwin, key);
+
+    new_dir = fileselection_get_file_or_dir (
+	_("Select directory for synchronization"),
+	old_dir,
+	GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
+
+    if (new_dir)
+    {
+	gtk_entry_set_text (GTK_ENTRY (GET_WIDGET (MANUAL_SYNCDIR_ENTRY)),
+			    new_dir);
+	g_free (new_dir);
+    }
+    g_free (key);
+}
+
+
+
+static void ipod_sync_button_clicked (RepWin *repwin, iPodSyncType type)
+{
+    const gchar *title;
+    const gchar *entry;
+    gchar *text, *key, *oldpath, *newpath;
+
+    g_return_if_fail (repwin);
+
+    switch (type)
+    {
+    case IPOD_SYNC_CONTACTS:
+	title = _("Please select command to sync contacts");
+	entry = IPOD_SYNC_CONTACTS_ENTRY;
+	key = get_itdb_prefs_key (repwin->itdb_index,
+				  KEY_PATH_SYNC_CONTACTS);
+	break;
+    case IPOD_SYNC_CALENDAR:
+	title = _("Please select command to sync calendar");
+	entry = IPOD_SYNC_CALENDAR_ENTRY;
+	key = get_itdb_prefs_key (repwin->itdb_index,
+				  KEY_PATH_SYNC_CALENDAR);
+	break;
+    case IPOD_SYNC_NOTES:
+	title = _("Please select command to sync notes");
+	entry = IPOD_SYNC_NOTES_ENTRY;
+	key = get_itdb_prefs_key (repwin->itdb_index,
+				  KEY_PATH_SYNC_NOTES);
+	break;
+    default:
+	g_return_if_reached ();
+    }
+
+    oldpath = prefs_get_string (key);
+    g_free (key);
+
+    text = g_markup_printf_escaped (_("<i>Have a look at the scripts provided in '%s'. If you write a new script or improve an existing one, please send it to jcsjcs at users.sourceforge.net for inclusion into the next release.</i>"), SCRIPTDIR);
+
+    newpath = fileselection_select_script (oldpath,
+					   SCRIPTDIR,
+					   title,
+					   text);
+    g_free (oldpath);
+    g_free (text);
+
+    if (newpath)
+    {
+	gtk_entry_set_text (GTK_ENTRY (GET_WIDGET (entry)), newpath);
+	g_free (newpath);
+    }
+}
+
+
+
+/* Callback */
+static void ipod_sync_contacts_button_clicked (GtkButton *button,
+					       RepWin *repwin)
+{
+    ipod_sync_button_clicked (repwin, IPOD_SYNC_CONTACTS);
+}
+
+
+/* Callback */
+static void ipod_sync_calendar_button_clicked (GtkButton *button,
+					       RepWin *repwin)
+{
+    ipod_sync_button_clicked (repwin, IPOD_SYNC_CALENDAR);
+
+}
+
+
+/* Callback */
+static void ipod_sync_notes_button_clicked (GtkButton *button,
+					    RepWin *repwin)
+{
+    ipod_sync_button_clicked (repwin, IPOD_SYNC_NOTES);
+
+}
+
+
+/**
+ * sync_or_update_playlist:
+ *
+ * Sync (normal playlist) or update (spl) @playlist (in repository
+ * @itdb_index) using the currently displayed options.
+ */
+static void sync_or_update_playlist (RepWin *repwin,
+				     gint itdb_index,
+				     Playlist *playlist)
+{
+    g_return_if_fail (repwin);
+    g_return_if_fail (playlist);
+
+    if (playlist->is_spl)
+    {
+	itdb_spl_update (playlist);
+
+	if (pm_get_selected_playlist () == playlist)
+	{   /* redisplay */
+	    pm_unselect_playlist (playlist);
+	    pm_select_playlist (playlist);
+	}
+
+	gtkpod_statusbar_message (_("Smart playlist updated."));
+    }
+    else
+    {
+	gchar *key_sync_delete_tracks, *key_sync_confirm_delete;
+	gchar *key_sync_show_summary, *key_manual_sync_dir, *key_syncmode;
+	gchar *sync_delete_tracks_orig, *sync_confirm_delete_orig;
+	gchar *sync_show_summary_orig;
+	gint sync_delete_tracks_current, sync_confirm_delete_current;
+	gint sync_show_summary_current;
+	gchar *manual_sync_dir = NULL;
+	gint value_new;
+
+	/* create needed prefs keys */
+	key_sync_delete_tracks = get_playlist_prefs_key (
+	    itdb_index, playlist, KEY_SYNC_DELETE_TRACKS);
+	key_sync_confirm_delete = get_playlist_prefs_key (
+	    itdb_index, playlist, KEY_SYNC_CONFIRM_DELETE);
+	key_sync_show_summary = get_playlist_prefs_key (
+	    itdb_index, playlist, KEY_SYNC_SHOW_SUMMARY);
+	key_manual_sync_dir = get_playlist_prefs_key (
+	    itdb_index, playlist, KEY_MANUAL_SYNCDIR);
+	key_syncmode = get_playlist_prefs_key (
+	    itdb_index, playlist, KEY_SYNCMODE);
+
+	/* retrieve original settings for prefs strings */
+	sync_delete_tracks_orig =
+	    prefs_get_string (key_sync_delete_tracks);
+	sync_confirm_delete_orig =
+	    prefs_get_string (key_sync_confirm_delete);
+	sync_show_summary_orig =
+	    prefs_get_string (key_sync_show_summary);
+
+	/* retrieve current settings for prefs_strings */
+	sync_delete_tracks_current =
+	    get_current_prefs_int (repwin, key_sync_delete_tracks);
+	sync_confirm_delete_current =
+	    get_current_prefs_int (repwin, key_sync_confirm_delete);
+	sync_show_summary_current =
+	    get_current_prefs_int (repwin, key_sync_show_summary);
+
+	/* temporarily apply current settings */
+	prefs_set_int (
+	    key_sync_delete_tracks, sync_delete_tracks_current);
+	prefs_set_int (
+	    key_sync_confirm_delete, sync_confirm_delete_current);
+	prefs_set_int (
+	    key_sync_show_summary, sync_show_summary_current);
+
+	/* sync directory or directories */
+	switch (get_current_prefs_int (repwin, key_syncmode))
+	{
+	case SYNC_PLAYLIST_MODE_NONE:
+	    break; /* should never happen */
+	case SYNC_PLAYLIST_MODE_MANUAL:
+	    manual_sync_dir = 
+		get_current_prefs_string (repwin, key_manual_sync_dir);
+	    /* no break;! we continue calling sync_playlist() */
+	case SYNC_PLAYLIST_MODE_AUTOMATIC:
+	    sync_playlist (playlist,
+			   manual_sync_dir,
+			   NULL, FALSE,
+			   key_sync_delete_tracks, 0,
+			   key_sync_confirm_delete, 0,
+			   NULL, sync_show_summary_current);
+	    break;
+	}
+
+	/* Update temporary prefs in case some settings were changed
+	 * (currently only 'key_sync_confirm_delete' can be changed
+	 * by sync_playlist()) */
+	value_new = prefs_get_int (key_sync_confirm_delete);
+	if (value_new != sync_confirm_delete_current)
+	{
+	    if (playlist == repwin->playlist)
+	    {   /* currently displayed --> adjust toggle button */
+		gtk_toggle_button_set_active (
+		    GTK_TOGGLE_BUTTON (GET_WIDGET (PLAYLIST_SYNC_CONFIRM_DELETE_TOGGLE)),
+		    value_new);
+	    }
+	    else
+	    {   /* not currently displayed --> copy to temp_prefs */
+		temp_prefs_set_int (repwin->temp_prefs,
+				    key_sync_confirm_delete,
+				    value_new);
+	    }
+	}
+
+	/* Copy original values back to prefs */
+	prefs_set_string (key_sync_delete_tracks,
+			  sync_delete_tracks_orig);
+	prefs_set_string (key_sync_confirm_delete,
+			  sync_confirm_delete_orig);
+	prefs_set_string (key_sync_show_summary,
+			  sync_show_summary_orig);
+
+	/* Free memory used by all strings */
+	g_free (key_sync_delete_tracks);
+	g_free (key_sync_confirm_delete);
+	g_free (key_sync_show_summary);
+	g_free (key_manual_sync_dir);
+	g_free (sync_delete_tracks_orig);
+	g_free (sync_confirm_delete_orig);
+	g_free (sync_show_summary_orig);
+	g_free (manual_sync_dir);
+    }
+}
+
+
+
+
+/* Callback */
+static void update_all_playlists_button_clicked (GtkButton *button,
+						 RepWin *repwin)
+{
+    GList *gl;
+
+    g_return_if_fail (repwin);
+    g_return_if_fail (repwin->itdb);
+
+    for (gl=repwin->itdb->playlists; gl; gl=gl->next)
+    {
+	Playlist *pl = gl->data;
+	g_return_if_fail (pl);
+	sync_or_update_playlist (repwin, repwin->itdb_index, pl);
+    }
+}
+
+
+/* Callback */
+static void update_playlist_button_clicked (GtkButton *button,
+					    RepWin *repwin)
+{
+    g_return_if_fail (repwin);
+    sync_or_update_playlist (repwin, repwin->itdb_index, repwin->playlist);
+}
+
+
+/* ------------------------------------------------------------
+ *
+ *        Callback functions (windows control)
+ *
+ * ------------------------------------------------------------ */
+
+static void edit_apply_clicked (GtkButton *button, RepWin *repwin)
+{
+    gint i, itdb_num, del_num;
+    struct itdbs_head *itdbs_head;
+
+    g_return_if_fail (repwin);
+
+    itdbs_head = gp_get_itdbs_head (gtkpod_window);
+    g_return_if_fail (itdbs_head);
+    itdb_num = g_list_length (itdbs_head->itdbs);
+
+    temp_prefs_apply (repwin->temp_prefs);
+
+    del_num = 0;
+    for (i=0; i<itdb_num; ++i)
+    {
+	gchar *key, *subkey;
+	gboolean deleted=FALSE;
+
+	iTunesDB *itdb = g_list_nth_data (itdbs_head->itdbs, i-del_num);
+	g_return_if_fail (itdb);
+
+	subkey = get_itdb_prefs_key (i, "");
+
+	if (temp_prefs_subkey_exists (repwin->extra_prefs, subkey))
+	{
+	    gboolean deleted;
+	    GList *gl;
+
+	    key = get_itdb_prefs_key (i, "deleted");
+	    deleted = temp_prefs_get_int (repwin->extra_prefs, key);
+	    g_free (key);
+	    if (deleted)
+	    {
+                /* FIXME: ask if serious, then delete */ 
+		if (TRUE)
+		{
+		    iTunesDB *itdb;
+		    gint j;
+
+		    /* flush all keys relating to the deleted itdb */
+		    key = get_itdb_prefs_key (i-del_num, "");
+		    prefs_flush_subkey (key);
+		    g_free (key);
+
+		    for (j=i-del_num; j<itdb_num-del_num-1; ++j)
+		    {
+			gchar *from_key = get_itdb_prefs_key (j+1, "");
+			gchar *to_key = get_itdb_prefs_key (j, "");
+			prefs_rename_subkey (from_key, to_key);
+			g_free (from_key);
+			g_free (to_key);
+		    }
+
+		    itdb = g_list_nth_data (itdbs_head->itdbs, i-del_num);
+		    gp_itdb_remove (itdb);
+		    gp_itdb_free (itdb);
+
+		    /* keep itdb_index of currently displayed repository
+		       updated in case we need to select a new one */
+		    if (repwin->itdb_index > i-del_num)
+		    {
+			--repwin->itdb_index;
+		    }
+		    ++del_num;
+		}
+		else
+		{
+		    deleted = FALSE;
+		}
+	    }
+
+	    if (!deleted)
+	    {
+		/* apply the "live update flag", which is kept inside
+		   the playlist struct */
+		for (gl=itdb->playlists; gl; gl=gl->next)
+		{
+		    Playlist *pl = gl->data;
+		    gint val;
+		    g_return_if_fail (pl);
+		    key = get_playlist_prefs_key (i, pl, KEY_LIVEUPDATE);
+		    if (temp_prefs_get_int_value (repwin->extra_prefs, key, &val))
+		    {
+			pl->splpref.liveupdate = val;
+			data_changed (itdb);
+		    }
+		    g_free (key);
+		}
+	    }
+	}
+
+	if (!deleted &&
+	    temp_prefs_subkey_exists (repwin->temp_prefs, subkey))
+	{
+	    gchar *str;
+	    /* check if mountpoint has changed */
+	    key = get_itdb_prefs_key (i, KEY_MOUNTPOINT);
+	    str = temp_prefs_get_string (repwin->temp_prefs, key);
+	    g_free (key);
+	    if (str)
+	    {   /* have to set mountpoint */
+		itdb_set_mountpoint (itdb, str);
+		space_set_ipod_itdb (itdb);
+		g_free (str);
+	    }
+
+	    /* check if model_number has changed */
+	    key = get_itdb_prefs_key (i, KEY_IPOD_MODEL);
+	    str = temp_prefs_get_string (repwin->temp_prefs, key);
+	    g_free (key);
+	    if (str)
+	    {   /* set model */
+		if (itdb->usertype && GP_ITDB_TYPE_IPOD)
+		{
+		    itdb_device_set_sysinfo (itdb->device,
+					     "ModelNumStr", str);
+		}
+		g_free (str);
+	    }
+
+	    /* this repository was changed */
+	    data_changed (itdb);
+	}
+	g_free (subkey);
+    }
+
+    temp_prefs_destroy (repwin->temp_prefs);
+    temp_prefs_destroy (repwin->extra_prefs);
+
+    repwin->temp_prefs = temp_prefs_create ();
+    repwin->extra_prefs = temp_prefs_create ();
+
+    if (g_list_length (itdbs_head->itdbs) < itdb_num)
+    {   /* at least one repository has been removed */
+	iTunesDB *new_itdb = g_list_nth_data (itdbs_head->itdbs,
+					      repwin->itdb_index);
+	iTunesDB *old_itdb = repwin->itdb;
+	Playlist *old_playlist = repwin->playlist;
+
+	init_repository_combo (repwin);
+	if (new_itdb == old_itdb)
+	{
+	    select_repository (repwin, new_itdb, old_playlist);
+	}
+	else
+	{
+	    select_repository (repwin, new_itdb, NULL);
+	}
+    }
+#   if LOCAL_DEBUG
+    printf ("index: %d\n", repwin->itdb_index);
+#   endif
+
+    update_buttons (repwin);
+}
+
+static void edit_cancel_clicked (GtkButton *button, RepWin *repwin)
+{
+    g_return_if_fail (repwin);
+
+    store_window_state (repwin);
+
+    repwins = g_list_remove (repwins, repwin);
+
+    repwin_free (repwin);
+}
+
+
+static void edit_ok_clicked (GtkButton *button, RepWin *repwin)
+{
+    g_return_if_fail (repwin);
+
+    edit_apply_clicked (NULL, repwin);
+    edit_cancel_clicked (NULL, repwin);
+}
+
+
+static void edit_delete_event (GtkWidget *widget,
+			       GdkEvent *event,
+			       RepWin *repwin)
+{
+    edit_cancel_clicked (NULL, repwin);
+}
+
+
+/* Used by select_playlist() to find the new playlist. If found,
+   select it */
+static gboolean select_playlist_find (GtkTreeModel *model,
+				      GtkTreePath *path,
+				      GtkTreeIter *iter,
+				      gpointer data)
+{
+    Playlist *playlist;
+    RepWin *repwin = data;
+    g_return_val_if_fail (repwin, TRUE);
+
+    gtk_tree_model_get (model, iter, 0, &playlist, -1);
+    if(playlist == repwin->next_playlist)
+    {
+	gtk_combo_box_set_active_iter (
+	    GTK_COMBO_BOX (gtkpod_xml_get_widget (repwin->xml,
+						  PLAYLIST_COMBO)),
+	    iter);
+	return TRUE;
+    }
+    return FALSE;
+}
+
+
+/* Select @playlist
+
+   If @playlist == NULL, select first playlist (MPL);
+*/
+static void select_playlist (RepWin *repwin, Playlist *playlist)
+{
+    GtkTreeModel *model;
+
+    g_return_if_fail (repwin);
+    g_return_if_fail (repwin->itdb);
+
+    if (!playlist)
+	playlist = itdb_playlist_mpl (repwin->itdb);
+    g_return_if_fail (playlist);
+
+    g_return_if_fail (playlist->itdb == repwin->itdb);
+
+    model= gtk_combo_box_get_model (
+	GTK_COMBO_BOX (gtkpod_xml_get_widget (repwin->xml,
+					      PLAYLIST_COMBO)));
+    g_return_if_fail (model);
+
+    repwin->next_playlist = playlist;
+    gtk_tree_model_foreach (model, select_playlist_find, repwin);
+    repwin->next_playlist = NULL;
+}
+
+
+
+/* Select @itdb and playlist @playlist
+
+   If @itdb == NULL, only change to @playlist.
+
+   If @playlist == NULL, select first playlist.
+*/
+static void select_repository (RepWin *repwin,
+			       iTunesDB *itdb, Playlist *playlist)
+{
+    g_return_if_fail (repwin);
+
+    if (itdb)
+    {
+	gint index;
+
+	repwin->next_playlist = playlist;
+
+	index = get_itdb_index (itdb);
+
+	gtk_combo_box_set_active (
+	    GTK_COMBO_BOX (gtkpod_xml_get_widget (repwin->xml,
+						  REPOSITORY_COMBO)),
+	    index);
+	/* The combo callback will set the playlist */
+    }
+    else
+    {
+	if (repwin->itdb)
+	    select_playlist (repwin, playlist);
+    }
+}
+
+
+/* set @entry with value of @key */
+static void set_entry_index (RepWin *repwin, gint itdb_index,
+			     const gchar *subkey, const gchar *entry)
+{
+    gchar *buf;
+    gchar *key;
+
+    g_return_if_fail (repwin && subkey && entry);
+
+    key = get_itdb_prefs_key (itdb_index, subkey);
+
+    buf = get_current_prefs_string (repwin, key);
+    if (buf)
+    {
+	gtk_entry_set_text (GTK_ENTRY (GET_WIDGET (entry)), buf);
+    }
+    else
+    {
+	gtk_entry_set_text (GTK_ENTRY (GET_WIDGET (entry)), "");
+    }
+    g_free (buf);
+    g_free (key);
+}
+
+
+/****** Fill in info about selected repository *****/
+static void display_repository_info (RepWin *repwin)
+{
+    iTunesDB *itdb;
+    gint index;
+    gchar *buf, *key;
+
+    g_return_if_fail (repwin);
+    g_return_if_fail (repwin->itdb);
+
+    itdb = repwin->itdb;
+    index = repwin->itdb_index;
+
+    /* Repository type */
+    if (itdb->usertype & GP_ITDB_TYPE_IPOD)
+    {
+	buf = g_markup_printf_escaped ("<i>%s</i>", _("iPod"));
+    }
+    else if (itdb->usertype & GP_ITDB_TYPE_PODCASTS)
+    {
+	buf = g_markup_printf_escaped ("<i>%s</i>", _("Podcasts Repository"));
+    }
+    else if (itdb->usertype & GP_ITDB_TYPE_LOCAL)
+    {
+	buf = g_markup_printf_escaped ("<i>%s</i>", _("Local Repository"));
+    }
+    else
+    {
+	buf = g_markup_printf_escaped ("<b>Unknown -- please report bug</b>");
+    }
+    gtk_label_set_markup (GTK_LABEL(GET_WIDGET("repository_type_label")),
+			  buf);
+    g_free (buf);
+
+    /* Hide/show corresponding widgets in table */
+    if (itdb->usertype & GP_ITDB_TYPE_IPOD)
+    {
+	const gchar *widgets_show[] = {
+	    MOUNTPOINT_LABEL,
+	    MOUNTPOINT_ENTRY,
+	    MOUNTPOINT_BUTTON,
+	    BACKUP_LABEL,
+	    BACKUP_ENTRY,
+	    BACKUP_BUTTON,
+	    IPOD_MODEL_LABEL,
+	    IPOD_MODEL_COMBO,
+	    LOCAL_PATH_ENTRY,
+	    IPOD_SYNC_LABEL,
+	    IPOD_SYNC_CONTACTS_LABEL,
+	    IPOD_SYNC_CONTACTS_ENTRY,
+	    IPOD_SYNC_CONTACTS_BUTTON,
+	    IPOD_SYNC_CALENDAR_LABEL,
+	    IPOD_SYNC_CALENDAR_ENTRY,
+	    IPOD_SYNC_CALENDAR_BUTTON,
+	    IPOD_SYNC_NOTES_LABEL,
+	    IPOD_SYNC_NOTES_ENTRY,
+	    IPOD_SYNC_NOTES_BUTTON,
+	    IPOD_CONCAL_AUTOSYNC_TOGGLE,
+	    NULL};
+	const gchar *widgets_hide[] = {
+	    LOCAL_PATH_LABEL,
+	    LOCAL_PATH_ENTRY,
+	    NULL};
+	const gchar **widget;
+
+	for (widget=widgets_show; *widget; ++widget)
+	{
+	    gtk_widget_show (GET_WIDGET (*widget));
+	}
+	for (widget=widgets_hide; *widget; ++widget)
+	{
+	    gtk_widget_hide (GET_WIDGET (*widget));
+	}
+
+	set_entry_index (repwin, index, KEY_MOUNTPOINT, MOUNTPOINT_ENTRY);
+
+	set_entry_index (repwin, index, KEY_FILENAME, BACKUP_ENTRY);
+
+	set_entry_index (repwin, index,
+			 KEY_PATH_SYNC_CONTACTS, IPOD_SYNC_CONTACTS_ENTRY);
+
+	set_entry_index (repwin, index,
+			 KEY_PATH_SYNC_CALENDAR, IPOD_SYNC_CALENDAR_ENTRY);
+
+	set_entry_index (repwin, index,
+			 KEY_PATH_SYNC_NOTES, IPOD_SYNC_NOTES_ENTRY);
+
+	set_entry_index (repwin, index, KEY_IPOD_MODEL, IPOD_MODEL_ENTRY);
+
+	key = get_itdb_prefs_key (index, KEY_CONCAL_AUTOSYNC);
+	gtk_toggle_button_set_active (
+	    GTK_TOGGLE_BUTTON (GET_WIDGET (IPOD_CONCAL_AUTOSYNC_TOGGLE)),
+	    get_current_prefs_int (repwin, key));
+	g_free (key);
+    }
+    else if (itdb->usertype & GP_ITDB_TYPE_LOCAL)
+    {
+	const gchar *widgets_show[] = {
+	    LOCAL_PATH_LABEL,
+	    LOCAL_PATH_ENTRY,
+	    NULL};
+	const gchar *widgets_hide[] = {
+	    MOUNTPOINT_LABEL,
+	    MOUNTPOINT_ENTRY,
+	    MOUNTPOINT_BUTTON,
+	    BACKUP_LABEL,
+	    BACKUP_ENTRY,
+	    BACKUP_BUTTON,
+	    IPOD_MODEL_LABEL,
+	    IPOD_MODEL_COMBO,
+	    IPOD_SYNC_LABEL,
+	    IPOD_SYNC_CONTACTS_LABEL,
+	    IPOD_SYNC_CONTACTS_ENTRY,
+	    IPOD_SYNC_CONTACTS_BUTTON,
+	    IPOD_SYNC_CALENDAR_LABEL,
+	    IPOD_SYNC_CALENDAR_ENTRY,
+	    IPOD_SYNC_CALENDAR_BUTTON,
+	    IPOD_SYNC_NOTES_LABEL,
+	    IPOD_SYNC_NOTES_ENTRY,
+	    IPOD_SYNC_NOTES_BUTTON,
+	    IPOD_CONCAL_AUTOSYNC_TOGGLE,
+	    NULL};
+	const gchar **widget;
+
+	for (widget=widgets_show; *widget; ++widget)
+	{
+	    gtk_widget_show (GET_WIDGET (*widget));
+	}
+	for (widget=widgets_hide; *widget; ++widget)
+	{
+	    gtk_widget_hide (GET_WIDGET (*widget));
+	}
+
+	set_entry_index (repwin, index, KEY_FILENAME, LOCAL_PATH_ENTRY);
+    }
+    else
+    {
+	g_return_if_reached ();
+    }
+
+    key = get_itdb_prefs_key (index, "deleted");
+    gtk_toggle_button_set_active (
+	GTK_TOGGLE_BUTTON (GET_WIDGET (DELETE_REPOSITORY_CHECKBUTTON)),
+	temp_prefs_get_int (repwin->extra_prefs, key));
+    g_free (key);
+}
+
+
+/****** Fill in info about selected playlist *****/
+static void display_playlist_info (RepWin *repwin)
+{
+    gchar *buf, *key;
+    Playlist *playlist;
+    iTunesDB *itdb;
+    gint i, index;
+    const gchar *widget_names[] = {
+	PLAYLIST_SYNC_DELETE_TRACKS_TOGGLE,
+	PLAYLIST_SYNC_CONFIRM_DELETE_TOGGLE,
+	PLAYLIST_SYNC_SHOW_SUMMARY_TOGGLE,
+	NULL };
+    const gchar *key_names[] = {
+	KEY_SYNC_DELETE_TRACKS,
+	KEY_SYNC_CONFIRM_DELETE,
+	KEY_SYNC_SHOW_SUMMARY,
+	NULL };
+
+    g_return_if_fail (repwin);
+    g_return_if_fail (repwin->itdb);
+    g_return_if_fail (repwin->playlist);
+
+    /* for convenience */
+    itdb = repwin->itdb;
+    index = repwin->itdb_index;
+    playlist = repwin->playlist;
+
+    /* Playlist type */
+    if (itdb_playlist_is_mpl (playlist))
+    {
+	buf = g_markup_printf_escaped ("<i>%s</i>", _("Master Playlist"));
+    }
+    else if (itdb_playlist_is_podcasts (playlist))
+    {
+	buf = g_markup_printf_escaped ("<i>%s</i>", _("Podcasts Playlist"));
+    }
+    else if (playlist->is_spl)
+    {
+	buf = g_markup_printf_escaped ("<i>%s</i>", _("Smart Playlist"));
+    }
+    else
+    {
+	buf = g_markup_printf_escaped ("<i>%s</i>", _("Regular Playlist"));
+    }
+    gtk_label_set_markup (GTK_LABEL(GET_WIDGET("playlist_type_label")),
+			  buf);
+    g_free (buf);
+
+    /* Hide/show corresponding widgets in table */
+    if (playlist->is_spl)
+    {
+	gint liveupdate;
+
+	gtk_widget_show (GET_WIDGET (SPL_VBOX));
+	gtk_widget_show (GET_WIDGET (PLAYLIST_SYNC_DELETE_TRACKS_TOGGLE));
+	gtk_widget_hide (GET_WIDGET (STANDARD_PLAYLIST_VBOX));
+
+	key = get_playlist_prefs_key (index, playlist, KEY_LIVEUPDATE);
+	if (!temp_prefs_get_int_value (repwin->extra_prefs,
+				       key, &liveupdate))
+	    liveupdate = playlist->splpref.liveupdate;
+	g_free (key);
+
+	gtk_toggle_button_set_active (
+	    GTK_TOGGLE_BUTTON (GET_WIDGET (SPL_LIVE_UPDATE_TOGGLE)),
+	    liveupdate);
+    }
+    else
+    {
+	gint syncmode;
+	gchar *dir;
+	gtk_widget_show (GET_WIDGET (STANDARD_PLAYLIST_VBOX));
+	gtk_widget_hide (GET_WIDGET (SPL_VBOX));
+
+	key = get_playlist_prefs_key (index, playlist, KEY_SYNCMODE);
+	syncmode = get_current_prefs_int (repwin, key);
+	g_free (key);
+
+	/* Need to set manual_syncdir_entry here as it may set the
+	   syncmode to 'MANUAL' -- this will be corrected by setting
+	   the radio button with the original syncmode setting further
+	   down. */
+	key = get_playlist_prefs_key (index, playlist,
+				      KEY_MANUAL_SYNCDIR);
+	dir = get_current_prefs_string (repwin, key);
+	g_free (key);
+	gtk_entry_set_text (GTK_ENTRY (GET_WIDGET (MANUAL_SYNCDIR_ENTRY)),
+			    dir);
+	g_free (dir);
+
+	switch (syncmode)
+	{
+	case SYNC_PLAYLIST_MODE_NONE:
+	    gtk_toggle_button_set_active (
+		GTK_TOGGLE_BUTTON (GET_WIDGET (SYNC_PLAYLIST_MODE_NONE_RADIO)),
+		TRUE);
+	    break;
+	case SYNC_PLAYLIST_MODE_MANUAL:
+	    gtk_toggle_button_set_active (
+		GTK_TOGGLE_BUTTON (GET_WIDGET (SYNC_PLAYLIST_MODE_MANUAL_RADIO)),
+		TRUE);
+	    break;
+	case SYNC_PLAYLIST_MODE_AUTOMATIC:
+	    gtk_toggle_button_set_active (
+		GTK_TOGGLE_BUTTON (GET_WIDGET (SYNC_PLAYLIST_MODE_AUTOMATIC_RADIO)),
+		TRUE);
+	    break;
+	default:
+	    /* repair broken prefs */
+	    prefs_set_int (key, SYNC_PLAYLIST_MODE_NONE);
+	    gtk_toggle_button_set_active (
+		GTK_TOGGLE_BUTTON (GET_WIDGET (SYNC_PLAYLIST_MODE_NONE_RADIO)),
+		TRUE);
+	    break;
+	}
+	/* make options available where appropriate */
+	gtk_widget_set_sensitive (GET_WIDGET (SYNC_OPTIONS_HBOX),
+				  syncmode != SYNC_PLAYLIST_MODE_NONE);
+	/* set standard toggle buttons */
+	for (i=0; widget_names[i]; ++i)
+	{
+	    key = get_playlist_prefs_key (index, playlist, key_names[i]);
+	    gtk_toggle_button_set_active (
+		GTK_TOGGLE_BUTTON (GET_WIDGET (widget_names[i])),
+		get_current_prefs_int (repwin, key));
+	    if (key_names[i] == KEY_SYNC_DELETE_TRACKS)
+	    {
+		gtk_widget_set_sensitive (
+		    GET_WIDGET (PLAYLIST_SYNC_CONFIRM_DELETE_TOGGLE),
+		    get_current_prefs_int (repwin, key));
+	    }
+	    g_free (key);
+	}
+    }
+}
+
+
+
+/****** New repository was selected */
+static void repository_changed (GtkComboBox *cb,
+				RepWin *repwin)
+{
+    struct itdbs_head *itdbs_head;
+    iTunesDB *itdb;
+    gint index;
+
+#   if LOCAL_DEBUG
+    printf ("Repository changed (%p)\n", repwin);
+#   endif
+
+    g_return_if_fail (repwin);
+
+    index = gtk_combo_box_get_active (cb);
+
+    itdbs_head = gp_get_itdbs_head (gtkpod_window);
+    g_return_if_fail (itdbs_head);
+
+    itdb = g_list_nth_data (itdbs_head->itdbs, index);
+
+    if (repwin->itdb != itdb)
+    {
+	repwin->itdb = itdb;
+	repwin->itdb_index = index;
+	display_repository_info (repwin);
+	init_playlist_combo (repwin);
+	update_buttons (repwin);
+    }
+}
+
+
+
+/****** New playlist was selected */
+static void playlist_changed (GtkComboBox *cb,
+			      RepWin *repwin)
+{
+    GtkTreeModel *model;
+    Playlist *playlist;
+    GtkTreeIter iter;
+    gint index;
+
+#   if LOCAL_DEBUG
+    printf ("Playlist changed (%p)\n", repwin);
+#   endif
+
+    g_return_if_fail (repwin);
+
+    index = gtk_combo_box_get_active (cb);
+    /* We can't just use the index to find the right playlist in
+       itdb->playlists because they might have been reordered. Instead
+       use the playlist pointer stored in the model. */
+    model= gtk_combo_box_get_model (cb);
+    g_return_if_fail (model);
+    g_return_if_fail (gtk_tree_model_iter_nth_child (model, &iter,
+						     NULL, index));
+    gtk_tree_model_get (model, &iter, 0, &playlist, -1);
+
+    if (repwin->playlist != playlist)
+    {
+	g_return_if_fail (playlist->itdb == repwin->itdb);
+	repwin->playlist = playlist;
+	display_playlist_info (repwin);
+    }
+}
+
+
+/* Provide graphic indicator in playlist combobox */
+static void playlist_cb_cell_data_func_pix (GtkCellLayout *cell_layout,
+					    GtkCellRenderer *cell,
+					    GtkTreeModel *model,
+					    GtkTreeIter *iter,
+					    gpointer data)
+{
+    Playlist *playlist;
+
+    g_return_if_fail (cell);
+    g_return_if_fail (model);
+    g_return_if_fail (iter);
+
+    gtk_tree_model_get (model, iter, 0, &playlist, -1);
+
+    pm_set_renderer_pix (cell, playlist);
+}
+
+
+/* Provide playlist name in combobox */
+static void playlist_cb_cell_data_func_text (GtkCellLayout *cell_layout,
+                                             GtkCellRenderer *cell,
+                                             GtkTreeModel *model,
+                                             GtkTreeIter *iter,
+                                             gpointer data)
+{
+    Playlist *playlist;
+
+    g_return_if_fail (cell);
+    g_return_if_fail (model);
+    g_return_if_fail (iter);
+
+    gtk_tree_model_get (model, iter, 0, &playlist, -1);
+
+    pm_set_renderer_text (cell, playlist);
+}
+
+
+
+/****** common between init_repository_combo() and create_repository() */
+static void set_repository_combo (GtkComboBox *cb)
+{
+    struct itdbs_head *itdbs_head;
+    GtkCellRenderer *cell;
+    GtkListStore *store;
+    GList *gl;
+
+    itdbs_head = gp_get_itdbs_head (gtkpod_window);
+    g_return_if_fail (itdbs_head);
+
+    if (g_object_get_data (G_OBJECT (cb), "combo_set") == NULL)
+    {   /* the combo has not yet been initialized */
+	/* Cell for graphic indicator */
+	cell = gtk_cell_renderer_pixbuf_new ();
+	gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (cb), cell, FALSE);
+	gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (cb), cell,
+					    playlist_cb_cell_data_func_pix,
+					    NULL, NULL);
+	/* Cell for playlist name */
+	cell = gtk_cell_renderer_text_new ();
+	gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (cb), cell, FALSE);
+	gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (cb), cell,
+					    playlist_cb_cell_data_func_text,
+					    NULL, NULL);
+
+	g_object_set (G_OBJECT (cell),
+		      "editable", FALSE,
+		      NULL);
+    }
+
+    store = gtk_list_store_new (1, G_TYPE_POINTER);
+    gtk_combo_box_set_model (cb, GTK_TREE_MODEL (store));
+    g_object_unref (store);
+
+    for (gl=itdbs_head->itdbs; gl; gl=gl->next)
+    {
+	GtkTreeIter iter;
+	Playlist *mpl;
+	iTunesDB *itdb = gl->data;
+	g_return_if_fail (itdb);
+
+	mpl = itdb_playlist_mpl (itdb);
+	g_return_if_fail (mpl);
+
+	gtk_list_store_append (store, &iter);
+	gtk_list_store_set (store, &iter, 0, mpl, -1);
+    }
+}
+
+
+
+
+/****** Initialize the repository combo *****/
+static void init_repository_combo (RepWin *repwin)
+{
+    GtkComboBox *cb;
+
+    g_return_if_fail (repwin);
+
+    cb = GTK_COMBO_BOX (GET_WIDGET (REPOSITORY_COMBO));
+
+    set_repository_combo (cb);
+
+    if (g_object_get_data (G_OBJECT (cb), "combo_set") == NULL)
+    {   /* the combo has not yet been initialized */
+	g_signal_connect (cb, "changed",
+			  G_CALLBACK (repository_changed), repwin);
+
+	g_object_set_data (G_OBJECT (cb), "combo_set", "set");
+    }
+
+
+    repwin->itdb = NULL;
+    repwin->playlist = NULL;
+}
+
+
+
+
+/****** Initialize the playlist combo *****/
+static void init_playlist_combo (RepWin *repwin)
+{
+    GtkCellRenderer *cell;
+    GtkListStore *store;
+    GtkComboBox *cb;
+    GList *gl;
+
+    g_return_if_fail (repwin);
+    g_return_if_fail (repwin->itdb);
+
+    cb = GTK_COMBO_BOX (gtkpod_xml_get_widget (repwin->xml,
+					       PLAYLIST_COMBO));
+
+    if (g_object_get_data (G_OBJECT (cb), "combo_set") == NULL)
+    {
+	/* Cell for graphic indicator */
+	cell = gtk_cell_renderer_pixbuf_new ();
+	gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (cb), cell, FALSE);
+	gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (cb), cell,
+					    playlist_cb_cell_data_func_pix,
+					    NULL, NULL);
+	/* Cell for playlist name */
+	cell = gtk_cell_renderer_text_new ();
+	gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (cb), cell, FALSE);
+	gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (cb), cell,
+					    playlist_cb_cell_data_func_text,
+					    NULL, NULL);
+
+	g_object_set (G_OBJECT (cell),
+		      "editable", FALSE,
+		      NULL);
+
+	g_signal_connect (cb, "changed",
+			  G_CALLBACK (playlist_changed), repwin);
+
+	g_object_set_data (G_OBJECT (cb), "combo_set", "set");
+    }
+
+    store = gtk_list_store_new (1, G_TYPE_POINTER);
+    gtk_combo_box_set_model (cb, GTK_TREE_MODEL (store));
+    g_object_unref (store);
+
+    if (repwin->itdb)
+    {
+	for (gl=repwin->itdb->playlists; gl; gl=gl->next)
+	{
+	    GtkTreeIter iter;
+	    Playlist *pl = gl->data;
+	    g_return_if_fail (pl);
+
+	    gtk_list_store_append (store, &iter);
+	    gtk_list_store_set (store, &iter, 0, pl, -1);
+	}
+    }
+
+    if (repwin->itdb)
+    {
+	select_playlist (repwin, repwin->next_playlist);
+	repwin->next_playlist = NULL;
+    }
+}
+
+
+
+/* Render apply insensitive when no changes were made.
+   When an itdb is marked for deletion, make entries insensitive */
+static void update_buttons (RepWin *repwin)
+{
+    gboolean apply, ok, deleted;
+    gchar *key;
+
+    g_return_if_fail (repwin);
+    g_return_if_fail (repwin->temp_prefs);
+    g_return_if_fail (repwin->extra_prefs);
+
+    if ((temp_prefs_size (repwin->temp_prefs) > 0) ||
+	(temp_prefs_size (repwin->extra_prefs) > 0))
+    {
+	apply = TRUE;
+	ok = TRUE;
+    }
+    else
+    {
+	apply = FALSE;
+	ok = TRUE;
+    }
+
+    gtk_widget_set_sensitive (GET_WIDGET ("apply_button"), apply);
+    gtk_widget_set_sensitive (GET_WIDGET ("ok_button"), ok);
+
+    if (repwin->itdb)
+    {
+	gtk_widget_set_sensitive (GET_WIDGET (REPOSITORY_VBOX), TRUE);
+
+	/* Check if this itdb is marked for deletion */
+	key = get_itdb_prefs_key (repwin->itdb_index, "deleted");
+	deleted = temp_prefs_get_int (repwin->extra_prefs, key);
+	g_free (key);
+
+	gtk_widget_set_sensitive (GET_WIDGET ("path_table_ipod"), !deleted);
+	gtk_widget_set_sensitive (GET_WIDGET ("update_all_playlists_button"), !deleted);
+	gtk_widget_set_sensitive (GET_WIDGET ("playlist_frame"), !deleted);
+	gtk_widget_set_sensitive (GET_WIDGET ("delete_repository_button"),
+				  !deleted && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (GET_WIDGET (DELETE_REPOSITORY_CHECKBUTTON))));
+
+	if (repwin->playlist)
+	{
+	    gboolean sens = FALSE;
+	    if (repwin->playlist->is_spl)
+	    {
+		sens = TRUE;
+	    }
+	    else
+	    {
+		gint val;
+		key = get_playlist_prefs_key (repwin->itdb_index,
+					      repwin->playlist,
+					      KEY_SYNCMODE);
+		val = get_current_prefs_int (repwin, key);
+		g_free (key);
+		if (val != SYNC_PLAYLIST_MODE_NONE)
+		{
+		    sens = TRUE;
+		}
+		gtk_widget_set_sensitive (GET_WIDGET (SYNC_OPTIONS_HBOX),
+					  sens);
+
+		key = get_playlist_prefs_key (repwin->itdb_index,
+					      repwin->playlist,
+					      KEY_SYNC_DELETE_TRACKS);
+		val = get_current_prefs_int (repwin, key);
+		g_free (key);
+		gtk_widget_set_sensitive (
+		    GET_WIDGET (PLAYLIST_SYNC_CONFIRM_DELETE_TOGGLE),
+		    val);
+	    }
+	    gtk_widget_set_sensitive (GET_WIDGET (UPDATE_PLAYLIST_BUTTON),
+				      sens);
+	}
+    }
+    else
+    {   /* no itdb loaded */
+	gtk_widget_set_sensitive (GET_WIDGET (REPOSITORY_VBOX), FALSE);
+    }
+}
+
+
+
+/* Free memory taken by @repwin */
+static void repwin_free (RepWin *repwin)
+{
+    g_return_if_fail (repwin);
+
+    g_object_unref (repwin->xml);
+
+    if (repwin->window)
+    {
+	gtk_widget_destroy (repwin->window);
+    }
+
+    g_free (repwin);
+}
+
+
+/**
+ * repository_edit_itdb_added:
+ *
+ * Notify the dialog that a new itdb was added to the display.
+ *
+ * @itdb: newly added itdb
+ * @select: select the new itdb if TRUE.
+ */
+static void repository_edit_itdb_added (iTunesDB *itdb, gboolean select)
+{
+    struct itdbs_head *itdbs_head;
+    gint index, num;
+    GList *gl;
+
+
+    g_return_if_fail (itdb);
+    itdbs_head = gp_get_itdbs_head (gtkpod_window);
+    g_return_if_fail (itdbs_head);
+ 
+    index = g_list_index (itdbs_head->itdbs, itdb);
+    g_return_if_fail (index != -1);
+    num = g_list_length (itdbs_head->itdbs);
+
+    /* Cycle through all open windows */
+    for (gl=repwins; gl; gl=gl->next)
+    {
+	gint i;
+	iTunesDB *old_itdb;
+	Playlist *old_playlist;
+	RepWin *repwin = gl->data;
+	g_return_if_fail (repwin);
+
+	/* rename keys */
+	for (i=num-2; i>=index; --i)
+	{
+	    gchar *from_key = get_itdb_prefs_key (i, "");
+	    gchar *to_key = get_itdb_prefs_key (i+1, "");
+#           if LOCAL_DEBUG
+	    printf ("TP renaming %d to %d\n", i, i+1);
+#           endif
+	    temp_prefs_rename_subkey (repwin->temp_prefs,
+				      from_key, to_key);
+	    g_free (from_key);
+	    g_free (to_key);
+	}
+
+	old_itdb = repwin->itdb;
+	old_playlist = repwin->playlist;
+
+	init_repository_combo (repwin);
+
+	if (select)
+	{
+	    select_repository (repwin, itdb, NULL);
+	}
+	else
+	{
+	    select_repository (repwin, old_itdb, old_playlist);
+	}
+    }
+}
+
+
+/**
+ * repository_edit:
+ *
+ * Open the repository options window and display repository @itdb and
+ * playlist @playlist. If @itdb and @playlist is NULL, display first
+ * repository and playlist. If @itdb is NULL and @playlist is not
+ * NULL, display @playlist and assume repository is playlist->itdb.
+ */
+void repository_edit (iTunesDB *itdb, Playlist *playlist)
+{
+    RepWin *repwin;
+    GtkComboBox *cb;
+    gint defx, defy;
+    gint i;
+    /* widget names and corresponding keys for 'standard' toggle
+       options */
+    const gchar *playlist_widget_names_toggle[] = {
+	PLAYLIST_SYNC_DELETE_TRACKS_TOGGLE,
+	PLAYLIST_SYNC_CONFIRM_DELETE_TOGGLE,
+	PLAYLIST_SYNC_SHOW_SUMMARY_TOGGLE,
+	SPL_LIVE_UPDATE_TOGGLE,
+	NULL };
+    const gchar *playlist_key_names_toggle[] = {
+	KEY_SYNC_DELETE_TRACKS,
+	KEY_SYNC_CONFIRM_DELETE,
+	KEY_SYNC_SHOW_SUMMARY,
+	KEY_LIVEUPDATE,
+	NULL };
+    const gchar *itdb_widget_names_toggle[] = {
+	IPOD_CONCAL_AUTOSYNC_TOGGLE,
+	NULL };
+    const gchar *itdb_key_names_toggle[] = {
+	KEY_CONCAL_AUTOSYNC,
+	NULL };
+    /* widget names and corresponding keys for 'standard' strings */
+    const gchar *itdb_widget_names_entry[] = {
+	MOUNTPOINT_ENTRY,
+	BACKUP_ENTRY,
+	IPOD_MODEL_ENTRY,
+	LOCAL_PATH_ENTRY,
+	IPOD_SYNC_CONTACTS_ENTRY,
+	IPOD_SYNC_CALENDAR_ENTRY,
+	IPOD_SYNC_NOTES_ENTRY,
+	NULL };
+    const gchar *itdb_key_names_entry[] = {
+	KEY_MOUNTPOINT,
+	KEY_BACKUP,
+	KEY_IPOD_MODEL,
+	KEY_FILENAME,
+	KEY_PATH_SYNC_CONTACTS,
+	KEY_PATH_SYNC_CALENDAR,
+	KEY_PATH_SYNC_NOTES,
+	NULL };
+
+    /* If window is already open, raise existing window to the top */
+    if (repwins)
+    {
+	repwin = repwins->data;
+	g_return_if_fail (repwin);
+	g_return_if_fail (repwin->window);
+	gdk_window_raise (repwin->window->window);
+	return;
+    }
+
+    repwin = g_malloc0 (sizeof (RepWin));
+
+    repwin->xml = glade_xml_new (xml_file, "repository_window", NULL);
+/*  no signals to connect -> comment out */
+/*     glade_xml_signal_autoconnect (detail->xml); */
+    repwin->window = gtkpod_xml_get_widget (repwin->xml,
+					    "repository_window");
+    g_return_if_fail (repwin->window);
+
+    repwins = g_list_append (repwins, repwin);
+
+
+    /* Setup model number combo */
+    cb = GTK_COMBO_BOX (GET_WIDGET (IPOD_MODEL_COMBO));
+    gp_init_model_number_combo (cb);
+
+    /* Window control */
+    g_signal_connect (GET_WIDGET ("apply_button"), "clicked",
+		      G_CALLBACK (edit_apply_clicked), repwin);
+
+    g_signal_connect (GET_WIDGET ("cancel_button"), "clicked",
+		      G_CALLBACK (edit_cancel_clicked), repwin);
+
+    g_signal_connect (GET_WIDGET ("ok_button"), "clicked",
+		      G_CALLBACK (edit_ok_clicked), repwin);
+
+    g_signal_connect (repwin->window, "delete_event",
+		      G_CALLBACK (edit_delete_event), repwin);
+
+    /* Entry callbacks */
+    g_signal_connect (GET_WIDGET (MANUAL_SYNCDIR_ENTRY), "changed",
+		      G_CALLBACK (manual_syncdir_changed), repwin);
+    /* connect standard text entries */
+    for (i=0; itdb_widget_names_entry[i]; ++i)
+    {
+	GtkWidget *w = GET_WIDGET (itdb_widget_names_entry[i]);
+
+	g_signal_connect (w, "changed",
+			  G_CALLBACK (standard_itdb_entry_changed),
+			  repwin);
+	g_object_set_data (G_OBJECT (w), "key",
+			   (gpointer)itdb_key_names_entry[i]);
+    }
+
+    /* Togglebutton callbacks */
+    g_signal_connect (GET_WIDGET (SYNC_PLAYLIST_MODE_NONE_RADIO),
+		      "toggled",
+		      G_CALLBACK (sync_playlist_mode_none_toggled),
+		      repwin);
+
+    g_signal_connect (GET_WIDGET (SYNC_PLAYLIST_MODE_MANUAL_RADIO),
+		      "toggled",
+		      G_CALLBACK (sync_playlist_mode_manual_toggled),
+		      repwin);
+
+    g_signal_connect (GET_WIDGET (SYNC_PLAYLIST_MODE_AUTOMATIC_RADIO),
+		      "toggled",
+		      G_CALLBACK (sync_playlist_mode_automatic_toggled),
+		      repwin);
+
+    g_signal_connect (GET_WIDGET (DELETE_REPOSITORY_CHECKBUTTON),
+		      "toggled",
+		      G_CALLBACK (delete_repository_checkbutton_toggled),
+		      repwin);
+    /* connect standard toggle buttons */
+    for (i=0; playlist_widget_names_toggle[i]; ++i)
+    {
+	GtkWidget *w = GET_WIDGET (playlist_widget_names_toggle[i]);
+
+	g_signal_connect (w, "toggled",
+			  G_CALLBACK (standard_playlist_checkbutton_toggled),
+			  repwin);
+	g_object_set_data (G_OBJECT (w), "key",
+			   (gpointer)playlist_key_names_toggle[i]);
+    }
+    for (i=0; itdb_widget_names_toggle[i]; ++i)
+    {
+	GtkWidget *w = GET_WIDGET (itdb_widget_names_toggle[i]);
+
+	g_signal_connect (w, "toggled",
+			  G_CALLBACK (standard_itdb_checkbutton_toggled),
+			  repwin);
+	g_object_set_data (G_OBJECT (w), "key",
+			   (gpointer)itdb_key_names_toggle[i]);
+    }
+
+
+    /* Button callbacks */
+    g_signal_connect (GET_WIDGET (MOUNTPOINT_BUTTON), "clicked",
+		      G_CALLBACK (mountpoint_button_clicked), repwin);
+
+    g_signal_connect (GET_WIDGET (BACKUP_BUTTON), "clicked",
+		      G_CALLBACK (backup_button_clicked), repwin);
+
+    g_signal_connect (GET_WIDGET (MANUAL_SYNCDIR_BUTTON), "clicked",
+ 		      G_CALLBACK (manual_syncdir_button_clicked), repwin);
+
+    g_signal_connect (GET_WIDGET (DELETE_REPOSITORY_BUTTON), "clicked",
+ 		      G_CALLBACK (delete_repository_button_clicked), repwin);
+
+    g_signal_connect (GET_WIDGET (IPOD_SYNC_CONTACTS_BUTTON), "clicked",
+ 		      G_CALLBACK (ipod_sync_contacts_button_clicked), repwin);
+
+    g_signal_connect (GET_WIDGET (IPOD_SYNC_CALENDAR_BUTTON), "clicked",
+ 		      G_CALLBACK (ipod_sync_calendar_button_clicked), repwin);
+
+    g_signal_connect (GET_WIDGET (IPOD_SYNC_NOTES_BUTTON), "clicked",
+ 		      G_CALLBACK (ipod_sync_notes_button_clicked), repwin);
+
+    g_signal_connect (GET_WIDGET (UPDATE_PLAYLIST_BUTTON), "clicked",
+ 		      G_CALLBACK (update_playlist_button_clicked), repwin);
+
+    g_signal_connect (GET_WIDGET (UPDATE_ALL_PLAYLISTS_BUTTON), "clicked",
+ 		      G_CALLBACK (update_all_playlists_button_clicked), repwin);
+
+    g_signal_connect (GET_WIDGET (NEW_REPOSITORY_BUTTON), "clicked",
+ 		      G_CALLBACK (new_repository_button_clicked), repwin);
+
+    init_repository_combo (repwin);
+
+    /* set default size */
+    defx = prefs_get_int (KEY_REPOSITORY_WINDOW_DEFX);
+    defy = prefs_get_int (KEY_REPOSITORY_WINDOW_DEFY);
+
+    if ((defx == 0) || (defy == 0))
+    {
+	defx = 540;
+	defy = 480;
+    }
+/*     gtk_window_set_default_size (GTK_WINDOW (repwin->window), */
+/* 				 defx, defy); */
+    gtk_window_resize (GTK_WINDOW (repwin->window),
+		       defx, defy);
+
+    /* Set up temp_prefs struct */
+    repwin->temp_prefs = temp_prefs_create ();
+    repwin->extra_prefs = temp_prefs_create ();
+
+    if (!itdb && playlist)
+	itdb = playlist->itdb;
+    if (!itdb)
+    {
+	struct itdbs_head *itdbs_head = gp_get_itdbs_head (gtkpod_window);
+	itdb = g_list_nth_data (itdbs_head->itdbs, 0);
+    }
+    g_return_if_fail (itdb);
+
+    select_repository (repwin, itdb, playlist);
+
+    update_buttons (repwin);
+
+    gtk_widget_show (repwin->window);
+}
+
+
+/* Use the dimension of the first open window */
+void update_default_sizes (void)
+{
+    if (repwins)
+	store_window_state (repwins->data);
+}
+
+
+
+
+/* ------------------------------------------------------------
+ * ************************************************************
+ *
+ * Create Repository Dialog
+ *
+ * ************************************************************
+ * ------------------------------------------------------------ */
+
+struct _CreateRep
+{
+    GladeXML *xml;           /* XML info                             */
+    GtkWidget *window;       /* pointer to repository window         */
+};
+
+typedef struct _CreateRep CreateRep;
+
+static CreateRep *createrep = NULL;
+
+/* repository types */
+enum
+{
+    REPOSITORY_TYPE_IPOD = 0,
+    REPOSITORY_TYPE_LOCAL = 1,
+    REPOSITORY_TYPE_PODCAST = 2,
+};
+/* before/after */
+enum
+{
+    INSERT_BEFORE = 0,
+    INSERT_AFTER = 1,
+};
+
+
+/* somes widget names used several times */
+static const gchar *REPOSITORY_TYPE_COMBO="repository_type_combo";
+static const gchar *INSERT_BEFORE_AFTER_COMBO="insert_before_after_combo";
+static const gchar *REPOSITORY_NAME_ENTRY="repository_name_entry";
+
+
+
+
+/* shortcut to reference widgets when repwin->xml is already set */
+#undef GET_WIDGET
+#define GET_WIDGET(a) repository_xml_get_widget (cr->xml,a)
+
+
+/* ------------------------------------------------------------
+ *
+ *        Callback functions (windows control)
+ *
+ * ------------------------------------------------------------ */
+
+
+/* Free memory taken by @createrep */
+static void createrep_free (CreateRep *cr)
+{
+    g_return_if_fail (cr);
+
+    g_object_unref (cr->xml);
+
+    if (cr->window)
+    {
+	gtk_widget_destroy (cr->window);
+    }
+
+    g_free (cr);
+}
+
+
+
+static void create_cancel_clicked (GtkButton *button, CreateRep *cr)
+{
+    g_return_if_fail (cr);
+
+    createrep_free (cr);
+
+    createrep = NULL;
+}
+
+
+static void create_ok_clicked (GtkButton *button, CreateRep *cr)
+{
+    struct itdbs_head *itdbs_head;
+    gint type, bef_after, itdb_index;
+    const gchar *name, *mountpoint, *backup, *ipod_model, *local_path;
+    iTunesDB *itdb;
+    gint n,i;
+
+    g_return_if_fail (cr);
+
+    itdbs_head = gp_get_itdbs_head (gtkpod_window);
+    g_return_if_fail (itdbs_head);
+    n = g_list_length (itdbs_head->itdbs);
+
+    /* retrieve current settings */
+    type = gtk_combo_box_get_active (
+	GTK_COMBO_BOX (GET_WIDGET (REPOSITORY_TYPE_COMBO)));
+
+    bef_after = gtk_combo_box_get_active (
+	GTK_COMBO_BOX (GET_WIDGET (INSERT_BEFORE_AFTER_COMBO)));
+
+    itdb_index = gtk_combo_box_get_active (
+	GTK_COMBO_BOX (GET_WIDGET (REPOSITORY_COMBO)));
+
+    name = gtk_entry_get_text (
+	GTK_ENTRY (GET_WIDGET (REPOSITORY_NAME_ENTRY)));
+
+    mountpoint = gtk_entry_get_text (
+	GTK_ENTRY (GET_WIDGET (MOUNTPOINT_ENTRY)));
+
+    backup = gtk_entry_get_text (
+	GTK_ENTRY (GET_WIDGET (BACKUP_ENTRY)));
+
+    ipod_model = gtk_entry_get_text (
+	GTK_ENTRY (GET_WIDGET (IPOD_MODEL_ENTRY)));
+    if (strcmp (ipod_model, gettext(SELECT_OR_ENTER_YOUR_MODEL)) == 0)
+    {   /* User didn't choose a model */
+	ipod_model = "";
+    }
+
+    local_path = gtk_entry_get_text (
+	GTK_ENTRY (GET_WIDGET (LOCAL_PATH_ENTRY)));
+
+    /* adjust position where new itdb is to be inserted */
+    if (bef_after == INSERT_AFTER)
+	++itdb_index;
+
+    /* rename pref keys */
+    for (i=n-1; i>=itdb_index; --i)
+    {
+	gchar *from_key = get_itdb_prefs_key (i, "");
+	gchar *to_key = get_itdb_prefs_key (i+1, "");
+#       if LOCAL_DEBUG
+	printf ("renaming %d to %d\n", i, i+1);
+#       endif
+	prefs_rename_subkey (from_key, to_key);
+	g_free (from_key);
+	g_free (to_key);
+    }
+
+    /* Setup prefs for new itdb */
+    set_itdb_index_prefs_string (itdb_index, "name", name);
+    switch (type)
+    {
+    case REPOSITORY_TYPE_IPOD:
+	set_itdb_index_prefs_string (itdb_index,
+				     KEY_MOUNTPOINT, mountpoint);
+	set_itdb_index_prefs_string (itdb_index,
+				     KEY_BACKUP, backup);
+	set_itdb_index_prefs_int (itdb_index, "type", GP_ITDB_TYPE_IPOD);
+	if (strlen (ipod_model) != 0)
+	    set_itdb_index_prefs_string (itdb_index,
+					 KEY_IPOD_MODEL, ipod_model);
+	break;
+    case REPOSITORY_TYPE_LOCAL:
+	set_itdb_index_prefs_string (itdb_index,
+				     KEY_FILENAME, local_path);
+	set_itdb_index_prefs_int (itdb_index, "type", GP_ITDB_TYPE_LOCAL);
+	break;
+    case REPOSITORY_TYPE_PODCAST:
+	set_itdb_index_prefs_string (itdb_index,
+				     KEY_FILENAME, local_path);
+	set_itdb_index_prefs_int (itdb_index, "type",
+				  GP_ITDB_TYPE_PODCASTS|GP_ITDB_TYPE_LOCAL);
+	break;
+    default:
+	g_return_if_reached ();
+    }
+
+    /* Create new itdb */
+    itdb = setup_itdb_n (itdb_index);
+    g_return_if_fail (itdb);
+
+    /* add to the display */
+    gp_itdb_add (itdb, itdb_index);
+
+    /* notify repository_edit dialog */
+    repository_edit_itdb_added (itdb, TRUE);
+
+    /* Finish */
+    create_cancel_clicked (NULL, cr);
+}
+
+
+static void create_delete_event (GtkWidget *widget,
+			       GdkEvent *event,
+			       CreateRep *cr)
+{
+    create_cancel_clicked (NULL, cr);
+}
+
+
+
+/* ------------------------------------------------------------
+ *
+ *        Callback (repository type)
+ *
+ * ------------------------------------------------------------ */
+
+static void repository_type_changed (GtkComboBox *cb,
+				     CreateRep *cr)
+{
+    gint index, i;
+    const gchar **show=NULL;
+    /* widgets to show for iPod repositories */
+    const gchar *show_ipod[] = {
+	MOUNTPOINT_LABEL, MOUNTPOINT_ENTRY, MOUNTPOINT_BUTTON,
+	BACKUP_LABEL, BACKUP_ENTRY, BACKUP_BUTTON,
+	IPOD_MODEL_LABEL, IPOD_MODEL_COMBO,
+	NULL };
+    /* widgets to show for local repositories */
+    const gchar *show_local[] = {
+	LOCAL_PATH_LABEL, LOCAL_PATH_ENTRY, LOCAL_PATH_BUTTON,
+	NULL };
+    /* list of all widgets that get hidden */
+    const gchar *hide_all[] = {
+	MOUNTPOINT_LABEL, MOUNTPOINT_ENTRY, MOUNTPOINT_BUTTON,
+	BACKUP_LABEL, BACKUP_ENTRY, BACKUP_BUTTON,
+	IPOD_MODEL_LABEL, IPOD_MODEL_COMBO,
+	LOCAL_PATH_LABEL, LOCAL_PATH_ENTRY, LOCAL_PATH_BUTTON,
+	NULL };
+
+
+    index = gtk_combo_box_get_active (cb);
+
+    switch (index)
+    {
+    case REPOSITORY_TYPE_IPOD:
+	show = show_ipod;
+	break;
+    case REPOSITORY_TYPE_LOCAL:
+    case REPOSITORY_TYPE_PODCAST:
+	show = show_local;
+	break;
+    }
+
+    g_return_if_fail (show);
+
+    /* Hide all widgets */
+    for (i=0; hide_all[i]; ++i)
+    {
+	gtk_widget_hide (GET_WIDGET (hide_all[i]));
+    }
+    /* Show appropriate widgets */
+    for (i=0; show[i]; ++i)
+    {
+	gtk_widget_show (GET_WIDGET (show[i]));
+    }
+}
+
+
+/* ------------------------------------------------------------
+ *
+ *        Callback (buttons)
+ *
+ * ------------------------------------------------------------ */
+
+/* mountpoint browse button was clicked */
+static void cr_mountpoint_button_clicked (GtkButton *button,
+					  CreateRep *cr)
+{
+    const gchar *old_dir;
+    gchar *new_dir;
+
+    g_return_if_fail (cr);
+
+    old_dir = gtk_entry_get_text (
+	GTK_ENTRY (GET_WIDGET (MOUNTPOINT_ENTRY)));
+
+    new_dir = fileselection_get_file_or_dir (
+	_("Select mountpoint"),
+	old_dir,
+	GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
+
+    if (new_dir)
+    {
+	gtk_entry_set_text (GTK_ENTRY (GET_WIDGET (MOUNTPOINT_ENTRY)),
+			    new_dir);
+	g_free (new_dir);
+    }
+}
+
+
+/* backup browse button was clicked */
+static void cr_backup_button_clicked (GtkButton *button,
+				      CreateRep *cr)
+{
+    const gchar *old_backup;
+    gchar *new_backup;
+
+    g_return_if_fail (cr);
+
+    old_backup = gtk_entry_get_text (
+	GTK_ENTRY (GET_WIDGET (BACKUP_ENTRY)));
+
+    new_backup = fileselection_get_file_or_dir (
+	_("Set backup file"),
+	old_backup,
+	GTK_FILE_CHOOSER_ACTION_SAVE);
+
+    if (new_backup)
+    {
+	gtk_entry_set_text (GTK_ENTRY (GET_WIDGET (BACKUP_ENTRY)),
+			    new_backup);
+	g_free (new_backup);
+    }
+}
+
+
+
+
+/* local path browse button was clicked */
+static void cr_local_path_button_clicked (GtkButton *button,
+					  CreateRep *cr)
+{
+    const gchar *old_path;
+    gchar *new_path;
+
+    g_return_if_fail (cr);
+
+    old_path = gtk_entry_get_text (
+	GTK_ENTRY (GET_WIDGET (LOCAL_PATH_ENTRY)));
+
+    new_path = fileselection_get_file_or_dir (
+	_("Set local repository file"),
+	old_path,
+	GTK_FILE_CHOOSER_ACTION_SAVE);
+
+    if (new_path)
+    {
+	gtk_entry_set_text (GTK_ENTRY (GET_WIDGET (LOCAL_PATH_ENTRY)),
+			    new_path);
+	g_free (new_path);
+    }
+}
+
+
+
+
+/**
+ * create_repository: Create a new repository.
+ * 
+ * @repwin: if given, @repwin will be updated.
+ *
+ * Note: this is a modal dialog.
+ */
+
+static void create_repository (RepWin *repwin1)
+{
+    CreateRep *cr;
+    GtkComboBox *cb;
+    gchar *str, *buf1, *buf2;
+    struct itdbs_head *itdbs_head = gp_get_itdbs_head (gtkpod_window);
+
+    /* If window is already open, raise existing window to the top */
+    if (createrep)
+    {
+	g_return_if_fail (createrep->window);
+	gdk_window_raise (createrep->window->window);
+	return;
+    }
+
+    createrep = g_malloc0 (sizeof (CreateRep));
+    cr = createrep;
+
+    cr->xml = glade_xml_new (xml_file, "create_repository_window",
+			     NULL);
+/*  no signals to connect -> comment out */
+/*     glade_xml_signal_autoconnect (detail->xml); */
+    cr->window = gtkpod_xml_get_widget (cr->xml,
+					"create_repository_window");
+
+    g_return_if_fail (cr->window);
+
+    /* Window control */
+    g_signal_connect (GET_WIDGET ("cancel_button"), "clicked",
+		      G_CALLBACK (create_cancel_clicked), cr);
+
+    g_signal_connect (GET_WIDGET ("ok_button"), "clicked",
+		      G_CALLBACK (create_ok_clicked), cr);
+
+    g_signal_connect (createrep->window, "delete_event",
+		      G_CALLBACK (create_delete_event), cr);
+
+
+    /* Combo callback */
+    g_signal_connect (GET_WIDGET (REPOSITORY_TYPE_COMBO), "changed",
+		      G_CALLBACK (repository_type_changed), cr);
+
+    /* Button callbacks */
+    g_signal_connect (GET_WIDGET (MOUNTPOINT_BUTTON), "clicked",
+		      G_CALLBACK (cr_mountpoint_button_clicked), cr);
+
+    g_signal_connect (GET_WIDGET (BACKUP_BUTTON), "clicked",
+		      G_CALLBACK (cr_backup_button_clicked), cr);
+
+    g_signal_connect (GET_WIDGET (LOCAL_PATH_BUTTON), "clicked",
+		      G_CALLBACK (cr_local_path_button_clicked), cr);
+
+    /* Setup model number combo */
+    cb = GTK_COMBO_BOX (GET_WIDGET (IPOD_MODEL_COMBO));
+    gp_init_model_number_combo (cb);
+    gtk_entry_set_text (GTK_ENTRY (GET_WIDGET (IPOD_MODEL_ENTRY)),
+			gettext (SELECT_OR_ENTER_YOUR_MODEL));
+
+    /* Set initial repository type */
+    gtk_combo_box_set_active (
+	GTK_COMBO_BOX (GET_WIDGET (REPOSITORY_TYPE_COMBO)),
+	REPOSITORY_TYPE_IPOD);
+
+    /* Set before/after combo */
+    gtk_combo_box_set_active (
+	GTK_COMBO_BOX (GET_WIDGET (INSERT_BEFORE_AFTER_COMBO)),
+	INSERT_AFTER);
+
+    /* Set up repository combo */
+    set_repository_combo (GTK_COMBO_BOX (GET_WIDGET (REPOSITORY_COMBO)));
+    gtk_combo_box_set_active (
+	GTK_COMBO_BOX (GET_WIDGET (REPOSITORY_COMBO)),
+	0);
+
+    /* Set default repository name */
+    gtk_entry_set_text (GTK_ENTRY (GET_WIDGET (REPOSITORY_NAME_ENTRY)),
+			_("New Repository"));
+
+    /* Set initial mountpoint */
+    str = prefs_get_string ("initial_mountpoint");
+    gtk_entry_set_text (GTK_ENTRY (GET_WIDGET (MOUNTPOINT_ENTRY)),
+			str);
+    g_free (str);
+
+    buf1 = prefs_get_cfgdir ();
+    g_return_if_fail (buf1);
+    /* Set initial backup path */
+    buf2 = g_strdup_printf ("backupDB_%d",
+			    g_list_length (itdbs_head->itdbs));
+    str = g_build_filename (buf1, buf2, NULL);
+    gtk_entry_set_text (GTK_ENTRY (GET_WIDGET (BACKUP_ENTRY)), str);
+    g_free (str);
+    g_free (buf2);
+
+    /* Set local repository file */
+    buf2 = g_strdup_printf ("local_%d.itdb",
+			    g_list_length (itdbs_head->itdbs));
+    str = g_build_filename (buf1, buf2, NULL);
+    gtk_entry_set_text (GTK_ENTRY (GET_WIDGET (LOCAL_PATH_ENTRY)), str);
+    g_free (str);
+    g_free (buf2);
+    g_free (buf1);
+}

Added: trunk/src/repository.h
===================================================================
--- trunk/src/repository.h	                        (rev 0)
+++ trunk/src/repository.h	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,46 @@
+/* Time-stamp: <2006-05-15 21:59:36 jcs>
+|
+|  Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+| 
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+| 
+|  iTunes and iPod are trademarks of Apple
+| 
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: repository.h 745 2006-05-15 15:43:06Z jcsjcs $
+*/
+
+#ifndef __REPOSITORY_H__
+#define __REPOSITORY_H__
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+ 
+#include <gtk/gtk.h>
+#include "itdb.h"
+
+
+
+/* repository window */
+void repository_edit (iTunesDB *itdb, Playlist *playlist);
+void repository_update_default_sizes (void);
+/*void repository_remove_playlist (Playlist *playlist);*/
+#endif

Added: trunk/src/sha1.c
===================================================================
--- trunk/src/sha1.c	                        (rev 0)
+++ trunk/src/sha1.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,567 @@
+/*
+|  Copyright (C) 2002 Corey Donohoe <atmos at atmos.org>
+|  Copyright (C) 2002-2007 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  SHA1 routine: David Puckett <niekze at yahoo.com>
+|  SHA1 implemented from FIPS-160 standard
+|  <http://www.itl.nist.gov/fipspubs/fip180-1.htm>
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: sha1.c 1024 2007-04-07 14:55:49Z jcsjcs $
+*/
+
+#include <errno.h>
+#include <limits.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <glib.h>
+#include "charset.h"
+#include "sha1.h"
+#include "file.h"
+#include "prefs.h"
+#include "misc.h"
+#include "misc_track.h"
+#include "display.h"
+#include "display_itdb.h"
+
+
+typedef guint32 chunk;
+union _block
+{
+   guint8 charblock[64];
+   chunk chunkblock[16];
+};
+typedef union _block block;
+
+union _hblock
+{
+   guint8 charblock[20];
+   chunk chunkblock[5];
+};
+typedef union _hblock hblock;
+
+struct _sha1
+{
+   block *blockdata;
+   hblock *H;
+};
+typedef struct _sha1 sha1;
+
+static guint8 *sha1_hash(const guint8 * text, guint32 len);
+static void process_block_sha1(sha1 * message);
+
+#if BYTE_ORDER == LITTLE_ENDIAN
+static void little_endian(hblock * stupidblock, int blocks);
+#endif
+
+/**
+ * Create and manage a string hash for files on disk
+ */
+
+/**
+ * NR_PATH_MAX_BLOCKS
+ * A seed of sorts for SHA1, if collisions occur increasing this value
+ * should give more unique data to SHA1 as more of the file is read
+ * This value is multiplied by PATH_MAX_MD5 to determine how many bytes are read
+ */
+#define NR_PATH_MAX_BLOCKS 4
+#define PATH_MAX_SHA1 4096
+
+/* Set up or destory the sha1 hash table */
+void setup_sha1()
+{
+    struct itdbs_head *itdbs_head;
+
+    g_return_if_fail (gtkpod_window);
+    itdbs_head = g_object_get_data (G_OBJECT (gtkpod_window),
+				    "itdbs_head");
+
+    /* gets called before itdbs are set up -> fail silently */
+    if (itdbs_head)
+    {
+	if (prefs_get_int("sha1"))  /* SHA1 hashing turned on */
+	{
+	    gp_sha1_hash_tracks();
+	
+	    /* Display duplicates */
+	    gp_duplicate_remove(NULL, NULL);
+	}
+	else
+	    gp_sha1_free_hash();
+    }
+}
+
+/**
+ * get_filesize_for_file_descriptor - get the filesize on disk for the given
+ * file descriptor
+ * @fp - the filepointer we want the filesize for
+ * Returns - the filesize in bytes
+ */
+static guint32
+get_filesize_for_file_descriptor(FILE *fp)
+{
+    off_t result = 0;
+    struct stat stat_info;
+    int file_no = fileno(fp);
+
+    if((fstat(file_no, &stat_info) == 0))	/* returns 0 on success */
+	result = (int)stat_info.st_size;
+    return (guint32)result;
+}
+
+/**
+ * sha1_hash_on_file - read PATH_MAX_SHA1 * NR_PATH_MAX_BLOCKS bytes
+ * from the file and ask sha1 for a hash of it, convert this hash to a
+ * string of hex output @fp - an open file descriptor to read from
+ * Returns - A Hash String - you handle memory returned
+ */
+static gchar *
+sha1_hash_on_file(FILE * fp)
+{
+   gchar *result = NULL;
+
+   if (fp)
+   {
+       int fsize = 0;
+       int chunk_size = PATH_MAX_SHA1 * NR_PATH_MAX_BLOCKS;
+
+       fsize = get_filesize_for_file_descriptor(fp);
+       if(fsize < chunk_size)
+	   chunk_size = fsize;
+
+       if(fsize > 0)
+       {
+	   guint32 fsize_normal;
+	   guint8 *hash = NULL;
+	   int bread = 0, x = 0, last = 0;
+	   guchar file_chunk[chunk_size + sizeof(int)];
+
+	   /* allocate the digest we're returning */
+	   result = g_malloc0(sizeof(gchar) * 41);
+
+	   /* put filesize in the first 32 bits */
+	   fsize_normal = GINT32_TO_LE (fsize);
+	   memcpy(file_chunk, &fsize_normal, sizeof(guint32));
+
+	   /* read chunk_size from fp */
+	   bread = fread(&file_chunk[sizeof(int)], sizeof(gchar),
+			    chunk_size, fp);
+
+	   /* create hash from our data */
+	   hash = sha1_hash(file_chunk, (bread + sizeof(int)));
+
+	   /* put it in a format we like */
+	   for (x = 0; x < 20; x++)
+	       last += snprintf(&result[last], 4, "%02x", hash[x]);
+
+	   /* free the hash value sha1_hash gave us */
+	   g_free(hash);
+       }
+       else
+       {
+	  gtkpod_warning(_("Hashed file is 0 bytes long\n"));
+       }
+   }
+   return (result);
+}
+
+/**
+ * Generate a unique hash for the Track passed in
+ * @s - The Track data structure, we want to hash based on the file on disk
+ * Returns - an SHA1 hash in string format, is the hex output from the hash
+ */
+static gchar *
+sha1_hash_track(Track * s)
+{
+   ExtraTrackData *etr;
+   gchar *result = NULL;
+   gchar *filename;
+
+   g_return_val_if_fail (s, NULL);
+   etr = s->userdata;
+   g_return_val_if_fail (etr, NULL);
+
+   if (etr->sha1_hash != NULL)
+   {
+       result = g_strdup(etr->sha1_hash);
+   }
+   else
+   {
+       filename = get_file_name_from_source (s, SOURCE_PREFER_LOCAL);
+       if (filename)
+       {
+	   result = sha1_hash_on_filename (filename, FALSE);
+	   g_free(filename);
+       }
+   }
+   return (result);
+}
+
+
+/* @silent: don't print any warning */
+gchar *sha1_hash_on_filename (gchar *name, gboolean silent)
+{
+    gchar *result = NULL;
+
+    if (name)
+    {
+	FILE *fpit = fopen (name, "r");
+	if (!fpit)
+	{
+	    if (!silent)
+	    {
+		gchar *name_utf8=charset_to_utf8 (name);
+		gtkpod_warning (
+		    _("Could not open '%s' to calculate SHA1 checksum: %s\n"),
+		    name_utf8, strerror(errno));
+		g_free (name_utf8);
+	    }
+	}
+	else
+	{
+	    result = sha1_hash_on_file (fpit);
+	    fclose (fpit);
+	}
+    }
+    return result;
+}
+
+
+/**
+ * Free up the dynamically allocated memory in @itdb's hash table
+ */
+void sha1_free_eitdb (ExtraiTunesDBData *eitdb)
+{
+    g_return_if_fail (eitdb);
+
+    if (eitdb->sha1hash)
+    {
+	g_hash_table_destroy (eitdb->sha1hash);
+	eitdb->sha1hash = NULL;
+    }
+}
+
+/**
+ * Free up the dynamically allocated memory in @itdb's hash table
+ */
+void sha1_free (iTunesDB *itdb)
+{
+    g_return_if_fail (itdb);
+    g_return_if_fail (itdb->userdata);
+
+    sha1_free_eitdb (itdb->userdata);
+}
+
+/**
+ * Check to see if a track has already been added to the ipod
+ * @s - the Track we want to know about. If the track does not exist, it
+ * is inserted into the hash.
+ * Returns a pointer to the duplicate track.
+ */
+Track *sha1_track_exists_insert (iTunesDB *itdb, Track * s)
+{
+    ExtraiTunesDBData *eitdb;
+    ExtraTrackData *etr;
+    gchar *val = NULL;
+    Track *track = NULL;
+
+    g_return_val_if_fail (itdb, NULL);
+    eitdb = itdb->userdata;
+    g_return_val_if_fail (eitdb, NULL);
+
+    g_return_val_if_fail (s, NULL);
+    etr = s->userdata;
+    g_return_val_if_fail (etr, NULL);
+
+    if (prefs_get_int("sha1"))
+    {
+	if (eitdb->sha1hash == NULL)
+	{
+	    eitdb->sha1hash = g_hash_table_new_full(g_str_hash,
+						   g_str_equal,
+						   g_free, NULL);
+	}
+	val = sha1_hash_track (s);
+	if (val != NULL)
+	{
+	    track = g_hash_table_lookup (eitdb->sha1hash, val);
+	    if (track)
+	    {
+		g_free(val);
+	    }
+	    else
+	    {   /* if it doesn't exist we register it in the hash */
+		g_free (etr->sha1_hash);
+		etr->sha1_hash = g_strdup (val);
+		/* val is used in the next line -- we don't have to
+		 * g_free() it */
+		g_hash_table_insert (eitdb->sha1hash, val, s);
+	    }
+	}
+    }
+    return track;
+}
+
+/**
+ * Check to see if a track has already been added to the ipod
+ * @s - the Track we want to know about.
+ * Returns a pointer to the duplicate track.
+ */
+Track *sha1_track_exists (iTunesDB *itdb, Track *s)
+{
+    ExtraiTunesDBData *eitdb;
+    Track *track = NULL;
+
+    g_return_val_if_fail (itdb, NULL);
+    eitdb = itdb->userdata;
+    g_return_val_if_fail (eitdb, NULL);
+
+    if (prefs_get_int("sha1") && eitdb->sha1hash)
+    {
+	gchar *val = sha1_hash_track (s);
+	if (val)
+	{
+	    track = g_hash_table_lookup (eitdb->sha1hash, val);
+	    g_free (val);
+	}
+    }
+    return track;
+}
+
+/**
+ * Check to see if a track has already been added to the ipod
+ * @file - the Track we want to know about.
+ * Returns a pointer to the duplicate track using sha1 for
+ * identification. If sha1 checksums are off, NULL is returned.
+ */
+Track *sha1_file_exists (iTunesDB *itdb, gchar *file, gboolean silent)
+{
+    ExtraiTunesDBData *eitdb;
+    Track *track = NULL;
+
+    g_return_val_if_fail (file, NULL);
+    g_return_val_if_fail (itdb, NULL);
+    eitdb = itdb->userdata;
+    g_return_val_if_fail (eitdb, NULL);
+
+    if (prefs_get_int("sha1") && eitdb->sha1hash)
+    {
+	gchar *val = sha1_hash_on_filename (file, silent);
+	if (val)
+	{
+	    track = g_hash_table_lookup (eitdb->sha1hash, val);
+	    g_free (val);
+	}
+    }
+    return track;
+}
+
+
+/**
+ * Check to see if a track has already been added to the ipod
+ * @sha1 - the sha1 we want to know about.
+ * Returns a pointer to the duplicate track using sha1 for
+ * identification. If sha1 checksums are off, NULL is returned.
+ */
+Track *sha1_sha1_exists (iTunesDB *itdb, gchar *sha1)
+{
+    ExtraiTunesDBData *eitdb;
+    Track *track = NULL;
+
+    g_return_val_if_fail (sha1, NULL);
+    g_return_val_if_fail (itdb, NULL);
+    eitdb = itdb->userdata;
+    g_return_val_if_fail (eitdb, NULL);
+
+    if (prefs_get_int("sha1") && eitdb->sha1hash)
+    {
+	track = g_hash_table_lookup (eitdb->sha1hash, sha1);
+    }
+    return track;
+}
+
+/**
+ * Free the specified track from the ipod's unique file hash
+ * @s - The Track that's being freed from the ipod
+ */
+void sha1_track_remove (Track *s)
+{
+    ExtraiTunesDBData *eitdb;
+
+    g_return_if_fail (s);
+    g_return_if_fail (s->itdb);
+    eitdb = s->itdb->userdata;
+    g_return_if_fail (eitdb);
+
+    if (prefs_get_int("sha1") && eitdb->sha1hash)
+    {
+	gchar *val = sha1_hash_track (s);
+	if (val)
+	{
+	    Track *track = g_hash_table_lookup (eitdb->sha1hash, val);
+	    if (track)
+	    {
+		if (track == s) /* only remove if it's the same track */
+		    g_hash_table_remove (eitdb->sha1hash, val);
+	    }
+	    g_free(val);
+	}
+    }
+}
+
+/* sha1_hash - hash value the input data with a given size.
+ * @text - the data we're reading to seed sha1
+ * @len - the length of the data for our seed
+ * Returns a unique 20 char array.
+ */
+static guint8 *
+sha1_hash(const guint8 * text, guint32 len)
+{
+   chunk x;
+   chunk temp_len = len;
+   const guint8 *temp_text = text;
+   guint8 *digest;
+   sha1 *message;
+
+   digest = g_malloc0(sizeof(guint8) * 21);
+   message = g_malloc0(sizeof(sha1));
+   message->blockdata = g_malloc0(sizeof(block));
+   message->H = g_malloc(sizeof(hblock));
+
+   message->H->chunkblock[0] = 0x67452301;
+   message->H->chunkblock[1] = 0xefcdab89;
+   message->H->chunkblock[2] = 0x98badcfe;
+   message->H->chunkblock[3] = 0x10325476;
+   message->H->chunkblock[4] = 0xc3d2e1f0;
+   while (temp_len >= 64)
+   {
+      for (x = 0; x < 64; x++)
+         message->blockdata->charblock[x] = temp_text[x];
+#if BYTE_ORDER == LITTLE_ENDIAN
+      little_endian((hblock *) message->blockdata, 16);
+#endif
+      process_block_sha1(message);
+      temp_len -= 64;
+      temp_text += 64;
+   }
+   for (x = 0; x < temp_len; x++)
+      message->blockdata->charblock[x] = temp_text[x];
+   message->blockdata->charblock[temp_len] = 0x80;
+   for (x = temp_len + 1; x < 64; x++)
+      message->blockdata->charblock[x] = 0x00;
+#if BYTE_ORDER == LITTLE_ENDIAN
+   little_endian((hblock *) message->blockdata, 16);
+#endif
+   if (temp_len > 54)
+   {
+      process_block_sha1(message);
+      for (x = 0; x < 60; x++)
+         message->blockdata->charblock[x] = 0x00;
+   }
+   message->blockdata->chunkblock[15] = len * 8;
+   process_block_sha1(message);
+#if BYTE_ORDER == LITTLE_ENDIAN
+   little_endian(message->H, 5);
+#endif
+   for (x = 0; x < 20; x++)
+      digest[x] = message->H->charblock[x];
+   digest[20] = 0x00;
+   g_free(message->blockdata);
+   g_free(message->H);
+   g_free(message);
+   return (digest);
+}
+
+/*
+ * process_block_sha1 - process one 512-bit block of data
+ * @message - the sha1 struct we're doing working on
+ */
+static void
+process_block_sha1(sha1 * message)
+{
+   chunk x;
+   chunk w[80];                 /* test block */
+   chunk A;                     /* A - E: used for hash calc */
+   chunk B;
+   chunk C;
+   chunk D;
+   chunk E;
+   chunk T;                     /* temp guint32 */
+   chunk K[] = { 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6 };
+
+   for (x = 0; x < 16; x++)
+      w[x] = message->blockdata->chunkblock[x];
+   for (x = 16; x < 80; x++)
+   {
+      w[x] = w[x - 3] ^ w[x - 8] ^ w[x - 14] ^ w[x - 16];
+      w[x] = (w[x] << 1) | (w[x] >> 31);
+   }
+   A = message->H->chunkblock[0];
+   B = message->H->chunkblock[1];
+   C = message->H->chunkblock[2];
+   D = message->H->chunkblock[3];
+   E = message->H->chunkblock[4];
+   for (x = 0; x < 80; x++)
+   {
+      T = ((A << 5) | (A >> 27)) + E + w[x] + K[x / 20];
+      if (x < 20)
+         T += (B & C) | ((~B) & D);
+      else if (x < 40 || x >= 60)
+         T += B ^ C ^ D;
+      else
+         T += ((C | D) & B) | (C & D);
+      E = D;
+      D = C;
+      C = (B << 30) | (B >> 2);
+      B = A;
+      A = T;
+   }
+   message->H->chunkblock[0] += A;
+   message->H->chunkblock[1] += B;
+   message->H->chunkblock[2] += C;
+   message->H->chunkblock[3] += D;
+   message->H->chunkblock[4] += E;
+}
+
+#if BYTE_ORDER == LITTLE_ENDIAN
+/*
+ * little_endian - swap the significants bits to cater to bigendian
+ * @stupidblock - the block of data we're swapping
+ * @blocks - the number of blocks we're swapping
+ */
+static void
+little_endian(hblock * stupidblock, int blocks)
+{
+   int x;
+   for (x = 0; x < blocks; x++)
+   {
+  	stupidblock->chunkblock[x] = (stupidblock->charblock[x * 4] << 24 | stupidblock->charblock[x * 4 + 1] << 16 | stupidblock->charblock[x * 4 +2] << 8 | stupidblock->charblock[x * 4 + 3]);
+   }
+}
+#endif
+
+

Added: trunk/src/sha1.h
===================================================================
--- trunk/src/sha1.h	                        (rev 0)
+++ trunk/src/sha1.h	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,48 @@
+/* Time-stamp: <2006-11-23 00:43:34 jcs>
+|
+|  Copyright (C) 2002 Corey Donohoe <atmos at atmos.org>
+|  Copyright (C) 2004-2005 Jorg Schuler <jcsjcs at users.sourceforge.net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+| 
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+|  USA
+| 
+|  iTunes and iPod are trademarks of Apple
+| 
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: sha1.h 930 2006-11-22 15:48:19Z jcsjcs $
+*/
+#ifndef _GTKPOD_SHA1_H_
+#define _GTKPOD_SHA1_H_
+
+#include "display_itdb.h"
+
+void setup_sha1();
+gchar *sha1_hash_on_filename (gchar *name, gboolean silent);
+/* Any calls to the following functions immediately return if sha1sums
+ * is not on */
+Track *sha1_file_exists (iTunesDB *itdb, gchar *file, gboolean silent);
+Track *sha1_sha1_exists (iTunesDB *itdb, gchar *sha1);
+Track *sha1_track_exists (iTunesDB *itdb, Track *s);
+Track *sha1_track_exists_insert (iTunesDB *itdb, Track *s);
+void sha1_track_remove (Track *s);
+void sha1_free (iTunesDB *itdb);
+void sha1_free_eitdb (ExtraiTunesDBData *eitdb);
+
+#endif

Added: trunk/src/stock_icons.c
===================================================================
--- trunk/src/stock_icons.c	                        (rev 0)
+++ trunk/src/stock_icons.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,144 @@
+/*
+ |Copyright (C) 2007 P.G. Richardson <phantom_sf at users.sourceforge.net>
+ |Part of the gtkpod project.
+ | 
+ |URL: http://www.gtkpod.org/
+ |URL: http://gtkpod.sourceforge.net/
+ |
+ |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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ |
+ |iTunes and iPod are trademarks of Apple
+ |
+ |This product is not supported/written/published by Apple!
+ |
+ */
+
+#include "stock_icons.h"
+
+static void register_stock_icon (gchar *path, const gchar *stockid);
+
+/**
+ * stockid_init
+ *
+ * Initialises paths used for gtkpod specific icons.
+ * This needs to be loaded early as it uses the path
+ * of the binary to determine where to load the file from, in the
+ * same way as main() determines where to load the glade file
+ * from.
+ *
+ * @progpath: path of the gtkpod binary being loaded.
+ *  
+ */
+void stockid_init (gchar *progpath)
+{
+	gchar *progname;
+	
+	progname = g_find_program_in_path (progpath);
+
+	if (progname)
+	{
+		static const gchar *SEPsrcSEPgtkpod = G_DIR_SEPARATOR_S "src" G_DIR_SEPARATOR_S "gtkpod";
+		
+		if (!g_path_is_absolute (progname))
+		{
+			gchar *cur_dir = g_get_current_dir ();
+			gchar *prog_absolute;
+
+			if (g_str_has_prefix (progname, "." G_DIR_SEPARATOR_S))
+				prog_absolute = g_build_filename (cur_dir, progname+2, NULL);
+			else
+				prog_absolute = g_build_filename (cur_dir, progname, NULL);
+			
+			g_free (progname);
+			g_free (cur_dir);
+			progname = prog_absolute;
+		}
+		
+		if (g_str_has_suffix (progname, SEPsrcSEPgtkpod))
+		{
+			gchar *suffix = g_strrstr (progname, SEPsrcSEPgtkpod);
+			
+			if (suffix)
+			{
+				*suffix = 0;
+				GPHOTO_PLAYLIST_ICON_PATH = g_build_filename (progname, "data", "gphoto_playlist_icon-48.png", NULL);
+				TUNE_PLAYLIST_ICON_PATH = g_build_filename (progname, "data", "tunes_playlist_icon-48.png", NULL);
+			}
+		}
+		
+		g_free (progname);
+		
+		/* Photo playlist icon */
+		if (GPHOTO_PLAYLIST_ICON_PATH && !g_file_test (GPHOTO_PLAYLIST_ICON_PATH, G_FILE_TEST_EXISTS))
+		{
+			g_free (GPHOTO_PLAYLIST_ICON_PATH);
+			GPHOTO_PLAYLIST_ICON_PATH = NULL;
+		}
+				
+		if (!GPHOTO_PLAYLIST_ICON_PATH)
+		{
+			GPHOTO_PLAYLIST_ICON_PATH = g_build_filename (PACKAGE_DATA_DIR, PACKAGE, "data", "gphoto_playlist_icon-48.png", NULL);
+		}
+		
+		/* Normal Playlist icon */
+		if (TUNE_PLAYLIST_ICON_PATH && !g_file_test (TUNE_PLAYLIST_ICON_PATH, G_FILE_TEST_EXISTS))
+		{
+			g_free (TUNE_PLAYLIST_ICON_PATH);
+			TUNE_PLAYLIST_ICON_PATH = NULL;
+		}
+						
+		if (!TUNE_PLAYLIST_ICON_PATH)
+		{
+			TUNE_PLAYLIST_ICON_PATH = g_build_filename (PACKAGE_DATA_DIR, PACKAGE, "data", "tunes_playlist_icon-48.png", NULL);
+		}
+		
+		register_stock_icon (GPHOTO_PLAYLIST_ICON_PATH, GPHOTO_PLAYLIST_ICON_STOCK_ID);
+		register_stock_icon (TUNE_PLAYLIST_ICON_PATH, TUNES_PLAYLIST_ICON_STOCK_ID);
+	}
+}
+
+/**
+ * register_stock_icons
+ *
+ * Add pixbuf images to the default icon factory for use
+ * as stock items should they be required.
+ *  
+ */
+static void register_stock_icon (gchar *path, const gchar *stockid)
+{
+	 GError *error = NULL;
+	 GdkPixbuf *image;
+		
+	 g_return_if_fail (path);
+	 
+	 image = gdk_pixbuf_new_from_file (path, &error);
+	  
+	 if(error != NULL)
+	 {	
+		 printf("Error occurred loading photo icon - \nCode: %d\nMessage: %s\n", error->code, error->message); 
+		 g_error_free (error);
+		 g_return_if_fail (image);
+	 }
+	 
+	 GtkIconSet *pl_iconset = gtk_icon_set_new_from_pixbuf (image);
+	 GtkIconFactory *factory = gtk_icon_factory_new ();
+	 gtk_icon_factory_add (
+			 factory, 
+			 stockid,
+			 pl_iconset);
+	 gtk_icon_factory_add_default (factory);
+	 
+	 gdk_pixbuf_unref (image);
+}

Added: trunk/src/stock_icons.h
===================================================================
--- trunk/src/stock_icons.h	                        (rev 0)
+++ trunk/src/stock_icons.h	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,47 @@
+/*
+|  Copyright (C) 2007 P.G. Richardson <phantom_sf at users.sourceforge.net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+| 
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+| 
+|  iTunes and iPod are trademarks of Apple
+| 
+|  This product is not supported/written/published by Apple!
+|
+*/
+
+#ifndef STOCK_ICONS_H_
+#define STOCK_ICONS_H_
+
+#ifdef HAVE_CONFIG_H
+	#include <config.h>
+#endif
+
+#include <gtk/gtk.h>
+
+/* Stock IDs */
+#define GPHOTO_PLAYLIST_ICON_STOCK_ID "gtkpod-gphoto-playlist-icon"
+#define TUNES_PLAYLIST_ICON_STOCK_ID "gtkpod-tunes-playlist-icon"
+
+/* Icon File Paths */
+gchar *GPHOTO_PLAYLIST_ICON_PATH;
+gchar *TUNE_PLAYLIST_ICON_PATH;
+
+void stockid_init (gchar *progpath);
+
+#endif /*STOCK_ICONS_H_*/

Added: trunk/src/syncdir.c
===================================================================
--- trunk/src/syncdir.c	                        (rev 0)
+++ trunk/src/syncdir.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,769 @@
+/* Time-stamp: <2007-06-17 23:01:18 jcs>
+|
+|  Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+| 
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+| 
+|  iTunes and iPod are trademarks of Apple
+| 
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: syncdir.c 1550 2007-06-17 14:14:38Z jcsjcs $
+*/
+
+/* This file provides functions for syncing a directory or directories
+ * with a playlist */
+
+#include <libintl.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include "display_itdb.h"
+#include "file.h"
+#include "info.h"
+#include "misc.h"
+#include "misc_track.h"
+#include "prefs.h"
+#include "syncdir.h"
+
+
+struct add_files_data
+{
+    Playlist *playlist;
+    GList    **tracks_updated;
+};
+
+
+/**
+ * confirm_sync_dirs:
+ *
+ * @dirs_hash: hash table containing the directory names
+ * @key_sync_confirm_dirs: preference key to specify whether or not
+ *            the list of directories should be confirmed. The
+ *            confirmation dialog may change the value of this prefs
+ *            entry. If NULL confirmation takes place.
+ *
+ * Have the user confirm which directories should be included into the
+ * confirmation process.
+ *
+ * Return value: FALSE: user aborted. TRUE: otherwise. @dirs_hash will
+ * be adjusted to reflect the selected directories.
+ */
+static gboolean confirm_sync_dirs (GHashTable *dirs_hash,
+				   const gchar *key_sync_confirm_dirs)
+{
+    g_return_val_if_fail (dirs_hash, FALSE);
+
+    if (key_sync_confirm_dirs && !prefs_get_int (key_sync_confirm_dirs))
+	return TRUE;
+
+    /* FIXME: implement confirmation (doesn't strike me as a major
+     * feature -- feel free to contribute)
+     *
+     * The idea would be to have the user check/uncheck each of the
+     * individual directories. @dirs_hash will be adjusted to reflect
+     * the selected directories.
+     */
+    return TRUE;
+}
+
+
+/**
+ * confirm_delete_tracks:
+ *
+ * @tracks: GList with tracks that are supposed to be removed from the
+ *          iPod or the local repository.
+ * @key_sync_confirm_delete: preference key to specify whether or not
+ *          the removal of tracks should be confirmed. The
+ *          confirmation dialog may change the value of this prefs
+ *          entry. If NULL confirmation takes place.
+ *
+ * Return value: TRUE: it's OK to remove the tracks. FALSE: it's not
+ *               OK to remove the tracks. TRUE is also given if no
+ *               tracks are present, @key_sync_confirm_delete is NULL
+ *               or it's setting is 'FALSE' (0).
+ */
+
+static gboolean confirm_delete_tracks (GList *tracks,
+				       const gchar *key_sync_confirm_delete)
+{
+    GtkResponseType response;
+    struct DeleteData dd;
+    gchar *label, *title;
+    GString *string;
+    iTunesDB *itdb;
+    Track *tr;
+
+    if (tracks == NULL)
+	return TRUE;
+
+    if (key_sync_confirm_delete &&
+	!prefs_get_int (key_sync_confirm_delete))
+	return TRUE;
+
+    tr = g_list_nth_data (tracks, 0);
+    g_return_val_if_fail (tr, FALSE);
+    itdb = tr->itdb;
+    g_return_val_if_fail (itdb, FALSE);
+
+    dd.itdb = itdb;
+    dd.pl = NULL;
+    dd.tracks = tracks;
+    if (itdb->usertype & GP_ITDB_TYPE_IPOD)
+	dd.deleteaction = DELETE_ACTION_IPOD;
+    if (itdb->usertype & GP_ITDB_TYPE_LOCAL)
+	dd.deleteaction = DELETE_ACTION_DATABASE;
+
+    delete_populate_settings (&dd,
+			      &label, &title,
+			      NULL, NULL,
+			      &string);
+
+    response = gtkpod_confirmation (
+	-1,                       /* gint id, */
+	TRUE,                     /* gboolean modal, */
+	title,                    /* title */
+	label,                    /* label */
+	string->str,              /* scrolled text */
+	NULL, 0, NULL,            /* option 1 */
+	NULL, 0, NULL,            /* option 2 */
+	TRUE,                     /* gboolean confirm_again, */
+	key_sync_confirm_delete,  /* ConfHandlerOpt confirm_again_key,*/
+	CONF_NULL_HANDLER,        /* ConfHandler ok_handler,*/
+	NULL,                     /* don't show "Apply" button */
+	CONF_NULL_HANDLER,        /* cancel_handler,*/
+	NULL,                     /* gpointer user_data1,*/
+	NULL);                    /* gpointer user_data2,*/
+
+
+    g_free (label);
+    g_free (title);
+    g_string_free (string, TRUE);
+
+    if (response == GTK_RESPONSE_OK)
+    {
+	/* it's OK to remove the tracks */
+	return TRUE;
+    }
+    else
+    {
+	/* better not delete the tracks */
+	return FALSE;
+    }
+}
+
+
+/* Used by sync_show_summary() */
+static void sync_add_tracks (GString *str,
+			     GList *tracks, const gchar *title)
+{
+    GList *gl;
+
+    g_return_if_fail (str);
+    g_return_if_fail (title);
+
+    if (tracks)
+    {
+	g_string_append (str, title);
+
+	for (gl=tracks; gl; gl=gl->next)
+	{
+	    gchar *buf;
+	    Track *tr = gl->data;
+	    g_return_if_fail (tr);
+
+	    buf = get_track_info (tr, FALSE);
+	    g_string_append_printf (str, "%s\n", buf);
+	    g_free (buf);
+	}
+	g_string_append_printf (str, "\n\n");
+    }
+}
+
+
+
+/**
+ * sync_show_summary:
+ *
+ * @key_sync_show_summary: preference key to specify whether or not a
+ *          summary should be shown or not. If NULL, the summary is
+ *          shown. This key may be changed by the confirmation dialog.
+ * @playlist: playlist where are syncing with.
+ * @tracks_to_delete_from_ipod: GList with tracks to be deleted from
+ *          the iPod or local repository.
+ * @tracks_to_delete_from_playlist: GList with tracks to be deleted
+ *          from @playlist.
+ * @tracks_updated: GList with tracks that have been updated.
+ */
+static void show_sync_summary (const gchar *key_sync_show_summary,
+			       Playlist *playlist,
+			       GList *tracks_to_delete_from_ipod,
+			       GList *tracks_to_delete_from_playlist,
+			       GList *tracks_updated)
+{
+    GString *summary;
+    Playlist *mpl;
+    gint no_length;
+
+    g_return_if_fail (playlist);
+    g_return_if_fail (playlist->itdb);
+
+    if (key_sync_show_summary && !prefs_get_int (key_sync_show_summary))
+	return;
+
+    summary = g_string_sized_new (2000);
+
+    /* mpl->name is the repository's name */
+    mpl = itdb_playlist_mpl (playlist->itdb);
+    g_return_if_fail (mpl);
+    g_string_append_printf (summary,
+			    _("Sync summary for %s/%s\n"),
+			    mpl->name, playlist->name);
+
+    /* used to check whether data was added or not */
+    no_length = strlen (summary->str);
+
+    sync_add_tracks (
+	summary,
+	tracks_updated,
+	ngettext ("The following track has been added or updated:\n",
+		  "The following tracks have been added or updated:\n",
+		  g_list_length (tracks_updated)));
+
+    if (playlist->itdb->usertype & GP_ITDB_TYPE_IPOD)
+    {
+	sync_add_tracks (
+	    summary,
+	    tracks_to_delete_from_ipod,
+	    ngettext ("The following track has been completely removed from the iPod:\n",
+		      "The following tracks have been completely removed from the iPod:\n",
+		      g_list_length (tracks_to_delete_from_ipod)));
+    }
+    else
+    {
+	sync_add_tracks (
+	    summary,
+	    tracks_to_delete_from_ipod,
+	    ngettext ("The following track has been removed from the repository:\n",
+		      "The following tracks have been removed from the repository:\n",
+		      g_list_length (tracks_to_delete_from_ipod)));
+    }
+
+    sync_add_tracks (summary,
+		     tracks_to_delete_from_playlist,
+		     ngettext ("The following track has been removed from the playlist:\n",
+			       "The following tracks have been removed from the playlist:\n",
+			       g_list_length (tracks_to_delete_from_playlist)));
+
+    if (strlen (summary->str) == no_length)
+    {
+	g_string_append (summary, _("Nothing was changed.\n"));
+    }
+
+    gtkpod_confirmation (CONF_ID_SYNC_SUMMARY,
+			 FALSE,
+			 _("Sync summary"),
+			 NULL,
+			 summary->str,
+			 NULL, 0, NULL,
+			 NULL, 0, NULL,
+			 TRUE,
+			 key_sync_show_summary,
+			 CONF_NULL_HANDLER, NULL, NULL,
+			 NULL, NULL);
+
+    g_string_free (summary, TRUE);
+}
+
+
+
+
+/* Callback for adding tracks (makes sure track isn't added to playlist
+ * again if it already exists */
+static void sync_addtrackfunc (Playlist *plitem, Track *track, gpointer data)
+{
+    g_return_if_fail (plitem);
+    g_return_if_fail (track);
+
+    /* only add if @track isn't already a member of the current
+       playlist */
+    if (!itdb_playlist_contains_track (plitem, track))
+	gp_playlist_add_track (plitem, track, TRUE);
+}
+
+
+/**
+ * add_files:
+ *
+ * add all music/video files to the playlist @userdata->playlist. 
+ * updated/newly added tracks are appended to @userdata->tracks_updated.
+ */
+static void add_files (gpointer key, gpointer value, gpointer user_data)
+{
+    struct add_files_data *afd = user_data;
+    Playlist *pl;
+    gchar *dirname = key;
+
+    g_return_if_fail (key);
+    g_return_if_fail (afd);
+    g_return_if_fail (afd->playlist);
+    g_return_if_fail (afd->tracks_updated);
+    pl = afd->playlist;
+
+    if (g_file_test (dirname, G_FILE_TEST_IS_DIR))
+    {
+	GDir *dir = g_dir_open (dirname, 0, NULL);
+	if (dir != NULL)
+	{
+	    G_CONST_RETURN gchar *next;
+	    while ((next = g_dir_read_name (dir)))
+	    {
+		gchar *filename = g_build_filename (dirname, next, NULL);
+		FileType filetype = determine_file_type (filename);
+		gboolean updated = FALSE;
+		Track *tr=NULL;
+
+		switch (filetype)
+		{
+		case FILE_TYPE_UNKNOWN:
+		case FILE_TYPE_DIRECTORY:
+		case FILE_TYPE_IMAGE:
+		case FILE_TYPE_M3U:
+		case FILE_TYPE_PLS:
+		    /* ignore non-music/video files */
+		    break;
+		case FILE_TYPE_MP3:
+		case FILE_TYPE_M4A:
+		case FILE_TYPE_M4P:
+		case FILE_TYPE_M4B:
+		case FILE_TYPE_WAV:
+		case FILE_TYPE_M4V:
+		case FILE_TYPE_MP4:
+		case FILE_TYPE_MOV:
+		case FILE_TYPE_MPG:
+                case FILE_TYPE_OGG:
+                case FILE_TYPE_FLAC:
+		    tr = gp_track_by_filename (pl->itdb, filename);
+		    if (tr)
+		    {   /* track is known -> add to playlist if not
+			 * already present and only update if mtime or
+			 * filesize is different */
+			ExtraTrackData *etr = tr->userdata;
+			struct stat filestat;
+			g_return_if_fail (etr);
+
+			if (!itdb_playlist_contains_track (pl, tr))
+			{
+			    gp_playlist_add_track (pl, tr, TRUE);
+			    updated = TRUE;
+			}
+
+			stat (filename, &filestat);
+/*
+printf ("%ld %ld (%s)\n, %ld %d\n",
+	filestat.st_mtime, etr->mtime,
+	filename,
+	filestat.st_size, tr->size);
+*/
+			if ((filestat.st_mtime != etr->mtime) ||
+			    (filestat.st_size != tr->size))
+			{
+			    update_track_from_file (pl->itdb, tr);
+			    updated = TRUE;
+			}
+		    }
+		    else
+		    {   /* track is not known -- at least not by it's
+			 * filename -> add to playlist using the
+			 * standard function. Duplicate adding is
+			 * avoided by an addtrack function checking
+			 * for duplication */
+			add_track_by_filename (pl->itdb, filename,
+					       pl, FALSE,
+					       sync_addtrackfunc, NULL);
+			tr = gp_track_by_filename (pl->itdb, filename);
+			updated = TRUE;
+		    }
+		    break;
+		}
+		if (tr && updated)
+		{
+		    *afd->tracks_updated =
+			g_list_append (*afd->tracks_updated, tr);
+		}
+		g_free (filename);
+	    }
+	} 
+	g_dir_close (dir);
+    }
+}
+
+
+
+
+/**
+ * sync_playlist:
+ *
+ * @playlist: playlist to sync with contents on hard disk
+ * @syncdir:  directory to sync with. If @syncdir is NULL, a list of
+ *            directories is created from all the filenames of the
+ *            member tracks
+ * @key_sync_confirm_dirs: preference key to specify whether or not
+ *            the list of directories should be confirmed. The
+ *            confirmation dialog may change the value of this prefs
+ *            entry. If NULL, @sync_confirm_dirs decides whether
+ *            confirmation takes place or not.
+ *            FIXME: not implemented at present.
+ * @sync_confirm_dirs: see under @key_sync_confirm_dirs.
+ * @key_sync_delete_tracks: preference key to specify whether or not
+ *            tracks no longer present in the directory list should be
+ *            removed from the iPod/database or not. Normally tracks
+ *            are only removed from the current playlist. If this key's
+ *            value is set to TRUE (1), they will be removed from the
+ *            iPod /database completely, if they are not a member of
+ *            other playlists. Note: to remove tracks from the MPL,
+ *            this has to be TRUE.
+ *            If NULL, @sync_delete_tracks will determine whether
+ *            tracks are removed or not. Also, if @playlist is the
+ *            MPL, tracks will be removed irrespective of this key's
+ *            value. 
+ * @sync_delete_tracks: see under @key_sync_delete_tracks.
+ * @key_sync_confirm_delete: preference key to specify whether or not
+ *            the removal of tracks should be confirmed. The
+ *            confirmation dialog may change the value of this prefs
+ *            entry. If NULL, @sync_confirm_delete will determine
+ *            whether or not confirmation takes place.
+ * @sync_confirm_delete: see under @key_sync_confirm_delete
+ * @key_sync_show_summary: preference key to specify whether or not a
+ *            summary of removed and newly added or updated tracks
+ *            should be displayed. If NULL, @sync_show_shummary will
+ *            determine whether or not a summary is displayed.
+ * @sync_show_shummary: see under @key_sync_show_shummary
+ *
+ * Return value: none, but will give status information via the
+ * statusbar and information windows.
+ **/
+void sync_playlist (Playlist *playlist,
+		    const gchar *syncdir,
+		    const gchar *key_sync_confirm_dirs,
+		    gboolean sync_confirm_dirs,
+		    const gchar *key_sync_delete_tracks,
+		    gboolean sync_delete_tracks,
+		    const gchar *key_sync_confirm_delete,
+		    gboolean sync_confirm_delete,
+		    const gchar *key_sync_show_summary,
+		    gboolean sync_show_summary)
+{
+    GHashTable *dirs_hash;
+    gboolean delete_tracks, is_mpl;
+    time_t current_time;
+    GList *tracks_to_delete_from_ipod = NULL;
+    GList *tracks_to_delete_from_playlist = NULL;
+    GList *tracks_updated = NULL;
+    struct add_files_data afd;
+    GList *gl;
+
+    g_return_if_fail (playlist);
+
+    /* Create a hash to keep the directory names ("key", and "value"
+       to be freed with g_free). key is dirname in local encoding,
+       value is dirname in utf8, if available */
+    dirs_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
+
+    /* If @syncdir is not NULL, put @syndir into the hash
+       table. Otherwise put the dirs of all tracks in @playlist into
+       the table. */
+
+    if (syncdir)
+    {
+	/* make sure the directory name does not end in '/' -- the
+	   code below does not seem to like this */
+	gint len = strlen (syncdir);
+	gchar *dir = g_strdup (syncdir);
+	if (len > 1)
+	{
+	    if (G_IS_DIR_SEPARATOR (dir[len-1]))
+	    {
+		dir[len-1] = 0;
+	    }
+	}
+	g_hash_table_insert (dirs_hash, dir, NULL);
+    }
+    else
+    {
+	for (gl = playlist->members; gl; gl=gl->next)
+	{
+	    ExtraTrackData *etr;
+	    Track *track = gl->data;
+	    g_return_if_fail (track);
+	    etr = track->userdata;
+	    g_return_if_fail (etr);
+
+	    if (etr->pc_path_locale && *etr->pc_path_locale)
+	    {
+		gchar *dirname_local;
+
+		dirname_local = g_path_get_dirname (etr->pc_path_locale);
+		if (etr->pc_path_utf8 && *etr->pc_path_utf8)
+		{
+		    g_hash_table_insert (
+			dirs_hash,
+			dirname_local,
+			g_path_get_dirname (etr->pc_path_utf8));
+		}
+		else
+		{   /* no utf8 -- make sure we don't replace a dir
+		     * entry that had the utf8 data set */
+		    if (!g_hash_table_lookup (dirs_hash, dirname_local))
+		    {
+			g_hash_table_insert (dirs_hash,
+					     dirname_local, NULL);
+		    }
+		    else
+		    {
+			g_free (dirname_local);
+		    }
+		}
+	    }
+	}
+    }
+
+    /* Confirm directories */
+    if (key_sync_confirm_dirs || sync_confirm_dirs)
+    {
+	if (!confirm_sync_dirs (dirs_hash, key_sync_confirm_dirs))
+	{   /* aborted */
+	    g_hash_table_destroy (dirs_hash);
+	    return;
+	}
+    }
+
+    /* current_time can be used to recognize newly added/updated
+       tracks */
+    current_time = time (NULL);
+
+    /* Add all files in all directories entered into dirs_hash */
+    afd.playlist = playlist;
+    afd.tracks_updated = &tracks_updated;
+    g_hash_table_foreach (dirs_hash, add_files, &afd);
+    /* Remove updated and duplicate list so it won't pop up at a later
+       time */
+    display_updated ((void *)-1, NULL);
+    display_non_updated ((void *)-1, NULL);
+    gp_duplicate_remove (NULL, (void *)-1);
+
+    /* Should tracks be deleted that were not present in the
+     * directories? */
+    if (key_sync_delete_tracks == NULL)
+    {
+	delete_tracks = TRUE;
+    }
+    else
+    {
+	delete_tracks = prefs_get_int (key_sync_delete_tracks);
+    }
+    /* Is playlist the MPL? */
+    is_mpl = itdb_playlist_is_mpl (playlist);
+
+    /* Identify all tracks in playlist not being located in one of the
+       specified dirs, or no longer existing. */
+    for (gl=playlist->members; gl; gl=gl->next)
+    {
+	ExtraTrackData *etr;
+	gboolean remove;
+
+	Track *tr = gl->data;
+	g_return_if_fail (tr);
+	etr = tr->userdata;
+	g_return_if_fail (etr);
+
+	remove = FALSE;
+	if (etr->pc_path_locale && *etr->pc_path_locale)
+	{
+	    gchar *dirname_local;
+
+	    dirname_local = g_path_get_dirname (etr->pc_path_locale);
+	    if (!g_hash_table_lookup_extended (dirs_hash, dirname_local,
+					       NULL, NULL))
+	    {   /* file is not in one of the specified directories */
+		remove = TRUE;
+	    }
+	    else
+	    {   /* check if file exists */
+		if (g_file_test (etr->pc_path_locale,
+				 G_FILE_TEST_EXISTS) == FALSE)
+		{   /* no -- remove */
+		    remove = TRUE;
+		}
+	    }
+	    g_free (dirname_local);
+	}
+
+	if (remove)
+	{   /* decide whether track needs to be removed from the iPod
+	     * (only member of this playlist) or only from this
+	     * playlist (if delete_tracks is not set, no tracks are
+	     * removed from the MPL) */
+	    if (delete_tracks &&
+		(is_mpl || (itdb_playlist_contain_track_number (tr)==1)))
+	    {
+		tracks_to_delete_from_ipod =
+		    g_list_append (tracks_to_delete_from_ipod, tr);
+	    }
+	    else
+	    {
+		if (!is_mpl)
+		{
+		    tracks_to_delete_from_playlist =
+			g_list_append (tracks_to_delete_from_playlist, tr);
+		}
+	    }
+	}
+    }
+
+
+    if (tracks_to_delete_from_ipod &&
+	(key_sync_confirm_delete || sync_confirm_delete) &&
+	(confirm_delete_tracks (tracks_to_delete_from_ipod,
+				key_sync_confirm_delete) == FALSE))
+    {   /* User doesn't want us to remove those tracks from the
+	 * iPod. We'll therefore just remove them from the playlist
+	 * (if playlist is the MPL, don't remove at all) */
+	if (!is_mpl)
+	{
+	    tracks_to_delete_from_playlist = g_list_concat (
+		tracks_to_delete_from_playlist,
+		tracks_to_delete_from_ipod);
+	}
+	else
+	{
+	    g_list_free (tracks_to_delete_from_ipod);
+	}
+	tracks_to_delete_from_ipod = NULL;
+    }
+
+
+    if (key_sync_show_summary || sync_show_summary)
+    {
+	show_sync_summary (key_sync_show_summary,
+			   playlist,
+			   tracks_to_delete_from_ipod,
+			   tracks_to_delete_from_playlist,
+			   tracks_updated);
+    }
+
+    /* Remove completely */
+    for (gl=tracks_to_delete_from_ipod; gl; gl=gl->next)
+    {
+	Track *tr = gl->data;
+	g_return_if_fail (tr);
+
+	if (tr->itdb->usertype & GP_ITDB_TYPE_IPOD)
+	    gp_playlist_remove_track (NULL, tr, DELETE_ACTION_IPOD);
+	else if (tr->itdb->usertype & GP_ITDB_TYPE_LOCAL)
+	    gp_playlist_remove_track (NULL, tr, DELETE_ACTION_DATABASE);
+    }
+
+    /* Remove from playlist */
+    for (gl=tracks_to_delete_from_playlist; gl; gl=gl->next)
+    {
+	Track *tr = gl->data;
+	g_return_if_fail (tr);
+
+	gp_playlist_remove_track (playlist, tr, DELETE_ACTION_PLAYLIST);
+    }
+
+    /* Was any data changed? */
+    if (tracks_to_delete_from_ipod ||
+	tracks_to_delete_from_playlist ||
+	tracks_updated)
+    {
+	data_changed (playlist->itdb);
+	gtkpod_tracks_statusbar_update ();
+    }
+
+    g_list_free (tracks_to_delete_from_ipod);
+    g_list_free (tracks_to_delete_from_playlist);
+    g_list_free (tracks_updated);
+}
+
+
+/**
+ * sync_all_playlists:
+ *
+ * @itdb: repository whose playlists are to be updated
+ * 
+ * Will update all playlists in @itdb according to options set. The
+ * following pref subkeys are relevant:
+ * 
+ * sync_confirm_dirs
+ * sync_delete_tracks
+ * sync_confirm_delete
+ * sync_show_summary
+ */
+
+void sync_all_playlists (iTunesDB *itdb)
+{
+    gint index;
+    GList *gl;
+
+    g_return_if_fail (itdb);
+
+    index = get_itdb_index (itdb);
+
+    for (gl=itdb->playlists; gl; gl=gl->next)
+    {
+	gint syncmode;
+	Playlist *pl = gl->data;
+	g_return_if_fail (pl);
+
+	syncmode = get_playlist_prefs_int (pl, KEY_SYNCMODE);
+	if (syncmode != SYNC_PLAYLIST_MODE_NONE)
+	{
+	    gchar *key_sync_confirm_dirs =
+		get_playlist_prefs_key (index, pl, KEY_SYNC_CONFIRM_DIRS);
+	    gchar *key_sync_delete_tracks =
+		get_playlist_prefs_key (index, pl, KEY_SYNC_DELETE_TRACKS);
+	    gchar *key_sync_confirm_delete =
+		get_playlist_prefs_key (index, pl, KEY_SYNC_CONFIRM_DELETE);
+	    gchar *key_sync_show_summary =
+		get_playlist_prefs_key (index, pl, KEY_SYNC_SHOW_SUMMARY);
+	    gchar *syncdir = NULL;
+
+	    if (syncmode == SYNC_PLAYLIST_MODE_MANUAL)
+	    {
+		syncdir = get_playlist_prefs_string (pl,
+						     KEY_MANUAL_SYNCDIR);
+	    }
+
+	    sync_playlist (pl, syncdir,
+			   key_sync_confirm_dirs, 0,
+			   key_sync_delete_tracks, 0,
+			   key_sync_confirm_delete, 0,
+			   key_sync_show_summary, 0);
+
+	    g_free (key_sync_confirm_dirs);
+	    g_free (key_sync_delete_tracks);
+	    g_free (key_sync_confirm_delete);
+	    g_free (key_sync_show_summary);
+	    g_free (syncdir);
+	}
+    }
+}

Added: trunk/src/syncdir.h
===================================================================
--- trunk/src/syncdir.h	                        (rev 0)
+++ trunk/src/syncdir.h	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,64 @@
+/* Time-stamp: <2006-06-15 00:55:28 jcs>
+|
+|  Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+| 
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+| 
+|  iTunes and iPod are trademarks of Apple
+| 
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: syncdir.h 854 2006-06-14 16:12:10Z jcsjcs $
+*/
+
+#ifndef __SYNCDIR_H__
+#define __SYNCDIR_H__
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+ 
+#include <gtk/gtk.h>
+#include "itdb.h"
+
+
+enum
+{
+    /* no auto-sync */
+    SYNC_PLAYLIST_MODE_NONE = 0,
+    /* use dirs from filenames in playlist */
+    SYNC_PLAYLIST_MODE_AUTOMATIC = 1,
+    /* use specified dir */
+    SYNC_PLAYLIST_MODE_MANUAL = 2
+};
+
+
+void sync_playlist (Playlist *playlist,
+		    const gchar *syncdir,
+		    const gchar *key_sync_confirm_dirs,
+		    gboolean sync_confirm_dirs,
+		    const gchar *key_sync_delete_tracks,
+		    gboolean sync_delete_tracks,
+		    const gchar *key_sync_confirm_delete,
+		    gboolean sync_confirm_delete,
+		    const gchar *key_sync_show_summary,
+		    gboolean sync_show_summary);
+
+void sync_all_playlists (iTunesDB *itdb);
+#endif

Added: trunk/src/tools.c
===================================================================
--- trunk/src/tools.c	                        (rev 0)
+++ trunk/src/tools.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,895 @@
+/*
+|  Copyright (C) 2002-2007 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+|
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: tools.c 1684 2007-08-18 06:38:49Z jcsjcs $
+*/
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+
+#include "info.h"
+#include "misc.h"
+#include "misc_track.h"
+#include "mp3file.h"
+#include "prefs.h"
+#include "tools.h"
+#include <errno.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+
+/*pipe's definition*/
+enum {
+    READ = 0,
+    WRITE = 1
+};
+
+enum {
+    BUFLEN = 1000,
+};
+
+/* ------------------------------------------------------------
+
+		     Normalize Volume
+
+   ------------------------------------------------------------ */
+
+
+#ifdef G_THREADS_ENABLED
+static  GMutex *mutex = NULL;
+static GCond  *cond = NULL;
+static gboolean mutex_data = FALSE;
+#endif
+
+
+/* Run @command on @track_path.
+ *
+ * Command may include options, like "mp3gain -q -k %s"
+ *
+ * %s is replaced by @track_path if present, otherwise @track_path is
+ * added at the end.
+ *
+ * Return value: TRUE if the command ran successfully, FALSE if any
+ * error occurred.
+ */
+static gboolean run_exec_on_track (const gchar *commandline,
+				   const gchar *track_path)
+{
+    gchar *command_full_path = NULL;
+    gchar *command = NULL;
+    gchar *command_base = NULL;
+    const gchar *nextarg;
+    gboolean success = FALSE;
+    gboolean percs = FALSE;
+    GPtrArray *args;
+
+    int status, fdnull, ret;
+    pid_t tpid;
+
+    g_return_val_if_fail (commandline, FALSE);
+    g_return_val_if_fail (track_path, FALSE);
+
+
+    /* skip whitespace */
+    while (g_ascii_isspace (*commandline))  ++commandline;
+
+    /* find the command itself -- separated by ' ' */
+    nextarg = strchr (commandline, ' ');
+    if (!nextarg)
+    {
+	nextarg = commandline + strlen (commandline);
+    }
+
+    command = g_strndup (commandline, nextarg-commandline);
+
+    command_full_path = g_find_program_in_path (command);
+
+    if (!command_full_path)
+    {
+	gtkpod_warning (_("Could not find '%s'.\nPlease specifiy the exact path in the Tools section of the preference dialog or install the program if it is not installed on your system.\n\n"), command);
+	goto cleanup;
+    }
+
+    command_base = g_path_get_basename (command_full_path);
+
+    /* Create the command line to be used with execv(). */
+    args =  g_ptr_array_sized_new (strlen (commandline));
+    /* add the full path */
+    g_ptr_array_add (args, command_full_path);
+    /* add the basename */
+    g_ptr_array_add (args, command_base);
+    /* add the command line arguments */
+
+    commandline = nextarg;
+
+    /* skip whitespace */
+    while (g_ascii_isspace (*commandline))  ++commandline;
+
+    while (*commandline != 0)
+    {
+	const gchar *next;
+
+	next = strchr (commandline, ' ');
+	/* next argument is everything to the end */
+	if (!next)
+	    next = commandline + strlen (commandline);
+
+	if (strncmp (commandline, "%s", 2) == 0)
+	{   /* substitute %s with @track_path */
+	    g_ptr_array_add (args, g_strdup (track_path));
+	    percs = TRUE;
+	}
+	else
+	{
+	    g_ptr_array_add (args,
+			     g_strndup (commandline, next-commandline));
+	}
+
+	/* skip to next argument */
+	commandline = next;
+
+	/* skip whitespace */
+	while (g_ascii_isspace (*commandline))  ++commandline;
+    } 
+
+    /* Add @track_path if "%s" was not present */
+    if (!percs)
+	g_ptr_array_add (args, g_strdup (track_path));
+
+    /* need NULL pointer */
+    g_ptr_array_add (args, NULL);
+
+    tpid = fork ();
+
+    switch (tpid)
+    {
+    case 0: /* we are the child */
+    {
+	gchar **argv = (gchar **)args->pdata;
+#if 0
+	gchar **bufp = argv;
+	while (*bufp)	{ puts (*bufp); ++bufp;	}
+#endif
+	/* redirect output to /dev/null */
+	if ((fdnull = open("/dev/null", O_WRONLY | O_NDELAY)) != -1)
+	{
+	    dup2(fdnull, fileno(stdout));
+	}
+	execv(argv[0], &argv[1]);
+	exit(0);
+	break;
+    }
+    case -1: /* we are the parent, fork() failed  */
+	g_ptr_array_free (args, TRUE);
+	break;
+    default: /* we are the parent, everything's fine */
+	tpid = waitpid (tpid, &status, 0);
+	g_ptr_array_free (args, TRUE);
+	if (WIFEXITED(status))
+	    ret = WEXITSTATUS(status);
+	else
+	    ret = 2;
+	if (ret > 1)
+	{
+	    gtkpod_warning (_("Execution of '%s' failed.\n\n"),
+			    command_full_path);
+	}
+	else
+	{
+	    success = TRUE;
+	}
+	break;
+    }
+
+
+  cleanup:
+    g_free (command_full_path);
+    g_free (command);
+    g_free (command_base);
+ 
+    return success;
+}
+
+
+
+
+/* reread the soundcheck value from the file */
+static gboolean nm_get_soundcheck (Track *track)
+{
+    gboolean success = FALSE;
+    gchar *path;
+    gchar *commandline = NULL;
+
+    g_return_val_if_fail (track, FALSE);
+
+    if (read_soundcheck (track))
+	return TRUE;
+
+    path = get_file_name_from_source (track, SOURCE_PREFER_LOCAL);
+
+    if (path)
+    {
+	switch (determine_file_type (path))
+	{
+	case FILE_TYPE_MP3: 
+	    commandline = prefs_get_string ("path_mp3gain");
+	    if (!commandline)
+	    {
+		gtkpod_warning (
+		    _("Did not normalize '%s'. Set mp3gain path in the Tools section of the preferences.\n"), path);
+	    }
+	    break;
+	case FILE_TYPE_M4A:
+	case FILE_TYPE_M4P:
+	case FILE_TYPE_M4B:
+	    commandline = prefs_get_string ("path_aacgain");
+	    if (!commandline)
+	    {
+		gtkpod_warning (
+		    _("Did not normalize '%s'. Set aacgain path in the Tools section of the preferences.\n"), path);
+	    }
+	    break;
+	case FILE_TYPE_WAV: /* FIXME */
+	case FILE_TYPE_OGG: /* FIXME */
+	case FILE_TYPE_FLAC: /* FIXME */
+	case FILE_TYPE_M4V:
+	case FILE_TYPE_MP4:
+	case FILE_TYPE_MOV:
+	case FILE_TYPE_MPG:
+	case FILE_TYPE_UNKNOWN:
+	    gtkpod_warning (
+		_("Normalization failed: file type not supported (%s).\n\n"),
+		path);
+	    break;
+	case FILE_TYPE_M3U: 
+	case FILE_TYPE_PLS: 
+	case FILE_TYPE_IMAGE: 
+	case FILE_TYPE_DIRECTORY:
+	    break;
+	}
+	if (commandline)
+	    success = run_exec_on_track (commandline, path);
+	g_free (path);
+    }
+    else
+    {
+	gchar *buf = get_track_info (track, FALSE);
+	gtkpod_warning (
+	    _("Normalization failed: file not available (%s).\n\n"),
+	    buf);
+	g_free (buf);
+    }
+
+    if (success)
+	return read_soundcheck (track);
+    else
+	return FALSE;
+}
+
+
+
+#ifdef G_THREADS_ENABLED
+/* Threaded getTrackGain*/
+static gpointer th_nm_get_soundcheck (gpointer track)
+{
+   gboolean success = nm_get_soundcheck ((Track *)track);
+   g_mutex_lock (mutex);
+   mutex_data = TRUE; /* signal that thread will end */
+   g_cond_signal (cond);
+   g_mutex_unlock (mutex);
+   return GUINT_TO_POINTER(success);
+}
+#endif
+
+/* normalize the newly inserted tracks (i.e. non-transferred tracks) */
+void nm_new_tracks (iTunesDB *itdb)
+{
+    GList *tracks=NULL;
+    GList *gl;
+
+    g_return_if_fail (itdb);
+
+    for (gl=itdb->tracks; gl; gl=gl->next)
+    {
+	Track *track = gl->data;
+	g_return_if_fail (track);
+	if(!track->transferred)
+	{
+	    tracks = g_list_append (tracks, track);
+	}
+    }
+    nm_tracks_list (tracks);
+    g_list_free (tracks);
+}
+
+static void normalization_abort(gboolean *abort)
+{
+   *abort=TRUE;
+}
+
+void nm_tracks_list (GList *list)
+{
+  gint count, succ_count, n, nrs;
+  guint32 old_soundcheck;
+  gboolean success;
+  static gboolean abort;
+  GtkWidget *dialog, *progress_bar, *label, *track_label;
+  GtkWidget *image, *hbox;
+  time_t diff, start, fullsecs, hrs, mins, secs;
+  gchar *progtext = NULL;
+
+#ifdef G_THREADS_ENABLED
+  GThread *thread = NULL;
+  GTimeVal gtime;
+  if (!mutex) mutex = g_mutex_new ();
+  if (!cond) cond = g_cond_new ();
+#endif
+
+  block_widgets ();
+
+  /* create the dialog window */
+  dialog = gtk_dialog_new_with_buttons (_("Information"),
+					 GTK_WINDOW (gtkpod_window),
+					 GTK_DIALOG_DESTROY_WITH_PARENT,
+					 GTK_STOCK_CANCEL,
+					 GTK_RESPONSE_NONE,
+					 NULL);
+
+
+  /* emulate gtk_message_dialog_new */
+  image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_INFO,
+				    GTK_ICON_SIZE_DIALOG);
+  label = gtk_label_new (
+      _("Press button to abort."));
+
+  gtk_misc_set_alignment (GTK_MISC (image), 0.5, 0.0);
+  gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
+  gtk_label_set_selectable (GTK_LABEL (label), TRUE);
+
+  /* hbox to put the image+label in */
+  hbox = gtk_hbox_new (FALSE, 6);
+  gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0);
+  gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+
+  /* Create the progress bar */
+  progress_bar = gtk_progress_bar_new ();
+  progtext = g_strdup (_("Normalizing..."));
+  gtk_progress_bar_set_text(GTK_PROGRESS_BAR (progress_bar), progtext);
+  g_free (progtext);
+
+  /* Create label for track name */
+  track_label = gtk_label_new (NULL);
+  gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
+  gtk_label_set_selectable (GTK_LABEL (label), TRUE);
+
+  /* Indicate that user wants to abort */
+  g_signal_connect_swapped (GTK_OBJECT (dialog), "response",
+			    G_CALLBACK (normalization_abort),
+			    &abort);
+
+  /* Add the image/label + progress bar to dialog */
+  gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
+		      hbox, FALSE, FALSE, 0);
+  gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
+		      track_label, FALSE, FALSE, 0);
+  gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
+		      progress_bar, FALSE, FALSE, 0);
+  gtk_widget_show_all (dialog);
+
+  while (widgets_blocked && gtk_events_pending ())  gtk_main_iteration ();
+
+  /* count number of tracks to be normalized */
+  n = g_list_length(list);
+  count = 0; /* tracks processed */
+  succ_count = 0;  /* tracks normalized */
+  nrs = 0;
+  abort = FALSE;
+  start = time(NULL);
+
+  if(n==0)
+  {
+     /* FIXME we should tell something*/
+
+  }
+  else
+  {
+      /* we need ***much*** longer timeout */
+      gtkpod_statusbar_timeout (30*STATUSBAR_TIMEOUT);
+  }
+  while (!abort &&  (list!=NULL))
+  {
+     Track  *track = list->data;
+     gchar *label_buf = g_strdup_printf ("%d/%d", count, n);
+
+     gtk_label_set_text (GTK_LABEL (track_label), label_buf);
+
+     gtkpod_statusbar_message (_("%s - %s"),
+			       track->artist, track->title);
+     C_FREE (label_buf);
+
+     while (widgets_blocked && gtk_events_pending ())
+	 gtk_main_iteration ();
+
+     /* need to know so we can update the display when necessary */
+     old_soundcheck = track->soundcheck;
+
+#ifdef G_THREADS_ENABLED
+     mutex_data = FALSE;
+     thread = g_thread_create (th_nm_get_soundcheck, track, TRUE, NULL);
+     if (thread)
+     {
+	 gboolean first_abort = TRUE;
+	 g_mutex_lock (mutex);
+	 do
+	 {
+	     while (widgets_blocked && gtk_events_pending ())
+		 gtk_main_iteration ();
+	     /* wait a maximum of 10 ms */
+
+	     if (abort && first_abort)
+	     {
+		 first_abort = FALSE;
+		 progtext = g_strdup (_("Aborting..."));
+		 gtk_progress_bar_set_text(GTK_PROGRESS_BAR (progress_bar),
+					   progtext);
+		 g_free (progtext);
+		 gtkpod_statusbar_message(_("Will abort after current mp3gain process ends."));
+		 while (widgets_blocked && gtk_events_pending ())
+		     gtk_main_iteration ();
+	     }
+	     g_get_current_time (&gtime);
+	     g_time_val_add (&gtime, 20000);
+	     g_cond_timed_wait (cond, mutex, &gtime);
+	 }
+	 while(!mutex_data);
+	 success = GPOINTER_TO_UINT(g_thread_join (thread));
+	 g_mutex_unlock (mutex);
+     }
+     else
+     {
+	 g_warning ("Thread creation failed, falling back to default.\n");
+	 success = nm_get_soundcheck (track);
+     }
+#else
+     success = nm_get_soundcheck (track);
+#endif
+
+     /*normalization part*/
+     if(!success)
+     {
+	 gchar *path = get_file_name_from_source (track, SOURCE_PREFER_LOCAL);
+	 gtkpod_warning (
+	     _("'%s-%s' (%s) could not be normalized.\n\n"),
+	     track->artist, track->title, path? path:"");
+	 g_free (path);
+     }
+     else
+     {
+	 ++succ_count;
+	 if(old_soundcheck != track->soundcheck)
+	 {
+	     pm_track_changed (track);
+	     data_changed (track->itdb);
+	 }
+     }
+     /*end normalization*/
+
+     ++count;
+     gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR (progress_bar),
+				   (gdouble) count/n);
+
+     diff = time(NULL) - start;
+     fullsecs = (diff*n/count)-diff;
+     hrs  = fullsecs / 3600;
+     mins = (fullsecs % 3600) / 60;
+     secs = ((fullsecs % 60) / 5) * 5;
+     /* don't bounce up too quickly (>10% change only) */
+/*	      left = ((mins < left) || (100*mins >= 110*left)) ? mins : left;*/
+     progtext = g_strdup_printf (
+	 _("%d%% (%d:%02d:%02d left)"),
+	 count*100/n, (int)hrs, (int)mins, (int)secs);
+     gtk_progress_bar_set_text(GTK_PROGRESS_BAR (progress_bar),
+			       progtext);
+     g_free (progtext);
+
+     while (widgets_blocked && gtk_events_pending ())  gtk_main_iteration ();
+     list=g_list_next(list);
+  } /*end while*/
+
+  gtkpod_statusbar_timeout (0);
+
+  gtkpod_statusbar_message (ngettext ("Normalized %d of %d tracks.",
+				      "Normalized %d of %d tracks.", n),
+			    count, n);
+
+  gtk_widget_destroy (dialog);
+  release_widgets();
+}
+
+
+
+/* ------------------------------------------------------------
+
+	    Synchronize Contacts / Calendar
+
+   ------------------------------------------------------------ */
+
+typedef enum
+{
+    SYNC_CONTACTS,
+    SYNC_CALENDAR,
+    SYNC_NOTES
+} SyncType;
+
+
+/* FIXME: tools need to be defined for each itdb separately */
+/* replace %i in all strings of argv with prefs_get_ipod_mount() */
+static void tools_sync_replace_percent_i (iTunesDB *itdb, gchar **argv)
+{
+    gchar *ipod_mount;
+    gint ipod_mount_len;
+    gint offset = 0;
+
+    if (!itdb) return;
+
+    ipod_mount = get_itdb_prefs_string (itdb, KEY_MOUNTPOINT);
+
+    if (!ipod_mount) ipod_mount = g_strdup ("");
+
+    ipod_mount_len = strlen (ipod_mount);
+
+    while (argv && *argv)
+    {
+	gchar *str = *argv;
+	gchar *pi = strstr (str+offset, "%i");
+	if (pi)
+	{
+	    /* len: -2: replace "%i"; +1: trailing 0 */
+	    gint len = strlen (str) - 2 + ipod_mount_len + 1;
+	    gchar *new_str = g_malloc0 (sizeof (gchar) * len);
+	    strncpy (new_str, str, pi-str);
+	    strcpy (new_str + (pi-str), ipod_mount);
+	    strcpy (new_str + (pi-str) + ipod_mount_len, pi+2);
+	    g_free (str);
+	    str = new_str;
+	    *argv = new_str;
+	    /* set offset to point behind the inserted ipod_path in
+	       case ipod_path contains "%i" */
+	    offset = (pi-str) + ipod_mount_len;
+	}
+	else
+	{
+	    offset = 0;
+	    ++argv;
+	}
+    }
+
+    g_free (ipod_mount);
+}
+
+
+/* execute the specified script, giving out error/status messages on
+   the way */
+static gboolean tools_sync_script (iTunesDB *itdb, SyncType type)
+{
+    gchar *script=NULL;
+    gchar *script_path, *buf;
+    gchar **argv = NULL;
+    GString *script_output;
+    gint fdpipe[2];  /*a pipe*/
+    gint len;
+    pid_t pid,tpid;
+
+    switch (type)
+    {
+    case SYNC_CONTACTS:
+	script = get_itdb_prefs_string (itdb, "path_sync_contacts");
+	break;
+    case SYNC_CALENDAR:
+	script = get_itdb_prefs_string (itdb, "path_sync_calendar");
+	break;
+    case SYNC_NOTES:
+	script = get_itdb_prefs_string (itdb, "path_sync_notes");
+	break;
+    default:
+	fprintf (stderr, "Programming error: tools_sync_script () called with %d\n", type);
+	return FALSE;
+    }
+
+    /* remove leading and trailing whitespace */
+    if (script) g_strstrip (script);
+
+    if (!script || (strlen (script) == 0))
+    {
+	gtkpod_warning (_("Please specify the command to be called on the 'Tools' section of the preferences dialog.\n"));
+	g_free (script);
+	return FALSE;
+    }
+
+    argv = g_strsplit (script, " ", -1);
+
+    tools_sync_replace_percent_i (itdb, argv);
+
+    script_path = g_find_program_in_path (argv[0]);
+    if (!script_path)
+    {
+	gtkpod_warning (_("Could not find the command '%s'.\n\nPlease verify the setting in the 'Tools' section of the preferences dialog.\n\n"), argv[0]);
+	g_free (script);
+	g_strfreev (argv);
+	return FALSE;
+    }
+
+    /* set up arg list (first parameter should be basename of script */
+    g_free (argv[0]);
+    argv[0] = g_path_get_basename (script_path);
+
+    buf = g_malloc (BUFLEN);
+    script_output = g_string_sized_new (BUFLEN);
+
+    /*create the pipe*/
+    pipe(fdpipe);
+    /*then fork*/
+    pid=fork();
+
+    /*and cast mp3gain*/
+    switch (pid)
+    {
+    case -1: /* parent and error, now what?*/
+	break;
+    case 0: /*child*/
+	close(fdpipe[READ]);
+	dup2(fdpipe[WRITE],fileno(stdout));
+	dup2(fdpipe[WRITE],fileno(stderr));
+	close(fdpipe[WRITE]);
+	execv(script_path, argv);
+	break;
+    default: /*parent*/
+	close(fdpipe[WRITE]);
+	tpid = waitpid (pid, NULL, 0); /*wait for script termination */
+	do
+	{
+	    len = read (fdpipe[READ], buf, BUFLEN);
+	    if (len > 0) g_string_append_len (script_output, buf, len);
+	} while (len > 0);
+	close(fdpipe[READ]);
+	/* display output in window, if any */
+	if (strlen (script_output->str))
+	{
+	    gtkpod_warning (_("'%s' returned the following output:\n%s\n"),
+			      script_path, script_output->str);
+	}
+	break;
+    } /*end switch*/
+
+    /*free everything left*/
+    g_free (script_path);
+    g_free (buf);
+    g_strfreev (argv);
+    g_string_free (script_output, TRUE);
+    return TRUE;
+}
+
+gboolean tools_sync_all (iTunesDB *itdb)
+{
+    gboolean success;
+
+    success = tools_sync_script (itdb, SYNC_CALENDAR);
+    if (success)
+	success = tools_sync_script (itdb, SYNC_CONTACTS);
+    if (success)
+	tools_sync_script (itdb, SYNC_NOTES);
+    return success;
+}
+
+gboolean tools_sync_contacts (iTunesDB *itdb)
+{
+    return tools_sync_script (itdb, SYNC_CONTACTS);
+}
+
+gboolean tools_sync_calendar (iTunesDB *itdb)
+{
+    return tools_sync_script (itdb, SYNC_CALENDAR);
+}
+
+gboolean tools_sync_notes (iTunesDB *itdb)
+{
+    return tools_sync_script (itdb, SYNC_NOTES);
+}
+
+/* ------------------------------------------------------------
+
+	    Play Now / Enqueue
+
+   ------------------------------------------------------------ */
+
+
+/*
+ * do_command_on_entries - execute @play on tracks in @selected_tracks
+ * @play: the command to execute (e.g. "xmms -e %s")
+ * @what: e.g. "Enqueue" or "Play Now" (used for error messages)
+ * @selected tracks: list of tracks to to be placed in the command line
+ * at the position of "%s"
+ *
+ */
+void
+do_command_on_entries (const gchar *command, const gchar *what,
+		       GList *selected_tracks)
+{
+    GList *l;
+    gchar *str, *commandc, *next;
+    gboolean percs = FALSE; /* did "%s" already appear? */
+    GPtrArray *args;
+
+    if ((!command) || (strlen (command) == 0))
+    {
+	gtkpod_statusbar_message  (_("No command set for '%s'"), what);
+	return;
+    }
+
+    while (g_ascii_isspace (*command))  ++command;
+
+    /* find the command itself -- separated by ' ' */
+    next = strchr (command, ' ');
+    if (!next)
+    {
+	str = g_strdup (command);
+    }
+    else
+    {
+	str = g_strndup (command, next-command);
+    }
+    /* get the full path */
+    commandc = g_find_program_in_path (str);
+    if (!commandc)
+    {
+	gtkpod_statusbar_message  (_("Could not find command '%s' specified for '%s'"),
+				   str, what);
+	g_free (str);
+	return;
+    }
+    C_FREE (str);
+
+    /* Create the command line */
+    args = g_ptr_array_sized_new (g_list_length (selected_tracks) + 10);
+    /* first the full path */
+    g_ptr_array_add (args, commandc);
+    do
+    {
+	const gchar *next;
+	gboolean end;
+
+	next = strchr (command, ' ');
+	if (next == NULL) next = command + strlen (command);
+
+	if (next == command)  end = TRUE;
+	else                  end = FALSE;
+
+	if (!end && (strncmp (command, "%s", 2) != 0))
+	{   /* current token is not "%s" */
+	    gchar *buf;
+	    buf = g_strndup (command, next-command);
+	    g_ptr_array_add (args, buf);
+	}
+	else if (!percs)
+	{
+	    for(l = selected_tracks; l; l = l->next)
+	    {
+		Track *tr = l->data;
+		g_return_if_fail (tr);
+		str = get_file_name_from_source(tr, SOURCE_PREFER_LOCAL);
+		if(str)
+		{
+		    g_ptr_array_add (args, str);
+		}
+	    }
+	    percs = TRUE; /* encountered a '%s' */
+	}
+	command = next;
+	/* skip whitespace */
+	while (g_ascii_isspace (*command))  ++command;
+    } while (*command);
+    /* need NULL pointer */
+    g_ptr_array_add (args, NULL);
+
+    switch(fork())
+    {
+    case 0: /* we are the child */
+    {
+	gchar **argv = (gchar **)args->pdata;
+#if DEBUG_MISC
+	gchar **bufp = argv;
+	while (*bufp)	{ puts (*bufp); ++bufp;	}
+#endif
+	execv(argv[0], &argv[1]);
+	g_ptr_array_free (args, TRUE);
+	exit(0);
+	break;
+    }
+    case -1: /* we are the parent, fork() failed  */
+	g_ptr_array_free (args, TRUE);
+	break;
+    default: /* we are the parent, everything's fine */
+	break;
+    }
+}
+
+
+/*
+ * play_entries_now - play the entries currently selected in xmms
+ * @selected_tracks: list of tracks to be played
+ */
+void tools_play_tracks (GList *selected_tracks)
+{
+    gchar *path = prefs_get_string ("path_play_now");
+    do_command_on_entries (path,
+			   _("Play Now"),
+			   selected_tracks);
+    g_free (path);
+}
+
+/*
+ * play_entries_now - play the entries currently selected in xmms
+ * @selected_tracks: list of tracks to be played
+ */
+void tools_enqueue_tracks (GList *selected_tracks)
+{
+    gchar *path = prefs_get_string ("path_play_enqueue");
+    do_command_on_entries (path,
+			   _("Enqueue"),
+			   selected_tracks);
+    g_free (path);
+}
+
+
+
+/* ------------------------------------------------------------
+
+      Callbacks
+
+   ------------------------------------------------------------ */
+
+gboolean
+on_gtkpod_info_delete_event            (GtkWidget       *widget,
+					GdkEvent        *event,
+					gpointer         user_data)
+{
+    info_close_window ();
+    return TRUE; /* don't close again -- info_close_window() already does it */
+}
+
+
+void
+on_info_close_clicked                  (GtkButton       *button,
+					gpointer         user_data)
+{
+    info_close_window ();
+}

Added: trunk/src/tools.h
===================================================================
--- trunk/src/tools.h	                        (rev 0)
+++ trunk/src/tools.h	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,58 @@
+/* Time-stamp: <2006-05-10 00:01:02 jcs>
+|
+|  Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+| 
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+| 
+|  iTunes and iPod are trademarks of Apple
+| 
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: tools.h 740 2006-05-13 16:41:06Z jcsjcs $
+*/
+
+#ifndef __NORMALIZE_H__
+#define __NORMALIZE_H__
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <glib.h>
+
+/* appears to be missing prior to glib 2.4 */
+#ifndef G_MININT32
+#define G_MININT32	((gint32)  0x80000000)
+#endif
+
+#define TRACKVOLERROR G_MININT32
+
+void nm_new_tracks (iTunesDB *itdb);
+void nm_tracks_list (GList *list);
+
+gboolean tools_sync_all (iTunesDB *itdb);
+gboolean tools_sync_contacts (iTunesDB *itdb);
+gboolean tools_sync_calendar (iTunesDB *itdb);
+gboolean tools_sync_notes (iTunesDB *itdb);
+
+void do_command_on_entries (const gchar *command, const gchar *what,
+			    GList *selected_tracks);
+void tools_play_tracks (GList *selected_tracks);
+void tools_enqueue_tracks (GList *selected_tracks);
+#endif

Added: trunk/src/wavfile.c
===================================================================
--- trunk/src/wavfile.c	                        (rev 0)
+++ trunk/src/wavfile.c	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,191 @@
+/* Time-stamp: <2005-09-17 21:55:20 jcs>
+|
+|  Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: wavfile.c 629 2005-09-20 09:50:13Z jcsjcs $
+*/
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include "charset.h"
+#include "itdb.h"
+#include "misc.h"
+#include "wavfile.h"
+
+#include <string.h>
+
+/* Code for determining the playlength is strongly based on xmms code
+ * (wav.c) which is distributed under the terms of the GPL V2 or any
+ * later version. */
+/* Original copyright notice (they are not involved with gtkpod,
+ * however):
+ * Copyright (C) 1998-2000 Peter Alm, Mikael Alm, Olle Hallnas,
+ * Thomas Nilsson and 4Front Technologies */
+
+#define	WAVE_FORMAT_UNKNOWN		(0x0000)
+#define	WAVE_FORMAT_PCM			(0x0001)
+#define	WAVE_FORMAT_ADPCM		(0x0002)
+#define	WAVE_FORMAT_ALAW		(0x0006)
+#define	WAVE_FORMAT_MULAW		(0x0007)
+#define	WAVE_FORMAT_OKI_ADPCM		(0x0010)
+#define	WAVE_FORMAT_DIGISTD		(0x0015)
+#define	WAVE_FORMAT_DIGIFIX		(0x0016)
+#define	IBM_FORMAT_MULAW	(0x0101)
+#define	IBM_FORMAT_ALAW			(0x0102)
+#define	IBM_FORMAT_ADPCM	(0x0103)
+
+typedef struct
+{
+	FILE *file;
+	short format_tag, channels, block_align, bits_per_sample, eof, going;
+	long samples_per_sec, avg_bytes_per_sec;
+}
+WaveFile;
+
+
+static gint read_le_long(FILE * file, glong *ret)
+{
+	guchar buf[4];
+
+	if (fread(buf, 1, 4, file) != 4)
+		return 0;
+
+	*ret = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
+	return TRUE;
+}
+
+static gint read_le_short(FILE * file, gshort *ret)
+{
+	guchar buf[2];
+
+	if (fread(buf, 1, 2, file) != 2)
+		return 0;
+
+	*ret = (buf[1] << 8) | buf[0];
+	return TRUE;
+}
+
+
+
+Track *wav_get_file_info (gchar *filename)
+{
+    Track *track = NULL;
+    gchar *fn;
+    gchar magic[4];
+    gulong len;
+    WaveFile *wav_file;
+
+    wav_file = g_malloc(sizeof (WaveFile));
+    memset(wav_file, 0, sizeof (WaveFile));
+    if (!(wav_file->file = fopen(filename, "rb")))
+    {
+	gchar *fn = charset_to_utf8 (filename);
+	gtkpod_warning (_("Could not open '%s' for reading.\n"), fn);
+	g_free (fn);
+	g_free(wav_file);
+	wav_file = NULL;
+	return NULL;
+    }
+
+    fread(magic, 1, 4, wav_file->file);
+    if (strncmp(magic, "RIFF", 4) != 0)  goto file_error;
+    read_le_long(wav_file->file, &len);
+    fread(magic, 1, 4, wav_file->file);
+    if (strncmp(magic, "WAVE", 4) != 0)  goto file_error;
+    for (;;)
+    {
+	fread(magic, 1, 4, wav_file->file);
+	if (!read_le_long(wav_file->file, &len)) goto file_error;
+	if (!strncmp("fmt ", magic, 4))          break;
+	fseek(wav_file->file, len, SEEK_CUR);
+    }
+    if (len < 16)  goto file_error;
+    read_le_short(wav_file->file, &wav_file->format_tag);
+    switch (wav_file->format_tag)
+    {
+    case WAVE_FORMAT_UNKNOWN:
+    case WAVE_FORMAT_ALAW:
+    case WAVE_FORMAT_MULAW:
+    case WAVE_FORMAT_ADPCM:
+    case WAVE_FORMAT_OKI_ADPCM:
+    case WAVE_FORMAT_DIGISTD:
+    case WAVE_FORMAT_DIGIFIX:
+    case IBM_FORMAT_MULAW:
+    case IBM_FORMAT_ALAW:
+    case IBM_FORMAT_ADPCM:
+	goto file_error;
+    }
+    read_le_short(wav_file->file, &wav_file->channels);
+    read_le_long(wav_file->file, &wav_file->samples_per_sec);
+    read_le_long(wav_file->file, &wav_file->avg_bytes_per_sec);
+    read_le_short(wav_file->file, &wav_file->block_align);
+    read_le_short(wav_file->file, &wav_file->bits_per_sample);
+/*    if (wav_file->bits_per_sample != 8 && wav_file->bits_per_sample != 16)
+      goto file_error;*/
+    len -= 16;
+    if (len)  fseek(wav_file->file, len, SEEK_CUR);
+
+    for (;;)
+    {
+	fread(magic, 4, 1, wav_file->file);
+
+	if (!read_le_long(wav_file->file, &len))  goto file_error;
+	if (!strncmp("data", magic, 4))
+	    break;
+	fseek(wav_file->file, len, SEEK_CUR);
+    }
+
+    track = gp_track_new ();
+
+    track->bitrate = wav_file->samples_per_sec * wav_file->channels * wav_file->bits_per_sample;
+    track->samplerate = wav_file->samples_per_sec;
+    track->tracklen = 1000 * ((double)8*len / track->bitrate);
+    track->bitrate /= 1000; /* change to kbps */
+    track->filetype = g_strdup ("WAV audio file");
+
+    fclose(wav_file->file);
+    g_free(wav_file);
+    wav_file = NULL;
+    return track;
+
+
+  file_error:
+    fclose(wav_file->file);
+    g_free(wav_file);
+    wav_file = NULL;
+    fn = charset_to_utf8 (filename);
+    gtkpod_warning (_("%s does not appear to be a supported wav file.\n"), fn);
+    g_free (fn);
+    return NULL;
+}
+
+
+gboolean wav_write_file_info (gchar *filename, Track *track)
+{
+    /* tags cannot be saved to wav files */
+    return TRUE;
+}

Added: trunk/src/wavfile.h
===================================================================
--- trunk/src/wavfile.h	                        (rev 0)
+++ trunk/src/wavfile.h	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,37 @@
+/* Time-stamp: <2005-06-17 22:12:11 jcs>
+|
+|  Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
+|  Part of the gtkpod project.
+| 
+|  URL: http://www.gtkpod.org/
+|  URL: http://gtkpod.sourceforge.net/
+|
+|  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+|
+|  iTunes and iPod are trademarks of Apple
+|
+|  This product is not supported/written/published by Apple!
+|
+|  $Id: wavfile.h 589 2005-06-17 13:30:05Z jcsjcs $
+*/
+
+#ifndef WAVFILEH_INCLUDED
+#define WAVFILEH_INCLUDED 1
+
+#include "itdb.h"
+
+gboolean wav_write_file_info (gchar *filename, Track *track);
+Track *wav_get_file_info (gchar *name);
+#endif

Added: trunk/ylwrap
===================================================================
--- trunk/ylwrap	                        (rev 0)
+++ trunk/ylwrap	2008-01-13 16:16:35 UTC (rev 292)
@@ -0,0 +1,223 @@
+#! /bin/sh
+# ylwrap - wrapper for lex/yacc invocations.
+
+scriptversion=2005-05-14.22
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2001, 2002, 2003, 2004, 2005
+#   Free Software Foundation, Inc.
+#
+# Written by Tom Tromey <tromey at cygnus.com>.
+#
+# 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, 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.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake at gnu.org> or send patches to
+# <automake-patches at gnu.org>.
+
+case "$1" in
+  '')
+    echo "$0: No files given.  Try \`$0 --help' for more information." 1>&2
+    exit 1
+    ;;
+  --basedir)
+    basedir=$2
+    shift 2
+    ;;
+  -h|--h*)
+    cat <<\EOF
+Usage: ylwrap [--help|--version] INPUT [OUTPUT DESIRED]... -- PROGRAM [ARGS]...
+
+Wrapper for lex/yacc invocations, renaming files as desired.
+
+  INPUT is the input file
+  OUTPUT is one file PROG generates
+  DESIRED is the file we actually want instead of OUTPUT
+  PROGRAM is program to run
+  ARGS are passed to PROG
+
+Any number of OUTPUT,DESIRED pairs may be used.
+
+Report bugs to <bug-automake at gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v|--v*)
+    echo "ylwrap $scriptversion"
+    exit $?
+    ;;
+esac
+
+
+# The input.
+input="$1"
+shift
+case "$input" in
+  [\\/]* | ?:[\\/]*)
+    # Absolute path; do nothing.
+    ;;
+  *)
+    # Relative path.  Make it absolute.
+    input="`pwd`/$input"
+    ;;
+esac
+
+pairlist=
+while test "$#" -ne 0; do
+  if test "$1" = "--"; then
+    shift
+    break
+  fi
+  pairlist="$pairlist $1"
+  shift
+done
+
+# The program to run.
+prog="$1"
+shift
+# Make any relative path in $prog absolute.
+case "$prog" in
+  [\\/]* | ?:[\\/]*) ;;
+  *[\\/]*) prog="`pwd`/$prog" ;;
+esac
+
+# FIXME: add hostname here for parallel makes that run commands on
+# other machines.  But that might take us over the 14-char limit.
+dirname=ylwrap$$
+trap "cd `pwd`; rm -rf $dirname > /dev/null 2>&1" 1 2 3 15
+mkdir $dirname || exit 1
+
+cd $dirname
+
+case $# in
+  0) $prog "$input" ;;
+  *) $prog "$@" "$input" ;;
+esac
+ret=$?
+
+if test $ret -eq 0; then
+  set X $pairlist
+  shift
+  first=yes
+  # Since DOS filename conventions don't allow two dots,
+  # the DOS version of Bison writes out y_tab.c instead of y.tab.c
+  # and y_tab.h instead of y.tab.h. Test to see if this is the case.
+  y_tab_nodot="no"
+  if test -f y_tab.c || test -f y_tab.h; then
+    y_tab_nodot="yes"
+  fi
+
+  # The directory holding the input.
+  input_dir=`echo "$input" | sed -e 's,\([\\/]\)[^\\/]*$,\1,'`
+  # Quote $INPUT_DIR so we can use it in a regexp.
+  # FIXME: really we should care about more than `.' and `\'.
+  input_rx=`echo "$input_dir" | sed 's,\\\\,\\\\\\\\,g;s,\\.,\\\\.,g'`
+
+  while test "$#" -ne 0; do
+    from="$1"
+    # Handle y_tab.c and y_tab.h output by DOS
+    if test $y_tab_nodot = "yes"; then
+      if test $from = "y.tab.c"; then
+    	from="y_tab.c"
+      else
+    	if test $from = "y.tab.h"; then
+    	  from="y_tab.h"
+    	fi
+      fi
+    fi
+    if test -f "$from"; then
+      # If $2 is an absolute path name, then just use that,
+      # otherwise prepend `../'.
+      case "$2" in
+    	[\\/]* | ?:[\\/]*) target="$2";;
+    	*) target="../$2";;
+      esac
+
+      # We do not want to overwrite a header file if it hasn't
+      # changed.  This avoid useless recompilations.  However the
+      # parser itself (the first file) should always be updated,
+      # because it is the destination of the .y.c rule in the
+      # Makefile.  Divert the output of all other files to a temporary
+      # file so we can compare them to existing versions.
+      if test $first = no; then
+	realtarget="$target"
+	target="tmp-`echo $target | sed s/.*[\\/]//g`"
+      fi
+      # Edit out `#line' or `#' directives.
+      #
+      # We don't want the resulting debug information to point at
+      # an absolute srcdir; it is better for it to just mention the
+      # .y file with no path.
+      #
+      # We want to use the real output file name, not yy.lex.c for
+      # instance.
+      #
+      # We want the include guards to be adjusted too.
+      FROM=`echo "$from" | sed \
+            -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\
+            -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'`
+      TARGET=`echo "$2" | sed \
+            -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\
+            -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'`
+
+      sed -e "/^#/!b" -e "s,$input_rx,," -e "s,$from,$2," \
+          -e "s,$FROM,$TARGET," "$from" >"$target" || ret=$?
+
+      # Check whether header files must be updated.
+      if test $first = no; then
+	if test -f "$realtarget" && cmp -s "$realtarget" "$target"; then
+	  echo "$2" is unchanged
+	  rm -f "$target"
+	else
+          echo updating "$2"
+          mv -f "$target" "$realtarget"
+        fi
+      fi
+    else
+      # A missing file is only an error for the first file.  This
+      # is a blatant hack to let us support using "yacc -d".  If -d
+      # is not specified, we don't want an error when the header
+      # file is "missing".
+      if test $first = yes; then
+        ret=1
+      fi
+    fi
+    shift
+    shift
+    first=no
+  done
+else
+  ret=$?
+fi
+
+# Remove the directory.
+cd ..
+rm -rf $dirname
+
+exit $ret
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:


Property changes on: trunk/ylwrap
___________________________________________________________________
Name: svn:executable
   + *




More information about the Pkg-gtkpod-devel mailing list